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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  {& E( L! `$ g" N
- b8 r9 x2 ^  _! l$ d2 e

7 {' L# B8 j$ |0 x- S! LЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
" t. v& ^. u: I+ _4 ~+ n5 X' wЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!1 H+ S, o4 w& @& o! H: S. R; L2 S; E2 J
Астралия ?- Q' J: ?% y  z+ C
. e' e+ e9 I+ U

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!8 n: N* q( ?- u1 ?
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
: Z' h9 r0 U1 W$ j2 Z" c+ ?1 i# @% I- Y8 ^) i' T2 w$ C9 N

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 w# c! H1 Y8 {4 Q
AlexCoder опубликовал в 2024-10-16 18:31, Z" b- R- B0 Y
День добрый!$ @8 h4 v1 N3 l
В статье описано взаимодействие игрока с N ...

. a" H2 ~# E, Q- ]9 \Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. M* z& x$ T1 _% }) J5 ?6 A0 W1 p* ]- z, d$ d; c8 B" Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# s  V0 w' {' d: e+ [" g. _& L8 A. N1 W& w
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" I$ V% V8 x8 d& W9 ?9 t% x" A
; y1 D1 ^% z, h0 W/ [% o+ K
  1. <font color="Green">// Пакет для состояний монстра</font>0 Y2 W# n6 P! S2 t
  2. package org.l2jmobius.gameserver.model.actor.state;; z! T% e0 {. \; h3 e
  3. <font color="Green">
    ; }8 ?- Q) L; k: V* _2 O
  4. // Интерфейс, представляющий состояния монстра</font>
    # @4 G2 \8 {' o) r) v
  5. public interface MonsterState {$ O# D: }" ?' k- w$ a/ Y; j5 N
  6.     void handleState(Monster monster);
    6 D  ^  ^+ C4 ]
  7. }
    - x9 r- w7 y! H/ `+ L: @
Скопировать код

/ x, N8 v" d- j6 @- d" }2 o& VШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., B, ?: q$ W9 `& A2 k0 s
9 F. D8 i; _! ^" M7 m; i" U1 Q8 A
Класс для начального состояния монстра:* L6 ]8 ~% W9 m) }$ t5 m2 {/ u
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ' N% I/ f7 v' J  R0 V) Q
  2. package org.l2jmobius.gameserver.model.actor.state;* y; p* r4 P! |; ~$ T

  3. ( ^. k9 `  N1 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , Q# ~1 P+ K6 d8 I5 J2 P* W

  5. 0 u# @' v$ }0 X+ A" Q9 K: t. Z0 H3 o4 t& M
  6. public class InitialState implements MonsterState {. G$ r/ w+ R& _- B  \& b
  7.     @Override/ M/ S9 t6 ?# R* f9 u, e9 k# t. E
  8.     public void handleState(Monster monster) {
    8 k: v0 ?6 z8 G0 O; [
  9.         // Начальная фаза боя% h/ v, r5 K: V6 L% }
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! w0 j( U4 r4 e; c( X
  11.     }
    6 U9 {1 `7 ^% _) [
  12. }
    ( q" z6 W' L! `! R
Скопировать код

5 F7 I6 D! A  H, h2 o
1 z: q! Z, `) B  |$ Y9 X! d2 i% ?# F' I* m

/ J9 S  x& D) ]. q9 ~9 `) ]
5 z  k5 Q: @7 w* z/ }6 I8 M. e
0 s+ z5 g( J  L& @
7 m* b2 Y( [7 ~: y, Y4 k( r: K
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). # }7 c' ?3 l( Q6 T. s  z
2 S+ ~0 c, M! y7 \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 _: n9 v7 M" |: e) f' x
: m  x. ]. F7 P/ C" \. v$ _
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 F  C1 `7 N( h9 l7 ?! B" Z7 L, ^9 E4 u: l7 Y/ \- F
  1. // Пакет для состояний монстра" X1 U. Z2 T5 O: q; c. y8 y( _
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! h9 `3 j9 ?  c0 u  f# B; d

  3.   {; F" y( q* W& Y- v2 J3 S1 ]
  4. // Интерфейс, представляющий состояния монстра
    # Q5 K) ]9 p2 h5 X# S( D
  5. public interface MonsterState {' ~: K4 s" H4 t% Y. t! l
  6.     void handleState(Monster monster);
    ' l+ K8 `" k0 n- X! F* x5 Z
  7. }
    $ e  T0 h1 {. Q$ v( b8 t
Скопировать код
" p# z8 x, z: ]: P* q7 q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ) z5 }5 G4 w5 v/ g! j% l# W5 g
& Q3 {. @' F% \
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! ?) J6 Z, P7 Q5 Q; ~1 `
2 a/ M0 [: h  ]8 Y3 Y3 D3 Q
Класс для начального состояния монстра:
+ }: Q/ J* g5 A* k- \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 a6 a& N0 r4 ?- K) q
  2. package org.l2jmobius.gameserver.model.actor.state;
    , x- y7 _3 j& S5 a- w5 q) T. p

  3. 3 y; f# e' ?# j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 m2 A( z9 z+ T( \: ^

  5. , V+ p, |! Q& r) F  ^( r8 J
  6. public class InitialState implements MonsterState {, F* W6 B; h7 t% b( Z. Y5 R0 g
  7.     @Override
    / Y- w" s4 T- u/ y8 d
  8.     public void handleState(Monster monster) {: Q2 w$ s2 \5 s
  9.         // Начальная фаза боя
      D' R1 M, _( h0 t4 w- q! p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
      m  f9 C1 k9 Q- f  {/ q1 o
  11.     }
    2 i( \4 E% ]- K7 g
  12. }
    6 d& n2 {  I* @( p) K' F! R+ i
Скопировать код
Класс для агрессивного состояния монстра:
1 `2 @5 `& u" w: T* _) D) F$ U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 G- G/ v: L5 k% ]' ^  ^( d0 d
  2. package org.l2jmobius.gameserver.model.actor.state;9 F) H' u% q( l! c. W
  3. " G6 J5 R, P. C; X
  4. import org.l2jmobius.gameserver.model.actor.Monster;, J7 V1 H1 [9 A* z5 T

  5. ; |! s, Q# f' e  E
  6. public class AggressiveState implements MonsterState {
    1 `* p" S2 q! s2 v9 i+ T; Q* `
  7.     @Override$ v/ r* L' C: R( k2 l7 {
  8.     public void handleState(Monster monster) {( x6 J9 s! {% H! V9 P- l2 w6 }* @& i
  9.         // Агрессивная фаза боя
    . C1 E, O, h* ~3 t+ c  I  _' F
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    . t* h* Q. Y* B& g9 m: l( l
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки% N* B3 l1 F% b" _
  12.     }7 U8 d7 A- X2 n$ Z# `
  13. }
    . s$ u8 P) P% K7 Q, p" L: v8 b
Скопировать код
Класс для финального состояния монстра:
. {( N, H2 E) Z- y. o4 `$ y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " p6 s% V. O) r; u2 B2 a
  2. package org.l2jmobius.gameserver.model.actor.state;
    * U/ Q6 b. N9 n& R& r

  3. 9 }9 u1 r; I4 ~9 p4 W3 W2 N8 c; D
  4. import org.l2jmobius.gameserver.model.actor.Monster;; I3 X( e9 b! c7 [
  5. # t3 i  ~( y& I
  6. public class FinalState implements MonsterState {
    : i1 |$ n# W. W, S( \6 G
  7.     @Override4 r3 w  z# L8 H# f
  8.     public void handleState(Monster monster) {
    4 z" n4 e! ?  S' y$ }0 }7 l  C
  9.         // Финальная фаза боя
    & m: G: G: P/ I  w! l5 v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; M' h- q- h% f8 [9 z3 C( H; h. ?5 i
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ; s" a. ?- M, n; H' W' r7 N
  12.     }8 J+ x$ q# J# W* V$ M, c$ g$ ^
  13. }) E8 \7 u7 `+ A) a1 A! y/ _
Скопировать код

# j9 O/ S- t3 k- dШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor." [3 Q6 K/ O( q7 L: x/ `) e4 h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + a- U' X, z5 Q/ v2 E! R: p$ r
  2. package org.l2jmobius.gameserver.model.actor;( u3 a  q  S. W' d! A: m. w# J

  3. * l! x& \- f3 _( P7 B+ N+ u
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 l, o: [0 J6 B) n2 g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 ]. |; G7 \4 _, b* W

  6. 1 T; c- Y2 p2 c) o8 n# f3 X
  7. public class Monster extends Creature {
    , E, f6 f3 T; l: b( j( R
  8.     private String name;# S/ t3 j/ t8 @) z
  9.     private double attackPower;' K3 P7 J& T" ~' y0 w
  10.     private MonsterState state; // Текущее состояние монстра" ^4 b% o  }" Y1 V3 T. v

  11. 3 i: _/ |( _$ g. P% r
  12.     // Конструктор монстра
    4 |7 K9 p  @" f7 i& t7 a- K: V, b
  13.     public Monster(String name, double attackPower) {  W& l0 K, Q' ?0 h/ O
  14.         this.name = name;
      G& f4 Z$ Y" {9 `8 Q! Z# Q" p
  15.         this.attackPower = attackPower;' N( V* i- v# g8 d3 X! n
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ ]! b. H5 S* p% C# k7 h& E' }8 G- P2 l# p
  17.     }; k5 [; F: x4 {( t; V4 }

  18. / Z- B  i8 D# l! \3 L6 Z0 o
  19.     // Метод для смены состояния# [0 M5 P( d9 g4 G7 e& b
  20.     public void setState(MonsterState newState) {' z7 Z; o3 ?( A, Q( i8 @
  21.         this.state = newState;
    % ?$ U+ ?5 n: X, j6 M' a
  22.     }
    ! t. k# X: y, P3 M

  23. 3 Q5 B6 e$ i; u1 i3 }5 Y. ^) o
  24.     // Выполнение действий на основе текущего состояния
    ) D: n& ]; f8 n) z
  25.     public void executeState() {6 b0 m! @' ?: L% l
  26.         state.handleState(this);
    ' }* C# e3 R! h' A( s' o* L1 f
  27.     }; A2 C0 `: ^) I0 ^
  28. 7 _. k: H! G$ G
  29.     // Геттеры и сеттеры/ J' ]; Y9 y, b8 E- E* S
  30.     public String getName() {- ?% V- a% R  h% B4 Q* J
  31.         return name;8 y5 P6 t: q5 I+ w5 H2 _
  32.     }
    . S6 h$ h8 h" A/ A, G" V* r

  33. ' }1 o6 B2 K8 {2 s% ^
  34.     public double getAttackPower() {
    $ V! g( H! v) C  }( K
  35.         return attackPower;
    9 G, d! f$ Q$ r( T( _2 m
  36.     }
    6 ~+ R) W" ?( z3 g. I4 r

  37. + }2 D9 [$ m$ n
  38.     public void setAttackPower(double attackPower) {
    5 n3 C5 b) v* w# `/ G
  39.         this.attackPower = attackPower;2 M  t4 `7 i& R7 X; i( [1 o5 t% ~
  40.     }
    2 E% r6 {# `" ^3 p8 l0 j
  41. }+ N4 m! m5 b5 M5 M8 r! M
Скопировать код
. @) e) @& F! u  T3 x
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! a7 o6 V4 `0 ?9 v9 Y% B# {& |$ Q

; P  c7 F) M1 V2 h
  1. // Пакет org.l2jmobius.gameserver.model.battle
      V3 f( Q4 F& X* M. d1 L
  2. package org.l2jmobius.gameserver.model.battle;' R  g/ M  `; \2 ^* N
  3. ! \* x( S# ^( Z- x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - s! l1 l/ ~8 Q$ _
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" d- @8 A+ y- A( M
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
      ^+ O5 o3 ?9 i* s" Q

  7. 5 U. Z6 x5 a- A" C6 {( ]7 p5 ?
  8. public class BattleSimulation {
    9 ^% F8 Y+ ?  f; g  L
  9.     public static void main(String[] args) {
    6 c. x# X7 c3 H; k
  10.         // Создаем монстра с начальной атакой9 m% C2 h& M' O1 C# n( V
  11.         Monster monster = new Monster("Дракон", 100);% T( G' K4 m8 Q: J8 B
  12. + B( |$ s% h6 F- L" ]
  13.         // Начальная фаза
    6 |2 V# i. A- {& K6 K! W% D
  14.         monster.executeState();7 N: G& Z2 U7 Z

  15.   }- |; W! z' M6 r0 j9 e
  16.         // Переход в агрессивную фазу
    $ o" O( P+ z0 |3 _, Q9 S8 Q
  17.         monster.setState(new AggressiveState());* k. ^1 @9 n5 K4 Q1 t
  18.         monster.executeState();
    " A2 ^- Y2 |4 v& }. @, d

  19. 1 e, E) J! |0 k
  20.         // Финальная фаза
    9 y/ Y( ~" t. f; ?5 m- Y4 K
  21.         monster.setState(new FinalState());+ z  f5 h( x( U- |
  22.         monster.executeState();0 `/ b' t$ q! \  z- P4 G
  23.     }
    # U8 d" G( _6 W' F2 `7 Q
  24. }2 |6 \5 |' ?, w; x# s7 o! p9 W
Скопировать код

) s; _3 [5 S+ t1 f& _5 p! UКомментарии по структуре пакетов и классов:
- h) C2 ~% ]- x! Z; n% {- e& C5 lЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ e7 L8 Z" s+ ~' E2 y" H0 ^
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
9 N3 W4 d. u4 w: W' M
5 N! r; H7 w) E1 k/ w4 z, J- ]% ]* i& O% a1 F/ T# N

9 B4 v. f* M7 [7 A9 p! s; e1 e
+ D& A; D* C% p/ ?# a8 G& c! d/ N. {% p# l2 G9 p5 ^. _8 O  w
" O7 ^2 M6 ~5 a2 z- L. f' {7 W

1 p# [+ @  Z+ L# q, i  s8 B( a5 s* ^1 m8 b

% K' }" W$ ?( ?3 A$ I4 x5 _" |
5 z( P; G* @' a/ ~; b& D* z/ v
) t5 ~' l/ p0 c4 T+ U9 g! |" N! X: w( {8 }) W" g; B- T

% e! ^1 `& \: i( r3 J' F
# H' r# g9 B  _
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
+ a* n' C, l3 ^) n. W; M* eДля управления сложными взаимодействиями, такими как  ...

% ]9 G! I* B: Q( dОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:212 y: |( X; z& ^2 W  \9 x
Отличный подход! Использование шаблона "Состояние" де ...
- |3 ]% K* o6 z# y: V
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.' `( B- A6 R  z+ p' o+ b! A' y+ _
5 }; x. d0 Q0 r$ x
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.) a  L+ G4 ?' l' Y: s5 n

( ?/ W3 k" [* J$ S
  1. // Пакет org.l2jmobius.gameserver.model.actor3 T, H8 m% V1 ?
  2. package org.l2jmobius.gameserver.model.actor;
    , u/ v: _7 l" a0 Q3 A) W, p8 D

  3. + B% u, ]. C7 _5 g. q" \+ Z  v8 _
  4. // Перечисление для типов атак
    & H) `/ W. A, U& \1 H4 l- m
  5. public enum AttackType {
    ' a- n8 \+ H9 J* |! v
  6.     PHYSICAL, MAGICAL;. u1 `+ {+ G( X, p+ d
  7. }
    ( B1 W# r# d( {
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак., d4 s# a& F3 T; i1 u
Обновленный класс для агрессивного состояния монстра:" y+ T$ x% b% g7 v
: q4 U  S3 Z: F3 D5 ?. {6 G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% S* g: p: n/ Z0 b
  2. package org.l2jmobius.gameserver.model.actor.state;' l0 M, l4 H/ P
  3. , a$ a" j0 P: o& ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( G. k4 o/ v& T& o. g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 w% B, Z5 v9 [3 @6 T

  6. 0 S# d! U0 r; N
  7. import java.util.Random;
    + C/ Y- H! Z! O' j, u  R! c
  8. 4 `& d3 c0 S: R; m
  9. public class AggressiveState implements MonsterState {& ]0 S8 i9 a* V5 y% \* Y
  10.     private Random random = new Random();
    - k  A2 P& K9 f9 V
  11. ! y: K  o% X; ?( o3 m. W
  12.     @Override
    3 Y7 P8 x& j; F6 U
  13.     public void handleState(Monster monster) {" w' u3 P8 C3 d
  14.         // Выбираем случайный тип атаки: физическая или магическая
    / j, x- `; M8 `" q, L
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;4 Z+ I4 A4 b! E% y# t: |- m

  16. 7 N! b. P0 N2 r+ j' X8 x$ Z3 F
  17.         // Логика для агрессивной фазы боя
    8 F7 l# g, Y0 Z
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 C3 t4 h& k- J: b- G+ W0 t7 z
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    : W2 f3 }- r- }" U
  20.         4 m( i$ J/ v! o+ {* ]
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    & U( _. S. |7 h" g* E# O0 d0 v6 B
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;8 @1 G7 R! e* ?- Z& [, P
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);+ F* f: z5 h" a9 M" H
  24.     }
    5 v# @. u; T, ]7 j$ w8 L; Z
  25. }! C; O+ ?6 m+ n
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
+ z  U3 M5 a+ e& q8 j8 ^* h, }0 j2 C# y# b, N, K% t2 ?; o( l. A, _! t
  1. // Пакет org.l2jmobius.gameserver.model.actor( ]7 j. W! ?) D0 n0 z  a& ~: h
  2. package org.l2jmobius.gameserver.model.actor;
    - n  Z. t* f+ J7 `% s) ]

  3. 6 }( h; X8 h% I2 x0 j2 Z6 a" v
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    " X! L: _4 H, N3 D7 V+ R7 V! E
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ' r9 i; S* G5 k3 q. X( T, _8 p. ~' D* i
  6. 4 K7 Q2 W: G( M/ u8 G7 C
  7. public class Monster extends Creature {
    ; x! i, V% N/ Q. x' R
  8.     private String name;, S- ^7 G. y, ?& z
  9.     private double attackPower;
    # m! j/ e. v; D) g
  10.     private MonsterState state; // Текущее состояние монстра
    ! s, t* [: y! \9 Q9 D

  11. $ O/ e3 f4 z# l" d9 P5 V5 C6 {
  12.     // Конструктор монстра
    ( H8 i' m. U- i
  13.     public Monster(String name, double attackPower) {! T5 W9 v: s! }$ I
  14.         this.name = name;: y+ [8 O8 b- @+ u# X
  15.         this.attackPower = attackPower;, r# _+ P% `* F( b
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию# ~+ i- X- t9 M# B: a
  17.     }
    5 `9 Z- \- I0 o& {" d- S+ q
  18. $ V6 p- ~7 d1 z+ B
  19.     // Метод для смены состояния/ I6 U% F& g" V
  20.     public void setState(MonsterState newState) {( M' I* k: h9 M, C6 S2 P. k7 w
  21.         this.state = newState;1 A* l; r0 ~5 C! \+ A- H
  22.     }. i; f# n7 N: r+ K+ k
  23. 5 f) Z; A* T, B0 `! W% i4 T: J6 l
  24.     // Выполнение действий на основе текущего состояния" N, f# T8 n# D/ s# ^# [* i5 G* r
  25.     public void executeState() {( E- Y$ r, S; b5 k$ Y$ l7 A1 I
  26.         state.handleState(this);. s1 z9 |* X. Z- F
  27.     }
    $ Q$ }$ H- j- r4 @: ~. u" B

  28. 9 e0 v1 V' m1 x+ a
  29.     // Геттеры и сеттеры0 k3 I( A# b% e
  30.     public String getName() {
    " w3 Y6 j* y/ U
  31.         return name;
    1 ?" f: G0 e0 f
  32.     }; Q  Q" b5 o4 O, X6 g3 X- B4 r4 t
  33. ' |! N( i; H! f% T' u4 o- j: j, x
  34.     public double getAttackPower() {5 @3 Z8 [% c  V5 `
  35.         return attackPower;
    ! w8 |2 p# f5 j. t" L' U+ `% B
  36.     }
    ! `- s+ I% V- Q6 \9 A

  37. + p) j) m) K- g  F" o  }$ g0 m4 u
  38.     public void setAttackPower(double attackPower) {# d$ J3 ~) N) J! Y
  39.         this.attackPower = attackPower;
    7 e+ d3 U2 P5 X, t
  40.     }% O: I" r& d2 M. r2 |  z
  41. }
    * @8 \3 u8 T8 \) ^6 e/ q5 h6 O9 v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  Z; |+ U8 s/ K2 {! ~  y1 o* c4 G8 ~! \9 j
  1. // Пакет org.l2jmobius.gameserver.model.battle+ L, w$ F" n1 v) A# D. ?$ |
  2. package org.l2jmobius.gameserver.model.battle;/ R6 u6 z, C6 q& O/ V$ q

  3. $ }0 w0 m1 r- |* L0 z8 L. Z, T0 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 K, }  y5 \" N' D* d( v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;6 p4 p5 ]8 j  E7 i

  6. ( U" a( c4 s1 O% b7 N& w
  7. public class BattleSimulation {
    & \) a8 q& K9 u% u: D
  8.     public static void main(String[] args) {
    ) P3 _# \# K, c5 U$ B
  9.         // Создаем монстра
    1 b' v+ a& t5 n  \- B7 O
  10.         Monster monster = new Monster("Дракон", 100);7 d. L9 |& c4 q6 V5 ^! j7 A0 `
  11. $ a3 O  ]+ L; {, ~. `7 _$ J7 Y! ]
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    0 A: x2 h4 x; H. {; S# J+ P
  13.         monster.setState(new AggressiveState());6 \) D" |7 s' A5 E# U
  14.         monster.executeState();) M4 t6 a1 t, n" w* i7 w, {
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак$ j0 M7 Q% T1 e+ r& k5 u
  16.     }1 Y2 Q+ E  d# F( F
  17. }$ _, H+ P" B+ G3 Y( L, V8 E# P
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.5 @& X7 G4 Z7 k+ |0 v& r2 i
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& p8 C1 H$ r8 H* u2 I7 g" K. T

1 r6 O0 b" m/ _6 I
. [1 U- I  f7 D$ A. o6 r) A6 Z( u
2 c6 J- q6 j' J8 R3 h: r4 z: X




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