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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!0 H& h) C5 [0 v# E# X( i) [, |  a7 |

# g; H& K3 f! ], ?8 n

. o: H" p/ O9 ]Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
. {. E. {4 u! i4 [Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 {) o% {, y! W, GАстралия ?
( Z% T5 i9 ]7 u) o% w! ]$ s! {  `$ f, n) n( F

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!' ]! `) N5 t4 C; @+ [$ ?6 ]
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?# W% j; m& Q: A( T0 o# E

1 l1 F0 @0 z/ G0 m
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
9 w; B4 q9 _' p6 I: E3 C
AlexCoder опубликовал в 2024-10-16 18:31. U0 F6 N5 a9 `1 F7 `# h' D
День добрый!# a( p* l& T5 y
В статье описано взаимодействие игрока с N ...
0 R7 u: l3 i2 ?; ?2 e8 g, \
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ; h/ N, P1 s# y
1 ~8 T& c/ G- O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( _" w, N4 O+ W' D. L

- P7 O9 w, `. Q! a' U0 K# \0 HШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' x8 @2 O6 l5 f* c* O

! m/ [7 U4 q' B
  1. <font color="Green">// Пакет для состояний монстра</font>9 d# u, S! P  U/ F6 R- S
  2. package org.l2jmobius.gameserver.model.actor.state;7 D$ f- J' p4 q( W2 w
  3. <font color="Green">, r' q6 D! o8 w! G6 B" q) j
  4. // Интерфейс, представляющий состояния монстра</font>7 E8 {' A3 u4 D. u
  5. public interface MonsterState {
    5 D6 l/ ^; }" Q0 f& M" ?: w
  6.     void handleState(Monster monster);: D+ u- B+ q, t& x' R0 h' ]" S
  7. }1 D8 v7 U8 R% b# t
Скопировать код
: _7 j: p; I7 p- D0 |3 _- M( R; Z. j6 w
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.& i" }" Q5 v9 B5 P4 r" g
, g4 y4 M: F; B: S) n7 a# {* X# l
Класс для начального состояния монстра:" P, }5 t8 K/ A- }$ m+ n2 d7 r
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    2 h. T& T: [' W9 ~9 H7 Q; W
  2. package org.l2jmobius.gameserver.model.actor.state;+ Z/ X* Z$ z" h9 U

  3. 7 L9 y3 o0 ~9 M# u" w
  4. import org.l2jmobius.gameserver.model.actor.Monster;- R3 n% K5 I) M$ t5 Y- _
  5. 3 i# t1 X( N; S3 k, `& L+ v) s
  6. public class InitialState implements MonsterState {
    2 _" s7 t! e0 U7 l% p  Y; j" c
  7.     @Override7 Y6 l& e# V, i0 l/ T; H
  8.     public void handleState(Monster monster) {2 }. d6 I3 G: `8 C' K: ?
  9.         // Начальная фаза боя
    / o; D2 B; ]! v& Q8 ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & A$ m; G  ?0 b8 x
  11.     }" r/ w4 j' q' ?( b" Z( d
  12. }3 }$ k, A/ |( Q6 ~/ B. G! G0 l, Y
Скопировать код

: W$ J+ H7 s# |) N4 s, L
3 a7 a, A# p2 b$ }: V+ r. o7 h' J# y" o

0 V9 w' v& |3 M' j9 M, ?& t
  W/ O, A& B/ ^8 F. ^' k2 c+ Q* q7 ]! |: X4 G" ^

1 d8 H* \9 s  M- e/ u
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& U$ @8 }! d% @: l8 T& p! k% ~+ G
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 ~- O) q1 l/ T8 w7 ?3 @# k
3 {; s0 W( c7 z" W: a& r! L
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% ]4 e/ e2 D6 I- {+ w# g7 Z. S
* K* z$ |9 w$ U: r+ B" S4 G
  1. // Пакет для состояний монстра
      S- h1 C) i  v
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) u  t* G+ k+ Y

  3. - s$ v+ y: o- s2 y/ T/ z: A
  4. // Интерфейс, представляющий состояния монстра. r( O+ n8 w+ u1 K! t
  5. public interface MonsterState {7 Y8 c' N2 Z+ k4 v
  6.     void handleState(Monster monster);! }: |- V& \( p7 s- g7 A" M" t
  7. }
    ' ]4 F2 m( v4 i4 a5 o
Скопировать код

% g( V( b% B7 V% A0 {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 [& y: e6 E% o5 f  I4 }: T/ |3 c3 O( z! P  Z2 O
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; S( b) H# e! _3 n. {

- e9 b; `' F4 M- }4 M3 C# kКласс для начального состояния монстра:( q7 A5 U, I# ^* e+ R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 e' o. @$ Z' C) h, V
  2. package org.l2jmobius.gameserver.model.actor.state;
    " a1 o/ u! [' L( _
  3. 0 W$ S: t3 U3 A+ G
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ i6 W, B" X9 p' A! e3 u2 V
  5. ! a  F4 U- g$ n/ k6 I3 i
  6. public class InitialState implements MonsterState {% ]4 `) L5 }8 }2 j4 W( p: j& t0 @
  7.     @Override
    % j0 L- m! y  J7 p+ m$ p0 ?
  8.     public void handleState(Monster monster) {
    2 c& }- z& M' e0 |
  9.         // Начальная фаза боя
    ; t+ A8 o$ a8 z$ l4 r  w% V5 n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! x- l2 e- s9 w: Q5 G; |
  11.     }
    . m$ _  _9 E3 {
  12. }
    / u6 \% w+ J; u( B
Скопировать код
Класс для агрессивного состояния монстра:' O% y# m9 i/ q+ |8 W1 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . |/ r/ N0 {1 f; K2 [
  2. package org.l2jmobius.gameserver.model.actor.state;5 n/ b/ Z8 ]9 F: s8 B

  3. 3 K: [% v$ X5 n% n4 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % o3 ]5 t6 C+ Q$ S+ D$ @/ o) F3 o
  5. ' U5 V* F9 \; k' P' V: c1 r2 R
  6. public class AggressiveState implements MonsterState {; r- r/ L: k6 K+ z) ^
  7.     @Override# @+ I# j) [. K
  8.     public void handleState(Monster monster) {1 P9 B3 z& N% [1 S3 S
  9.         // Агрессивная фаза боя; _% r8 E0 u* L% g1 G
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    4 A3 g3 w2 N' j& k* B
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ; E- w( f! E* t& t, W
  12.     }
    8 B: o( h# F3 v
  13. }
    1 C: K' t* p7 o
Скопировать код
Класс для финального состояния монстра:
. N# O' A' z5 g! Q+ ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " L4 |. M* b$ W
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' o7 I0 @+ t6 t* n' y  J  B2 j9 T% }

  3. 6 n8 j( o; o9 C; D/ i/ q
  4. import org.l2jmobius.gameserver.model.actor.Monster;; K5 g3 O" Z0 ~8 Z# Y

  5. ! c$ u, I3 R/ H: }3 k# S
  6. public class FinalState implements MonsterState {2 L+ X9 s) l* f! o
  7.     @Override! X1 t- Y% \* B8 ^; |* `
  8.     public void handleState(Monster monster) {6 b" h9 S" o  B! d% T/ z3 H' E
  9.         // Финальная фаза боя
    9 `- |  D( Z* B: v; I0 [- k
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");* }- ~- R4 ]. W! r5 T! T: J3 P
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    4 g6 S; P' H# I. u
  12.     }$ j0 h( Z7 {9 l; V0 u
  13. }6 |3 J) j' v5 e5 x- p/ B) ]
Скопировать код
5 z' D/ W+ \% U- ]
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 F; x: t& u3 w# U# F6 z$ F
  1. // Пакет org.l2jmobius.gameserver.model.actor0 o$ s! B" F; J8 x, R4 D
  2. package org.l2jmobius.gameserver.model.actor;( n: G) b* z5 c
  3. 6 E3 @! _4 [  C5 F# p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 T$ B; j. A5 h' k& V* f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 z/ i" \7 G  Q" a5 D
  6. 9 q7 ]/ P7 ?( w3 G, N
  7. public class Monster extends Creature {' M' t) t2 }/ [( g8 v# H
  8.     private String name;
    / k8 |- ^! j5 e( H% B6 I3 h
  9.     private double attackPower;+ a9 K6 q! Y8 F: S' ]) F& `3 _
  10.     private MonsterState state; // Текущее состояние монстра3 s! X# W3 X2 `, B$ U1 }
  11. ) Y# P# Q: {% e; G2 E% D" C3 B2 r2 x
  12.     // Конструктор монстра
    & o  J) b. _9 a1 R2 q3 X: z* `
  13.     public Monster(String name, double attackPower) {
    - t' C7 O8 c8 ]" f; P" F
  14.         this.name = name;& {. N( Y( {' O: F0 h
  15.         this.attackPower = attackPower;  z$ X) G) c( q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    3 Q' y" }& S6 J) W5 X! [" a
  17.     }
    * B) T* {" n" D

  18. - z" E7 }$ T7 N* c3 @: t% {8 ^
  19.     // Метод для смены состояния
    ! U0 o3 L7 M) r
  20.     public void setState(MonsterState newState) {3 L0 y- Q6 [' g: z- v
  21.         this.state = newState;+ n: a" Q3 `6 w) m. W, h8 c
  22.     }% p5 Z/ \" h* q4 A+ X: P( d

  23. / [+ O" v8 ?; x* f+ Y: I* Q$ [
  24.     // Выполнение действий на основе текущего состояния5 N1 i, h& A7 ?. i" e, [6 s
  25.     public void executeState() {5 `  r5 W3 e6 n( U
  26.         state.handleState(this);
    : r2 h' x1 b# `
  27.     }, N, a9 P1 I8 C8 Z$ e! b

  28. / v# u& x9 V$ \/ \
  29.     // Геттеры и сеттеры1 q1 C/ U$ t! X: l
  30.     public String getName() {1 H5 V/ j2 W4 [) Z
  31.         return name;: x; X& `9 ^' P! m* N
  32.     }/ B* d9 z1 i" Q

  33. 0 u* j& a& z% u2 F" N& Z
  34.     public double getAttackPower() {
    & c* ~8 [) y$ p8 _; z
  35.         return attackPower;
    . U6 U" k( Y7 y) H
  36.     }
    - l. \4 J3 q$ W) S6 d$ m
  37. ! B6 M/ q1 D, c1 I" C0 j$ c
  38.     public void setAttackPower(double attackPower) {
    ; s5 A( T. \5 b, a; o
  39.         this.attackPower = attackPower;' l& x& b# }9 p; l
  40.     }: O/ L- R. {4 `: A+ W& P/ O
  41. }
    ( @0 S! k' I! D
Скопировать код
. O) p) B5 g" N5 M$ J) \$ y
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
  M9 f. o8 A. U7 s, {& R5 X6 ?9 b6 J7 ?- t" ~: H5 j
  1. // Пакет org.l2jmobius.gameserver.model.battle
    2 C- z5 L* d5 Z4 _
  2. package org.l2jmobius.gameserver.model.battle;
    # r4 x# S2 L2 E/ T* S
  3. : v0 c+ B# t+ E8 z) Y: g, ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 i. b/ H% C/ _9 m( ^2 m: A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;6 T% u5 v. c$ r2 `6 J9 Z2 r
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    4 i7 u4 s2 m8 K3 \% z5 J1 [9 {

  7. : F- }3 f! d! V) @6 z: d
  8. public class BattleSimulation {
    5 r4 [) _* P- D& \) Q6 E
  9.     public static void main(String[] args) {
    : u; t9 h( M  s& _
  10.         // Создаем монстра с начальной атакой
    ) O% _6 M" f6 E) ?) E" v
  11.         Monster monster = new Monster("Дракон", 100);
    ; A/ N% |, d2 A' }
  12. 5 \2 U5 M) L- Z5 c" V, E2 w& z. A$ |$ a3 _
  13.         // Начальная фаза
    / ?$ U8 n' T- X+ N8 D
  14.         monster.executeState();+ W( S3 X$ E3 }$ r3 n) i  @! W

  15. : D2 u  Q+ ^+ @# q* ~1 ?
  16.         // Переход в агрессивную фазу
    " F+ s1 k" a) {1 @5 J( G
  17.         monster.setState(new AggressiveState());' ^$ A5 Q2 @  k9 c8 ~* |- [
  18.         monster.executeState();! q: C3 E' E: q2 l9 r) k
  19. 6 ]; j1 I3 K' U9 v
  20.         // Финальная фаза' K1 Y& [% ~  k- s1 i: a+ W' Z
  21.         monster.setState(new FinalState());& u" M* d! u7 h# y0 T* {! v
  22.         monster.executeState();
    ) c2 Y, P4 u/ M7 t( l, U3 X+ H
  23.     }
    : m3 P4 F  S; y  r4 Z+ h7 b1 u
  24. }! M' I9 d* o: n; |% d, n
Скопировать код
; j! ~( A# x+ k
Комментарии по структуре пакетов и классов:
1 x9 E( o. B  I/ k, t% F8 l: xЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.. v) l5 X6 X8 N! ?$ p- Q/ ^1 n. m
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: X( e( I( L8 m7 l
% b8 k- E* l$ g, d! t# O8 @

4 a+ b% K: A  h, p9 e
' [) s) M2 L( O3 d. n$ W; Q0 `* W2 b: u3 |7 @, D
8 D. d9 l( F  k; g# A7 c

8 G8 }1 Z2 h5 h" U3 W( J  B( i& Z% }& l+ s* G9 X; ~
6 T- _( d6 [% q/ ]; b
7 P' v* Y6 o' t# v/ a! n
- H5 c4 M$ w1 y: G5 V
. F6 E( H* L( C9 E. Y- o/ p
: ~+ O; R4 {4 W+ @/ U! T

/ P2 I( h' k( j5 V, ^
& f/ M1 u4 f6 [: Q3 P2 T2 k
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
( l& i: X8 d, ~- W9 d8 A: fДля управления сложными взаимодействиями, такими как  ...

9 C8 H" w, z# ^, k' e. nОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:215 V$ C4 f! f  A; A/ |
Отличный подход! Использование шаблона "Состояние" де ...

4 n& V# m# ]; o: q( aХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.8 M6 k! J$ J9 d- C
% X1 K- \6 D4 k! @
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.* g6 |% }% N- e) T2 V4 t

- w$ ~* |, I/ Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) [" d: P9 E' x3 y
  2. package org.l2jmobius.gameserver.model.actor;
    ( L7 z/ V0 V, J, ?' T0 [1 K7 S8 l* L
  3. % {. f" t0 f5 F1 h
  4. // Перечисление для типов атак7 v" K( v6 o+ U/ I0 G; a) h9 O
  5. public enum AttackType {
      d/ m# s( N% l: C8 ^& b; f( k3 n
  6.     PHYSICAL, MAGICAL;
    , P7 ?/ K2 l7 W
  7. }
    % e- @; z; j0 G, E( G& Z% S5 C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак./ N& K% j# H4 R: Q. }9 p
Обновленный класс для агрессивного состояния монстра:
8 _( ]% e- f+ J7 ]1 x3 `6 }4 o+ ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 v1 K7 K) D& u% V' n. a0 V
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 O1 R' J/ O; ?4 g3 c

  3. + d' T& N( ~! a1 P% v; t5 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 `& I1 w) I3 \. g3 v
  5. import org.l2jmobius.gameserver.model.actor.AttackType;& v4 e' i7 e- G/ A4 m
  6. 4 Q1 `. B& _/ ?/ g" g, o
  7. import java.util.Random;. t+ H" {& T" {) T& g

  8. & o" r3 |7 I( X% D: j0 B% h& e
  9. public class AggressiveState implements MonsterState {- `5 _. C! w3 ^4 a& ?9 O
  10.     private Random random = new Random();# s' J1 t) p2 M$ A
  11.   @- w& m( \6 }# P
  12.     @Override) P% s# b& h5 S; s2 _+ `
  13.     public void handleState(Monster monster) {
    ( B( D3 _: x& D
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 d1 G; ?4 C6 o' B2 ?
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    / W) M) I6 W; |/ a

  16. + v& c! Q+ [. [6 A3 ^2 J
  17.         // Логика для агрессивной фазы боя
    2 [7 D0 m, M  m. b: l
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    6 c8 F+ }% w8 Q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    2 y) m3 P: a* U. [( E
  20.         5 x5 j7 p) P& H* K+ e) a- o' B9 q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - R! f8 j2 }2 Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;) L6 ]0 w- z& g+ m2 _6 ~1 @
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    9 e1 Y: m7 v& \" X! n: Z. }
  24.     }
    - t! f! c/ L& V3 V; W+ [  F; a+ i
  25. }* _% |! ~8 O* A9 X5 @6 y5 W
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
" z! |! @, p2 X# w/ J9 g; Z! E
: \9 \  d8 C/ ]& w
  1. // Пакет org.l2jmobius.gameserver.model.actor! Z; R+ }- L6 r$ P/ n' F3 V
  2. package org.l2jmobius.gameserver.model.actor;
    ' k5 Y. f7 \: P  R
  3. , @+ {0 ]0 p$ B  k9 I3 f$ f+ w
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 \4 j; X9 l! Y5 ?  U& D) ^
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    & n( G1 a& D& z+ [& F5 O8 f

  6. 8 M/ W7 J0 y, l0 I9 W# m* |  @
  7. public class Monster extends Creature {
    ! U9 b7 f( L) v* {
  8.     private String name;
    % x  F1 x( e: u: Y% ^
  9.     private double attackPower;
    2 B4 R4 e2 z( a  r+ ?5 I
  10.     private MonsterState state; // Текущее состояние монстра
    5 d3 d: ?; _7 w/ A
  11. : z9 q) m9 I" g' d( m
  12.     // Конструктор монстра- H, W6 l/ s4 ]; O; f7 Z9 b
  13.     public Monster(String name, double attackPower) {
    1 O$ u5 P3 f3 V+ \
  14.         this.name = name;
    ) @, D  ^- `2 q; n9 C
  15.         this.attackPower = attackPower;
    " k" P2 L6 k- H: G/ ?/ S
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию3 |' Q4 R- Z& ]/ d+ b/ C( k* m
  17.     }
    ) L# \/ \7 X/ P8 \& T- v- j2 t
  18. 5 A, V( M" ~8 {$ R& W
  19.     // Метод для смены состояния# I, |/ |9 z" z& j! E
  20.     public void setState(MonsterState newState) {
    ( F- s3 Q' W9 z
  21.         this.state = newState;
    7 U% L* R9 {8 s) B, o1 \3 k! f+ x% F
  22.     }
    # j# v& I! K# D. @  x3 n  u0 Q

  23. 4 p( K% m5 e, a% G% j# ]
  24.     // Выполнение действий на основе текущего состояния: W; l! r( M! P% q8 |
  25.     public void executeState() {, R! r, o* G: O" u: Z1 b5 U
  26.         state.handleState(this);
    ! A( N" y0 }4 k2 e0 f5 w: O
  27.     }3 V1 t( e5 E: T1 G1 j2 F. B
  28. , x. ?% J' T  F( w& a' v2 b* m
  29.     // Геттеры и сеттеры" t7 Z; ~9 O0 k5 A2 @  `
  30.     public String getName() {) V, d8 d+ \' u, l6 ]% @; P
  31.         return name;0 u- G  F' z" r) B3 K1 h- }0 W
  32.     }
    7 M; p* G" i0 h6 h  C7 r/ n

  33. % f# @2 G. _. T; q
  34.     public double getAttackPower() {
    & o/ Z9 A, S7 g& e% B9 C5 y% e
  35.         return attackPower;: `4 U! Y3 R% t9 j. x
  36.     }
    7 V, I0 \) `% {0 w% `* P9 p) K
  37. 8 w) {! u& s  n7 |6 J
  38.     public void setAttackPower(double attackPower) {
    6 U$ H" ?* y, F" o0 V$ E3 U
  39.         this.attackPower = attackPower;7 Y, w* }! o$ [8 H" `4 r$ n2 L
  40.     }
    , b( I' J8 O7 W9 ?% T, S
  41. }
    ( y4 W; L& w; j: x9 }
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.5 g( o" n& E) j" r5 A

' w; |+ v% `$ b7 Y
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ' a. M& F! M4 G$ {! y# |$ D0 K
  2. package org.l2jmobius.gameserver.model.battle;" i! x$ d5 H8 {
  3. / [1 u- I# U: ^( f, `% S% c5 s
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . a5 r. F# m' ?* S+ b* _
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ; r: Q4 k( E7 y; c
  6. " t! \8 i( [  |; r
  7. public class BattleSimulation {
    ' `3 E/ A5 m0 E0 `5 ?2 C' M
  8.     public static void main(String[] args) {
    " }6 {6 p) d" J& K2 ]
  9.         // Создаем монстра- F0 ]2 Y( M2 G$ f  Z; |
  10.         Monster monster = new Monster("Дракон", 100);4 |" _( P* k9 o1 y% F

  11. 2 f% a8 {& s  s
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 B8 N7 o' L: `( {# d5 Z; ]
  13.         monster.setState(new AggressiveState());
    / y  D) `% o/ y7 r! V3 z
  14.         monster.executeState();
    9 Q8 g/ l! L, b) `, E3 P
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак6 R, ^1 ?- Y8 |# Y4 Z3 p5 \( \
  16.     }
    & h  p; i0 ?7 Q$ n+ A) a
  17. }
    . V( `, W; W( y; i& w  Z) S% O7 [
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.. _# U/ r6 p9 V: y: N# Y  F6 g
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!4 a  u9 I& ]% S$ l  R

3 i6 B# a8 K2 j- {  d
0 o% s/ z; n# P% x- r2 b" A9 t- u. Q1 T% g, V





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