Top.Mail.Ru

[Руководство по Java для L2J] Шаг 3.3: Взаимодействие игровых объектов

[Скопировать ссылку]
Astraliya Опубликовано 2024-10-16 17:54:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
, I( a$ y  J6 ?+ D, }
1 u2 ?0 L4 R4 f1 D; g
" }* }9 A" E- W4 h- U4 m
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
1 @/ O  u* s1 rЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!) ]; o3 Q/ }7 J9 u/ K2 [' s
Астралия ?
0 W3 r- f( B4 T7 a. @
- G$ `, p& N$ V4 {* f# {2 S5 P' R

Сообщений в теме:5

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!5 U5 S3 y# D$ [
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?3 M( U/ |- N4 ^$ X

) R  H% K, H* S+ U1 p" x5 Z
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ `2 P# m0 p! |
AlexCoder опубликовал в 2024-10-16 18:31
: F& {: p/ y  Z' t' bДень добрый!
0 U" h2 F) n6 o. IВ статье описано взаимодействие игрока с N ...

2 P5 f* ~  }3 S/ Q% }0 fДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " Z, W6 D  T1 z" S, O0 y, E; |. f) ]" l

) H7 F+ }  O/ m' MЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 N; n" u! n8 @/ J' t2 v9 L6 b# z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; A6 ]! @# I7 Y: h3 M% p- ?% v; r# k/ \# |7 o4 E
  1. <font color="Green">// Пакет для состояний монстра</font>
    2 |/ z4 x/ [6 ]# N7 c, C
  2. package org.l2jmobius.gameserver.model.actor.state;" E4 R3 ?1 N! v5 V- N
  3. <font color="Green">
    , R, F* t0 i4 N# `4 h6 R' x' Y9 g
  4. // Интерфейс, представляющий состояния монстра</font>
    8 F, u+ u$ F# q9 w$ B" X( P
  5. public interface MonsterState {7 y  a' N$ U& j
  6.     void handleState(Monster monster);! ?$ v+ A) Z. u: o
  7. }! W2 _! ]7 O. t5 s
Скопировать код

, [0 N' U6 I6 O& u2 [$ c7 n$ LШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: n; K1 p1 c% I# p8 C/ C0 X

, V+ d( M, G" b$ e# o2 X" SКласс для начального состояния монстра:- @  v! P1 r1 J
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>& v/ q6 q$ w/ _- F7 t% S) B8 R
  2. package org.l2jmobius.gameserver.model.actor.state;+ Q, I0 a% E3 N" b0 X* S! R* G& L$ B1 {
  3. ) `0 z: s! D% Y1 j% i& T( d4 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 f: c  R; d6 j3 d# E# p( T% V7 U2 |

  5. 7 n$ d: W9 K1 U3 a
  6. public class InitialState implements MonsterState {7 J8 z/ k1 V9 X; b( t& C
  7.     @Override
    3 T% K0 }/ \& @" b) j
  8.     public void handleState(Monster monster) {3 I( o/ O: ~0 r! {" N7 Y
  9.         // Начальная фаза боя, I- V2 s6 {9 x- g
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* e) a$ T: I# z6 d1 Q) a+ x
  11.     }
    5 O4 s$ |  ?! K8 z
  12. }
    " T* d( B4 K0 T- B9 [% {) x
Скопировать код

0 h9 ^9 R+ g6 J' I, ~2 B/ s& v% m% T. s) i, K% I! G; S

' j6 Z6 K  a/ v6 f" s3 |- e
( h2 ^7 c- e( E) ~
$ o3 J3 m3 w  @+ K3 J: Y0 D# x9 M4 F% W+ Q1 `: O) I1 z/ o$ S. T" f+ ^0 w
' s- Z8 z! Y5 Z, Q4 c3 w
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 y/ s9 @/ ^. g7 ?/ A' m% k: x! u/ l+ ]( l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( W* g9 _" a4 W% L1 \  @- H8 y0 m2 p
# H7 W$ e" v) H, uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния." c: H* e$ a( q* k# G: @
$ u  \/ q" q1 ^2 {0 X/ v
  1. // Пакет для состояний монстра% |+ Y) y: B" C2 y; ?
  2. package org.l2jmobius.gameserver.model.actor.state;1 d' f- s9 X  v9 O3 L
  3. 1 m: I% ?2 N; }$ y5 y  w
  4. // Интерфейс, представляющий состояния монстра
    3 ~* x# w2 F: L, l/ g7 g! J+ L4 }4 e
  5. public interface MonsterState {
    ' }4 ?6 S1 K/ h
  6.     void handleState(Monster monster);0 `. f! n8 S# P
  7. }
    % e+ M! r, Z+ ]8 f
Скопировать код
# G% V# K: t- x, Y/ N! v- Z) u
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
* y$ h. [4 E& G7 R% k6 k1 K/ d. r% i5 F2 r' A
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 I9 k" K; w3 A9 H  g/ y# K2 ^, {" p+ C4 \3 X. i
Класс для начального состояния монстра:' U7 k6 D/ G0 O# H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. Q: j. g: T. S, P
  2. package org.l2jmobius.gameserver.model.actor.state;; A, l  e$ ]3 c, c$ _" E* y
  3. 7 ~( _6 w8 [" m3 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 Z0 G$ \' Q" [4 P9 C% `0 |
  5. ) m* J8 _1 }0 U$ d8 K% w
  6. public class InitialState implements MonsterState {
    9 {; L9 |$ v8 q7 l6 s& K
  7.     @Override
    $ p0 Q9 q2 C( \+ g1 U4 W0 H
  8.     public void handleState(Monster monster) {
    ) `- [- h) ?2 z7 u
  9.         // Начальная фаза боя% ]' {2 ?2 T4 x* `
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 ]; g. ^* N# T" {
  11.     }) l. ^2 f3 I& O- V, j0 ]! [$ E
  12. }
    5 i% ^- k& [2 b
Скопировать код
Класс для агрессивного состояния монстра:
6 g' e3 m- x% K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' n) z% E1 W8 M. ^4 d% f
  2. package org.l2jmobius.gameserver.model.actor.state;; f) }3 h" M" V
  3. . I5 f0 |( k8 q2 [2 o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 }  Z4 {3 w/ M; c) i

  5. % ]4 @/ }0 q7 ?0 k; N
  6. public class AggressiveState implements MonsterState {
    ' t' V0 G. z8 O" M# a
  7.     @Override5 y* r0 K5 B' g5 U9 i6 ?- d/ l
  8.     public void handleState(Monster monster) {
    : ?; o* O0 K6 V1 G
  9.         // Агрессивная фаза боя
    3 U7 Z( i* T* _- `" Q; X. u: o
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");  O, D: c! r- w* t9 l9 E$ _# f/ z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. {/ L! h  r1 ?; N% K+ V
  12.     }
    5 f9 W$ a& c9 c: k2 {9 L
  13. }! j' L$ {! ~2 \! j; O$ p
Скопировать код
Класс для финального состояния монстра:
$ ?! H4 r+ ]2 D( S' H6 F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ s: _" Z6 Y8 N) z- x% V) v
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 p6 U5 v1 U) f' ?. t# ~

  3. 1 ^2 @+ f: [/ R* A# W
  4. import org.l2jmobius.gameserver.model.actor.Monster;  Q- ?' \9 `; d

  5.   Z% U$ M) A( Y/ m8 y% \
  6. public class FinalState implements MonsterState {
    3 y3 F2 R. n9 V$ o5 d6 q! X) k
  7.     @Override
    / ]! w/ B( Z+ B( _. E
  8.     public void handleState(Monster monster) {/ F* N, p" p! @0 Y5 T
  9.         // Финальная фаза боя
      g4 [3 K2 j( ?5 m/ A
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");0 S" D. [$ N5 H3 s- r, D; r# H9 l
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    0 D6 S7 T! z% E6 _" j
  12.     }
    ) t" g, b5 a8 A% g1 K- C6 w
  13. }
    ) C, F* r5 F2 E1 J. p0 I8 U1 w' ^
Скопировать код

6 _& K( t& H; Q4 x5 NШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.0 O( L' E2 m' n
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : j( T+ f" M$ ^2 f6 y/ C
  2. package org.l2jmobius.gameserver.model.actor;
      A+ N4 y! t$ N7 M( B2 x1 c

  3. 3 b4 v+ P# `7 p! N
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : U2 F, a" V) m3 m6 K! ?
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ W6 V9 ^+ a) G; `
  6. ; X( J$ O+ [1 u  T0 A4 K, A
  7. public class Monster extends Creature {2 a! e- a/ D. g$ S( E5 Z8 \
  8.     private String name;; T  ~6 |1 s; H  w# x$ S# J
  9.     private double attackPower;. i+ H3 ^! W0 O/ Z. r) n1 \; S
  10.     private MonsterState state; // Текущее состояние монстра
    $ I4 M& x( T! o* y% g, X
  11. 7 z. S* W; f9 v& n% S
  12.     // Конструктор монстра
    / P) b( [- x) I# p* m8 y
  13.     public Monster(String name, double attackPower) {
    ) I$ j" l; }4 w( h; r; Y3 Q) P
  14.         this.name = name;
    - W( W5 V% U$ t- c& K9 O
  15.         this.attackPower = attackPower;
    ; b7 m6 v2 v, T  a  b+ g
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ! c! f! ?: A* f; {( ], [
  17.     }, P* t* g) O+ o: C1 U
  18. ) Q) l: }- `" K4 s$ z1 ]
  19.     // Метод для смены состояния- A4 {* R; }) V8 h% V
  20.     public void setState(MonsterState newState) {
    * W8 _( ^6 \) i! P5 _. ^( X+ x
  21.         this.state = newState;& `0 j% g+ u3 l' y6 E8 b, S& G1 `! w& \
  22.     }
    + r6 F. V+ v4 ]5 n" G

  23. 8 g  u  P+ k% e! {' S% e, N
  24.     // Выполнение действий на основе текущего состояния
    ( Q' `* W$ H3 [; T8 M
  25.     public void executeState() {
    4 F7 q9 M3 N2 a& A6 G
  26.         state.handleState(this);+ b( T9 C- ]! J4 E9 Q
  27.     }$ F* C. A% d, _7 k

  28. ! t. h5 i! P5 y9 N
  29.     // Геттеры и сеттеры
    6 h1 y( b  M; {" J7 _5 U5 h! V
  30.     public String getName() {
    8 y: q7 R- Q% U5 `- i0 w
  31.         return name;2 h3 c; \* \/ ~7 `* ]$ t1 b/ y
  32.     }" u( ?- u0 ^" ^- _/ ~  M
  33. 5 X  a% x4 ?9 N* c; Z# a+ |0 ^
  34.     public double getAttackPower() {
    4 L+ }3 ?; ^- v/ A7 `
  35.         return attackPower;
    % b6 _# u! n5 Q. t# c
  36.     }
      V/ a/ L% S3 {% j+ T0 l3 c
  37. . Q) s0 R- e0 t4 y" F  I4 i
  38.     public void setAttackPower(double attackPower) {4 U$ M( U6 m3 @5 {" Y9 s8 C4 l
  39.         this.attackPower = attackPower;) Q: T; K6 r% m- K, f8 J
  40.     }
    - h3 T( Q" u* ]  a# E8 v2 z- x" s+ N
  41. }$ S' V3 g2 F' `/ A; T
Скопировать код
" ?& j3 H/ `4 `$ Y, U+ e1 T, {) V
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: r3 N. i9 Z0 Q4 j% K  _! Y" m' w; c

) q$ f6 m7 i0 C9 v
  1. // Пакет org.l2jmobius.gameserver.model.battle
    4 Y( C6 i" W7 Z) x6 K
  2. package org.l2jmobius.gameserver.model.battle;
    , A: G% V. `! ^$ S7 `* t' u- I
  3. ; I5 O! r5 J2 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;% R/ L) ^  x# x( Q2 |
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 ~- O5 n4 p7 z2 V/ l" {4 |
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;3 L3 m$ c4 x/ E; j5 o! U

  7. , o) P2 X4 O& Z0 S2 n  Q% U
  8. public class BattleSimulation {+ \/ v5 E- w& X: l
  9.     public static void main(String[] args) {6 H( b" h) @4 j  l6 u( ?9 I
  10.         // Создаем монстра с начальной атакой
    . N4 t$ }6 C, f- I+ U+ K5 A
  11.         Monster monster = new Monster("Дракон", 100);
    $ v  [6 G- `& e6 V2 ^
  12. 3 Q. Z; d" m' B3 ?: j
  13.         // Начальная фаза; R0 x5 G  h# k: }- n" j
  14.         monster.executeState();
    $ B* j& Y+ C4 v
  15. ! z8 x+ [7 v* {1 c: b$ s9 w
  16.         // Переход в агрессивную фазу
    3 c! v& J& l! y% E0 P0 Q
  17.         monster.setState(new AggressiveState());  {7 k/ Q* u$ u; l2 O
  18.         monster.executeState();0 h5 ]& O/ p# \( {0 P- Q
  19. * M$ A& v3 t' |5 L* K+ f8 c# K$ r
  20.         // Финальная фаза7 _0 v! z9 U% r' r! s
  21.         monster.setState(new FinalState());
    6 k% G- v# y. W( i
  22.         monster.executeState();
    ; ?8 N2 f! X! M( t- F
  23.     }
    2 e* }, i! b5 H$ D
  24. }; v- p4 k* X1 u8 b) S) Y
Скопировать код

3 r( N0 ?  u. k! zКомментарии по структуре пакетов и классов:
9 |, G( ?2 n# J; D/ L" B) W
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    9 U) D% j+ X8 l& {2 {% t; a
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 K* R1 B" c# J7 U: }9 dЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( g% X, a2 k8 H  N$ Q( c! m: |

7 t, c8 V1 o/ K  O' X
6 B2 K; f" d) |( C  Z# Q0 X% w. q5 f! o, l

2 t& S7 v' g  o6 |7 _6 |0 K
9 ?& @* t! K1 _" A3 o5 y! }
1 ~9 l: z7 n, T6 y3 z; _# B
. _- l' w9 k  E* A' v! m& h) m4 b' t+ U' u# k
& }9 K- X3 G6 N
6 x) c% U! t9 r
6 p+ D" D; {3 S; l
  `. }& l% i5 i
# Q! @. C/ e6 d0 ?  q0 ~/ r
( [5 T1 ^: p0 n0 t+ `4 q
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' F, u+ U; D5 k" b5 {Для управления сложными взаимодействиями, такими как  ...
, |' L- X  V3 ~6 T" S2 z
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
8 h6 f! I6 A* VОтличный подход! Использование шаблона "Состояние" де ...

1 m- P& E* j4 P* F( p, l6 d5 [9 g) eХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.8 ^. `0 f' d& v6 ^) y! b6 @

( [3 A4 I* m7 b, j4 I( ?  d( cШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
5 T. [- k* S9 L' h- g" J7 J9 @. S2 U# L7 G% T* d7 x$ D0 F
  1. // Пакет org.l2jmobius.gameserver.model.actor! [: G3 \) t# C0 ?1 h$ s* o/ I
  2. package org.l2jmobius.gameserver.model.actor;
    * F" I% L1 Y+ {- m, ~+ z) g* a
  3. - L. ^/ E8 ^- \8 K5 T* E- c* p
  4. // Перечисление для типов атак1 x9 ~: @9 O0 f1 A
  5. public enum AttackType {
    , {- G/ K% l3 H( k
  6.     PHYSICAL, MAGICAL;$ q) `) t+ j' h4 S* n9 A$ p
  7. }- T+ a4 i( X; S/ W) Y! W" d, {
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
  O1 z% U3 C5 E! e' k$ K; I% ~0 OОбновленный класс для агрессивного состояния монстра:
0 }$ Q4 }* p" A' V- o
0 E- P) s1 p" j* N' Q+ r3 f9 t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' o7 V8 Y5 j4 c0 y
  2. package org.l2jmobius.gameserver.model.actor.state;
    , s/ g) n7 D# P8 |% s
  3. / @: M/ Y, k7 N: P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , V1 P; C6 X1 ?& W' U! w$ S3 N
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    1 I+ k+ S& V; ?1 ~. {+ p

  6. 6 q* o7 R7 K" ]3 R! z, d
  7. import java.util.Random;
    5 e  }. S1 B- M5 e
  8. ( f$ [0 A- N6 w& b! M& {
  9. public class AggressiveState implements MonsterState {7 B5 Z, X5 n( `5 d
  10.     private Random random = new Random();
    & f5 i, P/ n' C, c$ v

  11. * \- n( w  Q+ x$ O! `2 X2 C
  12.     @Override& d/ e( a6 v% S# V% J
  13.     public void handleState(Monster monster) {8 }' y* K  h, K: M; `
  14.         // Выбираем случайный тип атаки: физическая или магическая8 Q0 T( I8 J& Y9 u
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;: L- D1 f7 Q+ ~! P5 x0 ^+ s5 T9 @
  16.   v# w" W, f" @1 [2 a' q, k9 U+ I
  17.         // Логика для агрессивной фазы боя% O$ T/ G$ h  a9 x7 V. z
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 4 N: y) Z. z3 m8 a- {! e
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & W: g# n9 b# l! e
  20.         
    & v1 g( T$ M* W2 t
  21.         // Увеличиваем силу атаки в зависимости от типа атаки0 C& X  K! t! J& F' I. ~) g
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;; i3 b* v! v6 M7 e& U. j7 \% o, Y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);' H$ N' }0 W1 p( T; F$ h( {
  24.     }9 b  D" p8 E/ P2 k
  25. }
    1 P9 ~. W# ^* q" h; O& Z% Z
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки4 e* `9 i5 Q* h4 a# ]+ T
! j4 P8 x3 y/ ]5 x  B
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % B" j0 ]( K4 B  a4 J. J% c' o
  2. package org.l2jmobius.gameserver.model.actor;
    ' t3 \7 T& ^. {8 w' o; B/ G
  3. 4 L& Y: u* W( [  n3 u, J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- {; n7 s# R1 ?4 z, E/ R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 ~9 b9 k$ c, n/ v2 h

  6. / H) J  A7 ~0 Y; k
  7. public class Monster extends Creature {
    ) {) T! R% m) S% d
  8.     private String name;
    7 W/ E3 g" B  u7 j% {( R
  9.     private double attackPower;
    6 j1 ~3 y. M0 X
  10.     private MonsterState state; // Текущее состояние монстра' h. ^1 t" C) w. z

  11. ( q% J8 W4 A3 Q
  12.     // Конструктор монстра. m3 k" Q! }- Q  A* k
  13.     public Monster(String name, double attackPower) {# c& l! \( x0 p. G* z3 K
  14.         this.name = name;
    % M, x% y9 `. \- a
  15.         this.attackPower = attackPower;0 {5 U4 m" g/ s$ U' l+ ~
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию. _3 l# ]2 g' m! A
  17.     }
    , {: {  Q0 o% r- B6 a

  18. * s6 t$ {) [; `+ f9 e
  19.     // Метод для смены состояния
    ; \2 j, y4 e& E3 y/ W3 _' k
  20.     public void setState(MonsterState newState) {& U  R" `, j7 `0 M: [. b
  21.         this.state = newState;& Y8 g/ Q) I4 M- ?) n1 d$ p
  22.     }7 }0 w6 Q1 |& ]- s2 ^. s/ g& x* u% Q

  23. ! [6 Z% U# Q9 h
  24.     // Выполнение действий на основе текущего состояния, Z; @  ?0 f( J% h4 R8 h
  25.     public void executeState() {
    6 W4 ?6 x, `7 x
  26.         state.handleState(this);
    5 y' p$ X2 j: e  B8 {0 O$ ]! Z
  27.     }
    3 ~- H, w. d$ Y6 V. b6 J
  28. * F" s4 i: }: Q- q
  29.     // Геттеры и сеттеры
    6 c; K8 \- q- C6 w, C2 i
  30.     public String getName() {
    . W' r/ ]+ S, v( B9 Q+ V3 O) d
  31.         return name;
    2 y0 h% q" ~. I. s6 N. E
  32.     }
    + b! }5 x; f1 P' w- _( R; [; ~

  33. : m& ]* Y- _* X
  34.     public double getAttackPower() {5 M& a' o5 [' Z- F
  35.         return attackPower;" S3 N0 Q' I( J+ Y
  36.     }
    - g( X7 \6 M& U. O8 J% j, p
  37. ( ?) h2 S# b$ g/ N& ?
  38.     public void setAttackPower(double attackPower) {6 o) {2 R! j/ s7 }; l7 T# z, \
  39.         this.attackPower = attackPower;  `6 n2 ^* _8 Y; ^6 R
  40.     }
    4 e3 h2 `2 i" ^7 @
  41. }
    ' P4 t1 T/ i. ?2 T
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
, w5 K+ _! E/ a
1 I2 H8 Z* f! A9 e5 D/ c4 ]
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 ~  @  _( ?9 s. e5 g. j, G
  2. package org.l2jmobius.gameserver.model.battle;0 x; _6 i3 |. N2 j  D+ |

  3. & e( o2 o! x3 i
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 y6 l' I  Y" F  v, r! T
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" ]  u4 z0 @+ p8 |, k+ l. x
  6. : D# ]& p1 x8 {
  7. public class BattleSimulation {
    5 c6 `) G% A  x8 n5 \
  8.     public static void main(String[] args) {
    $ X4 @1 E% Q1 E' c, K
  9.         // Создаем монстра
    % j" Z! }8 ^; G8 m- G% \
  10.         Monster monster = new Monster("Дракон", 100);
      N) i3 v( G! j, Q+ A( D; \' Y

  11. " [) B3 N- V5 T( h* ^# t
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( @! \% Z1 _  b3 ^  k
  13.         monster.setState(new AggressiveState());
    ; O- C. b1 {6 [. `9 u  k
  14.         monster.executeState();/ e- E0 N! \! C/ g. |1 U# ?
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 V/ T$ L: w, }: v6 H0 _3 ]/ D
  16.     }0 d/ L" F5 b6 t+ t8 a3 d
  17. }, Y+ f* a) J/ Q# Q( @
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
* W2 q2 c: _% y+ U2 p: UЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!; {4 T8 V/ T9 K8 K2 @

' V' n" w3 l/ L( P& w# w( S+ }0 G: C, O- T9 C; e
/ e  z% K5 B9 `  w
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

  • Выдающийся вклад

    Прилагайте постоянные усилия для процветания форума в течение длительного времени или много раз выдвигайте конструктивные предложения.
  • Авторитет сайта

    Участники, внесшие выдающийся вклад в работу форума

подписок0

подписчиков0

постов9

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.