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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!, {! }- K; L1 }  B2 p3 ?

& ]3 Z+ `1 _# j# ?# M
8 q/ f! r6 y# o+ U7 \
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.% y: N3 u2 V9 U5 C
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
5 y& z3 _4 G3 ?( gАстралия ?, @) n8 D# o% y" v9 ^2 Y/ ~

+ f1 k4 E( I! q1 I- r6 F- R. o( k
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
! a2 [( W0 M7 A2 `6 f* }В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?2 }2 K% Y, N, @! @$ c- u
! M3 P+ E! i8 x& a+ C

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
! S2 }( l5 Z( p1 B! e
AlexCoder опубликовал в 2024-10-16 18:31
$ X# r2 U" t4 x6 d9 iДень добрый!# E" U8 q/ K3 Y
В статье описано взаимодействие игрока с N ...
1 X" y) c4 J! L) K5 m
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" A" W" Q8 j$ ]7 b& o% ~
7 W4 M" W# h. q) i$ Z8 A8 |$ _. nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 j9 `0 z$ o! r$ F5 f- ?5 _

. \* i% [7 }' ~4 {; o( Y1 dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! ?* d: A( O2 j# }& c! }, ^0 u$ p6 c% e& [2 j% B7 H" b4 @$ e
  1. <font color="Green">// Пакет для состояний монстра</font>8 K% b  g5 ?0 Y7 q. B! k5 l
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 E* G2 |3 B* \( x4 x, z( G" z2 D! M
  3. <font color="Green">
    0 s- J* g4 S# r# S8 L. O5 _
  4. // Интерфейс, представляющий состояния монстра</font>
    7 _7 A  z9 {2 }% g, U
  5. public interface MonsterState {! I; t3 t0 H" _5 |- h) D- F
  6.     void handleState(Monster monster);+ v2 Y/ d/ @/ X+ {. v
  7. }3 P; ^( {; E0 `8 q
Скопировать код
7 e7 |' ]; w: W% M3 u* h6 y3 D
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 ], i7 l' g8 o  _

# q, a+ K5 `3 w1 [  S7 PКласс для начального состояния монстра:8 P7 C/ b6 }* ?% k6 O0 n% q. v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>  o- q4 ^: y% L+ g$ H
  2. package org.l2jmobius.gameserver.model.actor.state;# a# b9 N+ L, J" X4 k* n
  3. & x2 l0 r- i- S0 W# ]. C7 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      o4 G  |; ~! Q
  5. " a: Q: e5 n7 X. O+ d' x3 e
  6. public class InitialState implements MonsterState {! {# z" l& J  `# w! f4 y: A1 f
  7.     @Override8 V5 T" A4 K. m% z! @
  8.     public void handleState(Monster monster) {
    ' u0 Q* s  S/ Q" T9 h
  9.         // Начальная фаза боя
    ) v# v3 y% t; \$ S9 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 G9 ^9 g. V# {
  11.     }
    7 W! b0 z, h2 F
  12. }" t8 s! z2 q7 P+ f3 E3 y/ \3 J
Скопировать код

; {% e1 T: o. W) X) s/ x! t; V! z) ~: ~; W. E/ @% H

( J1 j; A$ {* G9 @% J2 T% s
) t. y4 ?% N$ ?
- H  q0 g8 Y- ~7 g2 h
* I3 Q. F+ }1 z' _0 H& n
. l: B( G/ J5 m# x9 P# }
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 0 M: j' y+ G5 S5 V+ c6 j3 f" V
: Z. ^- f" `6 j' j  t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" m! f" R; F( a4 S! C- z  p* |0 P; x: ^8 @
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ {( S8 p; e1 n/ c1 ]8 |
; t4 l: T1 b! i3 p8 S
  1. // Пакет для состояний монстра
    ) q7 Z  q; _2 T. U& ]! X- E
  2. package org.l2jmobius.gameserver.model.actor.state;) @7 U- m& u7 q8 G8 [; a. v

  3. # F/ p( v2 L6 `# Z0 C
  4. // Интерфейс, представляющий состояния монстра* \" ~# O/ d. f6 O' y2 G1 h
  5. public interface MonsterState {
    8 r1 Y$ M) T) s* Y$ w
  6.     void handleState(Monster monster);
    . e* s" l* R2 K) }0 D
  7. }' j5 y7 G+ R0 k+ Q/ f9 `$ q
Скопировать код
. ~) I( r/ I' y1 d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . [6 Y* v  W9 C

; `# V* N) m6 a+ i$ d" SЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* j( w# C. ]7 R3 B" t5 u' o

5 Z) T1 ]2 O3 g: \8 YКласс для начального состояния монстра:
/ d. t. D7 @1 s1 u9 k3 {! h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      i" D/ ~: Q& @- t, G! U7 o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' n/ Z( r. C3 Q0 [% x

  3. . d6 H. }3 L5 @( Z+ |
  4. import org.l2jmobius.gameserver.model.actor.Monster;! g& @9 m! T: h6 R  ?9 G

  5. & X# z  V: [: z9 m" E: [9 `
  6. public class InitialState implements MonsterState {% G( S9 G. N  ~; F
  7.     @Override: d+ w2 W# n9 b) w- w, l( l  b
  8.     public void handleState(Monster monster) {* k  e/ O/ ?/ ]8 a5 g7 k* p$ I4 N3 M2 t
  9.         // Начальная фаза боя) P+ j! i  P, _0 }0 L2 z9 ~
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    2 k( F3 [& x) [4 ]+ Y1 g
  11.     }& A6 F0 J2 @* b9 G% [3 I
  12. }
    ; K3 i% ]/ @1 V4 [) S
Скопировать код
Класс для агрессивного состояния монстра:
, r8 h2 u: D' B5 Q6 M
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# l- Q. |+ g2 D9 v
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) w0 n% ~& E0 M# C
  3. 2 S8 k0 T* o- r' x; y) s
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 D" e* ]! O- o* H1 W2 V: Y

  5.   p( W' ~6 N5 j" K
  6. public class AggressiveState implements MonsterState {8 L, c" L  F3 b9 Y- b7 j- a
  7.     @Override( m- i- {$ p# b# h$ q
  8.     public void handleState(Monster monster) {
    ; A9 b) Z7 d9 b/ q
  9.         // Агрессивная фаза боя
    : D& S$ ?6 R2 r$ m" D' }' i' E
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");# a5 h9 Y7 k4 B) \9 J9 r) m1 x
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки5 v+ W8 _* \/ E  [2 [9 V. b" q
  12.     }' ~+ _, p6 e# a2 x" P
  13. }
    / P1 P/ @$ o8 f
Скопировать код
Класс для финального состояния монстра:
+ N/ @! b' R9 H* e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 y& Z3 T! x9 V4 z
  2. package org.l2jmobius.gameserver.model.actor.state;8 B# `. t( P! |5 A5 x' {8 c2 X
  3. - r9 m# I. U9 J  e$ g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / ~  J) N- B1 P. P1 x- {+ _
  5. ! c6 N) p* }8 U1 M
  6. public class FinalState implements MonsterState {- s  ?8 K; _, v. G; |% i6 I4 p1 Q
  7.     @Override- }" [2 \8 P  S& I1 W+ t% l
  8.     public void handleState(Monster monster) {8 A5 x9 j6 G9 r0 ]1 x1 F1 s
  9.         // Финальная фаза боя
    . i; G0 n- b2 Z( d- K+ ^/ q& K8 ~$ @
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    4 T$ h2 v5 E/ ^  ]0 {0 w
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    + m6 h% K( H2 {
  12.     }
    ! b" F: n% ~& m) U2 `
  13. }
    / {( S2 P8 }; n6 k, j0 z4 f+ I
Скопировать код
! |8 N5 E' P/ ]* f6 p# o
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
! m! i3 _2 }" F- b2 L6 M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! R3 i+ A0 a% l5 K2 n
  2. package org.l2jmobius.gameserver.model.actor;
    ; ~9 Y# O* z; O5 |+ q+ I
  3. $ |1 j$ g, L0 A+ M) o
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    " J! @3 G" {0 ~( D  U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' l/ v& Y/ h6 D" d2 j; P+ z2 d
  6. % P) `1 W8 M' ?- i
  7. public class Monster extends Creature {
    ) G) b* }6 [8 p* d( P8 L
  8.     private String name;/ k( d* Q$ U# d: j: O& t) c! C, G% q
  9.     private double attackPower;8 Q8 c; Z4 L& y* e( o0 E- s0 G4 [9 `
  10.     private MonsterState state; // Текущее состояние монстра, n* s/ i7 N( H

  11. , O' v0 `) R: S- k7 ]6 a( O3 |9 L
  12.     // Конструктор монстра, t- K1 U8 _* e1 H" ]( X; ]; c
  13.     public Monster(String name, double attackPower) {
    / g- j- t9 C; [3 E$ M$ \0 V$ K3 J6 H  P
  14.         this.name = name;2 x7 R$ x* i# \4 N; A
  15.         this.attackPower = attackPower;0 h5 G- ]7 d. h
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние2 C! i* b1 F  y8 V  S
  17.     }
    ; H  Z  w4 Q# h
  18. % V% F' w7 ^8 Z: N/ L: T
  19.     // Метод для смены состояния( Z/ p) w5 H( C+ }1 b
  20.     public void setState(MonsterState newState) {
    . @& e6 K, N$ V, Z6 h8 h
  21.         this.state = newState;
    6 ?$ R+ Z2 r- j8 |* k
  22.     }* V4 m! G# p5 R9 F1 Q. O: T
  23. 3 B" D1 k; u4 I# V' s
  24.     // Выполнение действий на основе текущего состояния( a) Z, y4 K/ P1 F  w* f2 k
  25.     public void executeState() {* g: ^4 ~# u, I9 v
  26.         state.handleState(this);. @0 R, @+ d+ [$ V/ N
  27.     }
    # ~0 K- l7 U! I( M6 a
  28. : K. _. y3 C% W0 v! V& ~: A
  29.     // Геттеры и сеттеры
    2 A" {( s. ]0 V0 e+ A6 j) F3 {/ z
  30.     public String getName() {7 z* K7 A( X; |6 w
  31.         return name;1 g$ ?1 D4 J' h7 _
  32.     }/ x! D) @& r# v% g/ i( c2 C- J

  33. # U& M+ e+ Q3 ]! W8 X# P: h
  34.     public double getAttackPower() {2 s% D% A- v+ e2 Y7 Y" B
  35.         return attackPower;/ D, {, C3 L, z* \4 p
  36.     }1 }5 x8 u$ ?+ F  a: _* e. {/ ~
  37. ( K; ]* d% z3 q& m& M# ]3 p
  38.     public void setAttackPower(double attackPower) {
      W* n* E9 h9 s  v  f* C2 o
  39.         this.attackPower = attackPower;3 y; J# s( m% y/ w$ y' W
  40.     }
    ( K) @  w8 U) K0 g
  41. }# D$ {1 O+ _; ^' {1 e+ @6 ?+ X
Скопировать код

% J7 j5 I+ _, n! f: XШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 q9 ^; u" B0 F9 j. K2 k* v
: F: x. F4 B' R7 N( C& Z" i
  1. // Пакет org.l2jmobius.gameserver.model.battle1 K# S3 n* ^( `# N3 ~1 j+ b5 j4 B
  2. package org.l2jmobius.gameserver.model.battle;
    * q, u* L- K, K- E% }' x4 i% h; I
  3. ' ?: F% p0 Q0 H! E  a: B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # m" E* z4 n0 j5 }) O  a
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * r% n' R6 {0 i6 E4 ~' f7 j0 z/ S
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    3 f% F" S6 k: u* r2 f$ M* W
  7. 2 x2 l6 M4 V& M3 T2 h* M4 y
  8. public class BattleSimulation {1 R7 _7 l, r7 j, z6 [1 X5 N9 [& Q
  9.     public static void main(String[] args) {8 X/ q( [8 D; p" Y! e
  10.         // Создаем монстра с начальной атакой
    ! ~: O0 Q: Q! K1 A8 x' O
  11.         Monster monster = new Monster("Дракон", 100);! K" J6 n3 B, f+ H# F7 O

  12. 8 \6 i; F) p$ f* Y4 c
  13.         // Начальная фаза
    / }* q: {: s8 X% G
  14.         monster.executeState();: N8 l( u. f9 b# M* D
  15.   z) e0 B; m: R5 Z& D$ O
  16.         // Переход в агрессивную фазу
    " f; ~8 R# o5 @- @" j
  17.         monster.setState(new AggressiveState());
    8 l7 j: {* i; G9 \+ G) a9 [
  18.         monster.executeState();. W: z* r. D* q4 ]7 @# n

  19. - J0 \6 r: h, C( r# t8 s
  20.         // Финальная фаза, x+ K. v' j9 B5 q/ W! f  {
  21.         monster.setState(new FinalState());
    0 x+ T1 w( S; G6 \) B/ z
  22.         monster.executeState();
    7 v' f7 n! U+ G- `
  23.     }
    , R# n& E* O; k
  24. }
    , ]5 B* `% T6 z9 O7 H
Скопировать код
/ F6 f( w( F( @
Комментарии по структуре пакетов и классов:5 @' f" y& K; u) J
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; w/ Y6 l9 _( M6 b! t
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
) q/ ^7 T, o5 E0 b7 e
# g, H" A+ Q1 E2 D: m+ ~6 G% r) U2 ~. Q- }- I  \

) h+ \+ H) ~# f& o  u) a7 A1 e
; h; H; b3 ?( l) D1 K6 T4 z# h# D' J/ p# T/ q/ k8 Q

/ w3 ?# E$ O* s! j) H6 J* t2 X: M/ P# w
! I( N6 }: f. e& R1 u& A9 \
/ G* d9 l6 C% m+ b6 N8 _2 K

& \, H+ w3 H6 X# Q/ X4 Z2 N
; x" W0 `$ ~3 t  e* J
1 O4 K* `" Z( T& h) l9 L
' m( E: q5 I0 j' p* x' K2 e1 H" T

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04( @  s$ s) R8 Y5 N
Для управления сложными взаимодействиями, такими как  ...
' h% Q0 a6 E" T2 |
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
  f+ g% K( g7 A. t3 R/ KОтличный подход! Использование шаблона "Состояние" де ...
; B/ ~, l* ?5 {& B2 S
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
1 C6 s) P' p- J! }6 l" y& v/ F7 K, K. Q* x' ?
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя./ I) P* ~% s# W

; z6 I$ K1 b5 d- A, p% y4 h
  1. // Пакет org.l2jmobius.gameserver.model.actor$ K8 N9 U' f, K+ Y0 B+ R- I1 A
  2. package org.l2jmobius.gameserver.model.actor;
    1 A, m5 I/ J. Z9 T4 N" m
  3.   s( r8 Z* M6 E: B+ b1 c+ V
  4. // Перечисление для типов атак5 j8 l/ I5 I  @& z5 B- Z2 X
  5. public enum AttackType {
    , R. Z- k1 g; a0 d
  6.     PHYSICAL, MAGICAL;
    - J" K& Q7 L) L" s' R2 @0 Q' W
  7. }
    6 n7 Q' R. {$ |' s& H) ]5 x
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
8 \7 ?: ~( @) ?6 J# u0 W3 uОбновленный класс для агрессивного состояния монстра:
  b: t; h  c% P3 T6 e: G, U
8 T$ i8 o9 r5 P3 S6 ?# u: A# b, w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      M- r3 j) V5 H* }% k/ Y
  2. package org.l2jmobius.gameserver.model.actor.state;
    - U( ?3 J' t8 m

  3.   h3 _6 H; D/ _9 ]* F: v
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ r/ S5 @7 S1 F% G
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      D5 c0 t& T& j6 j; J2 S

  6. ) q$ w- h0 g) l4 a$ [1 A
  7. import java.util.Random;
    / x/ J( A8 }# F9 O4 c

  8. 2 Z) y+ K. P+ ^# y& Q- V8 `2 p
  9. public class AggressiveState implements MonsterState {$ K. X% S2 g, X$ Y# s
  10.     private Random random = new Random();
    5 a( Q! }$ Q! F7 s+ A2 j% a0 j$ P6 @7 V

  11. 1 i% X1 m+ u4 \
  12.     @Override! Q3 [( X# `3 p" s: X) d  D
  13.     public void handleState(Monster monster) {# |& ^- p; f/ v( Z  Q. ~4 ^, j
  14.         // Выбираем случайный тип атаки: физическая или магическая
    & z- S9 O8 V, y2 Q+ P  t& [6 l
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    * M' |) }' g4 @8 u2 Y  q3 a1 p
  16. 8 t  d3 b. \8 q! U* d
  17.         // Логика для агрессивной фазы боя
    5 B" b3 S' b3 k4 k$ ~5 U) O" [" T1 o) _
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " % ~9 l% |% Z* O, ]+ G5 u6 a( V
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    + b* k) x3 P3 R: l- S5 ^$ c3 z
  20.         ' ~: k" i/ X8 k9 C8 G2 a0 Q# F
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    3 e% S# |& l' h
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    0 _8 i6 c& _8 c2 T
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);$ r5 B& p' r5 c. B( i
  24.     }0 v- H7 Z$ }' `: b
  25. }$ Z- t  b" }7 {- ~) Q0 x; y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
( R0 t* {( Y/ F9 P; Q
5 o' m. s  m, T4 o
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 G+ `  ~, d) m6 k8 t
  2. package org.l2jmobius.gameserver.model.actor;+ e: ~& N! K/ E5 w4 Z( X3 r4 ~

  3. 7 w6 l% j' @! R% G
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 d5 @* t3 v, \) R" A* v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; i4 L5 u5 o  k' o+ [( m; M7 J

  6. 0 r; v5 V  O8 P4 z
  7. public class Monster extends Creature {- L( M" L2 l2 [
  8.     private String name;6 f6 w& z. m( |+ R3 R# ~0 V
  9.     private double attackPower;
    5 _: Z/ M- o1 i: ?; y
  10.     private MonsterState state; // Текущее состояние монстра
    : b# N$ l& E0 I' e2 X5 D# b4 a
  11.   F. Y9 O0 n. g$ Q
  12.     // Конструктор монстра
    - _. E4 v) W' l  K
  13.     public Monster(String name, double attackPower) {- M2 x+ S* D& Y* H# P
  14.         this.name = name;3 `2 z1 ?, m0 g  X( v: H
  15.         this.attackPower = attackPower;
    ; X. W9 n6 a  f" _7 F5 G; e1 z) E4 P2 }
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ; b1 y3 \/ S* v7 G
  17.     }0 I/ C8 J, Y/ H% o
  18. " e3 ]0 }9 J! ~+ B" o
  19.     // Метод для смены состояния
    9 ^1 o! a2 X, n& s5 ~+ y
  20.     public void setState(MonsterState newState) {
    $ p5 x1 U; w& q$ P& }5 r: f
  21.         this.state = newState;3 i1 I" W8 Z( [, j8 D6 {# S+ M/ M, R
  22.     }
    1 |; Q5 _( {. l5 f

  23. , G- m3 c6 G7 J4 i' G) W* A4 j
  24.     // Выполнение действий на основе текущего состояния5 m/ u8 U" R: k, d0 T! b
  25.     public void executeState() {" B; g  q* M& c. S6 D5 D: f, _
  26.         state.handleState(this);
    & X/ b4 k4 x- ~* [7 u
  27.     }
    6 r! r  s# k( ~( p) q

  28.   H) P% x8 l6 k9 H4 o7 I
  29.     // Геттеры и сеттеры
    3 N. c1 U8 l. P- S% W$ F3 b
  30.     public String getName() {
      j+ ~/ k( ]6 ~' w/ e1 T
  31.         return name;5 m6 H' H2 T5 B1 b
  32.     }
    4 G0 g. y# p. B; C0 G' T
  33. ! L1 `$ k7 V# _' ~" D
  34.     public double getAttackPower() {
    1 d8 I% Y- P6 ~1 E3 L; t5 y
  35.         return attackPower;
    , C3 T4 K4 U  y# u# ]' z8 @5 B# a
  36.     }7 z0 k0 f) ~4 u3 e
  37. 9 N6 }; ~; u3 O. h
  38.     public void setAttackPower(double attackPower) {' z' {% k; e, ]1 o
  39.         this.attackPower = attackPower;# m; K+ T8 M+ S7 D: b
  40.     }1 X& w& G7 q$ r9 H6 V- C' W
  41. }6 N' q# R5 Z6 }6 q8 m
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
3 T7 {6 \1 n4 c% S# S% f5 W
4 J: L6 \7 s# Y0 h. [8 Y3 I" y
  1. // Пакет org.l2jmobius.gameserver.model.battle$ v8 g8 N' ~. e1 s3 ^
  2. package org.l2jmobius.gameserver.model.battle;
    " V2 i& r; W* f4 d

  3. # u2 ?; B5 u, d/ u: `
  4. import org.l2jmobius.gameserver.model.actor.Monster;* n/ f3 r# c, v/ I2 d* `) T9 Q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, d" w3 T& c4 Q" e. e) G3 f; X' x
  6. 5 Z" c- D- @& O
  7. public class BattleSimulation {
    $ x. m* y; J! e6 I
  8.     public static void main(String[] args) {$ |. [3 q1 I0 J: e
  9.         // Создаем монстра) G! u+ l& `& t6 x$ z1 M& d( M
  10.         Monster monster = new Monster("Дракон", 100);# r+ r* p- i* h. Q- |9 q. [7 q. v0 d

  11. , d4 G7 J  E0 p5 e
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак, _$ K. w9 e8 O) Z
  13.         monster.setState(new AggressiveState());
    * n8 @2 N/ N" s. ~+ U
  14.         monster.executeState();
    & M1 H0 y2 q; w- _7 q/ }, M
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & C' a! Z( H$ }, b6 v+ ^  D
  16.     }3 h7 V* `" l* ~
  17. }* V. e1 O' N( N! E" E
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.! Q3 f- a9 S2 m) V6 }* c7 K" h
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!2 q- s+ r9 P; u( N4 \! J

1 n3 T1 Y$ ]9 x8 U; b5 v$ U
% }; V9 [' I5 C( N: r' _1 x0 t/ J* R; Y: n





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