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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
7 H; x  ^- m$ ^2 b( ~
) K) ^( y+ ]) u- E, E* |7 u

& ^4 F5 {" A  ]8 R' p/ [" t! l5 OЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 [- c2 b) `% `! D' k3 ^2 C! M
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!% i+ H5 [+ m# ]+ Q8 l
Астралия ?7 n. s6 V/ j% c' C
* H% H" D% d* f1 N/ u+ @

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
% G5 @+ i3 l5 {& z5 b7 fВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
' g6 O+ D2 G' c8 l& W
6 O3 Z! E* [$ g/ o8 T
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
) D! ~- A4 e/ J  s" @7 C5 N
AlexCoder опубликовал в 2024-10-16 18:31
% d9 W0 X( {, U# O- ~9 ~4 AДень добрый!
) P6 R/ H& J2 Q1 _  ^2 L- ^5 uВ статье описано взаимодействие игрока с N ...
' B' T7 R* A9 z2 j$ w- m6 J- [
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ! A3 z* B  z. b) b# {/ S

+ R4 p1 |# {; oЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( `0 C# T: p; \2 i

( S) R2 \( a! B9 ?2 r# XШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' R5 r" h8 D3 n* p. k% i4 d
) G8 z+ h- ^* w# J
  1. <font color="Green">// Пакет для состояний монстра</font>* [( Q- l! W' A! V
  2. package org.l2jmobius.gameserver.model.actor.state;; Y! C) \2 j0 ?8 ~# j; F2 @. k% a
  3. <font color="Green">. T3 l) \- C. e6 W) J- n
  4. // Интерфейс, представляющий состояния монстра</font>: `% \1 v2 I  f7 O& x( E
  5. public interface MonsterState {/ c! X: h6 c/ K* V8 ]4 T( w; t+ H8 b; a
  6.     void handleState(Monster monster);) }. Q' T+ Y% Y- P* i
  7. }
    6 Z4 i) ]; A; h
Скопировать код

3 i% x& K: ^% G) [+ ]Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; {2 E  }1 n- F& u% y# _2 |( W( Z
Класс для начального состояния монстра:! C7 i5 i9 Q, G8 B  S% i7 b; Q
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* f& |# U1 H1 [& T
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 i; B9 a5 v* |+ Z/ G
  3. . h$ X; G3 U; ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . f# i% _; f) _9 |

  5. * h7 ^4 E/ l( @, H8 l0 e# e
  6. public class InitialState implements MonsterState {
    " @1 ]0 x7 O6 T4 z# F3 s
  7.     @Override
    ; P8 [/ }4 f( Q* U
  8.     public void handleState(Monster monster) {+ o% ^& I3 K# m: a8 P* ]6 s
  9.         // Начальная фаза боя
    4 P, L& h0 B" y7 ~
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 I4 T% n( Q( h$ p* n& C& C( D# m
  11.     }
    8 x4 v7 O5 z: x4 A* b% f( V7 P0 p
  12. }
    ; t- W$ F: \! N: ^5 H  B* W1 S
Скопировать код
0 S& i8 V9 r5 u1 p: V1 A9 v9 h

- l1 J0 c4 e/ z, E. z  X7 i: l1 z! R$ z8 V
0 @& f# R: X. C9 X' r0 E
) A# e2 }: l# o3 S% P

' h* s; ?  H% w, f2 u, d& o! V. O- J
, a$ m4 V( w% d, N, a
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 ^" d1 u: ~$ B2 o0 \" o5 k4 h- l1 R) t' I( s! b2 S6 i. r% l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ w+ Q& A. G/ e5 d* D' E* T4 M! Q4 D. Z- G2 ~) X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 C3 m' O* a, h# w

3 c0 r2 C& {, e% }% W9 @" U4 A
  1. // Пакет для состояний монстра5 Q2 z/ m" z  h
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! P& M# b9 x$ }% V( m/ u

  3. . u2 H- R% W8 A# {
  4. // Интерфейс, представляющий состояния монстра
    * w6 H' s! d/ |: z
  5. public interface MonsterState {
    - R: O6 X5 f6 ?
  6.     void handleState(Monster monster);
    & E3 l$ [) E, h9 s9 A
  7. }
    * h" Y6 z7 r# s, B
Скопировать код
4 a" k2 z4 Z3 a' c
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
  `; k! p1 L4 @5 J4 G
4 l. f" U3 I$ c% V' IЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: _4 E" }, w5 v6 o' u0 Q

4 w  F( D4 z- i* `5 ^* c" |9 xКласс для начального состояния монстра:
7 \! z5 R% ^! \* p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " k, K$ ]- D5 p& m
  2. package org.l2jmobius.gameserver.model.actor.state;' |+ Z4 V) Q; G( F

  3. 0 d3 V; v+ ?* m/ U% _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      a+ D6 w. x- t+ w( @$ h& k

  5. 9 w' ^7 q3 B7 {# R" w% S
  6. public class InitialState implements MonsterState {
    $ {4 P2 ?" c1 I+ C7 z# {" V! k
  7.     @Override" |& p2 Z7 s+ c3 n% [8 e8 Z
  8.     public void handleState(Monster monster) {1 e% S' L8 N  x
  9.         // Начальная фаза боя6 v% y3 |+ g$ m4 }; {" c! L% x- Q: Z& X
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    + X' ~; |7 {# v2 R2 `
  11.     }
    9 A1 e1 _) t  p+ ]. q4 ]
  12. }
    % p  M$ Z; m8 P- t5 n
Скопировать код
Класс для агрессивного состояния монстра:
* D& X' f* W' L7 W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  q8 U6 {- i7 \" x1 C* r
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 f: d% V( r& N
  3. / |% K7 F$ a, q( E9 i2 ^$ o& [% Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 x& g/ t- A2 ?/ l  S$ F- z" `' ^

  5. ' z% z- |4 M% k2 K' o/ Y9 a
  6. public class AggressiveState implements MonsterState {
    6 X4 u+ R) p6 h) O1 z
  7.     @Override" S4 D1 K! u/ q1 l
  8.     public void handleState(Monster monster) {1 P+ T0 l; T6 }& b" i5 y+ ^
  9.         // Агрессивная фаза боя
    3 P) _8 ~8 b! \# ?1 E, U1 e
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");, G0 `* v  e1 c; ~6 n1 h  m
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; O' \4 M# s% l! ?1 ?
  12.     }; j+ M! ]& O+ L2 d' G% @0 _$ ^$ ?3 ^
  13. }% l5 K7 o- p) p5 k0 ~, m
Скопировать код
Класс для финального состояния монстра:! Y& v3 _7 f1 q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. w( |7 [$ B% i0 x8 s5 s1 W' p9 r
  2. package org.l2jmobius.gameserver.model.actor.state;. v% F. T. }3 I" g

  3. % p  X' f% y& V8 G4 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;- b4 q3 U# b; Z( ~

  5. 2 \4 @% M  Y( l
  6. public class FinalState implements MonsterState {
    ; [' ]$ X$ x; W' E# [$ }
  7.     @Override
    4 h4 I; ~& U/ T9 T# [$ H& D! @1 |, @2 y
  8.     public void handleState(Monster monster) {, T* a) g8 Q) u0 |6 n# W( O
  9.         // Финальная фаза боя
    $ A7 S* c% c- z* \1 `
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    7 j5 Q: o& N& K! o/ x" I* Z8 I
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    . N8 ?5 `8 O" N# p% V1 ?
  12.     }
    ; l3 H! i7 V( \$ ?' I8 P7 x  W. N
  13. }
    % |- S2 A' ?2 B8 j9 V9 w4 [3 C: X
Скопировать код
7 M' I- h, M1 x+ A% B: X4 _( M
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.9 y6 H. E7 k7 ]& |5 R6 q8 X
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 Y; x1 b& P* t" h
  2. package org.l2jmobius.gameserver.model.actor;
    # m+ |- Q* r1 U+ c

  3. , @) o$ U& ?2 s  m' g4 {% M7 u) q1 h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;# {; b5 {3 b3 W8 C
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;. m1 C  w* g& M2 ]
  6. 9 g% x! {3 x- M
  7. public class Monster extends Creature {4 c) p" I- Q) Q% I/ U9 O: I* u
  8.     private String name;
    7 G2 U/ |! f4 a; K, z
  9.     private double attackPower;
    ( H8 N" o1 q, n  h6 h& p4 V: Z2 S2 ?( G
  10.     private MonsterState state; // Текущее состояние монстра
    . F* Q) i7 Y/ T7 M7 S

  11. : ]0 S* d! ^8 m$ U% j0 k# y, I
  12.     // Конструктор монстра* R5 X+ j$ ^/ B6 ]8 R! t- a( I
  13.     public Monster(String name, double attackPower) {
    7 p1 k3 b, C1 b- |6 ]2 t7 W
  14.         this.name = name;
    $ l3 v6 r, P: G: ?$ Q! Z
  15.         this.attackPower = attackPower;
    4 m+ `! X& L' v/ w+ h4 S
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 \2 |! O' T) Q' V
  17.     }
    6 H4 [1 ^/ M. [) {

  18. / c9 b1 g4 R/ r4 A, `
  19.     // Метод для смены состояния6 T7 v0 q; m: l4 j* \& ?0 ]
  20.     public void setState(MonsterState newState) {
    ) g0 [$ @0 P& w0 ?  M" `
  21.         this.state = newState;
    2 a  v  P1 ?! S2 d  E* I8 _) Y
  22.     }
    0 X5 M4 j# r2 D. ?* f, `1 t' c

  23. * b! u7 U1 k* j, C
  24.     // Выполнение действий на основе текущего состояния4 l4 ^" o& `# I( D& f
  25.     public void executeState() {2 \! b/ F( E0 p  c. r8 l
  26.         state.handleState(this);
    5 E+ z& c- D, Z5 L* r& Q6 D0 Z
  27.     }
    6 J. Q) a  p0 y& _) N
  28. 6 O/ e( H2 V7 M" r
  29.     // Геттеры и сеттеры
    1 E$ b% y' V( C" K7 ~
  30.     public String getName() {
    . Y& I. Z$ \2 M2 A# C" R' k
  31.         return name;; {; o$ k. W* k' y7 H; R
  32.     }$ V0 r2 F* k, Y8 U* D/ v

  33. : V5 I# P( B$ ~3 M! o6 `
  34.     public double getAttackPower() {
    . C- L5 ]' E; J. b; O
  35.         return attackPower;3 k5 ~* R  [8 [; i5 ]: M) l
  36.     }
    + c  L1 g) @6 [" \$ {
  37. ; w8 Q' j6 N- S
  38.     public void setAttackPower(double attackPower) {8 _6 n5 k. t8 K" O  T
  39.         this.attackPower = attackPower;
    + ~4 }+ H% I9 f9 T) z
  40.     }' T8 ]# `* R/ Q% v# {$ t) f
  41. }
    2 z. @% r& G/ w0 T& M6 M0 p! b3 ]+ c( E
Скопировать код

$ L) l  Y" `/ i' p+ R0 HШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.9 }% v& m8 u6 t4 r( L5 |
! j- g$ p; }% @! @
  1. // Пакет org.l2jmobius.gameserver.model.battle5 e1 Q' {8 U8 ~7 n
  2. package org.l2jmobius.gameserver.model.battle;
    3 o- y) G& a; P8 l, B4 D, \
  3. 9 N4 }6 X& Q2 O& p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 N; V4 r1 m+ M/ m( p. N8 I8 K  r
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, u0 G; `' @. E" D. r
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;- S- l# p) Y* z7 ?1 ]  L
  7. 0 i4 q2 p6 ]5 C) r
  8. public class BattleSimulation {
    % F; Y" v+ _. Y8 c0 B+ ^& i
  9.     public static void main(String[] args) {6 ^8 c* U: n4 j; [; j  }
  10.         // Создаем монстра с начальной атакой
    ! r" G( f9 @: X: E% E+ z  I7 \6 G' N( z
  11.         Monster monster = new Monster("Дракон", 100);
    0 |- n6 ]* ^' F! p3 k3 Q7 o/ }$ J

  12. # U" K- R) \/ j( `& s6 ^5 H# B: i7 c) h
  13.         // Начальная фаза
    1 \( X# V) Q  Z1 w
  14.         monster.executeState();  r6 q$ `3 K4 D$ I2 J

  15. 2 K' b, V$ U$ k9 A4 f) c+ S
  16.         // Переход в агрессивную фазу
    5 ~4 p3 j3 H, E( L9 m3 x
  17.         monster.setState(new AggressiveState());
    3 y  k1 h4 p5 q- a& p
  18.         monster.executeState();+ |4 _) S# u) a& s" }- i

  19. 8 o% x4 R" {* K. T" C( X
  20.         // Финальная фаза% F2 _& q7 X! X8 _! l+ E' c( ^
  21.         monster.setState(new FinalState());
    1 m- h3 a( V2 h& {  p3 p
  22.         monster.executeState();9 g8 D. H0 s3 }( e; O& X9 e) ]
  23.     }
    & @/ P2 L: |7 G
  24. }
    ! t  d: V% {) ~4 L. [+ O
Скопировать код

9 c! F& L7 \9 _' {7 c0 ?Комментарии по структуре пакетов и классов:
1 F+ b/ s, s: h! x7 cЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 t6 |) l4 }+ S6 C  a. ]# L. ]Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!4 b5 [, \8 O, H  j

2 Q- ]) T8 ?, D2 @
! G8 r: L2 P/ r/ C3 \2 ^1 V  K& q- p: H5 b
3 r- U$ u1 H. q7 [$ M! Z% ?9 W

9 A4 r* v0 M2 f' a
% z5 |' V# x* t/ G3 C9 K
9 g: ]0 l) {% i
- {4 r) V0 V7 |1 j/ i7 J+ ~, {" g$ v+ B8 ~) h: k

$ L2 [( N5 M* s& e0 G1 a3 `. @" H: T: B; D: G

) u& x/ t. G$ y. a8 {' B2 o* J! k' p2 |" j. t
! V5 |  F$ m+ d3 U- F$ k

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
) N5 ^+ \- f! g+ Q) L3 {: e* XДля управления сложными взаимодействиями, такими как  ...

$ a$ C! s. D; fОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
* a/ x4 t5 \3 K+ N8 XОтличный подход! Использование шаблона "Состояние" де ...

# [2 I' I0 a2 a3 uХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии., K$ I0 Q: L0 V% C. I: q
( }: ?4 d' c7 s# d
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.1 b7 o! z& N7 D$ z1 O  c6 }6 I, M

* Y/ T$ c: W' B/ o  c, A
  1. // Пакет org.l2jmobius.gameserver.model.actor! n+ F3 b( S5 X1 F9 B
  2. package org.l2jmobius.gameserver.model.actor;8 ~1 y+ P8 }* O7 O
  3. 2 y  H/ C1 r. O% V: f$ Y0 A( r
  4. // Перечисление для типов атак
    2 t; V$ o$ }0 t2 @( y# y
  5. public enum AttackType {: ?! }" n# B$ E! i
  6.     PHYSICAL, MAGICAL;& i" x! Z; ?3 j; v. B: x: B# z
  7. }/ M1 @/ b: f. I3 `
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.: Q) Y6 B, S8 R8 a, c) ?* G1 l& u/ O* _
Обновленный класс для агрессивного состояния монстра:
. ]+ |' T# K" j  b: [9 e4 m1 F1 J- K; K1 Z( P9 r3 ?8 C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; P; o1 |$ q4 y% J5 b/ k
  2. package org.l2jmobius.gameserver.model.actor.state;
      L: H8 _! H7 W7 ]5 N
  3. 7 H0 {% T# k$ o* B* c, c7 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . X6 t6 h. ~( x* j/ W1 C# r
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    8 J/ g  T* u- {: M2 w  D

  6. , y7 z$ }/ l- J5 |3 L, k1 P
  7. import java.util.Random;
    7 m2 ~+ p! A0 x* A: E3 i

  8. 9 }+ {' ?* k9 ~, y$ ]# R
  9. public class AggressiveState implements MonsterState {3 y# x) T3 ^( O: s' c( w
  10.     private Random random = new Random();
    , j( U+ m6 k% i  ?% o$ B
  11. $ [1 a& Z3 g% ^: b
  12.     @Override
    1 G: L" [, S$ D. E( F
  13.     public void handleState(Monster monster) {0 F4 T" n4 y. B+ i4 B0 w* y
  14.         // Выбираем случайный тип атаки: физическая или магическая  Q  [! c  J/ R: V' C5 @
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;) z2 y, X- a1 u; b
  16. ; i' `. D2 Y  A( [6 A$ s
  17.         // Логика для агрессивной фазы боя
    9 Z8 X  F1 @# d3 q. a0 _
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    " n- B$ `+ l  H; n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    6 V  K2 {" g7 W
  20.         
    / N. h& N+ T% p' i3 p
  21.         // Увеличиваем силу атаки в зависимости от типа атаки( B2 j5 l, y, v) i$ K6 n/ A
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;& X) }% e& S: _4 [4 ?$ {3 n
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    + B, A2 ~2 J7 R" B) u" A
  24.     }" Z/ q- B  }% y) H; U
  25. }
    8 |: `# h. Y1 Z: }
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки. U  ^- T$ @, v/ b

8 ^6 Q- ]8 ~5 w; J  s0 r' u, N+ o
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 _. {* l* C1 `& `, n# B) n
  2. package org.l2jmobius.gameserver.model.actor;
    : e* n  _& M" h* K. `8 K

  3. 1 S% U' w# H5 ^6 B
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    $ G8 K8 U* W1 ]: r$ B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' n7 U3 y* b" m+ m2 O

  6. & M+ B7 c, ~1 I
  7. public class Monster extends Creature {
    ! Z- o3 s  l( Z! U; X
  8.     private String name;
    3 l  l  w! {" {; ~
  9.     private double attackPower;
    - p1 R+ b( k) Q9 X  U
  10.     private MonsterState state; // Текущее состояние монстра
    2 C$ V3 f% H3 G1 K" X1 @+ g

  11. ' f7 G' m0 n6 x2 o6 p
  12.     // Конструктор монстра
    8 F! Z$ B, y% ?* R- K0 l
  13.     public Monster(String name, double attackPower) {
    1 K7 @: {& \% T* r8 M5 I
  14.         this.name = name;2 T* C; t3 j' Q2 A$ h
  15.         this.attackPower = attackPower;
    " n- n( V; G( j) w) {3 H8 i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию- j. P2 ?, X. `$ _4 S+ w
  17.     }
    : p2 r3 d$ E( v, _' v( A
  18.   y& w+ R4 A% P. h( Z6 ?- [. m
  19.     // Метод для смены состояния9 O! d* R/ |# i$ i7 y; ^& ?8 k
  20.     public void setState(MonsterState newState) {
    1 V: ~% C: @4 Q! l" u
  21.         this.state = newState;
    1 K: a( Z; r  ~7 O5 I, V, ^
  22.     }
    5 \, t! ?# y$ ~* B
  23. $ v1 s+ Q6 b" O2 A3 o3 c8 n% V
  24.     // Выполнение действий на основе текущего состояния
    ! X7 y% h% ~6 ], \4 H5 M5 c
  25.     public void executeState() {
    + O% K1 m* Z  `
  26.         state.handleState(this);
    # o5 O$ n4 ~( T$ d
  27.     }
    ) N: s" D) Q3 m. a. a
  28. , C2 ], p: v+ i. z$ J
  29.     // Геттеры и сеттеры7 ?+ B8 P* s& t. E: a
  30.     public String getName() {. j# u. t1 u$ C! N7 |/ V
  31.         return name;- r/ p7 A4 O7 D: A+ }
  32.     }0 w7 V) o1 j6 h. j1 M, K1 ?" \2 `0 |
  33. 0 m) n7 G7 A) D5 a7 B0 E
  34.     public double getAttackPower() {  s8 D& s' [. [( G( ^3 i: R
  35.         return attackPower;0 S6 ?$ |% w, s) e; y- d
  36.     }6 {% k' u! m6 b+ @

  37. ' e2 {  @! T; m) W9 N( T/ h
  38.     public void setAttackPower(double attackPower) {
    % n4 |5 q, _, e) r; z% Z% Z
  39.         this.attackPower = attackPower;
    & _9 S8 C: W# y
  40.     }8 I9 g$ g: D* Q
  41. }
    + e4 y4 y# H, O4 p# u) |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  W* E. i% e0 T  e: o: n: ^' @; A  y  I7 ^! u% U* ]2 y
  1. // Пакет org.l2jmobius.gameserver.model.battle2 C+ {* E- l/ F' {: v
  2. package org.l2jmobius.gameserver.model.battle;# s" Y+ }$ f+ e$ T# [& i% ~
  3. " C% {9 n: L1 x1 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & R% N9 y' S3 b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- x$ K: ?3 l/ D5 d# O
  6. ) |1 |) a6 ^1 u8 ^
  7. public class BattleSimulation {( E6 p, \# m9 @; u& w  t, V  p2 ]" v
  8.     public static void main(String[] args) {* i& Y0 d* `9 |/ H+ E$ C% u' `; i% ]1 Z
  9.         // Создаем монстра
    * l1 k  k8 d) c6 E& ~9 u9 ^
  10.         Monster monster = new Monster("Дракон", 100);
    ) S. N: x8 W/ E5 e

  11. ) }8 Y, i& _; ~6 o2 k
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак7 g: [2 E8 o: ^9 d# f
  13.         monster.setState(new AggressiveState());
    ' @9 w0 v" t; }3 Y
  14.         monster.executeState();; D, M. `5 v4 K9 j* G, Q, K: m
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ( N' m. S: Z# Q( v1 p) R. z" r7 @
  16.     }
    , @9 |: b+ o0 K5 S0 y& F8 g/ P
  17. }6 M1 |' Q# L2 s% y7 A& a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
5 b* s$ v2 I# M' i9 q  U. JЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
* \2 z! [7 x# u7 D3 Y0 V: K; L  I" D
+ S) E5 M4 y7 E1 U! W# I3 k; |  L8 f4 o7 |/ F! E' W8 L

1 s; ^% b  s8 U8 t' x/ }




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