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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
9 _1 R/ t; Z" A3 G- F& z0 M5 i2 Y# n7 O2 g% T  M) R& ]

  O( D' z* W. U, o+ u6 s0 j- }Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
, p5 Y( \7 u4 @4 tЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 d2 L/ }" J3 A/ `0 @: g* D+ b$ Y5 t
Астралия 🌟- y) D8 U4 o  o+ ?# B6 \

* q/ M$ c4 J* L# Q# G  Z- G
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
4 Q. A& Q5 f- q4 K$ _0 f. m! ^В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 M4 Y# m; _& K  i3 O4 W: D6 C& h3 e( h

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
; i1 n7 ^# Q, e+ w
AlexCoder опубликовал в 2024-10-16 18:31
: e* |3 f% N% p4 K4 V6 RДень добрый!
* ]* A8 q7 \, }4 g" ~" \& gВ статье описано взаимодействие игрока с N ...

$ D: b" N* z& r6 [% H- e( j6 @Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 I' Y2 }) N) O1 O5 V# Q
+ s% _& w4 ?* Q" {6 n5 e. K8 Q$ X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., u2 s0 F( ]+ T6 e

, M+ B, e- ?4 R. i( f* HШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 J; l4 u! x! P) r" F& r, n& ?# G0 B+ }. n+ ~9 b9 x
  1. <font color="Green">// Пакет для состояний монстра</font>
      d8 _, x  C9 _7 I9 g+ e
  2. package org.l2jmobius.gameserver.model.actor.state;4 _" r- m) q6 M8 x2 a
  3. <font color="Green">/ {4 K& r5 K) E9 P- s, d' L- i3 Q3 i
  4. // Интерфейс, представляющий состояния монстра</font>
    ( n% F8 `7 I; I
  5. public interface MonsterState {0 U) a( }/ g3 Q  Y
  6.     void handleState(Monster monster);8 H2 ^: h8 Z+ q$ I' P1 I
  7. }
    " _/ b7 t9 r% N! W4 z
Скопировать код
8 |/ t9 N% A7 C4 `! N" J' j
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 Z5 k' m8 N* d6 A1 ~9 ^% p1 g9 m5 ~; R& {) q, H
Класс для начального состояния монстра:" V) M$ \7 F# O! `3 k: B
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    & M! H* I* J9 j1 i
  2. package org.l2jmobius.gameserver.model.actor.state;$ E/ w0 Y( Q/ s" {

  3. 9 G' q+ J5 V& v5 @* x3 d4 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ z- @% U  Q: q

  5. " L" u8 w8 ~4 ~! c
  6. public class InitialState implements MonsterState {
    ' I+ r) p' g0 u# `
  7.     @Override
    ' i1 m: P# k% l" G) l
  8.     public void handleState(Monster monster) {
    6 K3 Q" B: N: |  i  Z3 C9 A. ^
  9.         // Начальная фаза боя5 \4 Z# T9 \6 i  W6 ~& S# u) K
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  T+ C: g4 w( T
  11.     }$ X$ W  M" b# B  C$ E1 i
  12. }4 E: p6 N7 \+ A8 |3 u9 r
Скопировать код

1 N9 E# _& m* r3 I9 C$ Z
5 e! _( K+ X. v* Z- ?0 f& v% k2 h) d' h+ w' o; }- ^' }9 `

# B! S6 ]% B. U" \9 o
: M6 E5 {# x& s+ l
0 {, v: ^: Q9 v2 y
5 R# n/ z0 ?7 s( d/ J/ x' K; u
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& ], ?. v2 q  H* l/ ~. b
( L7 I( L  c2 x1 u" Z; Z2 KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 u9 t3 C% b+ n' P# \

" o+ @& E1 H' w" e$ P0 d$ a0 ^4 zШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; s1 v9 n. R0 g  M3 B7 E2 z6 C2 i+ m5 m8 u
  1. // Пакет для состояний монстра
    6 u+ J- A: R* n! |. X
  2. package org.l2jmobius.gameserver.model.actor.state;3 u% {. {; Y, _  Z

  3. 9 F. R( g4 T1 C: ?* X
  4. // Интерфейс, представляющий состояния монстра6 U9 m# u$ S& _, ]0 p  v& Q
  5. public interface MonsterState {
    # M0 Q* @7 E) Q1 C
  6.     void handleState(Monster monster);
    6 d9 a& U1 S! ?+ d* \' l; M2 ]
  7. }
    0 \, i  t8 C- _! W: v
Скопировать код

" ]7 Y$ |6 F7 i; V+ x- D4 xШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 4 N! _# J2 }% d/ ?' I

: h9 _8 G% ?( m' [, [Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 f! n7 j2 m) B' S  S: V
: |" r# q' ]  f  E; Q. JКласс для начального состояния монстра:3 d4 T' Z5 v: x5 k8 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 o( p, D* P1 i- b& L8 c' W; X
  2. package org.l2jmobius.gameserver.model.actor.state;+ V! `3 n7 g/ Z( i8 A
  3. & W5 b; W; M  m  G- U2 M" w
  4. import org.l2jmobius.gameserver.model.actor.Monster;, @; E; w6 j$ u# d- Y$ ?
  5. / u% t( x9 i8 _. g8 T$ R! @& q
  6. public class InitialState implements MonsterState {
    ; E0 _8 l1 S' F4 t3 y: f
  7.     @Override: J3 e3 F- n! j: J/ X$ C
  8.     public void handleState(Monster monster) {
    $ l  b' }: U# z- q
  9.         // Начальная фаза боя6 N& l- M: ~$ i$ ^( K8 ?& f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : m1 P7 M+ V1 i2 u4 J: r0 C6 b
  11.     }
    % J; ~+ j, c7 W/ A0 M! u0 V2 ?. _
  12. }
    + \; Q* Z8 H7 [4 y/ u. |
Скопировать код
Класс для агрессивного состояния монстра:( c" i7 S$ I7 t* [; y9 b8 ?  C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; P$ V2 `8 L+ O6 B3 b
  2. package org.l2jmobius.gameserver.model.actor.state;
    : A: Q" _5 B  h% D) \
  3. - ?2 e! D2 S' ^( P" H
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 i! y, g8 `2 C, j) Y9 x

  5. : {2 o8 P8 a1 u* X
  6. public class AggressiveState implements MonsterState {
    $ {- `3 V3 C) ^
  7.     @Override
    - o' B$ C$ \! T/ S" c
  8.     public void handleState(Monster monster) {
    & Z4 G# p3 E% W) f
  9.         // Агрессивная фаза боя
    # s" E9 G7 |6 k( K  X. k
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    . h( i* p/ U8 f) ]5 N9 |7 F
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    5 b5 m" B3 X/ e4 d- l1 s8 f
  12.     }
    9 N2 v$ Z1 f! c' }4 H
  13. }
    , t+ r" H3 b0 u4 n. _. d  z
Скопировать код
Класс для финального состояния монстра:" D* I' O4 w/ r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state: u$ R: ^; y- N- R
  2. package org.l2jmobius.gameserver.model.actor.state;) W# U' Z  _% A. k) B0 g3 t- o
  3. : o4 O) {- |1 J' A3 e" `9 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . _8 w6 {: r1 q
  5.   N$ t" h, [/ {, K+ M1 k
  6. public class FinalState implements MonsterState {
    ; b+ Q1 j3 P/ V+ h7 {# U' a
  7.     @Override
    9 N( W$ \5 z' J! X+ p
  8.     public void handleState(Monster monster) {
    5 T& Q9 I8 H) P" p  {
  9.         // Финальная фаза боя- k, @; @8 \% M8 a
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    3 e2 `) r5 N) f# b1 G8 ?
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    2 O% Q& Q8 c: x6 `
  12.     }
    % P. s, i% s* ^2 b
  13. }
      U% @* u) a/ E, a. M
Скопировать код

, X" }3 `( S; u/ c7 K7 N+ @' LШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.- H) u( q. l8 Y0 `, I
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 [  {/ ~9 w2 L- R( T8 |, w
  2. package org.l2jmobius.gameserver.model.actor;1 x0 T# }6 v  w' j7 T7 t

  3. 7 j* D. }( k: A+ @# I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    * y1 [- B" ~3 f/ K' ~7 u
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    - U' \8 Z, S3 B9 A1 o: A

  6.   M) y8 E, q5 }
  7. public class Monster extends Creature {
    6 f9 I. O; X: D3 |' j
  8.     private String name;( p8 Q, f: Q! O; H# p* H: g
  9.     private double attackPower;0 H& _, \0 V' n
  10.     private MonsterState state; // Текущее состояние монстра" x' A8 f* J. p& f% G: C/ Q

  11. * e  b8 Y/ O7 d
  12.     // Конструктор монстра
    + J, h0 h3 j4 A0 n: W2 W1 Z
  13.     public Monster(String name, double attackPower) {
    - }; b9 O7 Z# x) V, l3 H
  14.         this.name = name;
    ' U* h8 O& J& c5 s
  15.         this.attackPower = attackPower;5 X" l9 \4 N) E; u$ n; u, y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние) J  P; u) h: |% N9 }2 H  [
  17.     }
    ) N& l/ x! L% f5 `$ Q

  18. $ |/ u0 w, w( F  W) k+ L8 r" M
  19.     // Метод для смены состояния; c$ ^. ?$ z0 K( ]7 |
  20.     public void setState(MonsterState newState) {3 ]+ a* B1 g. D5 T  a! c0 W% r
  21.         this.state = newState;
    7 A) ~" Z( b* _' b  F
  22.     }; t, O$ S! {" i$ a0 s- e

  23. ; }% H& @4 U6 p$ @( ^' n* r1 z
  24.     // Выполнение действий на основе текущего состояния: P3 V+ V& M+ w$ d4 `
  25.     public void executeState() {
    ' q) q+ P8 u# `) m
  26.         state.handleState(this);. C9 H- C' {( @
  27.     }3 p+ X& R5 A# f8 Y$ b/ u  o
  28. ) k) V3 B( [  T  o% p1 J
  29.     // Геттеры и сеттеры2 l" c$ }/ V+ W, y3 m* L0 I5 j( a: g
  30.     public String getName() {8 @7 B$ L  ?& O; V3 ]
  31.         return name;
    ( D2 H4 q# x9 t: w+ A; a
  32.     }# B& Y5 T8 F) f" t

  33. 9 K/ j# a- V8 X
  34.     public double getAttackPower() {% O  h; ^' p$ l- o$ t
  35.         return attackPower;
    8 ?* ^, S: X7 f6 f' J( c
  36.     }
    3 i" }: h) r  K+ ~4 c" o% B5 w9 \: V
  37. 1 t$ J$ K  p5 M$ O! V
  38.     public void setAttackPower(double attackPower) {
    $ N3 V% k" a/ D: v
  39.         this.attackPower = attackPower;; o! |$ Q3 F, t7 b& Y4 k
  40.     }- W1 l! p. d4 ~7 Q9 M) S( w
  41. }! p/ F4 y2 v5 A5 b/ V8 d. {
Скопировать код

! Y2 O7 f, |0 ^5 j, vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
+ F* p9 v" _5 l8 u$ c2 D5 ?, P
5 m. M4 Y" b5 g- H9 {0 o
  1. // Пакет org.l2jmobius.gameserver.model.battle8 X/ n4 k  t: w1 J4 G! ]
  2. package org.l2jmobius.gameserver.model.battle;4 A: x. @; U  E1 b# ]
  3. 3 x8 ^+ F  A' a9 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;" N% A% B* `( ?, m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: L# y& [  x7 ^# ~4 _
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;) N: P" V- A. i$ t
  7. 5 y' V! u. h- `7 `* i( o0 C
  8. public class BattleSimulation {/ O; W4 v+ v* J' Q& [  K; [$ ^
  9.     public static void main(String[] args) {
    ( I; D" L. m  E/ U8 F
  10.         // Создаем монстра с начальной атакой
    8 x+ |, w' x" q; Y' \- M2 W
  11.         Monster monster = new Monster("Дракон", 100);
    3 r2 [1 _6 U9 `4 F- b4 `5 _* ]
  12. 1 B: a9 A+ G$ m8 R+ s5 S# G
  13.         // Начальная фаза# F) T$ W4 Z5 C6 o3 n( r2 ?
  14.         monster.executeState();/ Y+ X- c1 V2 U9 Q5 L, q# W# |1 q9 h
  15. 8 {  k" ], F& X# p: n
  16.         // Переход в агрессивную фазу
    ; K  }! _. }$ Q3 n" [8 m
  17.         monster.setState(new AggressiveState());3 a: _0 j3 C7 Z/ o
  18.         monster.executeState();
    , N  w) Y  _% X0 g0 [& r
  19. + t8 f% C, a, o
  20.         // Финальная фаза7 O5 D/ b" G; \" x' v- R9 w) W; _
  21.         monster.setState(new FinalState());; @6 b5 ^/ j# Z$ j( k* t& g
  22.         monster.executeState();# k; f. ?2 a: j: D: i
  23.     }4 k: d" V5 P! P4 s7 ?8 o
  24. }
    7 }3 ^. ], q3 j; |# Y9 c* r
Скопировать код
7 s5 E/ c, y9 R
Комментарии по структуре пакетов и классов:8 s8 D" I" ~; H3 z- W$ X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.% S, ]' t. x" X' V) C7 E
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" p% J! x6 |! i) y2 }6 w- Q
% N0 Y9 {* c$ V5 D! \9 n
5 A6 x: }" i6 v! Q6 h, \/ b
/ Z7 ~3 y9 @1 \0 r4 g9 N- f% e7 \! R& e; Z, D; |

; u( o8 T9 O5 B
' ]. D0 M3 q4 @/ [' r$ H) d, H) ~* ]) R) Z

2 W+ q* }) g' |* \5 w: C* M
% j2 J7 c- l# C& G; p: }( e$ o
, O2 i5 w$ W. W- ^; r+ P
: w+ |* m5 \: |( K8 G& u# \+ @( l4 ~! C* }$ k2 w9 v7 v0 ~% K
! M  C* v' D8 ]& U2 y# \

! n6 g6 E$ m  d$ k& Z) J
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
* O$ g% F7 h* n$ G% X5 e( |Для управления сложными взаимодействиями, такими как  ...
' `) M1 H0 K, F0 R3 d
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21! z! X6 X) p: u5 _: _0 U
Отличный подход! Использование шаблона "Состояние" де ...

6 E. J# ^7 C) ~* l+ \. i4 g+ f0 {Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
2 V" P( \' G' b! \2 e, Y
1 x( k( B1 i5 }" |# A; u; K; PШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 y; T) w5 u* d, ^6 [6 d

! ~: B9 Q1 e9 y$ S( Y$ h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; Y( U+ k* N) ]
  2. package org.l2jmobius.gameserver.model.actor;
    ; [! a0 L+ b0 C% q$ L

  3. + v: S0 P" h! E/ T* q: v6 d; k8 P
  4. // Перечисление для типов атак8 m  F6 A# ~& U0 P6 c
  5. public enum AttackType {% U8 s( E) z  V" [' u/ a9 G
  6.     PHYSICAL, MAGICAL;
    $ z$ i5 i% f- G% r
  7. }% f+ q5 ~: j$ V
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.' U  N7 M8 m9 K9 A" N0 Z1 i1 a
Обновленный класс для агрессивного состояния монстра:/ v, `( c! |6 f: k' w

( J. f! t( M6 e% Q' F) I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" O0 s7 ?  t" S4 H
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' O* i5 k/ P1 b1 D  S
  3. , P; u2 t( u  @6 ~9 b9 u. y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      q+ C) y5 n) x* T; n3 ?! J
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    - O( E# G. P; n! q! |; \3 ~

  6. ) I6 h+ v4 S; f6 V7 m* B
  7. import java.util.Random;& G8 P5 F* I+ n* s9 K8 I; w
  8. ; S! `1 F& A; I  n, y1 Z+ j; o
  9. public class AggressiveState implements MonsterState {
    / F& }- E; K# S5 S% _# P# @
  10.     private Random random = new Random();
    * I9 H1 x2 ?/ ]: ^9 g9 K

  11. 8 B3 d7 |/ |7 o. n) d
  12.     @Override
    " K! {; D( O# t' z3 t# c  U; b  j" `
  13.     public void handleState(Monster monster) {, h# o- q4 {# I) j+ c/ C8 ?* s
  14.         // Выбираем случайный тип атаки: физическая или магическая/ f2 s& X9 U) R8 Q8 t* ?* h8 q! Z) \
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;/ P# _; p  F: g9 B8 f8 g
  16. ; i  p2 t: Y) t& v- g4 [
  17.         // Логика для агрессивной фазы боя# m9 P! Z6 Z. ^9 @0 {6 b
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " " U4 H8 `( w# j. E
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");& b! x3 t/ I$ [0 d$ H
  20.         4 n4 M2 N7 n- K& c/ @
  21.         // Увеличиваем силу атаки в зависимости от типа атаки( P9 F0 ^0 \7 g  a9 y; V9 v9 u
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ' {! d3 N( P( l% U; U$ B
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);: P. H+ m) w; ?0 |% `
  24.     }5 N2 e6 |8 g& ~/ g  E. _2 ?
  25. }
    & [7 m' l2 P1 X+ Y! c: S9 b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки+ f) M8 c7 a" F# P

8 N! A' x. o  V, `  G2 B! `% C
  1. // Пакет org.l2jmobius.gameserver.model.actor% `8 a" }- ^& e6 b; c* T
  2. package org.l2jmobius.gameserver.model.actor;
    3 I, u; ~, Z+ {. ?% n$ a- o

  3.   }, t) t' ^( D4 A7 E  e* m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" N1 ^4 u! r7 b7 j! l" H8 \. Q
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 k. U/ [) g/ |$ O3 l& @

  6. ! N  k4 {6 k) r4 h
  7. public class Monster extends Creature {
    . a. u3 l8 V  K( U+ g
  8.     private String name;
    ) W5 w- A& n7 v0 p9 {! x/ K2 s
  9.     private double attackPower;
    / B' k4 [9 U; V% p$ q' N
  10.     private MonsterState state; // Текущее состояние монстра
      d# P& V2 N$ v# R

  11. ) O! {* a8 z2 P1 N; J' {
  12.     // Конструктор монстра
    % E7 V2 D7 _( _' P% `. X
  13.     public Monster(String name, double attackPower) {0 j/ L# z+ N( w
  14.         this.name = name;$ @7 O# j8 R$ k. q) ^
  15.         this.attackPower = attackPower;
    $ G2 D( p& i! j( l; v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    3 q' j9 m1 j( `6 O
  17.     }4 u* c, h4 B  X; ]% u% c
  18. " E, A$ T$ }1 Y+ g" f! [( z
  19.     // Метод для смены состояния, w+ h% k# s- ~+ N7 j
  20.     public void setState(MonsterState newState) {
    : d# V8 b1 I) L3 h6 _( m% r9 j
  21.         this.state = newState;
    ! R/ W6 U3 W$ `2 b9 s% r% H
  22.     }
    + ^2 \  U! g! A' [4 }
  23. ( B4 f0 P9 e" C5 W, b9 T
  24.     // Выполнение действий на основе текущего состояния; @2 h! H6 e! @5 W9 r0 E
  25.     public void executeState() {
    ' r2 i; q" V3 C. w
  26.         state.handleState(this);" @0 x6 u6 d! Z$ T$ I, ]
  27.     }: h+ V% W- M" R
  28. & L: x; W+ X5 y+ Z' P( n; k  g
  29.     // Геттеры и сеттеры
    4 M  L2 o. {) Z& p
  30.     public String getName() {
    # C/ Q. e9 F" Y3 S9 x2 H
  31.         return name;
    6 G  w1 W# J2 n( v- j/ C
  32.     }% ?. `: I6 X4 l. _+ T; S2 N
  33. & j1 d+ G/ R) P2 k. u
  34.     public double getAttackPower() {
    , M1 K, t+ L1 {) v% F) c
  35.         return attackPower;( p0 H! c5 ]+ \0 Y! [
  36.     }
    3 V0 ]: F* ~3 _/ ], P( r0 x8 X
  37. & L7 M6 R  y1 w1 L( `' M" l) x
  38.     public void setAttackPower(double attackPower) {8 r) q4 [- H0 `0 J6 Y/ t- A
  39.         this.attackPower = attackPower;
    : I& f* ?- I# k+ ~1 a" |" U* x2 q
  40.     }4 A5 S; `2 c4 h+ b8 R* x+ A
  41. }9 ~+ T2 W: p0 p. ^& W, x8 T0 W% ]  A
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
* d  |2 ~. X6 s
" n. t2 g* V* s
  1. // Пакет org.l2jmobius.gameserver.model.battle8 v7 w* B; N5 C; {9 `
  2. package org.l2jmobius.gameserver.model.battle;( ~0 {  r) w; X. ]2 l2 a

  3. ! H8 C/ M& j8 {9 }8 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 H# D; E% Y+ J" Z: [, |
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;/ S( R( \( v* _6 X6 ^

  6. - }  T6 k  p0 K. k: S
  7. public class BattleSimulation {
    " g1 Q& F! U4 g1 ]& b0 O
  8.     public static void main(String[] args) {4 O3 z; V5 _1 H
  9.         // Создаем монстра. |% s* ?  E1 Z+ D1 b8 N7 I
  10.         Monster monster = new Monster("Дракон", 100);
    8 |% `  f: z; f/ D
  11. 3 I$ [6 P+ S* S+ s* U* \
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ n6 k* Q2 p  e" K
  13.         monster.setState(new AggressiveState());
    * a, r& m' e3 t( @, w+ S) f
  14.         monster.executeState();' s. F5 e  A: P( y; ?2 d: W
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    2 x6 R3 }* w0 O6 E
  16.     }. m; M6 T- H4 c& }" p
  17. }- n5 {- G: y) Q  g
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.5 p; p8 ^3 \; k, w, L7 `
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
) v5 s- O- Z+ s0 |* q( S
2 B) y4 M1 J* I* n, C# h4 n
" Y7 S) L: d6 A; A8 d3 X4 v
6 {" }% t5 z' J0 N7 Z




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