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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
6 a+ v  I; B' B; o4 z0 D9 Y/ S
  q: _- ^9 {4 u! h3 r7 i" u

" b+ _4 }4 x" [4 RЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.' S  H! r7 [- `4 [
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 R0 N) D/ X9 t9 C) [( l3 AАстралия ?
; d% r, j  m4 u3 \' K* M8 O# f' e4 |6 u! `; f# d

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!6 a- f$ {' K, b( ]! W
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?$ J( V( L# C4 N& Y" b
* j' y8 `. m# z4 u9 R

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 % F+ }1 ?- e+ N/ b3 b( |) t5 c) z
AlexCoder опубликовал в 2024-10-16 18:31) O' U8 K4 ^8 T. `5 G8 z/ ?
День добрый!' C8 V( Q8 \2 e" {# y' \% I
В статье описано взаимодействие игрока с N ...

+ r: B/ K! `% j# c% v, v8 `) ^Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
; u2 B" l# k, v! P) \9 f0 `! w
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.$ o: `9 _- }1 W7 X- ~+ A; I

" M5 \6 W: X4 pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 [" P/ U8 o: x# U* f
! G5 t9 v8 f3 a# l
  1. <font color="Green">// Пакет для состояний монстра</font>6 l1 c4 d/ _. J$ J5 Z: L8 g$ G( ^
  2. package org.l2jmobius.gameserver.model.actor.state;6 u0 m/ o5 |/ I+ [+ S5 n
  3. <font color="Green">/ o  a( y' e3 o6 X% I# e
  4. // Интерфейс, представляющий состояния монстра</font>+ r: l$ e1 k% O* R
  5. public interface MonsterState {
    6 b1 W! T9 `- g# X
  6.     void handleState(Monster monster);
    7 @! q* O4 n* v4 K7 I
  7. }
    + i7 S3 P3 w3 h1 a7 `! z
Скопировать код

& y  W1 w" h5 R; {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' a4 z4 w& i; [' d4 n
: ~5 @6 P! m% S2 \6 q- e3 }
Класс для начального состояния монстра:
6 e5 I, b7 p7 D0 [
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* Z8 P9 ^; H5 t- r
  2. package org.l2jmobius.gameserver.model.actor.state;) D& I- L, W9 q2 G1 H
  3. 3 K* {+ \( A& T: S
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 B9 A3 {1 a8 c
  5. ' C  ]6 A4 g4 V- F; y3 d9 D
  6. public class InitialState implements MonsterState {
    4 ?& Z# l5 w8 p( K
  7.     @Override" k# V6 B4 \& s
  8.     public void handleState(Monster monster) {
    2 @8 S! C, ^0 C: Q9 I
  9.         // Начальная фаза боя. \* d6 Q) V' P/ S+ t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 ~2 j* g6 w8 V: y, d* ~
  11.     }6 ^) v- T/ @) |4 @
  12. }* i' w& j+ ?. M( b
Скопировать код

& V6 p; q# o& t* `% O! Z7 m1 V1 L3 N2 B

' `+ X6 ?  v/ n2 S3 p, D
* V9 [2 Q6 G' ^+ C# c
2 A( Y/ x0 R( A4 u' f- A( F2 [7 v
" s9 l- `( c! q+ ^  H

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 w- u+ W* T1 G
8 h% l% Z2 X1 B8 i! H4 f
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 @" r: f  C. Y
1 ?* w. R" d6 y+ [Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  N; V0 _% P% q' S( _
$ D( `3 ]5 E  x3 [+ x4 C  g) `
  1. // Пакет для состояний монстра% c& [: b# }1 z& T* j' V  {. s
  2. package org.l2jmobius.gameserver.model.actor.state;: N9 L2 R) k/ I

  3. 9 y; k( L% }. ^2 Z5 y) U
  4. // Интерфейс, представляющий состояния монстра7 S( L) b. O6 q# ^6 Y' i2 O
  5. public interface MonsterState {0 Y5 p. k5 G3 E' ?5 w9 R$ `
  6.     void handleState(Monster monster);6 A0 w: m- ?/ m9 s+ ~* m
  7. }' @9 z4 B3 L) C; m' v3 i
Скопировать код

# q+ ^, |6 m7 m2 X- v3 aШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 U( C0 x) N" a6 p! ~) C( \6 E

6 d/ S- P* B; n, E/ Z7 p  CЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* Z; Z5 ?5 j- y& f8 l( {

# R! ~3 v( |! F& d" eКласс для начального состояния монстра:/ F3 b% `! r& ~  X6 H) Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 N2 w6 O5 D3 Y/ D+ r
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 ~2 l: r2 O( \
  3. , U" K+ l( G. ]9 w! [" G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : z6 u% _' w& H$ H! n# G7 R

  5. 9 Q5 T$ e3 U+ s+ {8 q. M3 M
  6. public class InitialState implements MonsterState {8 d9 A- i. Q/ o' [9 e) _
  7.     @Override
    $ m# V/ H$ ]# v8 n
  8.     public void handleState(Monster monster) {
    4 u! O! Y" Q  ?1 K$ ?
  9.         // Начальная фаза боя  J% M+ @- z. ~) h8 h
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( [8 e& a- I/ e+ @$ H1 [
  11.     }
    7 F  k. ]9 S& w# t4 M
  12. }
    - p' w* ^' q8 o6 O7 M
Скопировать код
Класс для агрессивного состояния монстра:& ]8 g2 r& @* [' u( P4 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - ]! g' |& E) t
  2. package org.l2jmobius.gameserver.model.actor.state;8 C  Z& o; _$ C# b6 G
  3. 2 t9 w9 m0 u* u( D2 C* s; O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 g7 T1 c* y( w1 R4 g* Z

  5. ; l, [* a/ S; A0 J1 l/ l
  6. public class AggressiveState implements MonsterState {
    2 n* L. I# ?. k6 i- v
  7.     @Override9 \  ]: p. A: ^0 k0 ]  C% f
  8.     public void handleState(Monster monster) {
    : X1 C3 D% E. {. L& L( G; V7 q, c" y
  9.         // Агрессивная фаза боя
    8 [7 l) z- |5 ~* b& _# v: r
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");8 h% B3 a. S/ Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ! U+ h8 h/ i! n/ N& I# N
  12.     }
    4 [) I: D* O( o0 S( E/ E# i& K
  13. }
    8 v- U7 [) R; \
Скопировать код
Класс для финального состояния монстра:4 A, x5 B2 P9 Z7 O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , e3 Z! V, c% [1 q9 ?3 |0 T
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 x7 W; T' g) N- z5 a0 M
  3. * C. f% z$ u2 o; ~1 h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 D* ?$ x. p, y9 @

  5. # `( S; o9 p- J9 t) D& @
  6. public class FinalState implements MonsterState {
    ( h% I1 F6 j, V2 |
  7.     @Override
    0 I" }$ f) s' ^9 }7 K- I
  8.     public void handleState(Monster monster) {) U4 u" q0 i5 P' d
  9.         // Финальная фаза боя( t" q/ N  Q  ^  [2 Q' d
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    4 R6 q2 O  P" i% X& u3 B6 a8 T
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    + f# x4 J- ?% w0 d8 {+ o
  12.     }
    . J2 J% ~4 K) H& Y6 j  D- \
  13. }% Q8 P6 {  h. V, l+ W+ W
Скопировать код
' A( o- i, m# L: y2 `$ m) l% M
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 g! @& {  B( C; `1 J5 O2 _3 _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , q" U) S1 v, `& w# a1 @
  2. package org.l2jmobius.gameserver.model.actor;+ u5 A+ w% |6 x  X9 U: p' `5 P9 ^
  3. 2 w! K6 O  y" `9 N0 B) l+ d0 K: g
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ( b# U# L- @6 }; \* r2 Y) A7 ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 f$ ^& e- u4 A& ^* ?

  6. 3 w7 z, D1 e$ Y% P
  7. public class Monster extends Creature {  s1 _9 S( O" b
  8.     private String name;. ~+ t1 _( @4 k5 e5 O0 t; _
  9.     private double attackPower;% `, `6 i! I7 f5 h
  10.     private MonsterState state; // Текущее состояние монстра( k: o1 Q& D; V2 L' R& ^7 H

  11.   Q/ N. E; H% Z. u
  12.     // Конструктор монстра
    # s! G7 }, H% ~
  13.     public Monster(String name, double attackPower) {- d0 G* |! O6 r5 F, K
  14.         this.name = name;# O, t: {. k8 V( E0 L( L' ?
  15.         this.attackPower = attackPower;; i# p4 S  q$ G* D1 A
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    # ~) O) z& @7 N2 |  y) s. A
  17.     }# l: _6 D; Q, G: R
  18. ) _$ Z4 t2 r. P- ^& k' v8 k  N
  19.     // Метод для смены состояния
    ; D# @1 T  z) z8 ?6 k+ U
  20.     public void setState(MonsterState newState) {
    5 n, L& J) b& H; f" H* b: X0 Y
  21.         this.state = newState;* q. J" |: g2 N4 j
  22.     }8 u" f1 Y+ z5 ^' F' w

  23. 6 h3 j5 b, D/ ]3 n! X
  24.     // Выполнение действий на основе текущего состояния
    4 T1 u5 T' m3 i
  25.     public void executeState() {" A9 u5 i' G' f$ t# Q" _- D
  26.         state.handleState(this);
    ) `1 O3 I! n4 W4 h. w$ L$ n5 O: p
  27.     }  h, r6 T" {& L! L/ B

  28. , X5 X, ]/ d; [! V7 F' y
  29.     // Геттеры и сеттеры5 }% ^* V) ?$ j3 O* m0 m$ x+ n' m1 [
  30.     public String getName() {' W& X* |' H2 P+ I" D' o7 D; J5 `
  31.         return name;  s; k3 Y( G% x' @  R
  32.     }; m8 ?$ w) ?% r

  33. , w% m! E5 q  w$ X
  34.     public double getAttackPower() {5 _8 h! G7 ^* O9 D% s
  35.         return attackPower;
    & C3 j' n0 d" u0 U
  36.     }
    ' q8 \, E. d5 R. Z5 R* A. p

  37. 4 J. y8 q; ]+ R  A) U9 @
  38.     public void setAttackPower(double attackPower) {
    6 ~( g5 k+ P5 V4 ^5 R
  39.         this.attackPower = attackPower;/ e; E* _- B" J- A" @% M
  40.     }0 `, C5 K8 @+ w( e
  41. }  l, n( S" C+ w, ?, g, w5 N
Скопировать код

2 L, }& c  j+ v& K: ~8 vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.( z) x9 {' q3 a* `, [/ m5 G
7 z; \7 b& v) R" x$ D  e
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - R8 ]. f. F) i" g
  2. package org.l2jmobius.gameserver.model.battle;
    , s+ j- [4 z4 a
  3. ) u" ~( H8 b, d1 Q" X2 R. D+ ^" F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - S% N: o0 p" y  S; K' J* y5 O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ ~' a: g# F8 e: i/ V8 J
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    8 {% \+ _) k" ^. w; U7 S
  7. . b, T% r  T6 e, T1 G
  8. public class BattleSimulation {  B; |$ J/ I! |5 ]8 H4 K
  9.     public static void main(String[] args) {2 K- y9 A; i& \" d
  10.         // Создаем монстра с начальной атакой
    % t  w1 L2 c% S2 j& h' W
  11.         Monster monster = new Monster("Дракон", 100);
    ( A) W  B$ P0 B
  12. : i( r# Y' h1 W' E6 U! o8 }
  13.         // Начальная фаза
    4 V) }' j  j, K2 z! n
  14.         monster.executeState();7 v+ X* @! E% B1 `
  15. 2 ~9 G6 Z5 L4 K: S
  16.         // Переход в агрессивную фазу6 _* S8 a9 s4 _2 o- S/ X2 N! _4 F
  17.         monster.setState(new AggressiveState());
    6 B5 o& y/ ^) h* {/ b
  18.         monster.executeState();
    , Q# Z$ a) C6 |
  19. , B  _9 }1 E. }8 M9 z# }' X( {
  20.         // Финальная фаза
    : h  S$ O/ Y& ^4 M. F: X
  21.         monster.setState(new FinalState());
    : h2 U( x9 X( _$ V
  22.         monster.executeState();
    - Y; O# x: K5 M
  23.     }
    ' I3 o) [7 K  i: A! ], B4 ~/ i- c
  24. }; }; t. r; X2 |' Y8 v
Скопировать код

6 C3 w7 l% I8 N# wКомментарии по структуре пакетов и классов:
6 i8 g/ H% n( u1 u& Q# WЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
) Q/ ?" Q/ g- w) }/ cЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: `- y. b7 \3 ^* [
. n  C& v8 U7 n( ]/ }

2 m/ r+ j! e' |& }) V: ]- @
' n5 {: R: R4 ^& r4 Q! x5 r+ q# h' G) J9 Q6 U5 J( f! N# r

4 E8 c$ E* w3 q4 e! ~
" J" m+ |5 E3 J; b
2 d% I  e4 p9 n: U6 ~3 `0 g( @
! M3 u4 s' _' n& N$ v
. D& ~& i0 |8 o% n6 g+ E; l1 F! z  @- m

4 P5 R: g  @) Q% C% w: y: J! a; W8 f

, U8 g; x) f9 \5 R
$ f) {! o& x/ J, T. f; H
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
/ Q/ N  A# D9 B. ~Для управления сложными взаимодействиями, такими как  ...
: e# E% Z  q3 U/ `% x" D( R
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:216 t" V3 P5 G6 x
Отличный подход! Использование шаблона "Состояние" де ...
6 v* e- G- t3 {3 \' B- c: z
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. b1 D; c9 l0 m+ P4 g1 m$ {, H. P8 L$ r/ p; E; Q2 l
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя." I6 P+ c: q3 z  M- ~7 I+ W

3 _/ r( q' f, _6 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor" a9 w, {/ I4 c. |
  2. package org.l2jmobius.gameserver.model.actor;0 A5 I7 Y6 \: |9 u! H" d  X

  3. & }! A  `2 ^0 z2 Q# z
  4. // Перечисление для типов атак
    ( W7 e+ {3 B" h( U9 X3 M- n
  5. public enum AttackType {% L( b; R4 Y) k. C, g' ]. n
  6.     PHYSICAL, MAGICAL;
    4 h  I, N- G& |8 v: N3 }
  7. }
    ! n2 ?. J2 y+ Z; F6 s' R
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
2 E7 }5 \( p0 k. k4 `3 P2 @Обновленный класс для агрессивного состояния монстра:; G) Q& B" l' L3 Q- x

/ C+ H- V7 q1 Q' T* P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; H3 a4 c  W. N0 c. P6 u
  2. package org.l2jmobius.gameserver.model.actor.state;0 T) [9 q* U) A; y% {$ F7 ]8 P7 e
  3. . L4 F% T7 T6 a4 S- w- Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 ]1 Z1 t; D5 [( D, N+ z: \7 Q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ! F8 }; w6 @: p9 c  X& y

  6. , C0 n1 `. K5 F, n' ~0 G
  7. import java.util.Random;
    1 v7 T9 M3 v+ ^6 \9 o6 q
  8. / p& y+ v! @) S% q& f5 |
  9. public class AggressiveState implements MonsterState {: L  C. c+ N. a; X" D' x; h
  10.     private Random random = new Random();
    6 ^  M6 c( M( V6 l$ N2 u
  11. ( G+ @. p" X! `1 {
  12.     @Override
    - q" d3 h$ D, ^6 T
  13.     public void handleState(Monster monster) {; N8 \/ K. g3 D4 Q* Z
  14.         // Выбираем случайный тип атаки: физическая или магическая! [: [0 P/ F( F% S  v$ l* R7 R$ c
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! a) l. _) y* j* ]9 c
  16. * C5 z% g6 O% c6 z
  17.         // Логика для агрессивной фазы боя( z! A( S8 q3 u7 G) U
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 P/ h5 |- D, w# D! E5 _, q6 A
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( d* f1 z' g* h
  20.         
    3 [9 d2 ?! \! z3 r/ X3 _  a
  21.         // Увеличиваем силу атаки в зависимости от типа атаки. W1 h4 `; Q! K9 z8 O0 C
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    , ^) @' }1 e; Z' k$ a" E6 Z( K
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    4 f6 o" O7 ]& F5 y; s1 [( A$ ]/ C
  24.     }
    4 X% T) K9 D% V, b$ q! {
  25. }9 f! G& V4 Y7 g. J2 ?4 X6 _+ g
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
1 l! P2 G0 J5 R6 Y/ g" N5 c
& c" c1 N4 _: W5 \; ~
  1. // Пакет org.l2jmobius.gameserver.model.actor& V2 p* E+ o: Y  w$ T% S
  2. package org.l2jmobius.gameserver.model.actor;: g: D( u0 I* T$ |7 U0 o3 @" S

  3. 5 e; P7 b1 g5 i
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 {0 Y$ J) I5 L! _) \, }5 Z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ; ?" y. J' Y; y$ F9 W
  6. + e9 y5 j  i2 M
  7. public class Monster extends Creature {7 i+ W; C2 s9 y  m- o* w
  8.     private String name;& }0 H% V4 Z: f2 y
  9.     private double attackPower;
    / z# u  L4 j3 R  v( J4 R# M
  10.     private MonsterState state; // Текущее состояние монстра4 I/ D3 |7 U$ I7 T( `

  11. & w1 i0 }0 d2 W9 `( j1 m
  12.     // Конструктор монстра' e6 l0 [( m! b' D* K. ?: k, n
  13.     public Monster(String name, double attackPower) {
    & W" d% j8 }) |3 m6 j- k* N+ M
  14.         this.name = name;8 ~& U5 o9 l- N, \$ N4 q
  15.         this.attackPower = attackPower;4 r2 d* \; U2 c* k& y) f
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию" w8 {& P/ b. G4 V# E
  17.     }
      J- t3 q$ a. g0 R: M" X+ s

  18. 9 q/ n1 r5 C0 d; A$ ~4 \0 v
  19.     // Метод для смены состояния
    6 K9 k8 O2 l7 N" q
  20.     public void setState(MonsterState newState) {( l( w0 r# x5 Z+ H
  21.         this.state = newState;
    8 Y, ~2 I4 R: }  G
  22.     }
    : h6 q- _" {% O+ |
  23. 4 }) E- n$ C. b( }
  24.     // Выполнение действий на основе текущего состояния
    6 i6 r) E2 H$ J3 u
  25.     public void executeState() {8 B5 r% X- e% L
  26.         state.handleState(this);. G. l1 f1 [) t3 u  ?* O
  27.     }, C- d2 P, _- [4 T
  28. ' B4 [% x3 {6 ^% h4 U6 A
  29.     // Геттеры и сеттеры
    ) H1 Y. x" S, w
  30.     public String getName() {1 ?( Q' N6 `% q: w
  31.         return name;8 z  k9 v: O! a8 ^' _) X
  32.     }
    ! X6 C' M7 X4 ^7 U1 M# t/ V

  33. / B# s  d* u- P5 u% I6 N
  34.     public double getAttackPower() {
    ( }+ L. G+ n" M; A# y; C
  35.         return attackPower;+ Q( b. h" H& U. f; j7 A; O$ b2 O3 o
  36.     }+ \# Q& M) Z. o
  37. ; p. _/ n, A4 }! q+ \  J
  38.     public void setAttackPower(double attackPower) {( J0 z# k4 Q5 v2 e
  39.         this.attackPower = attackPower;8 [9 b0 c5 A/ b0 w
  40.     }1 `: \, Y& b/ y& J3 k1 P
  41. }
    ! N6 v& i5 |; Y1 y# H# i9 q! |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.; n2 h$ f# r' c( X- L% b: @, m

% L5 r1 x# o/ B0 D
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , \% a/ y8 p0 l: [# b/ r3 L
  2. package org.l2jmobius.gameserver.model.battle;
    " ?4 c( N2 y! l
  3. 3 Z) O# M0 t) \- L0 ^5 P4 w+ S
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 \9 O% X- [! D( m6 K- A- s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% ?4 X# z/ W9 V& n7 f* z# ~5 f

  6. , |# Y7 @. N+ Q! m; K5 c' y
  7. public class BattleSimulation {; U3 l/ o& n9 f* ^. R
  8.     public static void main(String[] args) {/ V4 Q" B( J% k3 M2 M: D' |- E8 Q
  9.         // Создаем монстра
    ' ^  l' U/ b+ I' M" X  @5 z- i9 h
  10.         Monster monster = new Monster("Дракон", 100);0 ?/ e  q, U5 n3 I8 w( [9 D4 }
  11. % N) w9 M: w5 j/ \: x. T+ i$ B! L
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак' i9 T9 ~1 W# U: q0 ~: r
  13.         monster.setState(new AggressiveState());
    ; P2 g# j8 j8 ?1 o% \- E
  14.         monster.executeState();3 Y" d! e& a) M) o* x9 S
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    / L+ r. U! b- W! r- N" j# x/ N
  16.     }) |! |+ R# A, n- A* ^! t
  17. }2 x  f: ]) M  P1 B; b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.( @. ?1 \$ F0 _: o; ]# @7 c, i
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!* l" J3 x- @3 k
: ^  c! Q' ~( d6 \2 r0 y- I
+ T/ R1 @  G0 ?# q

) s4 i7 L3 p. b& c- ?+ m$ C1 c




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