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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!7 w) @; m  P" T+ P- S: ~6 q& k
( b, I7 G8 _. e2 p' j
/ N) ~2 P7 s& V. {7 `
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
0 q! |6 T% R0 I- ]1 U6 E# y8 G, zЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!( ~, s" J) P8 M. t
Астралия ?
4 l2 K- W+ O$ ~" j9 D6 |0 q  c& S  j& @  ^1 Z3 c

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
8 }& ?5 k8 O, N. aВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
! ?8 A  y! }  R; G$ D& r+ t4 W' b* Z1 K8 v

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
( v7 J# @! a' j
AlexCoder опубликовал в 2024-10-16 18:31
0 Y* S# \' T, [) TДень добрый!
. [" N: y# `" `6 q& fВ статье описано взаимодействие игрока с N ...

$ O5 e+ ^( ^1 c' e+ uДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 k" L7 O: P+ _
  ?, B% K* M2 |
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
6 _1 v- K7 r0 h
: c: K5 B: {# Y5 `2 VШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 R+ F- y( S" B4 S" o' |; d
8 [7 l5 C% H% E& @" t5 M
  1. <font color="Green">// Пакет для состояний монстра</font>
    ' K6 [7 ~1 h2 @6 @% r( \" r
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 C3 y! v3 }8 w) K. v, H
  3. <font color="Green">
    ) d- V* y3 D( t# t" G
  4. // Интерфейс, представляющий состояния монстра</font>
    * B, B# d4 O) |- F0 P2 u
  5. public interface MonsterState {
    . t3 x( _& P4 Q
  6.     void handleState(Monster monster);- ~2 N6 P. q4 `+ h! U, O
  7. }8 u* A* j6 n. C/ l/ E
Скопировать код
+ W5 G2 a6 {( E& H. D
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' K6 Q) j) S$ J1 H
. h- b- g( c1 v1 d" z! p
Класс для начального состояния монстра:4 Y: X2 j4 H( k0 F3 W6 s1 K
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    - |( p: s0 X& ]$ P/ R
  2. package org.l2jmobius.gameserver.model.actor.state;
    + t( G! v8 B: h; ~4 A' j

  3. ' S3 b- e/ w; v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! d: b( a( I& m
  5. ; h7 {) Y- }$ A- ?
  6. public class InitialState implements MonsterState {
    8 i- N4 |# f" P5 O# R( P& X% N
  7.     @Override
    * M1 F: G/ z7 T- n8 C" h) T
  8.     public void handleState(Monster monster) {
    ( h: z  y& d& h* N9 O2 ]
  9.         // Начальная фаза боя
    $ y' C8 G* R. }# }# s
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    , b: `" p, Y* T7 x' x' f
  11.     }/ i% H' c& p& w; h
  12. }1 k# Z& N! Q1 y+ ^
Скопировать код
" h' H* e/ a0 f5 d5 |9 V- {
! r* O1 Y. A# M! X3 p  ~7 D

" o/ c. J" w4 t! r5 x0 X1 D0 D6 O* j4 Y1 \" S6 ]; g
% y  z2 b! j$ S- r' o, e

6 }+ ?7 P" N9 x) |9 n2 L% M
3 j! k) Q: R) `  r2 p* \! Z4 O
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / p' ~- U9 w$ p  c4 |/ _8 j

$ F# w7 j& g7 pЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.$ w$ f5 a/ X6 S4 K' S

" }# L" Q- v$ [$ Z5 }$ q2 g3 Y- x3 KШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 ]7 i8 l7 j6 }' g1 l
- o; b# P$ N  p/ p; `, r
  1. // Пакет для состояний монстра
    ( [; E5 ?% _3 ]4 R6 k  M7 p
  2. package org.l2jmobius.gameserver.model.actor.state;2 ~: e) S' N6 ^2 M& ?
  3. 0 S6 L' W( F; D7 v4 i# ?
  4. // Интерфейс, представляющий состояния монстра
    + U# s, D- |5 q/ A$ {7 _
  5. public interface MonsterState {6 y/ c% l% u9 r& C4 w0 O9 j# F6 L8 i
  6.     void handleState(Monster monster);( l3 f# L/ G9 s% n6 s8 N
  7. }
    % @( s! h2 W5 ~% ^  C5 r# [. m
Скопировать код

1 \' v. o/ j, P( W. x% \* O* B7 a" ^Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 B$ |( N% e0 _( K; w, H
+ g/ t  t6 G$ n/ S% @
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя." D- F) D! n7 X# F- x/ u" [# t
+ C! p9 K6 v: m* d" \, B  Q
Класс для начального состояния монстра:
$ ]0 n7 I  W4 q0 M# K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ _7 W6 z. V2 S1 b. ]
  2. package org.l2jmobius.gameserver.model.actor.state;$ ]# ]- c( I2 ?/ Q- v/ n5 |" y

  3. . a9 s% i/ n8 c/ T
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 y( T; B$ \% j" m6 Y0 G9 h) z. B

  5. , h" D% ]# {2 `
  6. public class InitialState implements MonsterState {( A1 x! L( q& ]: c: b) V. k
  7.     @Override
    6 F) h& u3 O& Z7 g" @
  8.     public void handleState(Monster monster) {
    0 [% \& I! D2 c# h
  9.         // Начальная фаза боя9 D1 \9 y6 R7 w* v: y2 G" p4 n- P/ l  n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 S. F- [& ?+ d( |% {- t) n
  11.     }/ f% p' n6 Q4 J" c0 b
  12. }
    & e" x" i: [( y+ r* G% h. U
Скопировать код
Класс для агрессивного состояния монстра:2 l/ {+ l' A- U% _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ r, Y- [& }: K* R( C) w% C
  2. package org.l2jmobius.gameserver.model.actor.state;$ T3 E/ [( B/ Q  r$ o! O  @9 v

  3. 9 Z3 p3 {! P; H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # V" ~/ q$ ~' j0 Y7 ?+ z4 p, a, W

  5. 0 M2 A- ~0 M. i+ I) T, o
  6. public class AggressiveState implements MonsterState {
    ( p+ Y; @" e/ f5 g8 w" n5 w4 Y
  7.     @Override3 Y8 H0 b- l0 s& u! o& C1 }
  8.     public void handleState(Monster monster) {
    ; B  G( S0 a4 Y0 e; W
  9.         // Агрессивная фаза боя: |, v; Y3 o( D4 p" [3 {" U. n
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , T' H& c) y; G$ f1 ~
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 ]1 _6 |8 D" H% v- O
  12.     }
    8 H2 q- S' U9 b; T1 t
  13. }
    9 i$ K9 t, v4 z! a6 _1 [' F% L
Скопировать код
Класс для финального состояния монстра:
+ m4 ^6 C/ ~/ V2 f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 b* B9 m1 b& Z# X1 q6 H
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 l- k( e' X' b, ?* B  E3 z, C

  3. - t6 {2 ~! o& |8 }& q" T! E. X
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ K6 V/ T( W6 ~! z# i

  5. 8 J# ~8 w+ `) p7 N' R
  6. public class FinalState implements MonsterState {
    1 w! M8 {' `) O0 k
  7.     @Override
    5 K0 j  h- Q9 l
  8.     public void handleState(Monster monster) {
    9 c; b; {3 H8 O
  9.         // Финальная фаза боя
    ' w2 Z0 n( z( w( h
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");6 k; x8 y$ I/ ^
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки) N* `$ K& r2 |3 E) p
  12.     }4 r1 [9 x6 z" {5 g
  13. }
    ; V* p2 C0 o5 Y0 J4 |: J
Скопировать код
" G7 K1 u) N8 _3 \( h9 X' b
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., h/ c) ]# Q! Z; A. ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 d9 s0 H; c1 \; O! ]- @0 B4 c
  2. package org.l2jmobius.gameserver.model.actor;8 L6 a0 C, @( m$ [3 y0 Y9 i! i8 t3 |
  3. 8 x" ?. z9 v$ [; M' H
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! g# G, i. Y9 J% U; O$ B" g" f8 j; L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ' N! W2 I6 y' G$ H

  6. 0 I% i; D/ G$ g& W( y4 H
  7. public class Monster extends Creature {
    1 n  w5 [( s4 p5 [* n0 R# L/ ]
  8.     private String name;
    , w% Y" m% ]/ B: k
  9.     private double attackPower;
    " T! F  V7 j* p6 V% G
  10.     private MonsterState state; // Текущее состояние монстра
    $ x) D+ d) @2 R  C. X

  11. - p" e, A0 I7 i0 r. f
  12.     // Конструктор монстра. e  C3 V% J, B' P2 r! X( |) x
  13.     public Monster(String name, double attackPower) {' c  R7 d4 k; Z
  14.         this.name = name;
    9 S% H, @' f- F0 F: n0 E
  15.         this.attackPower = attackPower;
    * s$ n) r/ I% s$ v/ ^6 @% o4 y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    / J9 k" h# }. G$ d1 ?& p( _
  17.     }
    8 I; q3 y2 d4 `/ s. _( w. R/ n
  18. 9 j5 x4 O0 O4 |  c9 v
  19.     // Метод для смены состояния
    / P* ?4 n( z1 S) N  E
  20.     public void setState(MonsterState newState) {
      _2 U5 }+ w: B( c5 c# b5 X
  21.         this.state = newState;$ o5 d5 f5 T- t4 x$ j  Z
  22.     }
    1 R2 f$ A) E7 N. [3 H. f
  23. 7 j' s- p0 k0 v. D) _5 v, b$ _# I+ Z
  24.     // Выполнение действий на основе текущего состояния' G5 k- b/ i2 x  e$ A
  25.     public void executeState() {
    - n6 U2 U; B5 S% `: D6 M
  26.         state.handleState(this);
    " G+ W1 P' p8 [' [
  27.     }; A+ M: @9 I; a" V

  28. ; _( o$ k% x* T  e. x
  29.     // Геттеры и сеттеры
    4 a* l6 ~# {8 W) I, g* W8 ^
  30.     public String getName() {
    ' Z/ c% c' `$ x+ }
  31.         return name;4 v" Y+ u7 [/ \# ?
  32.     }* A5 G7 i  U# |
  33. . D2 d  W% w& W" E( i, B( t
  34.     public double getAttackPower() {7 w1 F2 h: N5 I9 P
  35.         return attackPower;4 ~) z; q+ }$ \" ~
  36.     }$ U0 F; y- T9 a) N( ?0 @# K$ u
  37. 7 o2 R1 J1 g) l, n8 r/ k! s* r5 o
  38.     public void setAttackPower(double attackPower) {
    # M7 X  {, L/ Z7 ]
  39.         this.attackPower = attackPower;! z  B: w% k% t
  40.     }
    % j2 [8 ?0 {7 y5 p2 m1 I' l
  41. }( ^. V$ u! Y! k: C
Скопировать код
% @1 m/ ?" \) q1 M8 i. `
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.+ g( v5 I& U& B9 Q5 @: n0 s

! {1 F( ^6 Z* J1 Y& c/ i! `
  1. // Пакет org.l2jmobius.gameserver.model.battle0 \0 ^! ]# j# \, Y
  2. package org.l2jmobius.gameserver.model.battle;
    * w9 v$ V- y; a/ N
  3. 4 E: y0 F, @7 K- N. W" b
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 `4 @3 E4 ^2 w/ Z0 |* T' a; g4 @
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% l% Z: ]8 U' h: d
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    $ p2 U: o' g0 ~$ f0 v
  7. $ L, ?" E  @/ {9 L6 |6 P3 K
  8. public class BattleSimulation {
    - P$ A* {* D! l  X9 n0 M" E. z
  9.     public static void main(String[] args) {6 p; b- L+ ?( N5 B
  10.         // Создаем монстра с начальной атакой, {9 H# e2 j1 \0 u: M
  11.         Monster monster = new Monster("Дракон", 100);5 L  O4 {  f3 M1 q3 d( U

  12. ) z& ~% K- b8 `" Y+ g2 ]
  13.         // Начальная фаза
    & B3 o% n  _: H  |
  14.         monster.executeState();
    5 s3 K5 H+ M0 k% Q7 J3 c2 I

  15. ( S1 B6 N7 E! r, w/ O( X
  16.         // Переход в агрессивную фазу
    & o& f5 r& ^; V" k; }
  17.         monster.setState(new AggressiveState());$ |1 o4 E7 {. T7 K! Q. g
  18.         monster.executeState();
    5 B! q! [) `, U! O4 q* ]3 i) y! i) B

  19. ! A2 q8 S' i' d- X  y* }
  20.         // Финальная фаза7 W/ B% ^% I* x% y- @2 t! J9 ]
  21.         monster.setState(new FinalState());
    ! g2 B4 P5 J" Q4 j  g
  22.         monster.executeState();5 N. n3 n9 @# ]4 `' H
  23.     }2 G. o. w  m0 q; j4 E4 c& O
  24. }
    ' [& n& d. g: j: D
Скопировать код

3 l$ [5 _* R2 N5 ]$ `Комментарии по структуре пакетов и классов:" U8 B8 N- c- @) w
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! K* k( |: D; m2 p/ Q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 K; t. Q- x* Q% z  p+ R
, b6 I3 R/ b0 V9 E! J5 Q

. R% `( _  G$ Y
9 u4 Z2 v: a. {" ?  P" @: q( Y: v% K$ \

. Z5 u# O* o1 s; d4 }2 j% X) c: t! P& V1 L

0 i2 I1 i6 }& c  [& o8 W( c4 v4 @( V) P: a
- K( ?6 ]1 v/ [8 B4 m

& W+ b, `/ r) N2 }% r" N& v
! ^, Q5 o6 d$ k  x, M- J/ V- E1 V9 M+ \& E. ?# s

% y5 K1 k& H% f: M' F9 J! l) i" p' R' H( g

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:042 X1 T! p! J! u
Для управления сложными взаимодействиями, такими как  ...

( E- K) q, M5 ?9 FОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
+ m8 C! p4 \- }9 w6 zОтличный подход! Использование шаблона "Состояние" де ...

( \; |0 y! z! r' L2 y, d! YХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. e" ~/ E1 c$ O/ H# `8 i
( [. E" \6 ~% M. }
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.- o* D: x- {+ C1 W, G* D6 I4 J2 q5 Y

( p# H5 [! g9 f% q, g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % @6 c$ [( I* E0 d3 t
  2. package org.l2jmobius.gameserver.model.actor;/ J9 \) ], E% L' G

  3. ( d' J/ ~) W; i: A& F
  4. // Перечисление для типов атак( \: }3 j! v1 ^" K5 g; x
  5. public enum AttackType {
    3 b' P% E% e& S5 S/ Q
  6.     PHYSICAL, MAGICAL;
    6 Z3 g- D$ m% {3 j  [+ h
  7. }
    0 s9 T. i3 w. n9 g( l. }
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
  {, g2 `1 g7 O5 N5 L8 y" }; x# ^! fОбновленный класс для агрессивного состояния монстра:
  b% N) h, I1 G7 g5 J
, ?( O4 O/ S, t8 p! D8 x& x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 o% Y8 R. U9 T) m
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 L. b, m+ D, P7 @% j+ k  g
  3. & X1 |7 `- `( b) {4 I. o8 O& [
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 S7 z3 s! J' J
  5. import org.l2jmobius.gameserver.model.actor.AttackType;3 l* W& l* ^7 _6 z$ p0 y
  6. % B5 h; [% X8 t) ?: d( Y4 |
  7. import java.util.Random;
    ) x8 D% N' Y! L2 |

  8. " V* {1 V9 t# Z( y; H
  9. public class AggressiveState implements MonsterState {4 [: m% I/ h' a. z& R8 o, |
  10.     private Random random = new Random();' _3 {0 y; o% \* ?3 j
  11. 3 o4 Y# Y  F; e' S! i
  12.     @Override
    8 Z) C8 K6 N+ T' X5 u- z& z
  13.     public void handleState(Monster monster) {
    0 i3 N! t' F  Y+ W
  14.         // Выбираем случайный тип атаки: физическая или магическая
    & @0 C' E. q  c
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    , D! M. s& C' g/ @% b  }$ {$ K

  16. / J1 Y+ `4 Z2 d' ~7 G% @; b4 z, y
  17.         // Логика для агрессивной фазы боя
    : j, S4 b/ Z9 U) S5 `- T  }
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " + n, G  p, ~2 j4 r$ [+ X
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");/ z* l5 g: m$ ]  F% L3 q7 s
  20.         ' c# ]7 L1 M9 \# U5 x3 ]: N& y& l
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - K/ `2 o* x  K3 s
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
      `) X+ o) M. D; O. a
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ; _( n& N! }2 _# x
  24.     }
    4 F5 y2 p# j( P* w+ f
  25. }
      R  b) i- [; n# d& W( G
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
+ g7 y$ e, U" v: n- \: C0 _7 \5 k# J2 x6 M! `
  1. // Пакет org.l2jmobius.gameserver.model.actor0 P& G2 j, g% _4 [
  2. package org.l2jmobius.gameserver.model.actor;/ y2 a8 E# O) r) L; O

  3. % A$ \  f$ t1 R1 S; V' E" f/ I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;: W* W; ], X2 \$ g; c2 r- Z4 d
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 w8 l  y3 a9 x8 \* n, m0 _/ x
  6. & V7 c) P+ ]9 E6 p( k9 T* w
  7. public class Monster extends Creature {/ m2 t7 O; j% y2 Z
  8.     private String name;
    1 I2 `( g3 Y% a* j% Y
  9.     private double attackPower;: u  H: t0 w# M
  10.     private MonsterState state; // Текущее состояние монстра
    ( B8 e( j/ D5 M3 T) b0 g& A
  11. : Q1 \  `5 v: I5 a- A6 W8 G" n
  12.     // Конструктор монстра9 D5 }; _( D8 @; w6 s
  13.     public Monster(String name, double attackPower) {5 [* c$ H! P' t9 [- r" U
  14.         this.name = name;
    0 {" |( a4 S* Z) _
  15.         this.attackPower = attackPower;
    6 h' x0 l8 ]( O$ C& }! r
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию% H& }: a" p; B  a5 A
  17.     }' b) e, y1 C# q

  18. * x3 V! m) E1 @$ x8 M+ M
  19.     // Метод для смены состояния
    ; s6 ~3 g+ ?6 m( O6 u1 c
  20.     public void setState(MonsterState newState) {
    4 {: d: T% v/ p2 z6 G
  21.         this.state = newState;8 ]# I% X+ s8 F# ]
  22.     }
    ; |& O* n" ^- O' q6 l$ o$ z' G
  23. 5 \3 J2 B, r- f- F! q! P2 K
  24.     // Выполнение действий на основе текущего состояния
    0 _- [4 Y1 D+ _3 [# G( {
  25.     public void executeState() {# z. H& f+ z# O5 B0 r2 F9 D
  26.         state.handleState(this);
    , E7 h1 x3 Z0 c# b" ]
  27.     }# ?2 f% {9 g8 l* [% s
  28. 5 I7 F! T: _* ~+ ?7 y! R, E4 R- C; x
  29.     // Геттеры и сеттеры
    4 \- [& M, t% ~& |8 _& _7 e# y
  30.     public String getName() {6 s6 X) f9 C7 |( J; i, M+ O
  31.         return name;
    5 B, q- p* x9 F7 o! a% A+ [
  32.     }
    ; G3 d2 f. B5 e0 g3 I
  33. # J# P% k8 P1 U) \. ]
  34.     public double getAttackPower() {
    : O5 b* @5 X. g" E1 D
  35.         return attackPower;- |, u+ W4 x! H5 E
  36.     }
    6 w4 M3 g# P( L# I+ l, w

  37. 9 r* a' c5 K( i+ ~  q2 s
  38.     public void setAttackPower(double attackPower) {
    ! e  u$ m, q' x! M1 ~
  39.         this.attackPower = attackPower;( s# G8 k4 K% ~1 w: e  B+ F
  40.     }
    % l1 Q" B; U8 x. P# ]5 D7 ^
  41. }& e. H: G. S9 s' f- r$ Z1 a
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
8 M% T! N# ?* D6 V
2 w, H3 ]/ u2 m1 E$ \" g
  1. // Пакет org.l2jmobius.gameserver.model.battle3 s5 w' }2 q, `7 F' X6 g  o/ V
  2. package org.l2jmobius.gameserver.model.battle;$ t. J3 _7 m& P% ^: L: K. a
  3. # b4 f+ Y; _' l8 ~" ~8 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;& w' B4 q* l1 j1 K! y- k
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 u8 R* X$ |; R
  6. . m! C( @+ Y# A' X) }
  7. public class BattleSimulation {
    , c8 j; B) e! T  f2 Z+ S  T
  8.     public static void main(String[] args) {
      f: _% b. T' x9 m
  9.         // Создаем монстра
    . ~2 L2 T! o% {! w% H8 t! Y3 W
  10.         Monster monster = new Monster("Дракон", 100);
    1 G, ?) a5 F% O

  11. 7 q+ i9 W: O" K$ A6 g( ^) ]
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    1 H- m' Z6 ?- b2 r' I( d
  13.         monster.setState(new AggressiveState());
    6 T2 H5 |$ K. `
  14.         monster.executeState();
    ; W9 H: E, o( `3 n' Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак3 m" L! ?, m8 [
  16.     }
    ( T- @* o3 z# d! J
  17. }
    & g$ b" q% ~* g% i
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
* Q- |# l- c" Y% V1 C5 `; ?* F4 NЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!2 |; Y7 T& k! i* L# i, m: |8 e
9 `6 ^8 y2 D4 s7 Q6 i
1 \1 V/ \7 l( m
9 S* o. Q. y1 H3 D- s





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