Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!& E/ x; ^5 p1 y% d5 k8 X: H1 u

- `& A+ O2 |6 [9 \9 a- Q( j
$ x# o  v! M8 I/ @0 }
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы., Z0 A& [, X  z
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 _/ t2 f, e" s1 ^1 p& \/ ~Астралия ?
: z4 _4 ?8 F  f$ H/ |4 o1 {
% X! x% e( d3 b/ M& a" s2 G% m

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
1 g0 n( s7 Y" i% e0 OВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
% m& K2 y4 \7 i8 o9 M+ b
) \# a. j  Z6 Y" J- w' A
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 # j3 F, |) c0 C  b
AlexCoder опубликовал в 2024-10-16 18:314 T+ a# `: A. _% A1 |% K
День добрый!
/ m2 M$ u8 H6 A; b! ?В статье описано взаимодействие игрока с N ...

/ b5 e2 {1 y) ]% F) q1 v9 I( EДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. ]) E0 j, a  k. `' w7 J" ?" c- |9 _7 h: v4 e# A
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( N. e( e1 K# D) v* J1 G' Q
7 x2 W3 w! l  b* y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( l3 l1 |+ {0 q6 _/ t) p5 s+ d" g# j2 T
  1. <font color="Green">// Пакет для состояний монстра</font>
    ' Y, D( r. Y3 v& [) P
  2. package org.l2jmobius.gameserver.model.actor.state;
    & b0 l! J* p. l7 @. N$ X
  3. <font color="Green">/ f& Z1 q, b9 O/ z" w
  4. // Интерфейс, представляющий состояния монстра</font>8 {" y- r. T3 u# I9 }' m) J
  5. public interface MonsterState {5 r$ k3 T  m( @5 m  K% ?; G
  6.     void handleState(Monster monster);8 P# j$ N  {" A& ^
  7. }8 c  G* m; o1 }- G  x2 r; I
Скопировать код

* h* a2 a8 W5 i5 {, \% ~2 }" L/ F* CШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 T+ W+ K5 p2 ]; M: R, a4 W4 v# r+ u; Z# p, B! W
Класс для начального состояния монстра:
) t6 v* n. C# m! V
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    % ]$ J, w6 @; ^  R
  2. package org.l2jmobius.gameserver.model.actor.state;% k2 e! `$ o/ A  [0 W- I1 `
  3. / l  _( ?2 }  |/ W* D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 d4 N6 o  y' [6 o, t

  5. : z; U: B$ v" d' `/ v. h8 S% D
  6. public class InitialState implements MonsterState {
    3 F- b: V) }1 ~8 g
  7.     @Override
    % A5 }8 A6 b  h/ H' u* K
  8.     public void handleState(Monster monster) {% c% q2 J( ]4 R0 Y% P* M4 L% U! |7 k) I
  9.         // Начальная фаза боя
    + e* g: n" g, _" m9 I  B$ b9 J- Z# I
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 G* y) A8 G( t: E
  11.     }
    & u+ l' \$ v& s, ?1 A$ z, c
  12. }
    2 l9 ?- c0 g+ k$ [5 u
Скопировать код
3 w/ o1 Z& r  O1 d
  i* C5 t$ A% B: V5 u

* I) a3 e2 ~6 c0 {* {
1 p% K4 W+ x5 N: h0 \" |9 q0 z: a. @8 n5 c1 y
7 B( V  e1 b  S  O6 q

: ]# T5 T9 V: O2 s- s
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 ~9 x4 E# I% q- W
6 l3 f5 ^4 H2 K7 F3 G* c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 J7 q8 f  n" E, u6 L; M

- U0 i  \! E4 m# |) |Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 X/ Z) Y5 F" x6 [# f9 a& N5 U* c& Q1 t, {' v: c' U6 _
  1. // Пакет для состояний монстра5 o: ^; q/ ~0 M
  2. package org.l2jmobius.gameserver.model.actor.state;1 H% A5 B& c" L9 y" x# Z$ m

  3. - f; S; R+ g6 L4 ?* V
  4. // Интерфейс, представляющий состояния монстра2 l' ?& I- d7 c* U: T( W
  5. public interface MonsterState {
    ( D5 c+ i, B5 s+ t
  6.     void handleState(Monster monster);' B& A3 |' s6 R7 B7 l
  7. }$ l! q* B" ~* G) F( @
Скопировать код

* ^# T% Q$ @' ^* q: t# DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , V. p1 j& ?4 |
; S$ E" p# ]. K5 H) D. _- i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 K6 `. C% z! ^' o+ e1 r' |1 ^- ]% }2 P6 s8 a
Класс для начального состояния монстра:
; R+ k* M4 O; `# E/ @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) M3 ^/ F& }* n' S
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( [6 D5 D4 v8 I! ?2 C

  3. , _: w/ ~7 p2 U: p( v# L! [+ T
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 Q% r2 i3 c2 s$ T+ V: f

  5. ) R8 ?% f% X' z7 G2 g. w0 E
  6. public class InitialState implements MonsterState {
    1 F) o% W2 V1 a2 t
  7.     @Override# `: e4 V9 H: K9 i9 `# f
  8.     public void handleState(Monster monster) {
    : R2 n0 ^4 I2 {+ t7 e5 t! v
  9.         // Начальная фаза боя, r9 ^( Q* O; O/ D/ [$ N
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& Z' @$ y0 w* z5 J+ y) [
  11.     }
    2 t  X! _; q# z  h. P; A/ ]
  12. }
    8 p! k& l& X& t, V) G9 h
Скопировать код
Класс для агрессивного состояния монстра:
3 p- ~& b, P4 e, j- x& c% E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 e: t' U$ t1 v9 x4 i. n
  2. package org.l2jmobius.gameserver.model.actor.state;1 ?0 `, d- ~  T+ G( d1 Q

  3. # e8 d  n8 u. ^  x# f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ a/ ?$ P) y# g+ _
  5. " r2 t) t" f( U# r0 m& ^4 L, L8 S5 H
  6. public class AggressiveState implements MonsterState {
    ( T9 F: q" q! }$ \, {
  7.     @Override
    * Z& v# K* x6 ~2 J& m
  8.     public void handleState(Monster monster) {5 U0 x8 H9 w/ {, E; N
  9.         // Агрессивная фаза боя
      Q- l" [. e# j7 Y. V
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* K# J$ I/ B- x$ G, {) K
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* S6 V7 g; M  F8 m! i, m& P) |6 ~
  12.     }. L, y6 v; O, z; B
  13. }- \; {. T/ I) M+ p3 i! @/ v
Скопировать код
Класс для финального состояния монстра:4 w2 n7 m+ u0 W) S; m1 _2 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % m% ^# _$ G2 C% C5 u
  2. package org.l2jmobius.gameserver.model.actor.state;9 s. M( @* M7 L. @0 A9 O0 g$ g
  3. + T1 b1 k2 X- y; L5 q' p
  4. import org.l2jmobius.gameserver.model.actor.Monster;- A8 b' M0 b9 G& h5 H. I
  5. 5 J+ p5 N# n& z0 z8 P, b
  6. public class FinalState implements MonsterState {
    ! C) v3 f4 I) H* G
  7.     @Override# y* j" l6 f/ P: _% P' f
  8.     public void handleState(Monster monster) {! {8 O& n/ `" l% z$ T9 t2 X0 h
  9.         // Финальная фаза боя: B/ v- A  q4 S) g  P# V
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 O6 N) s/ g2 o: [, _' q; ~
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% Q8 `* u* X, @$ ~3 X, j
  12.     }" {' k: G7 O4 D% |4 Q
  13. }
    . Z9 Q) F4 ?2 z; A/ n: m9 S
Скопировать код

, L- U1 f1 u  x" A# O+ W- }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.7 c1 N+ }6 g% G+ j+ ~+ O
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 g. o% g8 S9 I  r6 V$ g% q' M
  2. package org.l2jmobius.gameserver.model.actor;: u6 P8 P' F. \8 j, P, x% h

  3. & j- k. c  _) ~  c6 }5 S; i
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" ]+ J. K( J9 ~+ r, g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 B; h6 K! Z5 b5 E& R

  6. - S: d, J5 u3 s
  7. public class Monster extends Creature {: G2 [$ z- R, u: z) {0 i0 F
  8.     private String name;; {8 s5 B2 k: a
  9.     private double attackPower;" h/ s$ M$ x- o
  10.     private MonsterState state; // Текущее состояние монстра- O4 F- c, S5 k* j5 h7 h* b

  11. & i4 S4 z* b9 r' _1 c
  12.     // Конструктор монстра
    ; @5 f$ z; o, {: V- T% R
  13.     public Monster(String name, double attackPower) {) @* P' p/ I0 e2 k+ E+ i; q* m! }2 G
  14.         this.name = name;5 ~- d! |$ E: `2 @  H* W
  15.         this.attackPower = attackPower;5 y3 s+ L0 K: N3 E7 @% @* n& o) q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние% k% V5 X5 b) R+ h: w/ m
  17.     }! H& e: @5 b$ ]# @

  18. & @" \/ d! H8 N3 I
  19.     // Метод для смены состояния
    " i: S% Z% J1 V& }, C
  20.     public void setState(MonsterState newState) {, C2 j* z' o/ \
  21.         this.state = newState;
    ) C+ J; K2 C- P% Y& D
  22.     }9 @+ Y' }# i$ a
  23. ) l: c* H1 a5 j* C5 O: P+ @
  24.     // Выполнение действий на основе текущего состояния
    $ @4 W# K$ k. K1 s1 a2 s; A) d' q
  25.     public void executeState() {
    $ h2 i! g% D  n: x9 t
  26.         state.handleState(this);
    & \# o, v6 s) y$ [/ H4 y
  27.     }/ e# z& W# P) |! P/ `' M. p; ^
  28. # R& t" H* P/ I9 d! s7 ?% |0 W
  29.     // Геттеры и сеттеры& p9 U4 n: ]) j8 S7 i  y8 e
  30.     public String getName() {
    2 M- o$ i( Y$ L2 l6 t" i' R# s( r2 a$ t1 U
  31.         return name;
    ! U6 t7 f% Z! C& t4 H
  32.     }8 `8 d' l! k: B) K: l4 s4 g
  33. ( \, E+ l; ]9 F( i% J) \4 m! O
  34.     public double getAttackPower() {& j! n' E  o% D6 g7 y
  35.         return attackPower;
    9 B9 |5 B* L6 v7 f- o
  36.     }- @% i7 g2 Q- ~
  37. " S( j$ l/ }: d
  38.     public void setAttackPower(double attackPower) {
    3 z+ d* s9 V2 ^& T
  39.         this.attackPower = attackPower;+ ^4 X$ y, _, a4 d/ @4 X( d  v; Z2 t$ y
  40.     }
    1 ^, d- _% P" B1 p4 `2 N
  41. }+ D9 N2 V3 Z+ e* y- T- p' M( _) Y/ E
Скопировать код
0 l0 b# j  H( _9 q" U4 \
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ `2 l+ J3 @' M. g4 D* W

, p: F! F4 S% ?) B( K+ Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    2 y2 `8 f% ]$ J% E! n, ~5 ]) V
  2. package org.l2jmobius.gameserver.model.battle;! ?1 y& ]8 w: F: L

  3. # B8 L7 F2 z" [4 S3 a. m
  4. import org.l2jmobius.gameserver.model.actor.Monster;' \7 C- W5 ^6 A: ]& ^; R' B7 ]) Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" W9 ^# a, {  I2 a. U2 y( W
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ) j$ ]# y! A5 W& u1 z" O* Z

  7. - }/ J7 s5 n" R$ ^! E
  8. public class BattleSimulation {
    7 L* v* h+ ^) t3 v! w: |. Z
  9.     public static void main(String[] args) {
    4 a7 U* \) L9 t# d! W6 @# v
  10.         // Создаем монстра с начальной атакой3 _0 z: C! q, V# L. M- m
  11.         Monster monster = new Monster("Дракон", 100);/ e; F/ H) d9 U: T3 S

  12. ' i% \6 R4 M; f8 f/ U
  13.         // Начальная фаза
    ; ^' U, L2 F- W3 t
  14.         monster.executeState();1 b2 L  W( n+ H6 @
  15. # n: z. P" _; m' y
  16.         // Переход в агрессивную фазу5 f3 o7 d& m- c, @
  17.         monster.setState(new AggressiveState());
    ( d! r7 `3 J2 X+ M+ f2 L* {
  18.         monster.executeState();
    * ?$ A; J+ Q7 a4 v7 f/ X
  19. , k. I/ n, Q7 R# Y
  20.         // Финальная фаза
    6 X' |4 H3 u# N! P) _8 H4 j
  21.         monster.setState(new FinalState());& \- `" T) A4 I( F8 c
  22.         monster.executeState();9 Y- I9 K( C2 Q, M# l+ {# l( Y+ f
  23.     }+ t* h' X' }% {( f
  24. }8 N8 a/ T2 }8 @& E6 ?+ m6 @+ K
Скопировать код
  s: ]8 A8 y! k# e8 L' u9 ^1 D$ I
Комментарии по структуре пакетов и классов:
' }2 F6 U. r1 |6 g/ M  d3 r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ Z, d8 [* D- U* ^+ m9 }
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( S* g  h, H3 E
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! O) I5 l+ j6 e
- c: H1 S) \! F  Z, v# O8 h. }6 F

# R: q) F5 s! r( A: |7 ]
' s" Q/ _  W) d( r' l! c9 l$ [1 N2 T/ o, G4 X9 I* b% ~5 P7 g* r' B

7 T; `# `. G% X; K5 X6 z5 o& j" y- j5 f9 ~0 B, M
/ z8 h* g7 q  W% ~0 q6 V
" v0 U3 r: w) ?% `/ J
1 C" p! Q+ Y% q! j4 {" e! b, J0 i

, n& T0 R* z: O! Q! K1 T- `* |. O# R
" J( X# o& X* `' n- k! n
  _+ n* d2 Y) |0 P6 r8 n* r% ?
( A% J$ n  e7 z( X: d
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
* L1 V9 R+ U8 i) c: g6 g* @1 ~Для управления сложными взаимодействиями, такими как  ...
: Z* E5 s( ~9 F$ S/ S6 K
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21' o6 j* Y! ]0 T0 \
Отличный подход! Использование шаблона "Состояние" де ...

% {% `4 X8 |3 C' }0 |  xХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
: |& l8 [2 p- q3 Y0 M' Y/ K# W: V. O/ N  O* o7 Z/ ^* G
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.  d( w5 @$ H! k3 a2 g$ v

6 T8 T+ l* ?  B9 [$ v
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 ], _/ z4 V7 W% Q; ?  }
  2. package org.l2jmobius.gameserver.model.actor;
    " T5 ~; g4 h* }1 k- G

  3. & d2 s" X; C; R0 Q
  4. // Перечисление для типов атак
    # s: Q1 J4 E+ H: P7 L0 q, w& z
  5. public enum AttackType {
    - Y0 Q* J9 \* F) c5 \! Y' k
  6.     PHYSICAL, MAGICAL;; l  T" U+ g% T9 F+ D5 ]
  7. }( z! @" i& L8 a* G) M7 G
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
0 ~6 A# t3 i5 \% ~: {8 MОбновленный класс для агрессивного состояния монстра:
: b! Y# x, f5 \
% l3 Z( P: x2 e1 q0 g% \8 V' S
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! _* b4 I3 W) I( {
  2. package org.l2jmobius.gameserver.model.actor.state;  L/ y. G) Q' Q) q! i
  3. ! V) q: G+ d6 M  _( C  S) C' P- i! X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 c0 f$ f- ?3 H. z6 B
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    / g$ l8 _( W* W; Q) v

  6. 8 T* v' G0 D2 Q7 B0 N3 V) N
  7. import java.util.Random;
    8 W( }! s( q+ u# ^9 ^6 k
  8. , [8 V9 j+ k7 [& k7 \
  9. public class AggressiveState implements MonsterState {7 X( n$ j: M9 ^
  10.     private Random random = new Random();- b# Z% y. Y! w% |+ J

  11. 6 g0 U: F6 K5 f! [% v
  12.     @Override
    ' d6 T7 h; b; o  j4 T% _3 @, h# \
  13.     public void handleState(Monster monster) {7 e2 U6 k+ k' M
  14.         // Выбираем случайный тип атаки: физическая или магическая8 |& ^% {4 z3 _5 p+ A# `3 d
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 S2 y$ x" j2 l, k
  16. ) B" m: |# D5 j' s- M1 @3 ]
  17.         // Логика для агрессивной фазы боя- c" E8 p: k4 J! v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " % M" v+ K2 r7 ]6 e! ]
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    7 L/ k% M/ v( x$ |- a0 J- o4 p
  20.         0 V0 y; M- w2 n& Q2 T, e* C; T, `" }
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    $ y2 D6 O, ?; u- ~
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    & s& ~) U( ?9 v" `9 T- w
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);3 p* Q- \3 k+ y5 w' b
  24.     }
    / \8 ]9 ~# W. l! t% x8 `! H* E
  25. }& G2 H. J1 k( }) c0 S
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
$ z$ y3 \! `  t+ }8 N# B9 |/ o  ?+ Y* G
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' _  m$ X* [+ s- Y7 t
  2. package org.l2jmobius.gameserver.model.actor;2 Q& b4 {( O& h9 u8 H1 T( H
  3. # h1 m- ~* J- T% n! H+ j- S
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : D% }, b3 c3 n/ l" y' @1 w1 \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ m2 A  z2 I% @6 X5 L/ P
  6. 9 ~/ q0 L2 S+ v7 v
  7. public class Monster extends Creature {
    6 i, D, e/ g6 r6 l' e! e
  8.     private String name;
    2 z" j1 V: r% S1 `% k) P6 }
  9.     private double attackPower;8 l- t8 q4 `  Z) _" s2 R
  10.     private MonsterState state; // Текущее состояние монстра
    ) m4 C5 k& [2 s5 x& k$ H* }0 \

  11. 4 x3 c9 `: z+ }; K/ e% ~
  12.     // Конструктор монстра
    ! H+ |- R+ s% ^. |  `( h3 _8 V
  13.     public Monster(String name, double attackPower) {
    , F1 M5 q. q7 i' `6 `; T! w$ b
  14.         this.name = name;# w$ z" N3 T& @( O/ [
  15.         this.attackPower = attackPower;
    5 a3 f; v0 @6 V' \0 T
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию$ C2 q- P; L& ?2 S. _. q
  17.     }% _$ t; [" b9 K+ Q2 }/ g3 t6 @( r

  18. : v0 D0 z/ V: t1 ], X- H4 C( Q
  19.     // Метод для смены состояния
    4 F0 B6 M; a! i6 C6 _' _
  20.     public void setState(MonsterState newState) {
    - h) [( U$ w# ]# a
  21.         this.state = newState;
    2 P) P0 `! A, u) S
  22.     }" C/ ]6 m# [7 ]4 {) M
  23. 2 u3 j" a( n6 m4 ~* z
  24.     // Выполнение действий на основе текущего состояния
    1 J( J( C/ |( j1 O7 t2 J$ x
  25.     public void executeState() {
      T5 `( ^. i  l0 u
  26.         state.handleState(this);
    ; o  W3 Y2 b2 X' n" g+ k/ W2 G" P
  27.     }: a: k% Y; p. F  W
  28. 9 M' e( |  R: N+ N. N0 L/ }6 c4 W9 ~
  29.     // Геттеры и сеттеры
    6 O4 i7 [' v7 i7 S0 `
  30.     public String getName() {
    ; J0 J0 Q" d; e1 J
  31.         return name;; ^! I4 c6 [2 r4 ^) n) l
  32.     }) C# o5 J6 E! c4 a% K# U

  33. : E1 c/ U' C* M, X* _
  34.     public double getAttackPower() {( [: p4 q4 k8 R) P6 F
  35.         return attackPower;  }9 k8 A5 {# E" @" ?9 s
  36.     }6 ^. ~9 u0 Q$ O; |; {. G- n! h

  37. , Q- `$ L1 I, ~
  38.     public void setAttackPower(double attackPower) {
    7 K* g! k: h) q3 ?4 r" T
  39.         this.attackPower = attackPower;
    " y& T1 E6 |0 e  V' v3 Y6 N
  40.     }; ?& q1 U: o+ b( ^& }, q
  41. }
    " V& T' ~; R: Q1 k1 [+ }
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
, w( o; D4 m; ^! q& j. [+ x3 V) G: e0 V; C; k
  1. // Пакет org.l2jmobius.gameserver.model.battle3 s2 C: P/ O8 z4 _: k
  2. package org.l2jmobius.gameserver.model.battle;. ^7 w6 k  I; d* |! L% U
  3. . M0 y. {7 p% |. x6 }, a0 ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 C9 C; |: Y+ m6 I% @
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . X8 ?  Q# N, P: c
  6. 3 g2 _: U8 o, O9 D: h* _
  7. public class BattleSimulation {
    6 W* y! E$ J) C% o+ ?; ]7 V$ Y
  8.     public static void main(String[] args) {' x# ^# b3 G" q  e7 J) ^# D& y
  9.         // Создаем монстра8 X& H8 e+ V% F
  10.         Monster monster = new Monster("Дракон", 100);0 i( M- P" F) L& H
  11. % x3 c" m0 J* O. o5 A! x7 C  b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    , E( l% _4 s' e" k6 Q
  13.         monster.setState(new AggressiveState());
    ) f9 v% H7 ~. u! w/ V1 a
  14.         monster.executeState();
    * N( }, p2 @+ \( O; g6 |* k4 q; p
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 J1 ?5 S1 z6 I( g
  16.     }% o2 J4 b  H7 H8 C
  17. }
    ) h& S5 h! K( r* r& `7 Z: U
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.+ ]" ?* u1 v6 `0 k9 e3 v7 a
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!" e1 r' W" G4 d/ l$ y1 e% p! h$ _
' p3 B" s6 E4 J8 k* o' m7 \
& a7 ?7 a! L; A1 |

% c# v0 |5 m0 x" {
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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