artace.ru - творческий сектор

Название: Шаг 3.3: Взаимодействие игровых объектов [Версия для печати]

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# C; ^& i, Y7 J9 L
1 ]6 B* C, L" r! i% \* I7 P
! B5 z  e4 M9 d
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ n2 l- H+ ^  a+ B8 \9 QЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 o9 A( h; A5 U! Q0 f3 ^: {
Астралия ?
. {/ N3 j- a0 }* i" r+ n) n) e+ d8 Z/ j- m2 H+ B2 m; M

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!9 |( x% \: }* b0 f$ E) L5 J+ K
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?7 X; m* E3 d5 v: r; j* j% E! z

- Y" t% G. A: d8 `
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
1 j3 F8 J3 y& M9 I) \' Y
AlexCoder опубликовал в 2024-10-16 18:31
: B2 j9 y. J& S& Y% L% ?День добрый!
4 }  Z0 A% ?! u+ j) [$ s* t# \, bВ статье описано взаимодействие игрока с N ...

9 m* p! r' a: V6 I! p# |* nДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
0 x! @5 \1 d, u2 _7 M3 n9 k6 Y% I/ t( n# u  t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.5 j: D# u* U& K+ }( J9 ?
" S$ x: t: F' o* _* D2 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% F# R8 p6 J2 q$ d6 e

8 ^- x# r1 \+ ]  q
  1. <font color="Green">// Пакет для состояний монстра</font>$ L) a$ w  d& t/ r. M9 {8 i
  2. package org.l2jmobius.gameserver.model.actor.state;
      R" @# ]5 d. K/ S
  3. <font color="Green">
    % D7 O! x. e; _3 {
  4. // Интерфейс, представляющий состояния монстра</font>, \) i5 S; D$ ]9 y8 o4 R9 K! A
  5. public interface MonsterState {; V. ]. [" y, T( t* A8 L5 X. ]; s& }6 u2 s
  6.     void handleState(Monster monster);, O' p* d7 [2 ?
  7. }
    ( u8 {4 V' T! I
Скопировать код
- ]; a; y7 f& v$ V3 E3 O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.& W1 ~% ~' o: I1 h; C

, {3 P) s! f! \Класс для начального состояния монстра:
- p; ]* D% u' ^  g7 R3 c, R3 @5 U/ T
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>) }4 `1 l, e8 t8 r9 u, Y: A
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 ]5 B, N8 L6 q% d& {2 E
  3. & f( r+ v7 b& D! S
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 [6 D! p0 p( U  R! Z9 T

  5. 6 h" f' l1 B% d
  6. public class InitialState implements MonsterState {: d* d- L4 M' Z: W# A& c( ?8 y. I
  7.     @Override5 S5 y) ^# m* j; h+ x
  8.     public void handleState(Monster monster) {
    0 Z9 j: [$ I) z) i. Z) w
  9.         // Начальная фаза боя
    $ c: v; T3 N: m$ E: t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ y8 e+ ]; r1 ?: Z% a: A
  11.     }  }) R; D$ j9 o1 ]
  12. }
    : w% F$ i+ n* z
Скопировать код

6 [6 U4 h, Q' g/ M3 |; q; ]; j- j4 v8 d; A
7 ?( Z  f4 o0 K0 n1 w8 M/ j7 S0 ]

. @" M& j- ^) i, p$ C/ U+ i
0 x9 o+ u! a4 s) `3 L; E0 z+ t' J- {2 y; X  S

- k8 D( M- W* x+ E1 W, @! _' C! I. M7 D
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 ~3 v( N: q! c7 o( n  D

+ f5 E: ^4 C$ GЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  L3 o6 L0 T& P; @
& ^& x5 s8 v) f' i; ^2 Q" ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
+ k6 ]1 q8 ?, w$ n2 w8 g! I2 U' D8 e+ Q- F# Y9 l
  1. // Пакет для состояний монстра
    ! W( ^8 Z& v6 ^! h
  2. package org.l2jmobius.gameserver.model.actor.state;7 C6 A: Z+ y7 w

  3. $ D6 Z2 k- f$ _; ?+ o4 ]
  4. // Интерфейс, представляющий состояния монстра
    % \; w' u' u1 x1 n6 J4 P
  5. public interface MonsterState {
    + H2 S9 e7 h9 K/ F. }# _9 ]
  6.     void handleState(Monster monster);5 T- b1 ~1 \& M7 B" t# V7 M! e/ d
  7. }" j' d2 v: |$ e3 Q
Скопировать код
- D$ x/ N* ~+ W! I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # R, P( q) w, C$ d. K4 d3 A" p( V- n

2 f: [: O3 K/ X' OЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.$ I4 i7 i0 x# ?1 }' [* M, G
- ]  f8 c2 [3 k
Класс для начального состояния монстра:
4 `# a( B& v  i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- H$ `; ?/ h2 O( N3 y3 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    % Z- f" e7 I* P' j( \1 B% m) o

  3. 7 {2 x: }7 A* l$ b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 s7 H$ x9 y4 t$ x

  5. 6 \8 g: V! @+ Q7 {
  6. public class InitialState implements MonsterState {# ]2 V2 s8 u+ n5 q1 N0 D  h+ m
  7.     @Override: g. h- n$ t3 r: a$ }  D) Y
  8.     public void handleState(Monster monster) {
    " R; I, l- |# ~+ R' v
  9.         // Начальная фаза боя
      C- g- C+ v+ Q7 @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");/ [! O5 u/ E/ i) P
  11.     }- I5 x" c& b; S
  12. }
    " R) A3 _( J5 K
Скопировать код
Класс для агрессивного состояния монстра:, u3 v) ?. R/ c* D0 |5 H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + D8 o: p9 f+ }8 V& D  M8 }1 g2 D; d
  2. package org.l2jmobius.gameserver.model.actor.state;; a7 v8 |5 p$ ^5 U, B

  3. + Q5 p0 p$ m" M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 s* c0 Z2 q  C: B4 \% z9 v$ {
  5. # Y$ T* s; _8 b
  6. public class AggressiveState implements MonsterState {4 k$ Z, _  B6 l! ]4 o0 r
  7.     @Override
    % P) |: W, a# z" M
  8.     public void handleState(Monster monster) {1 G8 l# w1 e# p' m3 m
  9.         // Агрессивная фаза боя! r. r5 J& N4 P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; C3 j3 A8 f$ ~- Y4 N+ q5 R
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    7 S0 c3 z5 Q0 [
  12.     }9 h5 X( J* l) C8 m3 K
  13. }
    0 i3 m/ K3 W# {) D3 W
Скопировать код
Класс для финального состояния монстра:6 G2 d( C9 \9 K. F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 l3 D3 p; ~# ^# j
  2. package org.l2jmobius.gameserver.model.actor.state;# V: a6 \9 W! E/ o2 }

  3. 7 x& W3 ~1 h3 L0 P* n, F! G( h/ k- m$ ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' |% g  U0 p1 b/ |+ u* n% D2 a
  5. ! A* A% i. q9 t4 [1 Z8 d
  6. public class FinalState implements MonsterState {7 `# r5 H7 h( a& h) E4 I
  7.     @Override
    7 T2 ~; M+ `- }0 e
  8.     public void handleState(Monster monster) {% e1 J  T) X5 z
  9.         // Финальная фаза боя) {5 O  U5 Y$ |/ p! T" u+ \8 h
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 B7 t# |0 ], u0 Y1 t5 V- S
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    + m$ V( U: u+ }, |2 z  ^! Q6 ^: r
  12.     }
    % v* I6 L. j  C% ]9 o% u3 o
  13. }) o6 x- s- e: p; \1 `- `
Скопировать код

, r$ R/ t8 w4 ]& eШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; X- J8 J: Q( A& N% l6 q+ [" }
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' V5 c" i+ t* P5 O
  2. package org.l2jmobius.gameserver.model.actor;8 w3 C$ m/ S. C& [8 h

  3. 2 g: C" [( I1 s. z# L: q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 ?# D  p% v/ o: i7 ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) S* K7 g8 C% A- x

  6. " S9 a- G. B4 c- |
  7. public class Monster extends Creature {* o1 X" l' P5 b+ ?$ T
  8.     private String name;( r5 y2 v. r# \% X/ j1 y
  9.     private double attackPower;
    9 i7 p6 F2 e( a
  10.     private MonsterState state; // Текущее состояние монстра
    % ^+ D  s% D4 v" u9 U! K

  11. ; _$ x2 G' s. R4 a1 O
  12.     // Конструктор монстра
    + i  ?/ n3 A) f5 m: @
  13.     public Monster(String name, double attackPower) {
    9 u9 J& x" O7 O- O' v
  14.         this.name = name;
    7 E. ]( h1 a# x$ c2 \* r1 n% d& D
  15.         this.attackPower = attackPower;
    % x; w8 Z. S& X8 J5 t0 i
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ; O+ V; i4 X5 F; e
  17.     }+ w; \6 E. e# p9 O- @
  18. ; l/ w5 Z) N/ t- S5 r
  19.     // Метод для смены состояния3 q! |# ~1 i: A! V3 ]' b9 K: @
  20.     public void setState(MonsterState newState) {3 o8 I$ X; j* b  c  p! v7 O$ H7 q
  21.         this.state = newState;
    7 H2 e+ v( n  b# u3 U
  22.     }
    ) M; r6 h& }4 L. s! O2 i! p6 Z: b

  23. ( X# T3 I- V6 q9 u) W/ N
  24.     // Выполнение действий на основе текущего состояния( Y. d( q# F  Z: |
  25.     public void executeState() {
    & {, k" P/ G$ D: {1 w& y  y
  26.         state.handleState(this);. m0 ~! ?/ G" C) l
  27.     }
    2 j4 G; V: h, G

  28. $ d. v0 ?: O/ ^8 t
  29.     // Геттеры и сеттеры
    : S% G* C+ D! h; j3 y9 l
  30.     public String getName() {
    4 L9 ]$ u( T; B: R" A5 H: q
  31.         return name;
    2 k' ^, C' ]1 ]. `7 q5 o0 m* F3 _
  32.     }
    0 X) \: y1 Q- ?/ e$ N- C8 C# ]' u
  33. % p# m& \% v. j5 H
  34.     public double getAttackPower() {
    ; R: V2 D# f, h
  35.         return attackPower;; V4 d, e- p- R6 i( Q8 |: m
  36.     }3 B  X. Y6 x7 n9 K$ L8 {! y

  37. % Q) ~; [) R( R0 G9 _6 w
  38.     public void setAttackPower(double attackPower) {
    9 g  G& x+ j- y" j0 ^
  39.         this.attackPower = attackPower;
    3 }0 v* M* P# I: i* l& a+ C
  40.     }
    ( z( A. F: b5 F% e; k" b7 B; h
  41. }- f  Q! F$ s5 x
Скопировать код
3 F& x+ a: H* ]) b
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) L/ `8 S) x, y0 L" M
* E$ g5 t. B! v  k! \; i# L& X& z' F/ q
  1. // Пакет org.l2jmobius.gameserver.model.battle! I/ v7 k6 G- |
  2. package org.l2jmobius.gameserver.model.battle;" v# d& A; j0 v3 B4 z

  3. - [* b& W. Y# n: a% O4 t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . [# }* D( |4 M/ d6 `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    9 j; X2 N! c3 C: i9 s0 a
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;/ ?2 e% b9 Z/ t0 ^2 ?" \" M

  7. 0 f( s. Y5 u& v$ |+ p
  8. public class BattleSimulation {
    5 r( ]  K/ b' t
  9.     public static void main(String[] args) {
    $ o; V  F# v5 }5 G
  10.         // Создаем монстра с начальной атакой# i8 i1 B# r1 T  D" c; u# I) z& S
  11.         Monster monster = new Monster("Дракон", 100);
    2 C7 t9 h$ q: `' s+ O6 p
  12.   N! c' o! u" \  s, F( y4 O1 U
  13.         // Начальная фаза* Z9 e) Y% m. S. d
  14.         monster.executeState();
    5 m$ w- J" P+ @2 h5 @3 `

  15. 4 H1 o9 {7 E7 I. @! O- O2 j
  16.         // Переход в агрессивную фазу
    : @5 q1 ~# m' ~# I) F
  17.         monster.setState(new AggressiveState());; [: }( ^5 X9 d3 P6 z3 R& M
  18.         monster.executeState();
    # i1 Z, Z8 s6 g+ u% w
  19. 2 a1 \1 ~) |8 o0 x' k
  20.         // Финальная фаза: j- l: Q: e6 Q) m  M
  21.         monster.setState(new FinalState());5 }/ H/ e: u" {! z3 E
  22.         monster.executeState();! H5 E2 N: z0 N( _4 w
  23.     }
    ( E8 M7 u, t, M/ ]* u) J' G
  24. }
    ) o& Z0 B' ?( B1 p! V& h- c
Скопировать код

* z) q: @- X. eКомментарии по структуре пакетов и классов:! u* x7 o$ U' ?% D0 r% g8 T; [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.3 ~# ]/ I! ?6 H' n7 {) u' d
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
9 c$ e0 E0 X" ^- l& S
# h3 U" U% s% c+ q! p. H% ^9 t
4 g# d. }, r, Q: s6 {# Q2 X
1 u! v( f# n" h3 R( ]) N1 m( o
; n$ U, J! \) |1 m
" u; H8 T5 C9 S! I, E5 x- |9 y( a. Y
( ^, B: E  P! O# z+ a
& [: H1 L8 C* J% @7 T0 }/ y0 m& x& Y( A5 U8 ~( s' F& S
9 q  a0 Y5 N: U8 c+ _4 a- v
- _7 e& Q8 [  C0 S5 e) q+ N2 k$ h
. ]$ w3 a: p7 G' ?7 p4 O

, z4 O' @3 E5 f1 H) ?9 \
6 X% r% |! z) Y# F# m" M7 ~7 L2 e$ J. d

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04' H% ?2 a( J1 ^, M
Для управления сложными взаимодействиями, такими как  ...

/ }9 I9 U% l+ s; V2 {Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
9 B: E! \: W" a: \- zОтличный подход! Использование шаблона "Состояние" де ...
* {. \9 ?: \& j" J" Q
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.; C% @' |& r' S3 w. g! W  Z2 z
& O8 c, y. g, h! }0 U
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
2 k' @' N7 R$ \/ D2 q& z1 o' e! B: `/ D9 C& i/ l$ y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " p' ]/ b4 a) C: I1 ^; \, Z
  2. package org.l2jmobius.gameserver.model.actor;
    / R3 i5 `; m7 G$ g

  3. 0 D( n' i5 U) U+ v9 {
  4. // Перечисление для типов атак
    ) o4 l, r0 O7 ~# S9 P1 ~( k
  5. public enum AttackType {
    1 c. n" o  t+ d$ n8 _
  6.     PHYSICAL, MAGICAL;
    ; ^4 A! x2 O" A2 q
  7. }- [3 ~: _% T' o. {8 h* a5 U4 u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.! _6 c$ r* z  @* E6 }3 G0 T8 W" m0 D
Обновленный класс для агрессивного состояния монстра:
  v$ h0 ~' N- D1 ^2 Z0 Z! |6 [0 t9 O' e( }9 h7 G9 C9 E) v; Y; c/ L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( Z& f9 _+ @" \: v2 Y- A! b* }
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 F& A: N" g5 o% g! V) ~. N7 k

  3. " K) m, M8 q+ h4 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , H' X, C' V5 m+ y8 B
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    6 X) A. X+ U( ^, Q; M  y
  6. : f( ^8 T5 o- G4 q8 z8 a# h
  7. import java.util.Random;; B9 i# Z9 P, a3 p8 l2 f$ n. ]
  8. - U3 Y: d3 Q. X' _2 s' \" e3 J9 H
  9. public class AggressiveState implements MonsterState {
    ; F5 ?6 M# a  c8 a
  10.     private Random random = new Random();
    ! X, L7 q; U8 r' |/ @+ \

  11. # l& S! K7 G6 P: e) K+ R) Y: S3 l8 J& g
  12.     @Override
    & q2 v) M* k# m4 Y  v0 e0 v$ D
  13.     public void handleState(Monster monster) {7 @. W& @3 d3 m1 @+ m
  14.         // Выбираем случайный тип атаки: физическая или магическая+ b) A. M6 ~- h5 |" e5 X, l  X
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    $ ]: V# H1 W. h0 H
  16. & m! J' |* ~: `9 X2 y3 ]3 [1 a: b. |
  17.         // Логика для агрессивной фазы боя
    4 F/ S: c! H% Y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 0 r! j; y, h1 H8 c* I" c3 c
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");9 m+ M2 ]# L# p3 Q# T
  20.         2 M! `- [/ W. e- t7 D0 q0 Z
  21.         // Увеличиваем силу атаки в зависимости от типа атаки6 a) {, r# P6 P2 U. T
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* D& H; h( h# K# D
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);& n' v* F4 q% H
  24.     }7 ]$ z/ F& D& @, F* h% _
  25. }
    ' o& B1 W- q3 O! t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. ?0 v% ?" l, O; d: j( l
/ }8 c. i0 ^' m; }; m* [) P
  1. // Пакет org.l2jmobius.gameserver.model.actor* W* B7 b! S9 Z9 E1 M, I
  2. package org.l2jmobius.gameserver.model.actor;0 H* ~: S5 C1 q7 m# Z* N% `
  3. 0 V! b& v: ^2 U, v% J5 x5 G
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 h  S) I+ `! l9 p# ^5 E) j/ g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 }: X) x! J4 g, p) p2 x

  6. / D; e) g- k: u1 U2 A
  7. public class Monster extends Creature {* o- K7 @, A1 D) W
  8.     private String name;) d: O# Z9 m1 n# p( [/ O1 c
  9.     private double attackPower;7 Z- ^4 D  E+ J  c9 t
  10.     private MonsterState state; // Текущее состояние монстра. A6 f/ T7 F0 Q) q7 N- E- M- x& E- K

  11. ! q2 u. `- Z& F$ E: n: b
  12.     // Конструктор монстра" o# x6 T' u9 ^7 n
  13.     public Monster(String name, double attackPower) {
    9 d/ F) m& j7 B+ ]3 O9 \7 x
  14.         this.name = name;
    $ K. y& U. \: L
  15.         this.attackPower = attackPower;
    & V  u) B, v! C; p: n
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 s) \* |/ T* g  J' r  H7 W5 p# S
  17.     }; Z" y0 j$ i$ y( \" I" z) C% A# |/ S
  18. 7 h( m9 g5 \( A) D6 g! H* ]9 M: z$ [+ x
  19.     // Метод для смены состояния
    * A7 C- u7 d5 q  f
  20.     public void setState(MonsterState newState) {! u$ }. n! y0 g( S
  21.         this.state = newState;; V7 G6 }3 L- c8 ~0 i
  22.     }
    ' B+ o& v" t. ~+ I
  23. , a% b% u, d' a: F( ?
  24.     // Выполнение действий на основе текущего состояния
    5 }. o# |% O% ^3 |7 _
  25.     public void executeState() {3 m/ {9 \' ~/ z4 ]5 r
  26.         state.handleState(this);
    / i  K0 y  g9 m- X/ H4 C: ^
  27.     }
    . O7 ^4 Y6 Y: G, w

  28. % l* L; E/ z" t% B& v$ ]
  29.     // Геттеры и сеттеры3 o: w/ b6 k9 a* G. Q+ J! X
  30.     public String getName() {! Z& j# b1 R, C) m8 A
  31.         return name;
    ; L$ r# g& W7 N) D1 _6 z) d, r
  32.     }
    5 Q* Q0 F; J+ w' x0 b' G. c3 ]& D

  33. 6 R  h- B1 Q0 ^; m
  34.     public double getAttackPower() {
    4 g7 K9 D& W5 R' F# K
  35.         return attackPower;
    5 l% z$ ~! a3 O3 b2 N6 a' N% b
  36.     }/ h5 q% A/ B/ ^; z' Q
  37. ! v' n$ S& P, C
  38.     public void setAttackPower(double attackPower) {5 ]) d) E' Z1 F5 k4 [: C
  39.         this.attackPower = attackPower;4 o, o0 P6 U8 l- ?: c3 Q. O
  40.     }
    " s# Q3 E- R# e) I7 |+ _
  41. }* G( N0 {% C& f6 q6 e( }4 c) F
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.) j2 |9 m+ p- a5 S' s2 Z
7 i' a- \  H- {( c4 l
  1. // Пакет org.l2jmobius.gameserver.model.battle" a  q8 R  ^- O8 L
  2. package org.l2jmobius.gameserver.model.battle;
    % W6 E9 Q  Z: P; e8 p& o

  3. : c; J8 l. f3 O2 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      t- P1 x2 J% e# J% v) Y* Z. W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, ^# d. e7 ~' t8 Q0 N. z9 a# a

  6. ( @) ?! |! c: t; R
  7. public class BattleSimulation {
    . R: [$ u; i/ W; G$ f
  8.     public static void main(String[] args) {2 N/ U3 ~8 O, q4 T! I, [' e5 i
  9.         // Создаем монстра
    7 F; t3 J  r, t" g3 u
  10.         Monster monster = new Monster("Дракон", 100);
    7 _0 b) [9 d, K
  11.   F" z; C# Z2 G8 `; s% H
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак% R5 l2 v! |7 H
  13.         monster.setState(new AggressiveState());; V# _0 ]7 U3 x
  14.         monster.executeState();
    . m; p) N% b0 A) a, u: m
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & s/ D- @* |9 w) M' @6 M! X
  16.     }4 M" q! f3 W) ~3 s( U
  17. }# Q  D! p" s4 t% [9 K- G4 @
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
( A5 {& |" n/ OЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!" p. ^7 u5 C7 A0 d. k
; Q* i- ?9 a5 M

4 {! h# K% C. x. F6 v& ?$ z  ], C9 m





Добро пожаловать artace.ru - творческий сектор (https://artace.ru/) Powered by Discuz! X3.5