Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
) P1 W% R& B- `8 `7 ?+ x8 K8 t3 Z3 @1 q( y+ S

3 N$ }+ M2 M/ n" I6 u$ VЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
2 H3 P  |* c+ ~7 V* U" o) E# ]Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!) V8 \) B, i- [
Астралия ?
1 j7 B" J% ~4 q: A- E7 `- v6 p! |( l) i

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
; C) O& p- |8 l* n5 UВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
% H8 U4 p; Q9 Z$ I" m7 e7 x$ K" o0 t/ U4 `* O- g1 r% \0 E( t3 w
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ' V4 O0 U) S7 B3 P% z2 |9 u
AlexCoder опубликовал в 2024-10-16 18:31
6 e; k4 Z2 j4 @  Q2 S6 w, CДень добрый!# i# ]$ E5 \$ f7 l: R( N4 K0 E5 ~
В статье описано взаимодействие игрока с N ...
$ |$ w3 G7 \. I- B! w: d- Q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . ]  W: ]' C1 T# d& B! H5 @9 ~9 N. {
& L9 y3 R% z' u: H# Q4 k
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.& {' W$ Q) Q' _5 a, W3 ^0 Y+ X; k

4 I' j% {2 s/ [# nШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ q, T) F* x9 _) W3 C" w% S
0 H! W; N( G/ x' I1 m
  1. <font color="Green">// Пакет для состояний монстра</font>
    + Z# C8 @( T6 F# g* P
  2. package org.l2jmobius.gameserver.model.actor.state;
    / O( d: b: N5 K
  3. <font color="Green">) S4 v$ N& o; r6 U
  4. // Интерфейс, представляющий состояния монстра</font>
    + j% l0 c$ ~2 ]8 ?
  5. public interface MonsterState {
    / Q) T( s& H) v: r4 p( v* P; I4 N' J
  6.     void handleState(Monster monster);& N+ O9 k& m4 P$ ?
  7. }7 M2 Y. Q" s! p# Y; E( D
Скопировать код
) Q, {* ]$ x* S# ]/ Q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.7 S7 s7 @5 j$ B! i0 t; s3 G

4 Q* ]+ c3 F' H" E5 s% c/ iКласс для начального состояния монстра:; {* f2 \/ `. {1 X; D7 v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>& f1 _# K  Y3 A! Z3 d/ J
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( M$ T7 Z7 q* S
  3. ; p! ^( {6 a! z0 ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 [" e! u8 H3 X* l( _, ?
  5. - ~+ I  W, _6 J0 @, F
  6. public class InitialState implements MonsterState {3 W/ I. Y3 H2 Y# i
  7.     @Override; z1 B$ O! R6 O  A" R6 ?. d
  8.     public void handleState(Monster monster) {, }. _- F5 c5 F7 X6 i9 _
  9.         // Начальная фаза боя
    , J2 F( G; E) g: W2 M- b
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ! l* V3 e: S# @. I  w( q& k9 p
  11.     }
    9 p0 T+ U6 G$ O3 K& o
  12. }
    / {1 C& P  ]. _$ a( U5 k$ a
Скопировать код

( w) `2 W2 e; V5 b* D; c8 C! T) ?2 k
! g+ R0 o& f* y. K! G& F

2 D- Y, z: q( |! _! R1 N- S0 d0 [: q( l; f0 b: P  H
$ N0 x" `, g7 a4 i6 `

& w) O) _  v/ r( w7 n* T
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). + ~: T1 q! l1 m' Y; P- {
; L7 a  ~7 q2 ~3 k. O" e9 B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- V9 ^( H! B/ }2 a0 L$ Q+ Z
9 ^' I9 d( i2 W- ^Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ u& U; J/ o1 }7 B

6 o  f( l* N4 }
  1. // Пакет для состояний монстра! k3 {# r+ g2 l$ u  p3 {
  2. package org.l2jmobius.gameserver.model.actor.state;
    / h* E5 B0 s0 b0 i5 D7 x  {+ a7 ^

  3. , l) l" ?) E- O& m9 j. h
  4. // Интерфейс, представляющий состояния монстра, X# K4 R) h. z: r. P) w  `/ @+ G
  5. public interface MonsterState {& b4 l2 n" B" F  ~/ z& g# S* Y
  6.     void handleState(Monster monster);
    & Q/ s- [+ X8 Q9 @. A
  7. }
    2 \6 U& b1 n+ v1 {7 |- G  p; c
Скопировать код

+ F% j' p1 U$ _* I& nШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ) k% K, i; k6 `

5 e: r, ]: c, Z, K" W  Z" GЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 X# ~: i. b6 E5 e& }
& m1 |, ~, f% i( K: NКласс для начального состояния монстра:+ c3 J% I4 J' z* b( @( ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ I+ h6 L( p/ j/ r. T
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 \& D) [! `9 p) \( \. x

  3. ) \7 }/ k, B9 `& ?# G: O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) d! ]5 x( F" T$ l; O% f1 R

  5. . B9 ]3 ~+ c. I5 S
  6. public class InitialState implements MonsterState {5 K' \: s8 E9 Z. b5 P
  7.     @Override
    ) o7 b; I. Y# j1 X' v5 I
  8.     public void handleState(Monster monster) {2 C9 g& i/ A) ~) ^
  9.         // Начальная фаза боя, k1 R3 |; L& s- G4 h1 r; }
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ H8 n: P3 ?' m
  11.     }2 x: g6 y6 _6 |- t
  12. }# O5 g( D# k# A
Скопировать код
Класс для агрессивного состояния монстра:
) k8 L3 ]6 J3 v, D9 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 N7 d- {7 q+ i- D7 D+ D: k; u
  2. package org.l2jmobius.gameserver.model.actor.state;! G: W1 A% E5 r) ~' D8 A4 p
  3. ' Q( E" P) `4 Y$ S/ L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 c4 B2 S- x- ~$ S4 B2 d

  5. . Z8 q1 ~' Z0 |7 h0 c& Y
  6. public class AggressiveState implements MonsterState {. X0 m" i6 V- R" C
  7.     @Override6 X" M# Y2 O' t8 F7 q; [  h
  8.     public void handleState(Monster monster) {
    ' P  v& G, c/ ~/ s0 f: g7 K
  9.         // Агрессивная фаза боя+ S" M' Q( j; r: p& a/ G4 R
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 ^% J* H7 G* _) r2 P6 K) r4 I
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    2 C3 p; ]% z+ l
  12.     }9 S- k( h8 Z2 `" O, N: n
  13. }- x$ V# S+ s1 G* c, p+ [( H* G1 [" I
Скопировать код
Класс для финального состояния монстра:
& v/ c4 }$ c. N7 F9 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % H) H5 K0 L! u3 j, |: S
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ O( X9 o% V" N7 {: ~$ B

  3. 3 ^# p% ~* j7 K$ S. }
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 u8 y& y- R$ i9 T$ J9 |

  5.   |7 v( k3 A9 I0 l+ g
  6. public class FinalState implements MonsterState {
    : B" V% g& a0 Q
  7.     @Override" x  u  S/ t$ k/ e+ b
  8.     public void handleState(Monster monster) {9 l- @* u  K5 f  a& F* t
  9.         // Финальная фаза боя9 G: F" Y6 V+ U! A" U/ k
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");# A7 L0 q0 {( q& {" [0 C& R, K
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки2 @. N  l# W( e9 v, j, J
  12.     }
    & q" G) Z6 d3 F) [) F6 {
  13. }; T8 h. X5 Y) _# {1 O7 Y
Скопировать код

5 t+ X& k# m! X2 R, I; YШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: B4 g) a$ e' s- l2 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 L, N+ T7 _$ |9 b8 K
  2. package org.l2jmobius.gameserver.model.actor;# y" ~2 r  i; M7 b$ w
  3. & ?& t8 g7 ~1 D' s
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ A) I; T! W1 n2 |# s- n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
      p$ i$ W: X5 Y, c6 B: V+ m
  6. 7 j8 ~3 g1 L2 f; [2 z
  7. public class Monster extends Creature {& w5 P4 @1 ^! J  n  L1 H/ n1 K1 q
  8.     private String name;
    % `$ l) Z0 x" M( Q
  9.     private double attackPower;$ H& i8 P5 D* A6 l) P
  10.     private MonsterState state; // Текущее состояние монстра; Z0 H% Q: b4 u# I4 F# b# O- M

  11. , ~. Y! X- k0 g; t- c6 A: \
  12.     // Конструктор монстра
    , r. L) e) D2 W9 x. }  s3 s3 U
  13.     public Monster(String name, double attackPower) {
    9 h* E- l3 K: O+ E
  14.         this.name = name;
    2 i! g6 A& I5 c6 B$ C7 ]. y
  15.         this.attackPower = attackPower;
    & h, B& P  c8 a8 l
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние7 ~3 P' T9 n0 w3 |
  17.     }: W; A4 T$ m* M' G  j% ]( J- P
  18. 7 O$ E, K! `" x
  19.     // Метод для смены состояния
    4 u% C  n- k/ ^. x6 K' J( D( W; j
  20.     public void setState(MonsterState newState) {" b9 G0 O: z: r7 _0 g& t
  21.         this.state = newState;
    ) |4 D! k7 g$ j3 ?( G
  22.     }; I" V/ l4 S& h

  23. + M& |  |* O1 }3 H
  24.     // Выполнение действий на основе текущего состояния" j# `$ L! ?5 T
  25.     public void executeState() {: M' z, G' S  i/ x% h
  26.         state.handleState(this);, G" b, N- e# M
  27.     }: O9 F3 _% D( X- T
  28. % [: l$ @. Y: ?! _
  29.     // Геттеры и сеттеры3 U1 I  m  `6 `  x+ Z' q9 c
  30.     public String getName() {  b6 e9 x1 g$ x
  31.         return name;
      K6 }; v& p: y
  32.     }
    9 Q8 I/ d; L  X1 h

  33. 7 z2 ^2 x! V; W0 p
  34.     public double getAttackPower() {$ Q5 w* @* k% d0 O
  35.         return attackPower;
    , n7 X1 v, {/ V) r
  36.     }
    ! E  S* A8 e. {2 Z" h
  37. % u  K4 L0 N3 T  ?9 X
  38.     public void setAttackPower(double attackPower) {
    0 e9 W1 G9 h) C  e' F, @
  39.         this.attackPower = attackPower;
    * C( ^5 z4 D& r8 r
  40.     }! _+ k8 D) b$ H+ ]8 W! ]& n' S7 E5 v
  41. }# L, o% D; @& C( {' R8 z
Скопировать код

2 v# e3 o' P# K/ x( o7 YШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.; d: b9 d; m5 j7 f

# }/ i% }4 h% n5 I
  1. // Пакет org.l2jmobius.gameserver.model.battle
    . y8 {7 B! F1 |% b" T& k% v0 y
  2. package org.l2jmobius.gameserver.model.battle;4 B2 P8 [! W- J! W; a* T

  3. - K) c% X9 z' O- b$ ^& n5 r
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 I' M4 y8 G( ^0 b- p% q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ b4 a* X! j, A0 L6 o) q% b% C5 H
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
      p. Q5 q+ l9 F7 I. w$ N
  7. $ b$ |6 i( @: ~! n7 h- H
  8. public class BattleSimulation {
    - e9 S) x9 ~; p5 D' z! r9 `: \
  9.     public static void main(String[] args) {
    " C3 {/ ]% P. f$ V4 T5 J
  10.         // Создаем монстра с начальной атакой
    $ Z1 v+ e! `1 r0 ^3 ]1 D
  11.         Monster monster = new Monster("Дракон", 100);& W* a# O0 K$ O7 `' [1 w- E: Z

  12. ; J. B, w5 O3 K3 [2 D9 p- A! N
  13.         // Начальная фаза) G$ @+ n# C6 s" g# Y
  14.         monster.executeState();
    5 ?1 s4 z5 y) L. @2 `

  15. ' D/ b. M' k8 r! u/ t& {4 j8 o
  16.         // Переход в агрессивную фазу7 y) F9 }$ k7 \* N& k( ]. p, @4 }
  17.         monster.setState(new AggressiveState());
    ' f( D9 |8 W0 w+ s5 y* T+ [0 J
  18.         monster.executeState();5 j" J7 \9 e6 J. t  a8 k# ~

  19. * P' i# Q" h  u/ F6 X1 B& T6 M
  20.         // Финальная фаза$ @+ |* ^) B/ x  s  H% U" u
  21.         monster.setState(new FinalState());
    6 e' X1 p- |0 M5 J5 ~
  22.         monster.executeState();- x7 N5 Q& @( w# p  J1 F  A
  23.     }
    8 X% Y) G9 w9 |. U
  24. }
    9 i) M) P( g7 G8 k4 N) j  _2 S
Скопировать код
8 C; g# p4 \; ]6 q4 O
Комментарии по структуре пакетов и классов:& b& j+ o; V7 Z& \6 ^+ J
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ; ]( O1 r  h6 `5 I: w3 x5 H4 i+ h+ c5 h
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( P) h4 z) P' o" H4 k6 j1 S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* x% X' p0 [& N) w2 I% M' ^( x' L

4 l( R& J) `' F8 r0 L% K
( G' T4 s2 N6 T* f' X  g" K9 u/ R4 R) K- P2 y0 Y# K

: G1 D# L& e! }9 U# H5 h" J& Z6 n' n7 h) c! `7 E$ g

* o: K8 I' m" A' ?1 h8 A! q
$ K0 c1 D; c) l) Z
# Q8 i, b! b4 }0 D- z5 U: a5 b6 b
  e1 f6 H% r% n3 E0 Q
4 w* \9 i' M' V0 g3 R  l9 ^. F5 d/ ~/ e6 ~

8 [  H& p7 e/ g- p9 a2 I% O3 W9 B1 j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 o/ x2 F! Q/ YДля управления сложными взаимодействиями, такими как  ...
2 X" [/ t) c/ M8 v6 {: ^
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
8 e0 c* |. g+ f7 KОтличный подход! Использование шаблона "Состояние" де ...

2 Q5 m5 t* c" E- m% F: sХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.( [1 d* s! `9 s9 X) d/ E# m
9 u/ j: y. _0 z  m6 M7 v& t1 s: R
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.! S5 S* }& \: f
) D! e7 v2 F: ^) t# }$ M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! j1 |5 x: k; @, J' P) V+ _7 M. _
  2. package org.l2jmobius.gameserver.model.actor;
    + n: G+ R3 p; s
  3. # `2 u0 X" _) p# g3 `
  4. // Перечисление для типов атак$ c3 W+ K+ _/ [5 K
  5. public enum AttackType {
    6 t& ^$ h9 Y) Y% b+ Y  U$ G% L1 `
  6.     PHYSICAL, MAGICAL;& f0 H8 D. M% ?# l1 N0 d7 l
  7. }* A( B$ X2 ]/ [) ~) E/ |/ @
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
* _4 h2 H/ y, u1 x2 G/ mОбновленный класс для агрессивного состояния монстра:; K6 s0 }: A- L% s& J# _3 R  d
4 _5 J; o4 [6 P" D( V0 f3 C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) M' d; u4 `: \4 R! ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ V& G9 g; x, F& R- ]8 d: x( G
  3. * ^3 k# k8 e: f3 O3 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 c3 ?- B; _- z' Z7 s5 ?7 D
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    - N6 z' J5 b5 a* y
  6. 4 w4 s: b- o6 ?- k$ f) c: W
  7. import java.util.Random;1 y+ A) w- F4 d% A6 z' N

  8. 9 H( u, I. j( ]+ Q* T
  9. public class AggressiveState implements MonsterState {0 H; \; u6 u$ `1 t
  10.     private Random random = new Random();6 t3 G# r: ?8 J( T: }& L

  11. 0 {% _& o3 E' d* d% n; X' L) V
  12.     @Override. \( K* m# g7 p
  13.     public void handleState(Monster monster) {
    2 f" O+ F+ A3 l# E! H
  14.         // Выбираем случайный тип атаки: физическая или магическая- R: H7 ?7 o8 N4 X; T; Q
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;5 P" W9 J4 p7 |) O

  16. + x! l' Z: M1 a% J* \
  17.         // Логика для агрессивной фазы боя
    ' K  C) O, |/ B$ P
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " $ V1 {. m) t  i! b, M# o
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");1 \, k6 |0 W, s& G9 g+ }
  20.         
    4 Q4 |" N, z: G, C/ |$ S' b$ e
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    1 N; \3 ]( P* p* [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    4 [2 {) F7 ?: ~) k' j; f. q: G1 j$ p! W
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    & K$ A& ]! q1 H. v5 m
  24.     }
    9 W* S" V  x" O2 C
  25. }1 c- i& l3 K7 D) B. B  A- {6 V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
7 `, j, N3 g1 I0 A  x4 n8 X7 ?- p3 Y0 l: w5 p8 l, A( d6 G) n# R8 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - A# p; v4 u9 \
  2. package org.l2jmobius.gameserver.model.actor;4 j1 {9 L/ z! z3 Q% ^- ?1 R" @

  3. % K! h& }3 w) d
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . H( e$ ]$ |  H3 R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! R+ n! B9 i5 \4 P/ D. T1 ^
  6. ; j; |* v" H# h$ O# I1 ~
  7. public class Monster extends Creature {" ?3 Q, F& q. T5 p" ?
  8.     private String name;
    % W9 P- s0 {6 n  S
  9.     private double attackPower;6 K- v3 X9 W) \5 `; o
  10.     private MonsterState state; // Текущее состояние монстра* o7 _- e7 H! r1 ^& ^3 c% `5 @

  11. $ j; R; \+ Q2 w; Q; h  D$ q; L( L
  12.     // Конструктор монстра
    8 K8 n6 y+ X7 V5 n
  13.     public Monster(String name, double attackPower) {
    0 E" b; F0 d. J( N+ U
  14.         this.name = name;0 N3 _' q3 |( }, \7 i
  15.         this.attackPower = attackPower;
      p/ C4 q( E, B, _) v9 t
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию% c. M$ x/ G. h8 j
  17.     }
    . C4 z! @9 I8 b7 I' b

  18. 1 z: X4 u0 u+ S
  19.     // Метод для смены состояния. e% f7 q. I0 n1 W7 w9 W
  20.     public void setState(MonsterState newState) {! {7 h# {: ^- a! g! S- h' s2 f
  21.         this.state = newState;
    ) ?# }4 J) ]7 V& b( d# N( N
  22.     }
    . H+ L$ c7 P8 p

  23. % i) j2 g* h, K; y
  24.     // Выполнение действий на основе текущего состояния* N! j* I4 Z% c5 P. Y6 G! g
  25.     public void executeState() {
    - o4 A; z* w- S" G/ D1 p
  26.         state.handleState(this);7 \& Y- ~' ?- _2 j& u
  27.     }
    4 j: q9 y0 b- j
  28. ; G- A% l, I3 A# S( x* O
  29.     // Геттеры и сеттеры
    , b7 B! O" Z! b3 S) s2 w
  30.     public String getName() {
    ) j" ^/ \9 C, ~9 J0 L% r
  31.         return name;' G; L. A" u2 c* c: b
  32.     }
    1 z+ d; K- a5 J: S8 ^! ~
  33. , x7 Z: W4 ?/ E5 U( }
  34.     public double getAttackPower() {! f1 C, D' T- J/ N2 p& C
  35.         return attackPower;
    1 J* e% y; P* L) t7 r
  36.     }
    ) ~5 f$ d! E7 k
  37. - h6 h8 D! F# k! A  e5 N) c
  38.     public void setAttackPower(double attackPower) {
    1 W+ `8 Z, N  H. D/ W% W2 _
  39.         this.attackPower = attackPower;# b+ Y- k3 o) d0 g1 e
  40.     }
    % Y5 i8 k0 S- u, U' U
  41. }6 W" j) t: n3 r  [) X
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
, a8 ^! \, w3 Y" K% _
$ `) F6 w2 a7 \$ C6 ~1 `; M
  1. // Пакет org.l2jmobius.gameserver.model.battle# p. v6 G5 c) p1 Z0 V, d$ \$ [
  2. package org.l2jmobius.gameserver.model.battle;
    / q# J$ Q* F" t, E' }1 z
  3. + p& J6 s/ w$ v& B3 }0 j' [( P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 z5 m, R* m1 \# g7 a4 N
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , O4 A2 ]( ]3 L& L1 R/ L5 Y
  6. - q+ X* W* x4 C5 ?6 |
  7. public class BattleSimulation {9 s) [9 ]9 Z7 X; t  r2 Z
  8.     public static void main(String[] args) {
    ; ?" U, j# z. {% `* t& N
  9.         // Создаем монстра
    $ \: m7 @# x$ R9 e( u5 s% H% t1 Z( p
  10.         Monster monster = new Monster("Дракон", 100);
    + a2 B4 M% A6 o8 ], ?

  11. " _5 d% P" q' T6 }4 S, L
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак1 X$ F8 B) A" l0 `
  13.         monster.setState(new AggressiveState());
    0 u' T) v$ z2 a2 I" y& J# A. I
  14.         monster.executeState();" K  z$ T3 m  j6 \( x" T4 t
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
      f/ T7 R3 P2 }
  16.     }" T$ P7 W9 d9 H( U# Y2 Q" ~
  17. }
    ; h7 E) n2 A' B$ ?
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.; P6 K$ B3 M& t# j4 |, ^7 o, Q3 P
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!3 ^* Q# F" g3 L! ?3 ]3 c7 m
& u2 F+ W% H) G7 b  x6 b& L4 K

5 O/ o  r) G! ^' J; u) B  M8 M, i. Q( I: z8 s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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