Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
9 B  L+ T! k4 a4 t2 d. \+ Y) [- E1 m# c' ^& ~
- D) g/ w% r3 ]* Y
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.: A: S% u6 M* _. i$ ]+ b1 P& _
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
7 |2 ~  u: g1 B7 t; x1 L+ h9 n8 {# PАстралия ?3 }( O) T2 X# u( q* f# Q

- {; ?1 o8 K( }' e

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
$ [' |, [$ j0 {' @В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
) r) {% B. A3 @- {$ Y% \5 `3 P. M- f* z% J2 [4 j8 |% W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 " ?5 ~" H. S. E; N
AlexCoder опубликовал в 2024-10-16 18:31/ L! p  r, q5 n6 S
День добрый!
) F+ ^- y% h7 V# Y* y) Y1 Y! f: O3 lВ статье описано взаимодействие игрока с N ...

0 H# C. \$ G/ i" ^. m" i) aДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). + @# O) h) @  s  t7 o+ {1 ?4 `
# P% G5 T" y/ C" d
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., c# T! r/ u8 Y( h4 {
) J; N+ f+ c: v# x* @5 F! F
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 I! }/ y8 ^: c8 {( ^+ V( d7 k6 ?' f0 F4 Y, V; x
  1. <font color="Green">// Пакет для состояний монстра</font>
    , s! C; y) U9 [4 ^
  2. package org.l2jmobius.gameserver.model.actor.state;, t# x0 Y. I: ^* u
  3. <font color="Green">5 p7 B& _6 [& N( F/ v* [! U7 Y) @' g1 \; I
  4. // Интерфейс, представляющий состояния монстра</font>
    # z' O: t5 M3 C2 u! z. K' x
  5. public interface MonsterState {
    5 z. N; F! X9 g
  6.     void handleState(Monster monster);3 A0 S* d/ p: _5 R
  7. }
    * w* @8 |% h( Z* ^: ?  }4 K
Скопировать код
# H6 [& i& K' s4 [
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ y. N  z: Z! C' W( @4 x/ z* w, U0 Y  _) h( f8 o# q; A
Класс для начального состояния монстра:. o+ E! ?% C) j# v. z
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ( y6 U+ j0 q* _6 V
  2. package org.l2jmobius.gameserver.model.actor.state;: m) I- V. B3 b. t1 v1 d
  3. . z# l! o  ^  Y; v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % A) k/ a$ V0 R2 _  f" M% T# n

  5. ' j, l- z% M1 `
  6. public class InitialState implements MonsterState {: G' o( A9 Z$ R
  7.     @Override, Z$ x6 W& J1 l+ N$ A# v2 z$ h3 G. M
  8.     public void handleState(Monster monster) {
    * x( ^: k9 h8 i
  9.         // Начальная фаза боя3 X. w4 D7 {) o( R
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");; D1 H0 c- n* t- o+ a; \
  11.     }
    5 w3 q# F3 H0 \2 I2 Y3 z7 q# p
  12. }6 I! A4 ?- b5 s+ x& m3 Z
Скопировать код
  u$ C; a: O+ O* a" G5 |

; M2 H. `: U- `2 f% Y
  A  c0 b% e2 T  _
8 d4 C' M8 I. u" A0 T. |" }
; S* u4 y! K4 ]5 e( d: q* i3 y
! r$ C/ D0 w, c4 p* M4 N5 J
8 Q8 C4 G) G' z% H) D* _0 _
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * ], ?; o! C% D: Y5 Q9 C9 R

8 p6 o% e3 n7 o. L. LЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' K3 [$ \# b8 s7 N6 L8 k3 t

; `3 B0 R, i9 o' p, J) TШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 d+ ~* ?# `1 T: ]' a  H$ v, _9 X+ Q! m0 K& W7 {8 y. e8 \
  1. // Пакет для состояний монстра
    / g" g' d6 ?! C' p4 I* M2 g, k
  2. package org.l2jmobius.gameserver.model.actor.state;+ }  j* s# _, ~
  3. ! D* k! T/ v! p; f* w5 Y# K
  4. // Интерфейс, представляющий состояния монстра
    7 [/ H4 A) x7 j5 b, [+ \
  5. public interface MonsterState {
    ' d7 e1 w/ j) u% |" p$ M' z
  6.     void handleState(Monster monster);  a5 A0 I2 W  Q4 o: g  d
  7. }
    6 G' g3 W; C+ C& I' p" @# Q, f
Скопировать код
! O$ A/ B1 [8 s$ O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . d9 b9 Y) J. x) W+ z# ~5 f# x
8 m7 g8 t; G  p
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  }+ }% R) ^0 U
) _2 d4 x6 d6 PКласс для начального состояния монстра:
9 Q6 S+ f9 P  {& A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & D9 j' X2 o9 A
  2. package org.l2jmobius.gameserver.model.actor.state;
    # E. s4 `0 [$ m; x6 \( b8 n: O' y4 l

  3. 9 [% |% X( q8 d) |
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 I, O& y, c1 V7 \

  5. & t0 }5 `9 r: @
  6. public class InitialState implements MonsterState {! C' [6 ]2 B& o! _  z  l. G( q6 {3 N" P
  7.     @Override
    5 X9 X. b) F" E
  8.     public void handleState(Monster monster) {
    ) p( |" C  c: M# V* z0 l$ a( B- I
  9.         // Начальная фаза боя( h. f4 Z9 w* x7 T
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : I+ I/ u! L" l  N1 U. L. D
  11.     }
      j" e5 o# m: W4 }9 i
  12. }/ f" z0 d$ J4 J! ]' m* a( a
Скопировать код
Класс для агрессивного состояния монстра:0 `$ v) p  |: H$ \* q& W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 o3 r2 T! M( L# j! _8 l5 S( g( ^
  2. package org.l2jmobius.gameserver.model.actor.state;3 T* \* `& p7 m

  3. - ?8 J+ r/ N; M* p' g$ J7 i
  4. import org.l2jmobius.gameserver.model.actor.Monster;: s. p6 T: R( t5 g$ P! u; r
  5. 0 r( d  V# F1 N4 e9 V" S" q
  6. public class AggressiveState implements MonsterState {4 t% a+ q1 F2 N8 X
  7.     @Override
    : l3 @6 e. q) O) d
  8.     public void handleState(Monster monster) {7 @; [0 `4 ]  k+ n( {
  9.         // Агрессивная фаза боя
    % y8 P$ U& G/ z8 m' t' {
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    / r2 a2 k1 v- R" w- o3 }# O/ w7 G
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; w$ U$ h  N8 i7 U3 j: c+ b
  12.     }3 t. S2 A' }3 _7 R. o
  13. }
    ( I& ~# A+ I' Z* t4 i' y
Скопировать код
Класс для финального состояния монстра:1 _. {* v3 C) O* d! {5 q; s1 V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : `- `# ^7 H$ S! h
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 ^  J+ u% Z! j$ K
  3. ; h3 `, Z2 I, f% x6 t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ ^9 F" F3 z9 A/ _* ]# d7 |1 b6 }
  5. ( z% n/ n6 J; i! x  O# k
  6. public class FinalState implements MonsterState {
    ; q- O) V3 u# w+ N' C, v
  7.     @Override$ i/ D+ I; k4 _' f/ m' W
  8.     public void handleState(Monster monster) {
    0 D- G3 X3 B  W0 T! }2 H5 J; t, a
  9.         // Финальная фаза боя1 R/ y" K/ C8 l# x! P& {7 h
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ; v( d, u4 M( X% ?( F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки& c5 m0 S0 O6 O) s
  12.     }
    1 v5 q3 U2 ?/ T) A7 b  Y$ m( h
  13. }
    8 P: W5 `: q, X" |, X! j$ p
Скопировать код
% n) q) o0 Y7 w
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; P3 x4 H; K6 v+ w
  1. // Пакет org.l2jmobius.gameserver.model.actor# d1 E6 r: w3 R5 U9 B
  2. package org.l2jmobius.gameserver.model.actor;
    # j! Z0 x7 a! U* ^: b
  3. $ n% e3 Q* j4 X2 ^: Y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    3 u' v5 g6 a3 T3 \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;! d/ q+ R! d# C1 v. j1 G% _
  6. 1 B& Q$ V2 F  P) h" ?; j9 z
  7. public class Monster extends Creature {' n7 ?2 g+ F% I. A8 N4 }
  8.     private String name;
    9 ?% S/ }$ a# d' R' S6 @
  9.     private double attackPower;3 G* o' O  |- V! h4 ~3 X, z
  10.     private MonsterState state; // Текущее состояние монстра* W! V% e0 j* c  e& e" Q; _

  11. 0 e- t; X- `- m, i9 x
  12.     // Конструктор монстра, a+ x% [; Q. n& B+ {
  13.     public Monster(String name, double attackPower) {
    & W8 m6 J: Z: o8 _$ G! Z% {
  14.         this.name = name;
    9 |' F+ q9 [5 l* b, F/ g
  15.         this.attackPower = attackPower;
    5 E7 V3 Y# t: n- K4 q; b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    1 h1 ?$ t/ x  {) @0 _3 i& Y
  17.     }
    3 `3 z, T; x' h' m( ^+ K/ T" v

  18. 1 _) @8 l2 s2 H
  19.     // Метод для смены состояния
    / {) ~5 M" Y* i% W) Z7 y, l
  20.     public void setState(MonsterState newState) {- P" a; l1 J0 g, L5 _
  21.         this.state = newState;
    7 M: b/ \: \. q3 {
  22.     }
    $ y! y$ x2 Y/ T6 T! J5 `9 f/ L$ n7 K

  23. & V8 _& W, h- |
  24.     // Выполнение действий на основе текущего состояния. j) X% C5 S0 _& ]
  25.     public void executeState() {. c9 S1 |7 y0 Y2 i+ w
  26.         state.handleState(this);
    / [9 q( y1 c0 I5 Q% p. l; ^7 f4 |
  27.     }
      F) A  ]0 j6 G# y

  28. ; m4 ]8 C" R- @5 G, }8 Q' ]
  29.     // Геттеры и сеттеры! s  ?& v# J9 Y; J0 h" Z$ t1 }
  30.     public String getName() {
    $ R( t# d8 V2 ^8 c2 X; X& |1 d
  31.         return name;
    ! w; k2 ~4 ^8 [, u) s# e
  32.     }
    # j' ]8 C( X) O8 H5 n( ?7 \
  33. + i7 M/ S! T7 S: {
  34.     public double getAttackPower() {
    * u: n% d" U- N6 k- f
  35.         return attackPower;5 I5 u/ O& |7 s
  36.     }+ y1 k( I: b6 j; x

  37. 9 ^. O3 L$ _% _5 K  Y
  38.     public void setAttackPower(double attackPower) {- e  S# X9 ?0 r) m
  39.         this.attackPower = attackPower;8 ~' j/ L, T3 Q! C' w* |- o7 _7 y
  40.     }8 h' ^1 D/ C6 C. M% ], l7 `
  41. }
    3 L$ ~; |+ U5 L7 r1 Q
Скопировать код

. @; \% h7 m! D4 y+ |Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! b+ h1 N! n2 l
' a, [/ n# E, Z/ T! q
  1. // Пакет org.l2jmobius.gameserver.model.battle/ d0 b" O. G* T' S! z
  2. package org.l2jmobius.gameserver.model.battle;
      l: e, C3 g* j# Q8 Q6 @2 s# ^! D

  3. 0 c! I* I9 x# Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ P# `! T) n! s: J) w/ i: `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " x3 a! s3 ^+ C, i
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ) v: B6 x* n6 T% i4 z; q4 z" I( U  y
  7. 1 j2 ^' Y( X1 i2 F$ k3 ?) }
  8. public class BattleSimulation {% R. `) l  m9 Z) w0 L' O1 M  H
  9.     public static void main(String[] args) {
    + ]3 I  z6 I. @$ M" D4 L+ t
  10.         // Создаем монстра с начальной атакой$ h' }) @; k- q  C
  11.         Monster monster = new Monster("Дракон", 100);
    & r- B: g% V: M; }7 |
  12. : r1 g' B8 b0 G! u  s+ v
  13.         // Начальная фаза
    " a! E+ P( Q3 {, O6 P
  14.         monster.executeState();
    9 r1 r- w" N# Z( z! ]* o0 Q+ W
  15. & H8 o  x0 \3 x' j/ v! X
  16.         // Переход в агрессивную фазу
    + v8 J' a% u, G! O# ]+ V
  17.         monster.setState(new AggressiveState());
    4 ?+ W8 g5 f* f" Z% O* s
  18.         monster.executeState();) O* g2 d) R( S- \+ }8 l# Y
  19. 1 c0 [' O* g& q7 b$ A! h  b
  20.         // Финальная фаза' f6 G9 G: t6 ~& |/ O
  21.         monster.setState(new FinalState());' b! W+ u; n8 G" }' K
  22.         monster.executeState();& j! Z! Y2 p; q% N
  23.     }
    3 P0 u7 M5 h5 C' d( W- s  E0 O
  24. }% _/ p0 {, }5 t8 C8 b' b8 L5 Z7 ~2 g
Скопировать код
4 i. u5 R9 M; Z5 c
Комментарии по структуре пакетов и классов:
) b& G0 \1 F5 ]% [  s. ]$ z& T
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 E" s  t# o4 M
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 L% A6 I* \. e) _8 Q4 |5 ^Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) j4 _: G; \% J- e
" v9 B' _% o: n8 Q$ c" V

/ ~; V$ v4 Y( K9 i7 k. |5 h% O2 c3 r% E

) x! ?9 Z' a: p0 W- }+ z
) e# x, K6 R' b/ M1 `1 N: l7 n6 f/ ^  H6 `4 [
! u$ b. V# F% z" R9 t

& f( P9 P; {/ ~( J. ]# P
7 ^, l* }: l5 P& v8 W: I- Z7 V; v$ L4 S* h; E6 h: f0 t6 \
* D0 @, J- W& T5 E& [
5 `  i7 g$ I9 \$ @3 `& u
, w  o7 t; F4 \
, f/ O( ?5 W" m  u8 ?5 ~
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04( s5 p4 i  n9 Q2 |+ ^7 Q, m! c
Для управления сложными взаимодействиями, такими как  ...
5 `! k& O1 N$ F3 D
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
0 T5 K* o! Y1 }2 RОтличный подход! Использование шаблона "Состояние" де ...

5 L5 s% ~  P5 f" MХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.! ]* X* u0 Z2 r- D! R# p6 _, H
3 z% [- f8 o1 ]4 e4 P, G: A
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.( m1 \- b( k( l6 ?
& Q# U! k/ p$ M- J  g
  1. // Пакет org.l2jmobius.gameserver.model.actor+ N& T" h' p7 h) g
  2. package org.l2jmobius.gameserver.model.actor;3 _- \: b' }. V% R% M( N

  3. 3 J8 F8 c$ f. J; @. e4 s- V- F
  4. // Перечисление для типов атак
    # L6 n; f" Z! T1 w1 ^
  5. public enum AttackType {
    9 b9 n  D' M% r) q. }7 `
  6.     PHYSICAL, MAGICAL;
    8 s6 e: D5 x" `& Z6 c
  7. }
    % l+ n0 j6 x. p1 U8 o2 y5 q' X# R! x
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
# J! ~  q" D4 y+ cОбновленный класс для агрессивного состояния монстра:# _( |1 {, q1 o* y
) f4 p# K  }$ i6 e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( ^; S9 {: M& I7 x: x5 g* V
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) j6 p; D9 \9 s
  3. 2 x3 G# q+ T& k1 @7 w4 y* x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 L9 O; Q5 \2 z6 M' W* `
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    1 V3 `+ [9 }' C7 J

  6. 2 I$ l" E5 H5 V6 Q5 [
  7. import java.util.Random;( A2 g8 V& e: j# q$ e
  8. 5 @0 J. A2 a; Z
  9. public class AggressiveState implements MonsterState {' H; N7 W% [% J7 M' Y
  10.     private Random random = new Random();1 ^. F/ q9 F4 l4 N" e1 x+ M5 T

  11. # k3 [- H- Q1 L% i; \% I
  12.     @Override
    . j) u- k9 ~+ s/ ]
  13.     public void handleState(Monster monster) {
    9 O8 L1 x, W) j( ^3 v
  14.         // Выбираем случайный тип атаки: физическая или магическая" Y- t* ~7 f5 i" N8 F
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;6 P5 L  n, d* U7 z7 j
  16. 3 Y4 P: F! G4 V' ]
  17.         // Логика для агрессивной фазы боя
    ! S, z8 x( S/ x9 a8 n+ D
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 5 S: ~/ `  H5 Z& v8 M
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- l( x; |- ^- M& S
  20.         - K4 C9 |" s! N" N# \2 I
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    0 b7 J6 X, E: Z! l3 A! g! J2 m
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ) g% G: P6 e' W& Y9 i% S$ Q
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    3 H$ A8 |/ O. d3 i
  24.     }; ]( C+ X8 ?) i9 G
  25. }
    3 r; G: F/ X# V; ~- A
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
: P3 e/ q1 B3 v3 G" g
# f# _( ?/ \; x
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / [/ x) E: E- a+ A9 Z, I& R
  2. package org.l2jmobius.gameserver.model.actor;: j0 t7 S3 N" W8 P

  3. , w; p( I1 K1 x) S% V% \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 D6 u1 Z; D' m. Y( e( m2 e
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  R( T8 j- ~; c. a2 \' X) Q  o2 w

  6. 5 S5 f7 A# P: \, N+ }. D. p0 z
  7. public class Monster extends Creature {
    ( y" C# d$ V9 y5 R& K# S( _
  8.     private String name;# c# X6 Y4 b1 X7 K  S
  9.     private double attackPower;
    * T, n; F( j7 w" e
  10.     private MonsterState state; // Текущее состояние монстра6 d$ d2 J  m' E. p/ j

  11. : q* r! ^! v9 N& C# V( I
  12.     // Конструктор монстра
    " F$ @; a) _; A; d6 M3 j/ ~4 a. s
  13.     public Monster(String name, double attackPower) {
    ; U' I6 l! @* ]3 e0 B9 d  h
  14.         this.name = name;& B7 l( g3 [7 Y5 v% w, p8 X  o
  15.         this.attackPower = attackPower;; ^3 S/ i- u$ v) P$ i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 h& G9 M/ G1 G$ b
  17.     }
    : E/ p8 p% L- u3 k0 k; S
  18. ! k- W5 }" V) n) s/ h' k5 r. V
  19.     // Метод для смены состояния
    % i# c% X9 _* [5 n9 `, R/ K" A
  20.     public void setState(MonsterState newState) {. a6 _8 n5 E) K* }( X+ Y% t/ N
  21.         this.state = newState;! \# {9 Z2 d4 a) q
  22.     }2 d* o( \/ @% V) A% b
  23. . c7 ]7 A& L2 x- V( U; W
  24.     // Выполнение действий на основе текущего состояния
    5 R3 n% S+ u7 r  e" X' b2 Y
  25.     public void executeState() {/ X" @* p: h& B; U( ~
  26.         state.handleState(this);; {" G" f" b$ e1 V1 V
  27.     }
    0 P) D4 A" A" D4 o
  28. 5 A' t# A& T& w) E
  29.     // Геттеры и сеттеры. \' q- y1 T( u. D& A
  30.     public String getName() {. e) f) g$ c) u* X2 s
  31.         return name;
    - w9 l; C6 G! C5 p
  32.     }
    8 n: N+ ~. j5 \( n  O

  33. ' R# H/ K* O- Z
  34.     public double getAttackPower() {+ q, s& |, q( v
  35.         return attackPower;
    6 {% P& C) j. D% I
  36.     }
    0 }2 }# F3 Q4 ?/ q) c

  37. % A$ B1 n% h$ q1 j% V4 Z" j2 M6 j
  38.     public void setAttackPower(double attackPower) {0 Z$ }/ ]* N  _- u. k
  39.         this.attackPower = attackPower;8 `+ M5 c% z6 B5 W" Q7 m
  40.     }
    8 T! _4 D: H2 d5 c4 M
  41. }6 Q8 H( L4 u2 {! u7 m( {) H
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 V1 n! n: Z+ b: S; w
! Y: v) |  T4 T# l3 t& f* y
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + q: ~6 N& v7 `" P7 ?2 y& B
  2. package org.l2jmobius.gameserver.model.battle;
    ' I/ I) O( T  p4 C
  3. 6 B7 u0 r6 x! \. e% s
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 E5 z4 K6 }9 N  X# n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! n: m7 w% J4 I  l% V

  6. % h9 I" ^# B  L+ D
  7. public class BattleSimulation {
      d9 O, |+ K, h1 h: @3 k
  8.     public static void main(String[] args) {
    ! ^+ Y! X& D6 w$ E
  9.         // Создаем монстра
    + v# A1 j* B: T7 B; @) e2 t
  10.         Monster monster = new Monster("Дракон", 100);5 g9 v, Z+ E' R, l' x7 C3 T* L

  11. + L. q0 m, G0 `
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    , P- R5 a, k/ F: T9 i6 W
  13.         monster.setState(new AggressiveState());
    . S( a. Z1 n4 j, A4 F5 N1 C& r
  14.         monster.executeState();: S: X; p8 n4 y+ }/ X
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак3 P/ u" @% s+ }3 T
  16.     }
    ( B; J+ m2 P; _3 l) P
  17. }$ S3 g5 Z, x7 Y) K
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки." V4 p, c1 m! \% y  L( W) J/ W, i
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!6 a# g* A5 x. c) E9 m8 u0 l) C

- k4 O! V0 e& Y5 B% I
: e( _, Z% b5 S! y% g8 p
  }% S. e$ l& f
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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