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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!! i. S1 W5 ?$ c3 u% p
  Q* [% ?- V3 ?$ ^4 p) v/ ^
2 X6 `4 G% v- o7 w4 |5 J) F8 m
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.) \. [1 B6 d8 o. f, x8 Z( y# n: P* d
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
0 t" e5 Q4 F* D6 i( q: |  p  xАстралия ?) p  i" c4 T: q- o6 [0 E0 b+ l2 d8 d
$ ?$ n& e9 S6 _* U8 E

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!7 G: M8 h: ?0 ?7 E: p# Y
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
* e& M- r4 ~8 J4 w4 z+ U9 w. X5 H% B/ D

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 3 k' P$ B/ R7 y- {+ R! ~
AlexCoder опубликовал в 2024-10-16 18:31
) J; V& u8 o7 LДень добрый!
5 Z, w5 ]# y) h# A4 a6 u# `В статье описано взаимодействие игрока с N ...

" T# I/ p+ l% W) g, T) fДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, U- G. U9 k; J
; \7 t/ C# ^' G0 s: HЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' y1 g; g4 i8 R+ P" }* L* s- V" U$ q2 x2 _
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ G" y$ P' T8 C# s4 a& C+ t

& D7 r7 y/ }5 D/ b' C3 i* `" ^
  1. <font color="Green">// Пакет для состояний монстра</font>7 M# t0 X! }+ i* l. [" B
  2. package org.l2jmobius.gameserver.model.actor.state;0 I# T. f" j# x& |, i3 W6 Y: H2 F
  3. <font color="Green">
    # N' q& I/ ^$ ^6 z
  4. // Интерфейс, представляющий состояния монстра</font>
    1 t4 U5 o; c; U7 H$ G
  5. public interface MonsterState {
    ' g. Q; |& q4 G& K  a
  6.     void handleState(Monster monster);
    , E/ ?- Z- y7 @8 s  T5 Z$ V6 e8 f, K
  7. }# m9 v) M5 j+ m7 x5 d: e
Скопировать код
) d8 C: K: L/ X3 R7 g
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 y/ Z. a: J- U( j  b1 q
7 B9 i/ t# c+ {% {/ c5 P& ~Класс для начального состояния монстра:3 I# k& i8 ]: v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* ^: W+ m& _: k+ W3 g% K% d/ L& F! D/ p
  2. package org.l2jmobius.gameserver.model.actor.state;# O5 n! x- A% p, B

  3. : i; x  b' g6 b# `+ B% i
  4. import org.l2jmobius.gameserver.model.actor.Monster;! j  u, |/ y* L& {+ b

  5. " r7 D  G- j. C' P8 u( s3 W+ j
  6. public class InitialState implements MonsterState {
    4 X) v2 ^! x2 g' c# j: M
  7.     @Override5 m" N; `+ S: c; l, f# V
  8.     public void handleState(Monster monster) {
    . c' o: r8 r# ?$ }
  9.         // Начальная фаза боя
    . c2 l; L; t( s" l; i* h& b
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# x2 T+ ^! B5 p; k) n: J4 K% I
  11.     }
      z1 {) k. k2 }1 @# G
  12. }8 ^8 {: F6 Q: q
Скопировать код
9 T( T; i; ?( c2 y
/ W, N: ]3 t6 G: @2 w; _
" ~' M9 g! W0 V. j- @
6 t$ }" [# J. X7 d9 I6 z

7 v: g* O5 M. k+ w
: U+ i3 }/ U+ |+ S! j' ]2 q& G3 ~0 X1 s% l  H1 Q: N; d/ J& M

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 {7 I5 m, Q0 j% z8 C4 U+ d/ ^/ s/ G5 h. Y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 o, b# G0 G: z6 y6 w

5 c9 d( i2 D% F' R5 z6 p8 Z% |Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
# Q; G: |# h3 W# K! T- G" H7 a: e# m
" H, o/ B( k( [9 D
  1. // Пакет для состояний монстра2 |. h: R+ ]6 i0 ~$ ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 W  B3 q$ a3 d" ?/ R
  3. ( U5 X* w: T3 Q0 A& e- P7 K6 V
  4. // Интерфейс, представляющий состояния монстра# O0 a0 F8 ~  u6 _. l  W3 w
  5. public interface MonsterState {
    / `% f' z1 ?) t; X% i% l4 @
  6.     void handleState(Monster monster);! Y% [- i+ C$ E% F; d) Y% x7 h& y) `1 S
  7. }' ^4 {! e( T: t; n
Скопировать код

3 u2 T9 w/ d; E/ ^5 F6 B: hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 [. P$ O5 \  F& K1 h* t! }2 M
' `% A7 _- K& n6 }& i( H
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( x) x+ x& m* }$ y

' G' Z+ S( H) x, ~# ^+ g5 m  |8 }Класс для начального состояния монстра:  j# w6 h% ]: V# F% [! K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 y2 ^$ W  u. v" e- y: a7 [
  2. package org.l2jmobius.gameserver.model.actor.state;
    . V/ K% N: n& q4 F& m
  3. - v7 c# d2 V/ W/ c; E$ r2 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;" `& Q: \) m; Z6 g5 A) d

  5. * F( K/ G: w* J0 a
  6. public class InitialState implements MonsterState {
    7 f8 N, Y) O) G- M
  7.     @Override" i0 w! J. B3 `# _; ^$ d
  8.     public void handleState(Monster monster) {! @& D! T+ w% L: }& T
  9.         // Начальная фаза боя$ |% v1 V! }; Z+ G* l/ D) H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    + i! j: p2 ]8 `# v" R
  11.     }, B2 {9 f9 i# |4 m
  12. }9 ?: |) `! H, {2 f/ {/ V
Скопировать код
Класс для агрессивного состояния монстра:. Q: J9 B0 F+ [" q1 D& ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state+ X7 F; f, w6 j
  2. package org.l2jmobius.gameserver.model.actor.state;7 @( |5 y+ _" C7 g6 Z8 `9 L7 q2 z
  3. " y$ n/ v* O( L) [. H
  4. import org.l2jmobius.gameserver.model.actor.Monster;" P9 n* ]5 ?6 U

  5. / S3 I, I- w, ]- W$ J
  6. public class AggressiveState implements MonsterState {5 l" P. l2 J" K5 F2 o7 n0 N& o
  7.     @Override* R9 I" i, f- J" B+ r
  8.     public void handleState(Monster monster) {8 K7 G1 \4 j4 d! D9 q8 H' h/ G1 p
  9.         // Агрессивная фаза боя& K$ l: b$ y3 U( B6 R
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    % F0 f: a- c. Z/ b  y, v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    . }' n0 f7 o, B: @, c# J+ b
  12.     }
    4 E$ C7 g- H- H7 ^0 D
  13. }$ G- z- ]' [) W* g9 L' {
Скопировать код
Класс для финального состояния монстра:
' D( i/ t# S  d9 P2 B/ L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 K1 F$ T, X+ E2 q5 G9 l2 P# p2 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) P. j# R2 T! J! _3 t" k0 n
  3. " d! S% t7 k% f1 r" M7 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;( v; ]' o$ u5 C" |8 _2 q  O* S& p" _
  5. ) G# \; s. I7 |( O
  6. public class FinalState implements MonsterState {/ E5 l( T* e- c2 V; e, k4 U
  7.     @Override- O: ?! H! r* p" o6 z4 }# Y' `* C
  8.     public void handleState(Monster monster) {, e* x* Y8 u# M7 c
  9.         // Финальная фаза боя
    : r5 e5 A! Q1 v* F- s& @
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 ^" i: `( y6 U* S% }! a6 R
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки1 @) `; b9 M4 S1 ?4 O' g
  12.     }
    6 ~5 ~8 ?! g" y0 Y) }
  13. }
    7 M( C& H$ t- \5 Y: j8 V2 U1 [
Скопировать код
, x  ?" |( `: a( H$ _7 k- n$ O4 ~0 z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.1 h$ k' p6 d' \; I
  1. // Пакет org.l2jmobius.gameserver.model.actor: Y6 T% ]; t  e% Q, |
  2. package org.l2jmobius.gameserver.model.actor;
    $ k2 Z# J, z% u  s7 W5 ?
  3. # E, Y9 J0 @: P
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    2 H' ]7 |' z% F1 |- w1 @* y6 J- x
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;0 x+ L7 y3 {; {* Y

  6. ( Q. Z9 }2 H9 ~- D" \0 u( {
  7. public class Monster extends Creature {3 |) ]6 n: E, f/ Z# f) O! N
  8.     private String name;1 p% j5 u* K( {% [' l
  9.     private double attackPower;& }: Y) l+ o4 s
  10.     private MonsterState state; // Текущее состояние монстра% b. z* \- B. d' Q' p: A

  11. ! e! g3 U" G2 N1 m) k1 Q" r
  12.     // Конструктор монстра- W8 I7 I4 O. C! J; z7 c% O
  13.     public Monster(String name, double attackPower) {' M/ B4 S/ z2 ]4 e; \
  14.         this.name = name;. T; }9 U7 G7 z% k
  15.         this.attackPower = attackPower;
    3 D$ n4 b1 d" f0 ~
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние5 _% x" q& h! T
  17.     }
      B0 x( Y% N) B/ `" J
  18. ' V# r) F1 P5 v' L
  19.     // Метод для смены состояния( r' {5 p& V% s% |. L: |/ R
  20.     public void setState(MonsterState newState) {
    * ~4 B: }. v! `2 {2 ^1 A6 E1 S9 e, a$ A
  21.         this.state = newState;* k" ]: w+ n) H, y) F
  22.     }
    3 @! P- Y# d: p( ?; o
  23. : C7 n, I, V7 h1 y1 o" R
  24.     // Выполнение действий на основе текущего состояния/ Z$ ^. U& ?4 r/ H6 @
  25.     public void executeState() {8 k, m$ j- K( p+ W9 s
  26.         state.handleState(this);0 p' [* b+ D( N
  27.     }
    5 U3 H4 r) s/ P# Z- @6 G, t
  28. . j9 Z% V, q2 B5 G4 f' o8 O* C. \
  29.     // Геттеры и сеттеры1 U' E; K. b5 S/ d- j
  30.     public String getName() {
    ; }; ~/ l- @6 [0 J3 }, z! z- j6 `
  31.         return name;
    % K+ w. u" q0 m: p+ P0 ?9 |
  32.     }+ v, `& w! x) }: D) u) M

  33. ! Y7 I2 R8 T0 Y2 }  A
  34.     public double getAttackPower() {
    1 L) ?5 U# f  W% M' `0 q1 q
  35.         return attackPower;
    ) q& N' C9 p1 l' P" B
  36.     }- v/ c+ s; N* Y9 Q5 D

  37. 5 v; [4 K- k, e( J0 Z% k9 B
  38.     public void setAttackPower(double attackPower) {
    4 \8 }/ i& D' {3 B5 u
  39.         this.attackPower = attackPower;
    " \' l- k7 z1 _8 x( ]" a* J+ l6 t
  40.     }1 P6 C  F- `+ o6 N
  41. }
    ) [; A4 G8 q. R) z
Скопировать код
( }) g9 k0 X2 J0 c5 B" r
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* b" E% F4 ?+ d8 Z3 @0 R* Y% q) F2 h% P4 z+ U9 f
  1. // Пакет org.l2jmobius.gameserver.model.battle
    $ U8 l) T# n+ U& h" o9 S
  2. package org.l2jmobius.gameserver.model.battle;- c' @' |+ H. ~  ^6 a2 N
  3. 6 Y* Z* J& |+ J# b; |6 X6 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      ?6 l! x- ?0 Q0 Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" X9 r3 g9 b& V. K
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    # ^' U' O5 A7 h5 D0 q$ y7 [
  7. . h' c! I( I8 V0 [6 M: U7 J1 \8 \9 W
  8. public class BattleSimulation {! l: A3 _( r  J8 o2 n1 i+ q8 E9 ~
  9.     public static void main(String[] args) {
    7 Q% K+ h, g1 T
  10.         // Создаем монстра с начальной атакой
    0 @8 t  T* c/ ^" V$ F
  11.         Monster monster = new Monster("Дракон", 100);6 ~1 m; x" P6 T: a( B6 v- |, p6 d6 J
  12. 6 y" K5 U1 o+ T% }! d
  13.         // Начальная фаза
    . W+ A7 E0 }/ D4 u# G+ E
  14.         monster.executeState();6 ^5 T/ \; h% N
  15. ! Y4 ^7 l/ w& ]+ L
  16.         // Переход в агрессивную фазу
    9 A. A9 u, m# B6 R: r% d; L7 O
  17.         monster.setState(new AggressiveState());1 X6 `. t" z  T& L: D  h
  18.         monster.executeState();# P. W2 V5 T! r3 Z% G) C  p% H; Z

  19. " W" w' ?. U& T- k# V/ u7 |" |4 n
  20.         // Финальная фаза
    % R, K5 M/ n& Q! P5 z
  21.         monster.setState(new FinalState());
    ' _" q; P! F( i$ H* S% w3 K3 @
  22.         monster.executeState();
    8 k, O! e1 k) j2 x' @) |- x  V. i
  23.     }2 f5 J2 L# [& r6 p( y$ X
  24. }
    : D0 @* x' r. C! b
Скопировать код

% i, @2 W+ n1 VКомментарии по структуре пакетов и классов:, L" p! z, e2 v4 ^: |. ?! Q2 e
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ d* w0 Z' G" b3 N4 I$ i- K
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 a  @4 N* n. \$ W% u

- v. }+ o; x- W$ U: O9 g+ ?, v7 V4 g2 d! W

3 k3 I4 w( Y3 i9 D" w+ O5 B- e
* U2 Q$ e+ l4 w" C
4 X2 [5 a9 k3 d  s6 G+ X7 z/ ?5 p* A1 e: G0 j

4 C+ Z  R8 H/ u" M% `2 c, o+ q3 f4 M% M$ W" k

4 |# d2 v9 l  x' r8 S) a9 N8 {: h; n  u! X& S$ [' M5 ^

6 i- J, @( A0 E5 m$ M: r$ R
  f& L5 Y' o% L4 m; Y
) o0 R! g/ ^: E! s! a0 c/ ~$ V! k- y: {5 j8 s& |& b

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:042 T! W! Y& m  U# K: d
Для управления сложными взаимодействиями, такими как  ...

$ ^& }3 x" X' d; a. L& ^Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
5 A) Z- \! W$ _, b6 X4 j# h; l- r. HОтличный подход! Использование шаблона "Состояние" де ...
7 Y( |: h" `2 e6 H8 o. `5 m
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.& E4 n/ N/ l& r5 d

1 P0 z0 u0 ~; f& D' \  G+ \Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.5 Z& M) S# O% A- U2 Y6 ^

8 N3 o* G$ b4 Y( \
  1. // Пакет org.l2jmobius.gameserver.model.actor+ s4 i3 H' ?" l5 v8 f) B+ X
  2. package org.l2jmobius.gameserver.model.actor;
    # ^  l+ T5 W8 i" u

  3. 2 d1 z  v1 X6 W$ J8 i- F0 \" Y& V
  4. // Перечисление для типов атак
    $ K  S1 J. I' u& }, e% C
  5. public enum AttackType {
    * a6 ~" u" E$ k/ U; }; z. t
  6.     PHYSICAL, MAGICAL;
    : ?6 Y% E' u; E. A( e6 j4 B6 q
  7. }6 K5 v7 `! C% S) x6 D8 D& [
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
7 f8 q  U& ?; ?. d6 eОбновленный класс для агрессивного состояния монстра:" T+ S$ ~) O# K& ~+ G
; I% s$ A6 G$ g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ Y) `: {  x$ O) s9 j6 d3 U' V
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) Q2 X) m1 @4 z; j! [& }+ s

  3. 3 _  L' O7 t3 D$ f+ S- A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " k: j, G3 `5 o  V; I6 V7 ?+ x
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 \4 A1 ^" F; R$ y  C
  6. * m9 J% `9 r8 [! C! t
  7. import java.util.Random;3 q) v2 I  X/ n: g

  8. 0 H1 Y/ d* D. i* g/ R% Z5 u
  9. public class AggressiveState implements MonsterState {
    ' f5 _% K. s* N: |% J
  10.     private Random random = new Random();
      o  |. M1 |* _, `  A8 m& s

  11. $ s; J. o1 R7 `8 B+ X! F$ I
  12.     @Override' u, v1 h3 y8 ^2 M" f" F- P
  13.     public void handleState(Monster monster) {
    . {' n" P' `2 W3 \2 E! v
  14.         // Выбираем случайный тип атаки: физическая или магическая- ?* h. o" b! B8 a$ F0 R& S/ T7 V
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    & Y. l" p6 M0 L* T: s* y2 P

  16. . J, _4 K# P  W! k2 w+ `
  17.         // Логика для агрессивной фазы боя
    + h  g3 v1 M3 V0 V% r
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 1 F% a! j$ ~  D" X: y& I# E
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    $ j/ n* x6 n& l/ Q& y
  20.         
    ! P5 v  {$ C2 r8 H! X1 s' S0 Q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки0 k9 J6 @. O* h1 A" r' {& j
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* c  `8 C) v" Q" |$ W; U/ M9 m! A% |
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);' ?  a8 w* D, w; X' y* E
  24.     }" ^* W8 X  L% m5 m
  25. }
    " x, Q' T, b4 r4 X) I6 K
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки1 a! X! h# P# X0 n1 o
0 H0 n0 z# ]% Z+ }" e: P0 L& s8 v
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 ?: k6 x1 I, J' n$ |
  2. package org.l2jmobius.gameserver.model.actor;( o! B" g) _1 q
  3. 0 H1 b  X* Q4 u; z' m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ W  q. Z4 x! h' ~8 N) F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    - T  p# w% y: @

  6. 7 W1 [9 f. B7 @/ K* b8 }; t. @
  7. public class Monster extends Creature {1 i" R+ y, l6 v1 A
  8.     private String name;' a# \; I) c3 b
  9.     private double attackPower;* h0 x- _0 K4 L! w8 V4 |9 d9 L; @
  10.     private MonsterState state; // Текущее состояние монстра/ h0 R: L# u: V- J5 }
  11. # ?& F# G  u. r1 A+ t# `' F
  12.     // Конструктор монстра* W" v0 K) B1 b1 D
  13.     public Monster(String name, double attackPower) {
    6 z2 Y* t3 `  `0 `0 w+ K+ p/ H+ N
  14.         this.name = name;3 u( L) a1 d$ y" O2 }' p* g
  15.         this.attackPower = attackPower;
    ' ]; @0 d; [; b+ X
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию; ~; B, T) T  m& b5 u/ l7 \
  17.     }
      b. e2 ]: z" C+ M$ V4 h* j

  18. 8 `, Z8 a& g% E
  19.     // Метод для смены состояния: J! q8 d5 V& s  R. J
  20.     public void setState(MonsterState newState) {
    1 x+ o# N* z! V7 R
  21.         this.state = newState;
    % G- q/ Y1 Y. L+ F5 R
  22.     }6 A" r+ z0 z/ ~5 P6 z: J' n7 I
  23. 5 \9 }7 ~& A" j" d
  24.     // Выполнение действий на основе текущего состояния
    & u% v" m" h: n  Q: c
  25.     public void executeState() {
    2 W" C6 ]) h* W* y. Y# i
  26.         state.handleState(this);5 w/ H) R3 i% U- N2 [' d. A
  27.     }
    0 f1 ]0 V- q! L) c$ l3 X
  28. ( L- h- m: [' I/ A; B% E' v5 x
  29.     // Геттеры и сеттеры' K! R: D' G, M( Q+ u% \1 J$ ?& }
  30.     public String getName() {
    0 ^7 {- \7 J) j, _
  31.         return name;2 n, b* S3 p$ ^7 s( R
  32.     }, [# }$ {; O$ j6 W

  33. 9 d7 x5 C5 f# ^8 z6 N# v6 K$ k
  34.     public double getAttackPower() {
    ! A% Z* i( M8 ]) n' F9 b& D
  35.         return attackPower;4 \7 m  t9 W5 o- ?
  36.     }; l/ m. Z& N' ^( u0 `

  37. " o* Y* G8 T: T' g; C! P/ p) G
  38.     public void setAttackPower(double attackPower) {0 h+ {: G8 t9 X7 Z8 z- N
  39.         this.attackPower = attackPower;& |3 L! a, f. C3 u1 X) D* v
  40.     }2 d' n- T0 J$ A$ p$ G( c
  41. }
    ( `* q. E/ K  L. v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.. w9 K3 M- P8 x
6 p6 W9 U0 m" n, Z( ]
  1. // Пакет org.l2jmobius.gameserver.model.battle  k6 p; a; O& {0 s% Q
  2. package org.l2jmobius.gameserver.model.battle;  V* H: ~! b2 F! ]# Y6 C

  3. . [0 A- `; S! I% F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " h% Q8 \: G- E5 t7 R" Y3 p( u
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ J' R% A! }  x' y
  6. ' x5 [4 h5 j* _* r
  7. public class BattleSimulation {3 C, `  ]8 l0 O) R6 g: ^; E
  8.     public static void main(String[] args) {
    " e$ l- K( `' O/ Q
  9.         // Создаем монстра
    , v5 q5 w$ t3 c. I' H$ u: P" K% j
  10.         Monster monster = new Monster("Дракон", 100);6 [5 f' n7 y2 B) d. n
  11. 7 |$ J% g& ~. J2 W: o
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак  e3 k; n" p( M7 s& g
  13.         monster.setState(new AggressiveState());, G6 j2 x5 a" W8 \. i% Q% ^, A" d
  14.         monster.executeState();! b, ?$ \- ^4 J: m8 E/ v4 N
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ' k' R3 M0 j1 Y  Q: T1 K
  16.     }
    8 @8 p, `6 t7 R7 b6 E  E
  17. }$ a1 ~8 M: ~5 ^
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
0 _: m1 L' f: ?" s% M3 HЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
$ j7 G, f) f" J: f, _3 Z& ~3 v- m
8 L* ]1 W2 j0 ?$ q; S# f) Z7 h
/ k6 H- }; O2 }: F$ b2 q7 G! c* b2 H8 a" R  p9 \





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