Top.Mail.Ru

[Руководство по Java для L2J] Шаг 3.3: Взаимодействие игровых объектов

[Скопировать ссылку]
Astraliya Опубликовано 2024-10-16 17:54:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
9 g3 L) E7 E' g0 H2 ]' U, H* ]) o" p2 H* I

" p# [0 y! p8 p' C# i. eЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
9 p$ x) }4 Q4 P7 d5 @) mЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
- s% g- Z+ ~9 P- EАстралия ?
; J6 z+ S6 i: v) ^; Z! z; u3 i' j9 B: }

Сообщений в теме:5

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* x. Z4 M0 A, L* h  p
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 D; l$ x/ B, s/ s( K! u- o" \
6 `: y! p* N6 P" c$ u
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
! \$ X5 ~$ i. z+ L
AlexCoder опубликовал в 2024-10-16 18:31
' U" m7 j, Y( ]/ PДень добрый!# d; M' W. |0 ^% C* W! O( L
В статье описано взаимодействие игрока с N ...

. H/ y5 x- E9 EДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 6 M! |% C; w% x% t$ C- V

: m* D  ]4 n" cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 V7 B$ [' u' M2 u9 l: j  y

! U4 N4 d1 M+ V' B- MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& \; W& e6 u% G, t
" u+ |* A- J, i0 q3 K) q
  1. <font color="Green">// Пакет для состояний монстра</font>
    / L( W  J1 e; r9 }/ R
  2. package org.l2jmobius.gameserver.model.actor.state;
    & l- z- F2 S0 `1 _2 t
  3. <font color="Green">- q) P9 ^8 ^/ H7 A2 `7 o
  4. // Интерфейс, представляющий состояния монстра</font>4 A1 s7 @- h* R- B8 _
  5. public interface MonsterState {
    / E; K5 B, h6 b( _( S# F$ a
  6.     void handleState(Monster monster);
    6 F0 V) q; J3 X; x
  7. }
    4 d: b+ b. n0 M- I  V
Скопировать код

6 i+ w4 q7 t; Y* Q/ h/ yШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., i! J' |% w( P9 g# o- d, x& B

) R6 _4 |4 Q6 P; RКласс для начального состояния монстра:  i/ q5 T$ ~1 B  e1 i0 U# P2 U6 [, p
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>$ f0 I: U" Y* |- Q/ U+ J6 t' G
  2. package org.l2jmobius.gameserver.model.actor.state;# l3 S8 N# m, N* v/ M* {
  3. ! Q$ P, W* l+ O9 \3 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - t! T7 i8 g7 P6 o+ Z) j

  5. 0 Y9 b) K7 u$ O1 G1 A
  6. public class InitialState implements MonsterState {* B( K% r/ j6 o3 |
  7.     @Override. l1 M5 w& ]1 S) Z3 j" }
  8.     public void handleState(Monster monster) {
    % t; G/ C8 E$ Z$ ^% @. b
  9.         // Начальная фаза боя
    2 O  n7 |2 _! k5 W7 C4 h- u$ w8 g# G5 ~
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & C# z2 p3 V9 }
  11.     }
    % e' D* C; g$ p* R1 C
  12. }
    $ D5 d/ e. d7 G! u+ _
Скопировать код

: e" C  u% |! _4 `3 }" Z' U8 n! u: B2 |* C6 ~

5 r4 J/ m( |! c& T5 K4 X2 Q  S% g
* v: t, o0 W+ c( j2 H# j9 \$ m9 T2 ?- j# u0 \
" e3 y  F% H* `# ^# X; [; {- b) |
3 K0 V& {: |1 {; e9 p
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 _" p  }1 ], p: ~1 W& `8 f
; C! t& }7 T/ A) V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% t. ?+ p) S6 Q; i) y
; M; L8 M9 Y/ I  I
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' z$ @! H# `7 X/ F) s) x) {* w  e" `8 h
; b4 Q3 d( S, V2 c( \2 q
  1. // Пакет для состояний монстра
    ( k( f) J; l% ]6 m; n' m, r
  2. package org.l2jmobius.gameserver.model.actor.state;% z4 b- y) S0 J) M4 ~' j6 W4 \5 N
  3. , H! j# Y# f6 }, F: A
  4. // Интерфейс, представляющий состояния монстра
    $ @1 q& D& Q5 @4 }$ H. Y
  5. public interface MonsterState {) p" I* f- Y: q! K& M, k
  6.     void handleState(Monster monster);1 U7 y; m. J4 n4 u; c1 z4 q1 O
  7. }9 ^9 I7 a1 F0 N1 L
Скопировать код
1 _1 \8 e5 F! J- p" G
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 3 I0 F8 k% t7 ~# V; i- {
% ]8 S& g5 Z" R  q7 O
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.9 Z' w- ?5 L# g) l) I0 O0 S

, y- {2 j% F/ k3 L: K5 @( VКласс для начального состояния монстра:' `- Q; m/ d$ ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' H3 m  C5 o0 ]* C
  2. package org.l2jmobius.gameserver.model.actor.state;) C' U% x' q1 B3 \6 y' }) r

  3. 5 i: |5 W* N% Q% [
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . s: R* q1 U2 ]1 [

  5. 0 S! `: y, D: w8 U
  6. public class InitialState implements MonsterState {
    . R' G. Q" S0 a
  7.     @Override5 b8 v2 x6 j  x
  8.     public void handleState(Monster monster) {
    1 k) t7 `! {) B6 {! ~6 {
  9.         // Начальная фаза боя
    * \; r4 c: ^% Z0 b- z2 ]
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" W" U, ]) U3 F. e$ \) v
  11.     }# f0 a$ ]) \, S; k6 C
  12. }* `0 i+ X5 Q/ z
Скопировать код
Класс для агрессивного состояния монстра:
0 k, `' |8 \4 m- g7 j# c, V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ w5 m+ z7 x# |6 O5 y& F
  2. package org.l2jmobius.gameserver.model.actor.state;& @% ?; R5 y1 k+ d5 }
  3. ' s3 L" Y1 o! @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & d+ ^* X" A  G2 b, k

  5. * S8 u' F. G( S/ i5 i
  6. public class AggressiveState implements MonsterState {
    - T2 p) B7 {* Q% `/ o
  7.     @Override
    : Q. t) F* U% [/ W; r3 r% a1 c
  8.     public void handleState(Monster monster) {
    ; {' J) H) ]; w" h2 ^# `; j- D9 o- k( n# Q
  9.         // Агрессивная фаза боя0 \, E# N8 o' A, [  ~
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    / M. ?# O8 h) R2 d9 i, _( N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки% x# }; f& B+ w9 ?' `
  12.     }
    3 [* g4 L& m: a: R; D
  13. }: W" a* n8 \. C' ]' _' w, I
Скопировать код
Класс для финального состояния монстра:
5 E/ q/ u$ ?, s! ^8 r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; [1 e. \  P' O; f+ h8 ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' K" B. W- E8 e( M/ `" j) l7 c

  3. 6 Z% ?; m; v' o6 ^  T8 N* V/ ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 r3 O: j# R: s# i7 M# e
  5. , q+ q+ U: j3 @9 S1 g& `
  6. public class FinalState implements MonsterState {( z3 n) u* P- o  ~% s' Y5 [7 d& {
  7.     @Override! w# v* K) M/ K. d% c
  8.     public void handleState(Monster monster) {6 H/ S- Q+ p% V. }9 q2 \
  9.         // Финальная фаза боя8 [7 s" Z" ]' p* j% {! [
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    - s0 u; k1 g  c3 T9 @
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ( q& t' I- e# q) o
  12.     }0 I$ ^' I- ?# k
  13. }, L% ~( c; y) `; T( Q6 b6 e7 }% w) M
Скопировать код
+ T! [) f& d" S2 U! C$ X5 h6 N
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; T4 `- W: k/ c" ~
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! E2 h: k% Y* y$ X$ L; v
  2. package org.l2jmobius.gameserver.model.actor;* u1 i. r' E+ Y
  3. : ~3 d: }/ S# ?$ W( b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % Y) Z1 A+ }: N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;0 }2 y- X$ X! ^8 U# ^4 ]

  6. 3 V+ h- H# Q+ _0 T" B' h3 U: ^) m% Z
  7. public class Monster extends Creature {; r9 K& P7 G  X$ c
  8.     private String name;4 a6 N3 ^; p3 ~6 n/ j8 X% Y
  9.     private double attackPower;
    ) q3 G: P% S3 h6 q
  10.     private MonsterState state; // Текущее состояние монстра
    . ]4 J: Z3 r$ I7 O! |. x- X9 Z

  11. 1 ~- a. D; r9 D" ^3 N' |. P# O
  12.     // Конструктор монстра5 u% O, p: o2 o' ]& d
  13.     public Monster(String name, double attackPower) {( p; B" r' x) Y6 u7 a$ |6 g% J
  14.         this.name = name;% b/ V8 _$ r  }8 V
  15.         this.attackPower = attackPower;7 r% E6 J7 X& M! c! g& A
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ D+ X: f" g: i: o
  17.     }, q% z. |5 z& M- x; H' F
  18. : H6 [  K6 h( G  o* i5 _
  19.     // Метод для смены состояния6 O1 Q- k# s+ N$ t7 L* Q* i$ `, v
  20.     public void setState(MonsterState newState) {
    ! _! w/ z2 ^7 o6 G
  21.         this.state = newState;
    + S% q- z+ H' R+ C; V( ^3 @
  22.     }
    / o5 H1 O0 W- _
  23. + `) D4 j3 m3 u: p
  24.     // Выполнение действий на основе текущего состояния  k+ C( U  i8 e2 d4 V7 Y) Z
  25.     public void executeState() {$ G( d0 b* X& E) l3 R
  26.         state.handleState(this);
    ( g& W1 A% k2 l- e/ s) V$ z, G" p
  27.     }
    3 V0 l2 t# L/ N+ o1 |( v! P# r2 p

  28. ) @) Q  t' F" q0 \! l
  29.     // Геттеры и сеттеры
      T/ g- y" @; Y! W$ W& K
  30.     public String getName() {4 N- T' H& r) q  z  g4 Q
  31.         return name;! O$ g; r2 L! N& ^
  32.     }; H8 j; A3 w4 }
  33. * [2 X8 G# W3 }, h8 F
  34.     public double getAttackPower() {
    - A# z$ I" @$ N7 t1 f. F3 P2 X7 n
  35.         return attackPower;
    - F1 g: g3 b. v5 h( N. u9 N
  36.     }
    , X8 o( n, a4 M

  37. ; j' }) _+ J- g2 Y6 N7 d
  38.     public void setAttackPower(double attackPower) {
    - |( A" r! l' J" ]' ^2 e1 l7 N, C
  39.         this.attackPower = attackPower;$ _# d, ?- [4 \2 M% U# X, B
  40.     }6 @' T! `0 J/ E7 O
  41. }8 T5 B+ m, [) t. m9 [4 X
Скопировать код

& z* h. ^$ S, o/ O% f3 d5 g& `0 `Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.4 z* x9 q* n; v6 [# s

& A) |/ a$ r7 M5 r
  1. // Пакет org.l2jmobius.gameserver.model.battle: n) S, ]) y) |) }
  2. package org.l2jmobius.gameserver.model.battle;% I& _; ~$ `# ]4 ^! b! d  B
  3. / T$ g: ~7 n& I7 I6 e1 T3 g6 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;' \% q$ S! l0 g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 x6 m! H/ y3 _
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;" E- J1 S' m1 k1 U" r' a
  7. + S; S- J% a9 L* S
  8. public class BattleSimulation {0 T. |& f9 g4 t3 U1 q* d; |% e
  9.     public static void main(String[] args) {
    3 }; U# r5 e# M8 e* z5 D
  10.         // Создаем монстра с начальной атакой
    / @+ O% D8 h7 k. G
  11.         Monster monster = new Monster("Дракон", 100);
    % m5 {6 X+ ~/ k9 ~

  12. # Q! t, v3 Z3 D
  13.         // Начальная фаза
      `7 Q) O- w, E! Q2 x
  14.         monster.executeState();, q: L# r$ ~# e# c7 G
  15. 9 Y% l8 W8 w: W
  16.         // Переход в агрессивную фазу9 T  K5 {3 m' Y7 b
  17.         monster.setState(new AggressiveState());* w2 D; F" z5 @
  18.         monster.executeState();
    ; k- h; H9 [# W7 P

  19. , H9 ]' c! U$ p
  20.         // Финальная фаза
    ) l3 Y  v4 b8 f6 J* {7 i
  21.         monster.setState(new FinalState());
    " @2 z, T$ ^' B3 ^
  22.         monster.executeState();; z! \7 I9 R. Z; V6 M) u
  23.     }
    - q8 ^$ H! y* y" L7 q
  24. }9 f4 [* H, m' {3 p* g3 p
Скопировать код

# W' y3 [# p3 p% nКомментарии по структуре пакетов и классов:* B. v$ f" _! n2 a3 W8 I6 }8 A
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.6 X% _; r9 e% n1 ?% N* T% u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
6 O3 h8 {1 X7 KЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) A. F/ a, e$ V) h
& c& p/ h1 k) e$ N
. E4 P6 @8 N5 Z+ R+ u0 F" k+ x

# x3 n8 i( n4 ~0 @8 D8 Y
7 L) X' s+ @+ ?0 T  f6 K
1 d" n1 H- P: v7 @6 s/ }' T
& M( r3 O5 ^! D: D$ |' P
, V* p  G0 J, o' x& [# H3 s* g9 C1 _7 O! C( u3 \3 N* \

6 y) h7 W  Y0 J9 d+ [
2 h" ~: ^( P( P4 b: Q4 I* x$ k0 D# V$ w9 z- X

: U. `) L1 Y9 [+ m8 Y% b& U8 F' w) T

/ I+ A: y8 f3 j6 c4 u4 w4 o+ l9 X
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
, e7 {& ^! b) K  DДля управления сложными взаимодействиями, такими как  ...

. c1 L  i7 f! M  kОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
4 l" {3 F. v5 N& G5 {( U+ Q: kОтличный подход! Использование шаблона "Состояние" де ...

* T7 q& o: Y* ?. ~9 aХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. D2 o( F  X7 i: K! q6 j! A: u) j. K4 |7 G2 C
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.' W0 }1 V9 z4 m$ @
: u, `% r3 N' ]  T' L
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : V9 r0 c4 W/ y& U. |% t7 e; F
  2. package org.l2jmobius.gameserver.model.actor;5 f8 H0 j* [2 `; J- t

  3. , N( D) E. k- U* d9 G
  4. // Перечисление для типов атак0 N+ l2 j; l4 w) ~( }% k
  5. public enum AttackType {
    ! `3 f5 B1 ?* R2 I
  6.     PHYSICAL, MAGICAL;
    , z8 w0 H# [. ~6 T- V' [; X5 D
  7. }
    0 z! f, J% V; D1 v% _" }
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.  j6 G1 S" W0 y- Y& X5 l! r4 E6 B6 K( V
Обновленный класс для агрессивного состояния монстра:
( ?: Q2 ]8 m% o: ?4 M! s" ?( l5 _+ u8 a- y: }. K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" X! k% Q/ @, f/ [2 \" b, H1 y
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 B0 G4 ]5 ^0 L4 }6 W. L, U: R

  3. $ C/ b5 s5 L0 a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 J' v& Y: X. d# A  A3 z6 d! I
  5. import org.l2jmobius.gameserver.model.actor.AttackType;: K4 W! G7 r' @* B+ E; H
  6. ! b* z5 S  v! M/ u1 c
  7. import java.util.Random;
    + h- J. K" p& a& A

  8. 6 a3 ~% z$ z& R
  9. public class AggressiveState implements MonsterState {4 f8 o5 ^0 N( V* Y0 j
  10.     private Random random = new Random();, Z6 G7 K! T7 @1 D* n- I/ ~( k
  11. / Y0 g7 y3 l7 w, u
  12.     @Override
    & K2 b  N$ L# X9 P
  13.     public void handleState(Monster monster) {+ W& p8 C5 [" _) l
  14.         // Выбираем случайный тип атаки: физическая или магическая/ u' `7 Z- u( M5 g; F/ F/ A+ a- Q
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    # ?! j4 S5 ?& G2 B3 X4 K4 F7 K

  16. - j0 K2 L: R$ S  x: j
  17.         // Логика для агрессивной фазы боя
    / X  p/ U3 u* E
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & [' f0 }0 _. `% E0 s! Z' j
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    , I+ ~: |1 W' S2 `8 v; i
  20.         
    / N0 r  R. y4 b& x8 T, Z6 v: h
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    " ]8 _$ Q, B( V5 V0 [4 ?$ L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    4 U3 n# F8 y: [! N& p9 M5 p, h
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    % c. U; X. K) ~
  24.     }% \( f" I; a8 V
  25. }. M: T% t5 @0 V3 k/ Z' q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
/ D$ P* Z) x. E+ @' E$ X6 N' E& P8 E4 _  L
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 [8 g! I, [* u( v% d9 K# H
  2. package org.l2jmobius.gameserver.model.actor;
    1 q- ?# T6 ?3 r8 u9 i1 a
  3. 7 Y; Q1 f$ c/ t  U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ x* N& ~( |$ X9 o: J7 J' ^# T: ?
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) Q, L1 \& p/ H; P: P6 z# d

  6. $ q0 W4 O- M) X# z
  7. public class Monster extends Creature {8 A8 i4 J7 _- C8 m* d: d
  8.     private String name;% r4 A4 O9 z% k+ }
  9.     private double attackPower;
    ( `- Y- H3 Z/ ~" K
  10.     private MonsterState state; // Текущее состояние монстра) ^' \* I5 j( a" i+ g5 s: }
  11. 9 W; T) a8 G  Q, a7 ~) g3 g
  12.     // Конструктор монстра- }- Q! x3 L+ M1 N- I$ z$ S$ f* Q0 ^
  13.     public Monster(String name, double attackPower) {
    ! x4 B+ K0 c! i# v! z
  14.         this.name = name;
    5 K" Y2 q8 J5 d3 V; s5 v
  15.         this.attackPower = attackPower;4 S) m& a  G* ~2 k, F/ ?
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию- ]6 Q4 ?7 v  |* h# ^5 y
  17.     }
    2 J4 Y/ X% Q& }( d
  18. & c* [( P. J& Z* |4 e' s" M
  19.     // Метод для смены состояния
    9 j' j+ |, |& x  q+ C* g4 ]
  20.     public void setState(MonsterState newState) {" b% x( Y# W& x% V" b# F3 G
  21.         this.state = newState;
    " T% I) i" U  q
  22.     }' L% x% o/ F( R4 a5 j

  23.   C  P) `" n! d' K
  24.     // Выполнение действий на основе текущего состояния8 P* W1 C. e  O8 J
  25.     public void executeState() {8 g. i' e- Q; n. G  a1 p+ v& {
  26.         state.handleState(this);( G5 w: O' {2 t4 l  r2 {, u
  27.     }) H7 M1 u. j1 [

  28. , X+ a8 k+ z; k) j
  29.     // Геттеры и сеттеры$ O; f" h# z3 o, {! h: |
  30.     public String getName() {
    ; Q" M$ O' y: G5 x4 n9 g. c* K6 [
  31.         return name;
    . L8 u& n( A1 ]5 o& _! p
  32.     }
    3 ~" P: |  {* K) d

  33. ' d9 |* l. N1 ?5 b
  34.     public double getAttackPower() {
    , D; \; z" J; ]- e; z2 V
  35.         return attackPower;3 k: F0 |. c( U9 p) w7 D5 v; S
  36.     }) V+ n2 Q* a  ?9 [
  37. + g3 X: W# z- c, U& z( S+ v2 K+ I' ?3 j
  38.     public void setAttackPower(double attackPower) {2 @# b" K8 H6 n, {, G) w6 m
  39.         this.attackPower = attackPower;; d! H3 ~( `$ o$ `; L4 {1 w: c! J
  40.     }  H" X4 [3 x, K
  41. }
    ; @* |. U5 W' ^! K. q' d& V! [. X
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.( |! |! k: @  d

4 @% q- T% Y9 b3 D5 Z1 U+ c
  1. // Пакет org.l2jmobius.gameserver.model.battle0 z8 y. f- ^) t
  2. package org.l2jmobius.gameserver.model.battle;$ {( ~" x* u1 {5 y6 O/ B; e

  3. " U, g. c+ r& C/ C7 k
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ c6 ]" v/ r6 `; D7 Z- @: x
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 h) w, x  X1 g) d

  6. : W) r, {0 L0 q  o) ?
  7. public class BattleSimulation {
    5 k$ `, K3 B7 l6 }+ [5 \- E9 z
  8.     public static void main(String[] args) {8 m1 S0 ^: c# N0 {$ E( b# p1 B
  9.         // Создаем монстра
    . C# C) w1 H2 X, v5 P* t
  10.         Monster monster = new Monster("Дракон", 100);" J1 A# n9 h' Q% ]8 {
  11. + w; }0 f2 S+ L- B
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    # p$ B% ?8 G. o; N6 f  I. S
  13.         monster.setState(new AggressiveState());
    ' U% Y. Z1 c) l$ T! X8 a  Q
  14.         monster.executeState();3 {6 f3 H, h6 f4 v, l
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 r! O5 \' U$ Z# l# O- [" w
  16.     }  c: b, z" ^  a
  17. }
    4 n/ _/ t6 @' @: C1 }; N$ a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.' n* [  b3 A/ j' C
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
/ ]+ g. T6 S$ y% F
: k7 O2 \) C' w* G6 _5 o' a9 ?3 l; V$ V2 `0 S/ Y! [, K# r  @4 {

3 V! O$ s4 w2 g! e6 _$ s6 n, j: ^. b7 T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

  • Выдающийся вклад

    Прилагайте постоянные усилия для процветания форума в течение длительного времени или много раз выдвигайте конструктивные предложения.
  • Авторитет сайта

    Участники, внесшие выдающийся вклад в работу форума

подписок0

подписчиков0

постов9

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.