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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
6 X' ~! O5 U% N: l- ?$ Y/ c* R% s1 V5 L) \+ ]) d2 m6 Y7 |
7 F% T: Q$ ]& q# \% @7 U/ {5 J
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
  C$ x+ j, ]' d8 O, v. eЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
% y3 y, _. K$ W# I: R- i: KАстралия ?
! W; ~0 b3 @  c- P  L  w: g6 f) k( J) k0 o; F# {) X* e

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
  B- D0 X! C* t& {; U8 ?В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?, ^' D* B6 O" C* v1 z: H3 `
) ~1 y5 `) u; y0 u

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
; k5 }0 C# [0 F; p4 R
AlexCoder опубликовал в 2024-10-16 18:31
' A' i$ H  V5 a+ k: uДень добрый!
9 P& g1 x' j/ mВ статье описано взаимодействие игрока с N ...
- X: h$ f) o4 _1 _' g) q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 t  B- T* Z9 o5 Z8 j" ]4 [/ j; t0 g; j5 ~  F1 X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! r2 L& g% x. t$ C! g1 r
1 n8 K6 s; W1 r! b. Y$ G# v) k
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.4 H" D& v- l# O' f1 B4 Y8 Y
, S' ^. k5 ~8 C
  1. <font color="Green">// Пакет для состояний монстра</font>; B* D9 i) [1 I/ Y0 Q, c5 n
  2. package org.l2jmobius.gameserver.model.actor.state;
    " x1 q# b* o% W+ }! G; q- `7 ]* R
  3. <font color="Green">; L1 G& n  A( z( \6 @) |
  4. // Интерфейс, представляющий состояния монстра</font>& T3 }5 k- D8 ]4 n+ V9 j
  5. public interface MonsterState {: m# x; W0 ~* K3 q  F& c6 N4 D
  6.     void handleState(Monster monster);1 F% J8 U: N  D* W
  7. }" U) i7 ~( V9 l2 U- ?
Скопировать код

, s% \/ s+ B( H( lШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ \& v! c/ f! i  O9 {; U! x5 N; H; f& `* X# B) W, s3 h
Класс для начального состояния монстра:
7 \, w0 D* q/ {# r7 @6 c
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* }  K+ c" m9 S  n
  2. package org.l2jmobius.gameserver.model.actor.state;
    : m9 q- y& i. b' `

  3. * C- R- G' N. S" ~2 |" n7 b9 n5 b  m
  4. import org.l2jmobius.gameserver.model.actor.Monster;) r: F! q2 d' D7 K# [
  5. ! z4 W4 B0 w0 a5 {- o) w/ Y' R
  6. public class InitialState implements MonsterState {  G! W! g, w+ w# Y% Q. e' T
  7.     @Override
    & f  Y2 B2 T3 e0 @+ I
  8.     public void handleState(Monster monster) {
    , F9 L' G9 O2 i$ E0 j! ~
  9.         // Начальная фаза боя
    6 ^: D% }) _9 e" Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");0 L; i* O, m. ], i3 R. s3 v7 c
  11.     }
    9 Z8 a" F. ]2 ^" k6 ?; R/ C
  12. }
    4 s: i) d2 x9 v% b/ h3 y
Скопировать код
3 B$ C6 S3 g* \& ~/ U2 F
  p' _- _. B; d

  f6 L5 D/ L) Z1 M/ w* @7 A) Z2 q/ T7 j

9 J) y' Y0 g( ~5 o# j- o2 e6 ~5 K0 \5 h: [2 Z, [
- B! y1 }2 q% k( u3 B' k* z

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 m# K' f7 k% e) @. D  a" w  |0 T$ l: r  ~, E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- `- j1 l; E3 ^/ K
3 M/ F1 i! `* R7 F1 L
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' J) I; d  f  T( r& W: x1 C" Z& P$ ?
  1. // Пакет для состояний монстра
    8 F7 U* S" H$ a( I" E" z4 K; |
  2. package org.l2jmobius.gameserver.model.actor.state;" `& G6 \" Q- t9 j+ R9 W
  3. 7 r2 j, T  g. S; E' }, L" K
  4. // Интерфейс, представляющий состояния монстра; }  [, T$ K. z& `
  5. public interface MonsterState {
    6 ]- T( i$ i1 B' G3 k
  6.     void handleState(Monster monster);
    6 \  E# U2 a' d: x5 `  L
  7. }* v. t% y4 `: o! D4 u0 N
Скопировать код
" b/ \0 B/ A% j6 n5 D
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
3 n8 m6 E' a9 |" q$ u6 b7 z: e) y" W
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 n3 y) D5 C" H) J% r, a
7 F8 k! ^/ Q$ P6 y, d( m! ~Класс для начального состояния монстра:/ P) x2 y- @( `: Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # L) {+ t/ q6 _) Y: s9 |  B& V
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; {. T- Y3 Y8 _* L2 e+ x; T; z/ J$ H
  3. ! [2 w& Q; r$ a2 U+ E
  4. import org.l2jmobius.gameserver.model.actor.Monster;( c: P0 N! J4 x
  5. 5 J( N: P" ]. D+ G$ l
  6. public class InitialState implements MonsterState {
    . G9 w2 j+ o1 s! \+ Q, j: {
  7.     @Override
    8 I1 K! r, x( J. e- t; w8 m8 C# W
  8.     public void handleState(Monster monster) {% A3 Z' m( V. X
  9.         // Начальная фаза боя* S+ K6 f* q" p" f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");. R) l- P3 i. ?. }  i
  11.     }
    : l! q3 m0 i" Q8 m! O! E
  12. }6 A+ v2 n4 r: J+ G7 A
Скопировать код
Класс для агрессивного состояния монстра:
: `1 e/ V2 ~$ ~% E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& q8 q1 ~" |: W: S" t5 Q
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( N3 `6 ~, f2 P2 y& Q" w

  3. 7 Y0 p' g0 v4 ^% Y2 a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ V' n8 y* f  v
  5. % a# l# r0 [1 f- H: ]- {# O0 Y
  6. public class AggressiveState implements MonsterState {. [, v& y9 X/ i. L3 n# ?6 b, R
  7.     @Override' o- i, n' m5 k+ G' N$ B. R: c
  8.     public void handleState(Monster monster) {4 }# J# \. {: C8 F, W& W
  9.         // Агрессивная фаза боя) T5 C/ A1 e- s# W1 S1 R" d" L/ H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
      \; ?+ k! ]+ Z9 ]% m2 Y) F9 U
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. v' k2 t7 p# S5 k
  12.     }& ^0 Y+ e3 X+ [3 I
  13. }; e: d3 ?$ i2 r
Скопировать код
Класс для финального состояния монстра:
5 a' B; z4 D& c  \  Z# D; Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! }) c4 _$ k& C: Q3 H
  2. package org.l2jmobius.gameserver.model.actor.state;& |0 M0 p& _( Q; P! g  i
  3. , u) y3 s% Q0 r% O8 b1 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ l5 o( U, k  r" Y2 d8 F

  5. ; v' P4 S: q. C) H% Z5 T
  6. public class FinalState implements MonsterState {7 g% B! s4 Z" H, I0 x
  7.     @Override1 F1 I; p( b. u- P8 n' ^
  8.     public void handleState(Monster monster) {
    . `8 j" U, T) O9 ]9 a) W
  9.         // Финальная фаза боя
    * B6 \0 \2 V" c7 x
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");  R/ Z+ j( \. A9 ], V5 }5 W
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( H3 [. M) e. R! ^; e
  12.     }
    5 F2 s6 d9 D, C# s
  13. }. g/ y5 p) v: j( k0 [
Скопировать код
, A2 N  n- y' v
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.& L# y; X/ n4 A; M* F& g/ O4 ?) V: N
  1. // Пакет org.l2jmobius.gameserver.model.actor3 o  _5 o  h5 |  W+ C2 R1 Y, _
  2. package org.l2jmobius.gameserver.model.actor;
    # x& ]  ]% z7 P' s  w+ X
  3. 8 g4 q- y" N! F) z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 D/ V! W) M% E- O% ?5 S  b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;3 |4 N- Z" W, i# C2 H7 e4 g

  6. # ~; e& f# {! S' E- s1 B4 J6 a
  7. public class Monster extends Creature {
    ! y( y' U2 r# `+ x0 `* r
  8.     private String name;
    6 o, J( I' _7 [8 S
  9.     private double attackPower;0 L4 Z6 N* K0 Z* O: S" O
  10.     private MonsterState state; // Текущее состояние монстра  B' [. w# q+ f- b# d! \& D/ T

  11. " n3 I% D( T% }8 D, B  X8 H
  12.     // Конструктор монстра. V2 V2 P8 J9 I$ `
  13.     public Monster(String name, double attackPower) {7 n  b$ t; k3 R0 d2 V! A
  14.         this.name = name;
    2 M; O1 A3 }4 @
  15.         this.attackPower = attackPower;# q5 `! T0 D& u( k
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние% G# L! X+ ~/ |! i. ~$ v4 y
  17.     }
    - ]& l5 g: Q% E7 o7 M, `
  18. ; ~# X7 e3 u# y
  19.     // Метод для смены состояния
    & s3 u0 D% F" r8 d) I! |. }
  20.     public void setState(MonsterState newState) {( P/ j1 ~% K( ~  N) U5 \# R( P! B- V2 n
  21.         this.state = newState;
    . D: y2 Z4 P! S( S( c  D
  22.     }
    8 ^6 R4 s8 N6 |  k. N7 \8 u( H
  23. 0 O; a* Z  `( v# o
  24.     // Выполнение действий на основе текущего состояния
    9 A& q- X5 |# u
  25.     public void executeState() {7 ~, s) Y5 z! u+ T. o, y/ T+ }
  26.         state.handleState(this);  ?3 N: R; _3 N1 A* h6 f9 W( M
  27.     }
    4 S8 |+ n5 h: J* w/ V5 V4 w
  28. ! h" W- n! u) w+ ?8 e0 A" g4 _
  29.     // Геттеры и сеттеры+ t# H& r; x4 m/ r6 F
  30.     public String getName() {
    % r& I. O& `2 B& J7 O
  31.         return name;- k7 x  U, t7 ?. E$ J  r
  32.     }* U" T, J- h0 @
  33. 3 _, y( Z) O  e. {0 j6 L7 T
  34.     public double getAttackPower() {
    % `. |! j/ t" {' Z
  35.         return attackPower;
    ' V* e* _0 Y" S/ r% Y
  36.     }% p* r& ~) j/ R$ g1 U0 }9 _
  37. / o4 N* r0 \; M+ R1 i4 r- K
  38.     public void setAttackPower(double attackPower) {, l0 W6 c1 m5 V6 O# i$ T
  39.         this.attackPower = attackPower;
    : j' c% H% `6 T6 c
  40.     }/ {$ ^8 y! L, N4 U2 M9 L
  41. }. t3 z& `  M% O2 y! v
Скопировать код

! a( ^1 f( B# f2 N6 [Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
7 R/ }0 q+ m6 W. F2 z7 N  o% K- Y* s6 v3 B+ W
  1. // Пакет org.l2jmobius.gameserver.model.battle/ |, d' {$ q3 v% J! X4 Z
  2. package org.l2jmobius.gameserver.model.battle;
    : @5 K# J8 v$ K6 G
  3. 7 @8 ^) [2 R$ s3 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;. H; ?* V8 R7 ]: b  |" G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' A. D. \3 B7 I9 x2 s% R
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' g- D* P+ B7 v" m
  7. 9 t) ?- X# V0 R4 A" s
  8. public class BattleSimulation {9 }2 t- f  ?+ k% r9 V+ k
  9.     public static void main(String[] args) {* E- j' c. I4 n
  10.         // Создаем монстра с начальной атакой$ D! i- j5 f& |2 J
  11.         Monster monster = new Monster("Дракон", 100);" T" Z' B1 R- O8 b. B: ~

  12. % c7 x; X8 V# c  b! k6 A! V6 B) X
  13.         // Начальная фаза
    9 F/ m$ K0 g  C! @" u
  14.         monster.executeState();
    0 |* b; |4 s% X7 W" [; u1 ?
  15.   a8 P7 P0 k+ q4 e& E3 u8 s6 w
  16.         // Переход в агрессивную фазу# O2 J: f6 [  U$ Y0 _  n$ c/ ~
  17.         monster.setState(new AggressiveState());
    , |$ V& r, X) K2 s4 n% W5 M
  18.         monster.executeState();
    " ?3 J1 h. o2 `! R
  19. ' m4 F. ^& e" {' ]) f, T9 S
  20.         // Финальная фаза
    - v1 y4 |7 B3 S* o+ L+ Z
  21.         monster.setState(new FinalState());
    ! S9 I7 |) n+ q- H; y2 i* x
  22.         monster.executeState();. ^1 Z! o, w$ f. `$ n) w! N1 h
  23.     }% K2 |* G. S" h5 X
  24. }
    - N  Q4 [$ E* Q
Скопировать код

: Y% B( p; \: n9 jКомментарии по структуре пакетов и классов:
' r6 t" w- {3 z5 {- P. W# cЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.: l( w# V( z9 \: s
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 H- `' H/ `3 Q1 \& c3 O5 A: {
4 b4 C- b) t) a, J  B" s; T' \

; v$ J% x  c0 N2 T. x2 @( g% f2 X- N! z6 `

1 B2 v4 b: K( A: Z3 X' m6 q% s  z

/ r7 h& M6 P7 }0 I* y% C
# P  N3 i2 p0 D. _
& k4 ^; N( {4 l$ s/ D8 h' Z9 c
" K, Y# e9 E% O& O6 P8 F, _
8 c+ X9 Z. h+ v$ s) n0 S3 N! @+ g0 }3 T6 ]
6 \( {+ R1 T, a

. l  @, b! ~5 E1 x" u- i+ c- F: i7 {: q9 a4 u7 s

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
; p$ x% `9 D" E7 Z8 x0 Q$ D& G0 FДля управления сложными взаимодействиями, такими как  ...

% T* p6 E* N, e% h1 T+ ?Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:210 g4 I; h( G1 A+ J7 G, V- l
Отличный подход! Использование шаблона "Состояние" де ...

" ^' ^6 ?7 a. Q# r2 HХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
: ~5 i7 v( M7 S) k* K4 `
* g9 G8 C! l, \+ w$ T* KШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.. s4 l3 C4 C1 {4 y
+ B8 z! t; z3 c6 }5 B7 u
  1. // Пакет org.l2jmobius.gameserver.model.actor2 S4 N+ q: N1 d' u, E
  2. package org.l2jmobius.gameserver.model.actor;$ e- T' [% Y' L

  3. $ G; C! D. V+ t5 X0 q- K7 Q2 B
  4. // Перечисление для типов атак* _* k" |0 F3 ~: P/ ~
  5. public enum AttackType {' |) H. ?. z2 L3 X
  6.     PHYSICAL, MAGICAL;
    : |: B2 W8 @3 ~, s
  7. }
    + Y' q- y0 d& F9 l
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
. [: k8 k1 q) N4 S. BОбновленный класс для агрессивного состояния монстра:. P: q0 ^/ d+ `$ U! i2 K8 P9 S0 e

( i7 e) Z) }, j8 K! j$ R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! C8 U( P9 h4 W2 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 @( y5 u* ]" d
  3. 5 p2 T: m; K: s; _' q; G1 i% ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / U% W  A) O9 O6 w5 a
  5. import org.l2jmobius.gameserver.model.actor.AttackType;* w0 g: O  k- X; Q

  6. 3 l' J8 H+ |- o9 `, r6 q' ?
  7. import java.util.Random;8 V  M% N4 R( C8 k

  8. 0 o( L9 o( @  ?
  9. public class AggressiveState implements MonsterState {9 z4 f. M, C) j+ j4 N
  10.     private Random random = new Random();" Z5 G* C4 R1 E. J) k! r
  11. ; @, M3 q- [9 [* F
  12.     @Override
    . l  I4 q0 a- c! N: [! _- j/ Z9 R
  13.     public void handleState(Monster monster) {
    , f. Q& f8 I6 }. M* D, Q4 c
  14.         // Выбираем случайный тип атаки: физическая или магическая: T$ y* e. Z5 h% r
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;  o: r. U7 _' W% @
  16. 5 {5 h0 f5 N$ f0 v
  17.         // Логика для агрессивной фазы боя
    1 B- y8 m- B) X4 o7 N
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    / ~# L, c! V) Q# n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");# s3 k5 |& ~; ~2 v- ?
  20.         ( E8 j. G9 x: Y$ e
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 E* ]9 j3 V& I; ]2 R7 C% h5 M
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    & I9 T& c& f& [% @, F( p: Q* W! O3 a! O
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);$ U- f7 V! L( h1 _; J1 f
  24.     }$ a8 B- V$ W9 u9 v
  25. }
    7 l! o9 n$ R2 W) U( _3 {9 ~
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
3 R7 V1 L1 f3 r& u8 l/ [
8 N& V/ l8 N( E( z+ l3 P2 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 B6 k1 p' M- ?' O$ q- g' i, G  i# j
  2. package org.l2jmobius.gameserver.model.actor;& h3 T) ^2 A' h1 Z3 e" ?7 t

  3. 7 t, y9 _. f2 W, y0 }
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    1 E( v6 F5 B4 j8 O. y* M
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;8 B  _9 r: [; V

  6. 4 H# h* z2 @9 x2 }% N7 c
  7. public class Monster extends Creature {# }. ~5 z1 V$ a! y" H# O
  8.     private String name;: {% l! i# H% Z
  9.     private double attackPower;
    * U1 b) x7 |7 S
  10.     private MonsterState state; // Текущее состояние монстра
    ' I+ E; J. O  R

  11. 3 U, V5 C+ s' A5 }  D1 y& N
  12.     // Конструктор монстра$ y/ ]$ w* U. t) [6 J% M
  13.     public Monster(String name, double attackPower) {
    ; k7 N. W2 \" o
  14.         this.name = name;
    . Z- T; Q9 k; x& b
  15.         this.attackPower = attackPower;
    6 [9 A0 D$ z, }7 E# @" \! e3 v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию* v. m! `: e1 s2 e3 u
  17.     }' S# ]! U. Y; |! {3 f5 _

  18. ; T* S0 l3 s6 G+ v
  19.     // Метод для смены состояния
    5 n! Q$ K. R# |5 X% @
  20.     public void setState(MonsterState newState) {& U) K! C0 W3 w7 [& A- w! f+ b
  21.         this.state = newState;
    " f/ ]% y1 S3 c$ n+ }4 @9 m
  22.     }
    2 `+ K3 S# C; q' R  v2 o! ~1 f4 j% X& Y

  23. 4 C3 f" i8 m5 S
  24.     // Выполнение действий на основе текущего состояния
    1 X, X; v; z5 v2 c, }  Y4 ?
  25.     public void executeState() {
    , e9 q. {: C# t8 N* g8 h
  26.         state.handleState(this);2 L$ j0 a) y3 K* N7 [# H4 u; Q
  27.     }
    9 _) [0 b/ d, i- o5 T4 `* h

  28. ; y* G1 O. e' n8 ^; k8 R
  29.     // Геттеры и сеттеры
    0 j5 v0 X2 L+ t, t$ l
  30.     public String getName() {% q& I* n8 Y: {$ Y$ d
  31.         return name;# s" W& K. Z- i& L4 g# L2 S" ~
  32.     }% [* {" q  J  n( I6 F0 q- |
  33. 9 y- C1 z: g, K( |5 o; G1 w. u
  34.     public double getAttackPower() {7 h+ \! S9 A# y# t" N
  35.         return attackPower;3 w$ H) U5 h; N& R" ?
  36.     }3 O/ n" K" w% {, P
  37. & Z  O4 _' E3 K$ \, C: b6 E
  38.     public void setAttackPower(double attackPower) {
    4 t% J' t8 w1 ^! I. o9 i
  39.         this.attackPower = attackPower;
    % ?5 m, h: Y. t: x4 t1 k+ U
  40.     }! S7 x% @, y; b# O7 D! L) n
  41. }# D; |" P$ s. O- |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.5 D' t- g; ]# C7 H
( F2 h1 G4 Z! H" s5 E
  1. // Пакет org.l2jmobius.gameserver.model.battle8 X% K4 r5 V5 w8 J7 \, D' S, D
  2. package org.l2jmobius.gameserver.model.battle;6 C: f. k8 Z0 Y& D
  3. ! Q3 U* Z0 B; q: T2 X; ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 y. K( S: [$ y3 s6 t
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) A7 I2 b3 f3 r- ^

  6. 5 z1 p, A& T, A/ q& Y+ f, @2 \
  7. public class BattleSimulation {. i' s5 U+ K- _% F$ ^
  8.     public static void main(String[] args) {
      L/ Y2 ~; A. [% r3 H
  9.         // Создаем монстра
    - l; }3 u; K7 J3 L# r9 n
  10.         Monster monster = new Monster("Дракон", 100);
    6 {* J4 L- F0 @; H

  11. + N) @7 |. t! A1 X( O5 ?) l
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    . S- n4 K# V; _0 O& r( b# f, A
  13.         monster.setState(new AggressiveState());, N! @4 k# p1 @
  14.         monster.executeState();4 s, J8 `( r0 F
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак; B% x; X9 ]& M+ `5 ~7 i' ~6 U$ d
  16.     }
    - F' _4 s# t* Y& o
  17. }
    5 j$ q6 Y3 b# M" {9 }
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ F; {" w# w1 O1 T) i" M) fЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
/ N0 G* V$ g1 C  y
2 X" D- r. \! [4 o0 b8 x' j* w; i- v& p. j8 ^
  f  [7 X1 R& @% f! E4 n  R' S) U- _  P





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