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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
2 ?. K$ D% L3 }6 Q- G
) ?+ e% l3 }8 g; [% r! Z

: E8 J* f8 y/ e1 k5 UЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы." w; ]! |' T/ Y! @6 N+ J
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!( ]3 q9 \0 N+ J$ R( ?1 {( T
Астралия ?
. k' I% J' c5 x9 l: K+ V5 Z
6 I" T) x0 H5 p, f! {; P' e& J
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!* r( W6 W' ?) [6 P
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?0 L: i7 _& n% T6 s. p

( j# h+ G9 q, R. Z9 P4 U
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 5 `3 u$ }& \6 G' s
AlexCoder опубликовал в 2024-10-16 18:31
+ N2 P7 @4 z7 N/ A7 u2 R  `$ SДень добрый!
. O2 W4 c$ N3 o" Y* l" ~4 M; A, nВ статье описано взаимодействие игрока с N ...

8 G8 Q0 _9 A' Z' _7 `Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). # |1 o5 n" V7 j$ [* p" J4 y. y
' G$ g6 b- i. v- w8 j* V6 U; V* i' x
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 P/ J0 G3 j  c* q% R3 x  I
6 [* e4 B6 a) F# V4 r# bШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.) K' D0 X. M. }

) m8 W% R$ C8 h  t+ o
  1. <font color="Green">// Пакет для состояний монстра</font>
    # V: f, K% k& t0 w/ I3 P) A
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ I- @$ D: E% ^: h9 ]2 m9 ]
  3. <font color="Green">( n" x  l( f" E) Y$ Q4 n6 }
  4. // Интерфейс, представляющий состояния монстра</font>
    ( r' v' d6 v0 j
  5. public interface MonsterState {
    * K+ F& y* C! R+ c7 N" i
  6.     void handleState(Monster monster);& _- F( u9 F- `7 r$ u- e% I
  7. }
    5 p. |* J! A( w+ b; h" M' s1 a
Скопировать код
! T: L5 c+ U2 Q3 W
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; J8 S( M& e5 h1 Z" ~3 y, `4 h* A% J8 w7 {6 T
Класс для начального состояния монстра:9 }2 w% h( G5 \# P0 f! O3 H; w
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    $ z' s' Z6 q4 K  q) ~6 i6 Q
  2. package org.l2jmobius.gameserver.model.actor.state;! s! ^6 x7 C9 o4 X4 t8 ~) Z

  3. + ]( Y. J9 t! ]2 J) g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 B  V( d2 |* d7 q# @
  5. % O- V+ a. X2 c$ `# @+ z
  6. public class InitialState implements MonsterState {3 p' {9 ]# d) V1 @  Z
  7.     @Override/ e1 f4 d& C+ `9 r* t
  8.     public void handleState(Monster monster) {
    5 e7 D5 l! p0 d5 S: Y
  9.         // Начальная фаза боя
    ' u+ D( O2 |% H$ E9 g- R2 S
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # a4 a, h  ^8 d# }! h
  11.     }
    6 K4 Q# a% m. A4 A/ w% K/ N# D4 _
  12. }
    # C$ e0 R/ M3 I% N: u2 h
Скопировать код

9 T3 v7 A, n; y8 |+ `  ^
" v! |2 U; r) q. {- ]+ W% C% k
7 x5 h; x' W3 R; `
2 T  h; y' t' R7 z: i) K, S* c' ^2 k- s8 _
# M& G" U& p, o; q/ q
: e- a7 O# `, w, r* Z# e

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
: [0 i# o- ]9 E( Q" _
1 R* Y  V2 f6 {+ d! vЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  e& s8 S* `2 a. F. |+ }

( i7 A. W2 ?: w; v' I( XШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния." B4 n0 a/ A. v( `" G0 q: _6 s9 i+ Q

7 C" M/ L3 b( \1 \( j* l! B+ Q# C$ P
  1. // Пакет для состояний монстра
    # u  @4 K  U0 i
  2. package org.l2jmobius.gameserver.model.actor.state;3 h9 q1 j: J& `' p5 n) m. O
  3. 6 l% B  E  s. Q8 ]- ]7 P+ h
  4. // Интерфейс, представляющий состояния монстра; C; G2 f  M9 C& x- c
  5. public interface MonsterState {! X1 g/ u( N1 d1 K5 K# n3 `+ m/ h, O
  6.     void handleState(Monster monster);
    + |( @; k. \; h% r' U
  7. }3 [2 e' a4 i- c# U9 X
Скопировать код

. I# }1 Q2 u5 y  h: B  [1 oШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ }  G5 n3 x0 P! a
2 L, Q; H$ `" _( B4 |# i& y" \
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  A/ p4 Z% Z6 o: f

5 O1 X5 i* q2 mКласс для начального состояния монстра:
5 J# ?( X" p+ Y% H3 a* [6 q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( q' i4 W! Y/ F/ K" g
  2. package org.l2jmobius.gameserver.model.actor.state;
    , ~- M7 I& P3 v! i
  3. 9 s$ t+ S; U9 {5 Q  e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 j; ?7 Q6 Y3 n( w. t

  5. / g2 b& w& E7 m$ g  V; V: J
  6. public class InitialState implements MonsterState {
    0 V$ s/ L# n2 `& _& [# _" d; T7 f+ |
  7.     @Override! W& b5 g1 p! c/ W; ~7 ?  l
  8.     public void handleState(Monster monster) {
    ; E0 C9 v0 _( u; F: k1 }7 N6 P
  9.         // Начальная фаза боя0 M  i' `6 ~' N& n0 d4 g& j  U
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 o3 `2 Y  a% \4 A
  11.     }
    / H) B5 P' X6 a, |: v2 U! c# l) R
  12. }
    0 z* i# @2 {; m' t% R
Скопировать код
Класс для агрессивного состояния монстра:# P, `4 v9 o) w; K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. {# g( N. W& h! t) j. M
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 |7 x9 K3 m" H- V& X

  3. $ p0 L# |6 _5 N+ e, C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ J0 G. D& r) A2 y' N+ C
  5. % Z9 g& f! h' W  Q& {. g( H3 j/ G( i& Y
  6. public class AggressiveState implements MonsterState {
      A" ]* b) F2 Z+ N5 C! I
  7.     @Override
    , f; M- n2 c$ _1 _
  8.     public void handleState(Monster monster) {
    # w) G: d$ o7 k# e0 _( w
  9.         // Агрессивная фаза боя
    0 R9 c' q, o' [. [
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; |5 u& [0 _9 }& Y4 g; q: k
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    3 V; K/ F" N( |, n4 m1 }
  12.     }
    2 L+ f& @5 h: y* w2 n. k/ G
  13. }- }0 i& q& l5 H- O
Скопировать код
Класс для финального состояния монстра:
% G, C! e" w+ J/ z1 {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 m! j+ S2 L& q  n
  2. package org.l2jmobius.gameserver.model.actor.state;/ w$ q8 s9 A; x. L+ T

  3. 8 m# }2 v3 v2 u# P$ ]; ^# Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;( n! @9 S4 W8 J  K, F
  5. : h7 R. x; v8 K, t- \
  6. public class FinalState implements MonsterState {- Z$ x2 B6 @- h
  7.     @Override
    ) b: _. D: F! P: I
  8.     public void handleState(Monster monster) {, ?9 o  ^6 u3 a! N9 y: o
  9.         // Финальная фаза боя; B. j" R: D/ T: O
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 p5 Y2 D1 i; ~9 G
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    5 p  c4 q7 b( f" A3 @5 p6 q
  12.     }1 K/ O: c+ X) N4 w
  13. }
    ) h9 d' U* x4 N# b4 w. r1 `" g
Скопировать код
' ^8 ]9 a; B& J. n9 T  [, C' [4 G. Q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: D- }9 _4 z$ g9 M* Z2 M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) M9 {' @' p4 Z/ r1 a, M
  2. package org.l2jmobius.gameserver.model.actor;5 C! U8 N. A, N7 x0 c- t

  3. $ e+ g6 V. h! g  M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
      [1 A% g9 X3 _
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) |5 W4 C9 y& t
  6. ) c! {9 a9 W( x% h
  7. public class Monster extends Creature {3 u& E: I$ I' _! z
  8.     private String name;$ r* T# O2 g: R5 e, q4 j  Q! P$ ], U
  9.     private double attackPower;
    ) y4 z, z; n7 I4 C1 I
  10.     private MonsterState state; // Текущее состояние монстра
    9 `  N& ^8 W/ `$ T( [8 H' x; C
  11. 1 ^$ C) ~4 P" P, c
  12.     // Конструктор монстра- _. B/ Y& N8 u$ J: R. z! o
  13.     public Monster(String name, double attackPower) {
    9 E' n  `8 w  }+ P3 |, `
  14.         this.name = name;
    4 g# Y9 ~7 Y6 ~' o5 ~
  15.         this.attackPower = attackPower;, J- l- c6 r. ^) x, A* @
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    1 ?9 X# Z4 Y' |+ S' ]
  17.     }
    , b+ O$ Y* f  Q# t- R: y+ Z
  18. & A/ i" {7 }. t- J( X7 e- u
  19.     // Метод для смены состояния
    6 y( e* D" _  k3 f. A1 h
  20.     public void setState(MonsterState newState) {
    9 [- t; S3 E* R9 \4 J
  21.         this.state = newState;
    ( ^3 B6 w: @7 Y
  22.     }
    2 G+ }! ^1 Y- {: Z- v& j
  23. / \5 T0 P0 K8 ]4 z. I( P" ^, p
  24.     // Выполнение действий на основе текущего состояния
    2 ?; U" q0 N5 t
  25.     public void executeState() {
    8 N& `  m' d0 h# F
  26.         state.handleState(this);7 u+ C, t# T- C, B1 h8 o" z
  27.     }
    7 ^+ H& Z  f) c. @

  28. 5 ^- x4 |6 J/ B! n* K  [0 {
  29.     // Геттеры и сеттеры
    6 }4 U3 g+ S* v) T5 [/ F
  30.     public String getName() {
    ) E8 s5 W2 H3 c% \. p4 k
  31.         return name;) U  {4 v/ `' ~( H$ C+ l
  32.     }; L- d8 a  d7 X! T/ @; K
  33. 8 e( Y& l/ S8 m3 p. h, `% c9 v  z
  34.     public double getAttackPower() {2 z; R) T' R! K9 j2 [
  35.         return attackPower;# }( _# K  n9 `( b- c+ g
  36.     }
    3 B1 M. G% v5 f, S' B" T9 H5 u

  37.   m: t; }% @/ a. u* l/ s
  38.     public void setAttackPower(double attackPower) {, G8 X1 n! V8 r
  39.         this.attackPower = attackPower;# \& [0 `. u- w$ O
  40.     }
    ' p# \0 t  l6 T9 E! D8 k; S
  41. }
    7 q; o- m& r% c% j6 M8 T
Скопировать код

9 [% @% E% X7 l1 cШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.- i( K$ b3 W" {

3 ~9 ]: i) F7 j* E% R3 s
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + e& E8 N$ G9 G1 q! A
  2. package org.l2jmobius.gameserver.model.battle;. B! p% U5 s0 C, B3 f$ z

  3. 5 a& Z3 }# ]# t) P4 z& J9 V0 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;, D$ O2 \. G; P) q, m8 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;6 m( G6 ]' Y- M; L1 [+ U3 ]5 j! ^
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;3 s2 |0 O( D8 w4 G' g
  7. : U" y2 |) n2 W4 m9 s
  8. public class BattleSimulation {
    + ]; o  p5 \) M4 H- O- a5 `
  9.     public static void main(String[] args) {
    & a) {8 H; \6 k# @# Y
  10.         // Создаем монстра с начальной атакой
    , ]) Q+ s! ?2 {7 T  Q
  11.         Monster monster = new Monster("Дракон", 100);# |$ b: C  k' t3 g2 c/ \

  12. + }/ V; u" u0 x) w: B" k; P; K, p
  13.         // Начальная фаза% ?$ i9 {; `7 C8 M2 M- l# ~) b+ J
  14.         monster.executeState();
    + q; K; o' L$ t" A7 s

  15. 3 P) Q0 e  K/ q/ y; F
  16.         // Переход в агрессивную фазу
    : Q( o8 `6 K- h3 B( A  f
  17.         monster.setState(new AggressiveState());8 C5 D" [. ?* K) u" \
  18.         monster.executeState();
    4 }; J$ u# v  M% K1 S' O
  19. 4 p3 I) g. X" O$ I" _
  20.         // Финальная фаза
    0 M$ a) X0 g  x: i
  21.         monster.setState(new FinalState());) ?& K) H# E. |0 g$ j2 g5 u
  22.         monster.executeState();% t8 T2 I" M3 F  i( |: L
  23.     }* `5 V  t1 C, X# A( ]2 c/ @  {4 H
  24. }
    , k" H/ q, P. H! b/ t* m
Скопировать код
5 l% H7 j! @" P* ^, W
Комментарии по структуре пакетов и классов:
, A( b  @: ?8 m3 v3 Y& sЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 c* N' Y+ K2 I& QЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" g; q' Y8 P6 f; y# V( ?% N
5 x+ J! j* W' b3 X$ ]

, j+ Y& L) M+ ]! D
. C, {4 g! }' {
% T) X# M( e5 B4 c4 P7 Y3 p# w& W: c+ f& w2 v8 d- w
: S! X# k7 b' B, V" z# a
: D6 @% X! f$ Q  q- |/ `6 S8 ?' @/ V' Y
3 x" N! T9 T3 D; p2 a1 Y

& }3 s' ^) _  g1 }$ n+ a7 ~3 Z6 m# C6 Q' v

5 i+ d' m& N2 V7 P3 U
% ~" E1 c+ K( m/ z8 {, e  p6 R3 M+ p4 t; {3 E' ]2 `* P

6 z; v5 T9 Y# P: d' K
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
8 P4 b  ^  N( ^5 `1 UДля управления сложными взаимодействиями, такими как  ...

, U( a) }- W- H; o+ D  U, FОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
6 A! B/ u$ M) T6 X# y) U2 dОтличный подход! Использование шаблона "Состояние" де ...
" {& r2 x2 F: P8 ~2 ?" x
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.6 ^* |/ R4 \! I, u
, ^7 x+ d. i- z2 P4 D% U8 P
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
6 H. ?; H" F& \  M  y
& \. u4 s4 l2 z' c- i
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % J* B: ^, ?6 C0 J# t
  2. package org.l2jmobius.gameserver.model.actor;9 O, j8 r5 @  V5 F% h

  3. + y$ ?( V6 A  U6 r( h2 q/ ]; w+ }0 l2 {, d
  4. // Перечисление для типов атак
    ; z/ E% J$ k3 u' Q) A6 s6 H1 T
  5. public enum AttackType {; N1 L4 F  U- d0 i1 F6 F
  6.     PHYSICAL, MAGICAL;5 i4 U, j7 `$ f4 Y
  7. }* c  X9 r7 @. k( O5 y- o
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
( Q# t: f$ ?/ L! Q  x8 m% W% IОбновленный класс для агрессивного состояния монстра:6 R$ I: p- A8 V
6 v, v; s" ^0 V; D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . b! C) p$ C: E9 K
  2. package org.l2jmobius.gameserver.model.actor.state;% s" `8 B* v. |8 A( k/ ^
  3. + f/ Q, Q0 j# j  A
  4. import org.l2jmobius.gameserver.model.actor.Monster;! C6 u$ f! b( i, s  o" m
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    * f1 u  K2 A1 L$ n  ]! k0 Y' D! M( C
  6. 7 g( _1 r" N% j; L
  7. import java.util.Random;
    : C( Y, i0 r2 J$ R% \9 l. K( `1 ?

  8. 3 L& L6 {' Z' J; G
  9. public class AggressiveState implements MonsterState {% Z! G, v* k! O0 P- S; F& u
  10.     private Random random = new Random();4 Q& S( e( l5 ~0 {8 `: K

  11. * ]0 H+ s# W( V" y$ y
  12.     @Override4 l8 v4 z: X) ^) X; o
  13.     public void handleState(Monster monster) {
    8 y- c# R4 q6 ^
  14.         // Выбираем случайный тип атаки: физическая или магическая
    + _8 N3 V  C- {3 O6 r7 h
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;7 V% l1 h5 `6 ]9 A9 N8 P5 G

  16. + m% h. p5 Z. O3 V
  17.         // Логика для агрессивной фазы боя  O7 A  w) c4 z5 [  b. L( \  K+ R
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " % H. \8 @# c# m& G0 ^; m
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! P% ^) W* A+ t! K  ?0 \0 C' e" Y0 H6 V
  20.         ! P5 s, L- Z- s( @( o9 ~( B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, a( f4 W; L0 e, }5 Y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    0 A0 ]5 r: E+ w, o; v  r
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);0 E4 f' D+ t2 d4 I
  24.     }
    4 f- E  W! S  A9 B" L0 |$ L: }# L
  25. }
    / w6 e5 r  x0 T2 d; |
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки% X, }1 i1 J$ p! {. u  o" d

' T; o/ n. b0 n! W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 f  B! ]7 ^, J2 ?
  2. package org.l2jmobius.gameserver.model.actor;4 V# u5 E1 w. E- U! b% m
  3. # r: A. o0 p2 Y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' W& W# {3 ^1 T0 v7 m. |
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, K/ Q- E% H% r6 W

  6. # H0 o1 {! O0 b1 y  p$ l
  7. public class Monster extends Creature {
    ; `. ~  g! w* D+ X
  8.     private String name;
    2 ?. b) P( l+ W+ [. p2 L
  9.     private double attackPower;
    0 q; a' K9 ^  H3 r6 T  }
  10.     private MonsterState state; // Текущее состояние монстра- G0 [( B. Q( z+ f! k! I- p# c

  11. 8 h. {! F, v+ Z  h5 y- s
  12.     // Конструктор монстра8 c' c! T- `% q0 D9 x  _- w
  13.     public Monster(String name, double attackPower) {
    % l4 x8 K( `# |7 \8 S! A
  14.         this.name = name;2 B- t% W! I; O/ d7 G
  15.         this.attackPower = attackPower;! v% |7 c' a) W; H) X# W
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 }$ G7 Z( D1 C
  17.     }0 ^  z8 @& |% l9 c- p/ J
  18. + N. _! G, G2 M8 G% H
  19.     // Метод для смены состояния6 `) b0 D1 `$ Q9 U! v+ M
  20.     public void setState(MonsterState newState) {
    . h: T  }5 x- ]6 c
  21.         this.state = newState;
    ' t% p0 U. F. p, r0 D
  22.     }
      f/ f$ u: W) {* U

  23. , L2 i6 t" L. U  e7 M, L) q% h9 V
  24.     // Выполнение действий на основе текущего состояния: A" a3 E) V4 G3 k1 N3 m
  25.     public void executeState() {
    % H5 I2 }" V# N: ~! `7 E8 A
  26.         state.handleState(this);1 X4 c' E& o5 `! r; f8 S
  27.     }9 O. }# A4 R7 y3 j1 N2 D
  28. 2 w8 l, ^3 d6 ~2 @( b- J" W
  29.     // Геттеры и сеттеры
    ! p, [: u# a; P. M
  30.     public String getName() {2 Z4 s+ c1 }/ T' \$ o
  31.         return name;% t2 ^- Q. G/ R' m1 \
  32.     }
    - E. T: w* q4 c/ j+ w

  33. : l) h8 J7 ^' G5 H2 |4 {, V
  34.     public double getAttackPower() {
    8 _$ @) c7 ^+ g' C5 @
  35.         return attackPower;3 y9 @. D9 b' u$ m7 M! n1 @
  36.     }
    - a: V2 n  e0 f9 l( I
  37. 8 F7 o1 t! j* D6 ^
  38.     public void setAttackPower(double attackPower) {
    0 P+ _# U! I5 d. c
  39.         this.attackPower = attackPower;/ w9 v  {' X/ u- \6 F
  40.     }3 m- x5 ]# A, X; W* v( q  z1 X
  41. }
    % j- C5 z6 i6 C6 J
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
, ?: @- X4 z, O
/ ~+ j9 v' \3 L4 g
  1. // Пакет org.l2jmobius.gameserver.model.battle- x# }# Y$ c& K2 u
  2. package org.l2jmobius.gameserver.model.battle;6 O3 I4 S6 @: [' x
  3. 9 I# h% s7 [2 e% B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - D6 F! K& D8 {# L4 [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, ^2 J* r, s1 _4 n
  6. ' L& `2 h) o, n- v! \- v5 ]4 j
  7. public class BattleSimulation {
    ! W" d9 m& q+ X2 d: w  P
  8.     public static void main(String[] args) {& }9 z; d" u. t) u/ w, D
  9.         // Создаем монстра/ T& @9 {0 V( X/ @/ ?) Z( |; Y
  10.         Monster monster = new Monster("Дракон", 100);4 i  b( b6 n& [/ I( n: c8 j

  11. : [5 C( F# S! ^; i4 }
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак" {7 _' M" X5 @0 F7 N- B7 g
  13.         monster.setState(new AggressiveState());0 u; G/ K  b0 j2 r- W3 {2 `
  14.         monster.executeState();% A7 q  @6 g, M* ?
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ( N8 n" ~, x9 ~) V' h
  16.     }
    : Z( x& L8 i+ T* Y, U. r$ y' S
  17. }
    ' g5 d) ~( Z+ X* V
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
$ q6 G( Z. i) _+ g0 Z' QЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
$ x) p1 v" t6 b- Y* o* ^7 U8 e* q1 y5 G. }4 G
& P2 _) w" M' ?* ?: \8 V  L* @' _

/ D: E, ]0 n* `4 l$ ~- `




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