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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!0 M  a& e; _( m8 w
6 \5 [( X! J: d- d& i0 C
* ?7 H3 m9 |/ \" {9 G  g, m0 r6 `
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
% U) ?- k2 S: }/ U3 KЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!$ \: c5 U( v# {. O; v( u' n5 {
Астралия ?7 Z" G; A3 w* U4 b' D

5 |: c6 c1 m, H! n
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
6 r& H; h% u, s" r3 d0 K. w# ?( xВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?# e8 Y) b' W' S8 G
0 r3 Z; f' t6 m8 g$ w4 w# x

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
1 j( {( [" v- O
AlexCoder опубликовал в 2024-10-16 18:31
  \1 t+ {0 C1 l2 K- `. Z3 WДень добрый!
) X! x) j  y  {8 l7 w- M$ XВ статье описано взаимодействие игрока с N ...

1 V# d0 ^- D5 h# b' nДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & N9 `8 r6 c5 }+ Z0 |

8 U& N& L3 S* kЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; V8 @% c" X+ h+ a- |( C8 d. G- R7 U. ^* m3 O6 ]
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 g5 b7 k8 [" t2 K/ s# {; e1 z* G& u
  1. <font color="Green">// Пакет для состояний монстра</font>& L1 A+ u. G" G9 f4 ^0 o
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 S1 A+ W: w) r0 X& u
  3. <font color="Green">
    5 F& m! _& j/ p, t
  4. // Интерфейс, представляющий состояния монстра</font>
    7 D2 }  m  K& i7 c4 q4 H# {
  5. public interface MonsterState {8 v* Q% ~6 D! {& w4 V
  6.     void handleState(Monster monster);
    & i! x% ^; w7 Q3 e& C
  7. }
    ( k; k/ Q: w  d" J3 g7 I& ~: u5 _8 e
Скопировать код
; X) w0 q$ G0 V0 ~4 ~2 A
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- c/ d* P. ^: r
3 ^4 D& K0 ~7 n$ a7 CКласс для начального состояния монстра:$ \# ^4 Y/ H# A6 ~
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>' ?1 |- E6 G% B5 H, Z2 J
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ G4 g0 ]5 r2 D* c  ^9 b

  3. ; Y8 ]! e" n- x* U) q  h: B
  4. import org.l2jmobius.gameserver.model.actor.Monster;! X/ \& O% u* o1 U
  5. : x' p9 w4 W9 |
  6. public class InitialState implements MonsterState {
    ) F. R; x: K% o* O7 R9 M
  7.     @Override+ F$ `' U  e9 }0 d5 Q& p7 ?& {
  8.     public void handleState(Monster monster) {
    ! a% Z4 ^, |6 @: ]+ _; t$ r
  9.         // Начальная фаза боя
    5 A* i9 O) `0 V, D$ H" g
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( c- v* K  H4 C0 E) N+ z) n; L" B
  11.     }
    : ^: o$ a( H% Q1 b! V
  12. }8 X  e, E' u  v# b6 M' K+ Z
Скопировать код

2 A" E+ N! {0 H& K
& N. a- Y7 e5 C6 W- F" W5 y! ], V# V, r8 H% J

! ^9 S3 G/ w5 I8 {+ f" o( y( W, m) y0 i/ D
) x! D8 @1 A7 i1 r. H

$ c9 v: j# A$ Q$ r; [
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
/ t4 j3 J" t) M3 V, r7 r; e% }" L0 e5 c7 H# ^3 l; t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' s+ R8 |2 R& [- v9 W, Y

8 s0 v( h9 R8 x; J% kШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: D' O% U. E1 r( k" ^6 c8 z
1 F( `: P# g7 r" G' q" \
  1. // Пакет для состояний монстра
    * k8 \% i4 ~4 ~) X2 }) f
  2. package org.l2jmobius.gameserver.model.actor.state;
    / D1 K% R9 K9 h* p' F5 \3 p

  3.   j% }6 R: v9 y  K% \6 E
  4. // Интерфейс, представляющий состояния монстра2 |, W3 ]; P  ?5 [% c( N
  5. public interface MonsterState {/ n' U2 [( H+ ]3 f9 ?: \" K; ^7 R
  6.     void handleState(Monster monster);
    - n/ o9 F# q( ~! s  w% |3 \
  7. }- d# |/ _% l1 N+ ~7 A- z
Скопировать код
7 c1 H6 T; R7 w! Y% \- C. }2 [
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 q# A/ ?. X& e3 c6 {/ s5 h1 e" z1 {8 ~/ O* n! S  o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 z1 |, Y1 s3 N$ j' f6 ?4 L$ c" A" Z) O$ @
, V5 _0 C* E  uКласс для начального состояния монстра:; u7 j- f- O/ e* |- U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + \' o2 l) r; f6 \" S+ U
  2. package org.l2jmobius.gameserver.model.actor.state;2 W. j0 Q4 c* Z6 u+ v3 t

  3. - m) @  q, D8 U4 T+ c" W/ w' f, j
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 z5 X. m9 e8 C. s! N

  5. ( h  R! v. g; [9 K
  6. public class InitialState implements MonsterState {
    # H* u! S+ o5 e4 |6 O3 T
  7.     @Override& I( k5 h, x5 @$ a
  8.     public void handleState(Monster monster) {1 u  @# c/ H5 y$ A  _& v
  9.         // Начальная фаза боя) Q0 e6 ~1 l& @+ A5 W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( [& |! p7 I" S9 }9 `  Y
  11.     }/ H- Z4 |$ \7 J3 y1 f' U/ g
  12. }+ {+ r) v7 i' E  F
Скопировать код
Класс для агрессивного состояния монстра:" P3 H% e+ g& r8 I; D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! Y% |6 ?0 i0 Q( _/ S' }
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) K0 ^/ ]5 J( K7 D# Y9 W' p

  3. / ]+ S) W, a7 k8 r" H$ N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 n4 B) }6 q2 O- R& J1 [* r7 w: l# l! G
  5. ( [1 m, h6 v' e1 W+ k- z
  6. public class AggressiveState implements MonsterState {
    , \+ i; j# H' i7 Z. p1 @
  7.     @Override; X: Z/ f/ V2 g) b% {0 ?% {$ J5 H
  8.     public void handleState(Monster monster) {
    ) ~% b6 z0 K; z* F4 F& v
  9.         // Агрессивная фаза боя
    - q8 f" u  g# v
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");: B; g8 J. _& F/ N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    . x2 g/ ~$ |9 R6 e
  12.     }
    ' [$ p" r, ~0 S2 N8 ?* W# O
  13. }
    + m7 R5 v: E# L" P
Скопировать код
Класс для финального состояния монстра:& g' |8 Z* e4 _' }; s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; [1 S3 w3 ]+ u0 A
  2. package org.l2jmobius.gameserver.model.actor.state;
    % J) U4 p$ d! ~0 w

  3. 4 \# s: [  }; u; k  I- f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 W' _, i, q' a0 c4 p, y7 G

  5. 9 N4 l. r3 d; Q" K& c( |& h
  6. public class FinalState implements MonsterState {
    0 q8 b8 W- ~& G6 A* l- U
  7.     @Override# q* I' |/ E* L3 d
  8.     public void handleState(Monster monster) {" ?1 m1 E9 l- S* g
  9.         // Финальная фаза боя' C. U- ?, C. {, x1 x
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");3 q* g' s3 T( I1 n; t% \. Q, }
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки- F+ m# c' X. ~7 h0 H; Y  ?# G
  12.     }
    ) `( c0 z" o, p- J
  13. }9 F8 |" N! m# Y  |& K& P/ s% f
Скопировать код

$ S! e; Y; ?% x4 e8 H* `Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, r/ y& I4 \$ q0 V1 `2 O1 W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! r8 q- p+ P6 \: k! W4 A4 |! I
  2. package org.l2jmobius.gameserver.model.actor;
    6 d# w; e" O. {0 a0 G" }& {& \
  3. 3 z3 Q9 X1 \3 e; ~9 \8 Y; `
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : L/ X0 @4 i1 V: T
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;. S* l, P! U/ E" t/ Z# w
  6. ( Z" {3 y9 Q2 Q2 x/ I5 s
  7. public class Monster extends Creature {
    & ^! n4 n& e3 e  T0 u9 Y) g! N4 L
  8.     private String name;
    ) x/ g* f  B& q
  9.     private double attackPower;
    $ @& S  ]) k: X5 H; g
  10.     private MonsterState state; // Текущее состояние монстра
    - J$ r# Z9 |5 Z5 L( }: E2 k

  11. 6 K9 n, N/ b  _
  12.     // Конструктор монстра6 W/ u4 b) B0 X3 }1 y
  13.     public Monster(String name, double attackPower) {
    + \) q0 Q" S% c  [/ I
  14.         this.name = name;
    : u6 }/ w# f/ h$ p% W$ o4 f6 [
  15.         this.attackPower = attackPower;& D% M. l6 X; ~$ ?1 v2 g  R
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ _* @) _9 D! Q7 l) J2 j7 ~, y
  17.     }
      _2 w( `1 |, @  Q9 |
  18. 5 S4 N) {/ I$ h4 S; N; _7 Y' p
  19.     // Метод для смены состояния8 ~/ H2 H  g0 u  H. p
  20.     public void setState(MonsterState newState) {% U- y, U0 H) Q' {
  21.         this.state = newState;/ O0 a1 a3 I1 K9 Z; S2 y; Z
  22.     }
    8 H# ]' k" c& \2 e  T) w1 ?

  23. 4 q; N7 o) V: c* e) i5 H% ]; l
  24.     // Выполнение действий на основе текущего состояния
    5 T+ z$ B9 M& V# m3 b
  25.     public void executeState() {$ ]! `5 Z, v8 `0 d
  26.         state.handleState(this);4 K& y4 r% x3 F! j  S; |
  27.     }
    5 e' [; g1 K. z- ~
  28. + `) T' J( N* T; _; ~% ?1 `
  29.     // Геттеры и сеттеры4 X3 \0 G# F+ c% U. W+ ^4 u! X
  30.     public String getName() {6 M" W$ O; R! l$ `' d7 T7 i
  31.         return name;
    ' A( T  Q/ R" W$ v* I: b5 S
  32.     }
    6 S3 q3 X  d4 v2 W) f

  33. ; S' J% \4 W2 }8 l
  34.     public double getAttackPower() {8 |1 H) O3 k, F# F' \
  35.         return attackPower;
      N" X; p  H9 B! l; L
  36.     }
    7 B$ @" |5 V. `7 r5 {7 V
  37. 1 E1 @% |  ?% v5 T% ]3 n: r
  38.     public void setAttackPower(double attackPower) {
    6 N7 y! ?  V* M
  39.         this.attackPower = attackPower;
    + p6 X8 {5 V2 X: |6 j' ^7 B
  40.     }( g) O! N! E" h5 |' ]% Y
  41. }/ K- a2 r7 Q0 T. l& b
Скопировать код

. F* O& w- [7 c1 \7 Y4 J  z1 H: _" iШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* I& F2 Z4 ~- V8 A8 D: c/ x9 }+ ~2 a
  1. // Пакет org.l2jmobius.gameserver.model.battle; {$ A' ?. U" m" [: F) L' l2 s
  2. package org.l2jmobius.gameserver.model.battle;
    9 @! E% k! U& M

  3. % z" i+ O8 G8 {& o: C
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ Y$ g1 ^+ A$ k. k8 v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;$ y. h3 M1 E' b7 g
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % Q+ Q2 {: t# X. |. |9 {0 s: {

  7. % s" z5 |/ r6 s  T/ p+ a& V3 b
  8. public class BattleSimulation {
    7 V( H& v! c; a( f, B2 w
  9.     public static void main(String[] args) {
    - ?/ }( ]( s; t. u* I# l9 O. L
  10.         // Создаем монстра с начальной атакой
    / ]4 X% {# A/ ?6 E
  11.         Monster monster = new Monster("Дракон", 100);
    0 P" W0 V0 F6 z, g& o3 e
  12. 7 F8 f4 ^6 x% {! E. O
  13.         // Начальная фаза! O+ K" b" T3 P( N  r) k) i4 N8 z
  14.         monster.executeState();
    " b/ [' j" {* h/ @, X8 i! L

  15. 6 @4 z0 `5 _' A& k7 x0 j- v
  16.         // Переход в агрессивную фазу( b, ^# f3 L; |. q3 @  e; P
  17.         monster.setState(new AggressiveState());
    2 w2 L. w( w: Q! m- J5 J6 D
  18.         monster.executeState();7 L3 u% Y$ F! {9 _
  19. 8 _; F0 s0 s8 U4 Z3 ~; ]
  20.         // Финальная фаза% T: M; h( P  H* t/ ]
  21.         monster.setState(new FinalState());
    : d7 ?- O0 A4 L" H: `& q2 ~" n
  22.         monster.executeState();
    9 o$ s& H" \6 i2 h! F% e
  23.     }
    - K# z1 [4 s* b" S* G
  24. }
    9 [8 f/ U7 G5 K& S# e# v
Скопировать код
; r1 T% m, j1 \1 ^3 n6 G' x
Комментарии по структуре пакетов и классов:
& O& U/ {" B; C. F' ?) d& _4 IЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! X' Z$ h4 |# o
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
( f) J2 y* [/ m  \5 {0 Y
5 B( L! z$ G) ^2 ?; t$ x1 v
" M) j9 b0 f$ j( Z+ Q3 B7 h" \0 h4 |; v
. V/ q6 E! x: N2 T& |4 |5 B6 u

% }& N, b! b3 [* [7 k; j8 [
6 `- Y6 Y* R( C9 ^' K9 ], a' N% b7 N  M/ M+ `& I" M. p
9 X) |1 U& d# B+ h: ^

) C! w& O6 @" |# z
3 s, O$ D( `9 G* k/ b2 k
" y1 m5 v$ u( u& \7 ~
& D& x) Y3 R! i5 T8 @% @" `5 `% s% I6 f8 W0 z" |4 P, C
; h! u, q, P1 z+ _3 T8 ?8 |3 g$ O

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
4 N, h! |8 W% A6 T# c- ?Для управления сложными взаимодействиями, такими как  ...
- U% U* K/ i7 ~+ D" A5 h
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
1 R2 h7 a! |! {7 ]9 iОтличный подход! Использование шаблона "Состояние" де ...
9 c6 c6 q2 G8 y2 I' M* E
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
; R1 r5 k+ o  [
/ b! ~0 ^/ I6 ~Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
# @) O! g0 t2 Z. j" i( C% T
! G2 e* I# B  t
  1. // Пакет org.l2jmobius.gameserver.model.actor3 K# s% G9 \  M1 K+ e+ H' P
  2. package org.l2jmobius.gameserver.model.actor;" {( v: v4 J  N0 X3 g/ \
  3. % q+ u( p4 x3 Z3 u) V
  4. // Перечисление для типов атак
    ) K1 M" V* H) }0 M( V
  5. public enum AttackType {5 F" j7 ~6 l2 H% E6 ~$ o1 r1 o
  6.     PHYSICAL, MAGICAL;
    9 v' C. }% J8 @. e: }+ N
  7. }
    ; r/ X3 W5 T, E" u/ n
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
+ h, l% G8 y% q1 h) y8 j7 s( a0 lОбновленный класс для агрессивного состояния монстра:
% c6 |% M4 Y3 w  W& F+ P1 f6 w. G8 C! Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 w& g2 v" ^. e, I2 T
  2. package org.l2jmobius.gameserver.model.actor.state;
    * r  R5 h3 v2 z5 ?+ _3 ~. e
  3. 5 o2 c4 }! F8 V( `; ?3 {% F7 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 R+ `7 Q. j' |$ p) ^2 o( J9 [. {* Q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;6 i% {3 a; T! D4 D- ?) }
  6.   w) u* c) k3 G5 V& U
  7. import java.util.Random;- W( @# r5 `% J( D7 f

  8. % Z3 w; k/ X) ~( n/ e- N
  9. public class AggressiveState implements MonsterState {
    " w6 i% ]8 k6 Q/ r
  10.     private Random random = new Random();
    # ]5 f% @: I1 o  ~% a5 r
  11. 2 E* w- @3 Q# S5 L
  12.     @Override* j5 K8 M: a/ O5 ]: c
  13.     public void handleState(Monster monster) {
    + d4 h) b( J, X" t* l- v
  14.         // Выбираем случайный тип атаки: физическая или магическая
    4 k" \, W, f% ^6 n7 i% W2 \& w
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    + y# Q; R' H3 v4 R- J3 |, i
  16. 1 i, X8 I0 o/ C3 S+ y7 v5 O
  17.         // Логика для агрессивной фазы боя& T6 I' e) u2 a, p
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    * B2 t3 A1 L3 G
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & n* ^5 R' f/ K1 [9 r
  20.         
    4 t3 b, X1 I3 ?; J
  21.         // Увеличиваем силу атаки в зависимости от типа атаки! t. Q) [1 l2 O$ a. P9 l
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;7 U$ i, @% F) s1 M! J2 y5 K- c/ q
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ! q5 o* T% e% S. d
  24.     }
    5 c. ?& J! V8 F; z. F
  25. }- ]1 @% P3 u2 ^. S; C+ s. j* _
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки, r0 k. M& g" O

3 t* _9 J) e- W% z  l
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / L; ^2 u$ P5 Y& J, k
  2. package org.l2jmobius.gameserver.model.actor;
    & k9 [  h4 t" \& k8 j
  3. ) b9 q- Y) q5 g: g5 T
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;% e  x0 J: M2 |( K1 ]& c
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 {% n+ Y, z0 u% U

  6. 4 ]1 D9 |; }* ?( }- v( D
  7. public class Monster extends Creature {
    8 [2 v* S  ]# m. U& V3 q# O9 q
  8.     private String name;
      Y4 |1 f7 ^* T% |1 L1 Z6 [; [
  9.     private double attackPower;
    - U7 q6 I* l" A5 p. V% F2 y6 c* C% t
  10.     private MonsterState state; // Текущее состояние монстра; J7 h: V& ?' ^1 r
  11. 4 t8 D# d2 ?) W; h- g# U. d
  12.     // Конструктор монстра' Q. a$ P% y6 m: |
  13.     public Monster(String name, double attackPower) {
    9 |$ e0 Z9 z: ~( q/ `+ C
  14.         this.name = name;+ u! M5 M0 O$ X: q, j% L. Y+ u# `
  15.         this.attackPower = attackPower;
    " G$ E1 w2 M: s3 E8 J) y' A' v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    : y# x4 ]( X3 S. V: S9 k# |7 N
  17.     }% N# b3 z- K- G1 s
  18. * n' g2 X/ {; N5 t
  19.     // Метод для смены состояния
    / Z" G3 ~) k* K" E
  20.     public void setState(MonsterState newState) {
    4 b+ m" H9 K# `" b! u# L5 C! }
  21.         this.state = newState;7 ^  S$ w+ p/ T. [. a' S
  22.     }% o* {! ^3 U# `6 r4 N5 e. N: K

  23. : e, t! x+ p0 r- C7 F
  24.     // Выполнение действий на основе текущего состояния
    $ V& P5 b' b9 y0 g' U
  25.     public void executeState() {
    " l! a, y1 ?2 u) W
  26.         state.handleState(this);: g7 u* V4 A$ r8 a9 V
  27.     }
    4 {! G$ I- C8 c" Z% c: M: _

  28. 2 z/ E2 N1 i" ?; }% c4 t4 d0 g% e
  29.     // Геттеры и сеттеры
    4 @$ D" @* O0 X' b" W/ Z; b
  30.     public String getName() {* z) n  C: ?# F& d
  31.         return name;
    ' O, k3 T# z! a1 L# z
  32.     }  X: [% F+ b$ `- K

  33. + l/ O  L( P4 x* j: M
  34.     public double getAttackPower() {
    % F6 m' d5 f, c1 M
  35.         return attackPower;2 {  U( [6 Z7 ?4 n: O
  36.     }
    3 w3 N( F1 C/ `

  37. / j  M- \. f1 S% a) V/ H: [8 b6 t
  38.     public void setAttackPower(double attackPower) {
    : q5 ~% P2 C. o& r
  39.         this.attackPower = attackPower;, {6 f1 z% T0 \9 k8 P0 l" S
  40.     }% q, T' M  r9 t/ c# R: i4 f
  41. }9 a5 Y, C' R$ u* \
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.4 y. g; ^% d8 U
0 t: i: D: b* t: B0 B+ I1 Z4 S
  1. // Пакет org.l2jmobius.gameserver.model.battle
    3 Q# q7 G$ l! m4 ]- V: }5 s% G
  2. package org.l2jmobius.gameserver.model.battle;* b6 _" Z) [& s! B4 T4 B

  3. % O3 J8 p6 P  e& V& H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & w2 Y* j: N( i( R
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 ~3 a$ T+ ?, A. E0 d- ^

  6. ! u. g3 y; F5 v! ?
  7. public class BattleSimulation {) b# Q, Q2 k# a& m2 T
  8.     public static void main(String[] args) {& _6 F+ b8 c6 ]
  9.         // Создаем монстра
    ' ]" H! ^% @$ j) K# z) n
  10.         Monster monster = new Monster("Дракон", 100);
    1 p. B2 y7 K- H! ?
  11. % a0 A6 ~" F( @8 B' ]. e3 a
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    / f9 C7 T. @; b1 x
  13.         monster.setState(new AggressiveState());: ~1 e3 z$ t9 M# `& G
  14.         monster.executeState();
    ! Z1 n: R; V. k9 N' v! N/ K
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ! a, M; c; O' G1 `* U
  16.     }
    # ^6 `) l% T. s. |1 b; m
  17. }! e! s4 j  S: `& E5 \; v( ?. p
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.8 Q& ]8 p) z: e9 I7 y' w
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
' X! O$ |$ ^0 B5 X! G" n  x4 }6 l- Z6 _) o6 T

" Q" [; P' _& r( V+ y0 Y3 U
! t4 z4 W0 D0 c, _0 j5 I! D. G




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