Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
, x1 X0 f* H& @  n$ d
/ O0 J. C( |3 C: H/ ?& g5 d
) P  s* |2 L8 ~& `6 g
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ Q: A' g* E+ v7 [Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!6 E) [4 h6 p! E2 g& a. Q2 }' k2 I! @
Астралия ?9 o( E7 s, Y+ q# m! _
! I6 Q) R' c! G5 P

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!  U, P( h# h8 u' W
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
: |% c" F0 \7 h3 J( @/ h" k, u
* y. X  y) W$ W) G
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 # [9 C( ~- L# u! }
AlexCoder опубликовал в 2024-10-16 18:31
/ l/ P& L4 O4 Z( L# s' ]День добрый!
& S7 G2 C+ \+ d0 C/ {' T4 Q& X8 U8 lВ статье описано взаимодействие игрока с N ...

/ r% n& s# W! L' C5 e9 mДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 V9 x: P/ r" ?/ V0 f) Z1 L! [0 v5 H2 U& P, X/ O, J
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
8 b. [6 l9 f$ A$ z
* M1 n% ?0 T  g& a5 oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
+ s* }3 U- D  f7 d; t8 R$ }4 ?" o8 G. N% y! D! i$ h  W
  1. <font color="Green">// Пакет для состояний монстра</font>3 T5 d! m% s5 R4 @7 R
  2. package org.l2jmobius.gameserver.model.actor.state;
      T+ ^+ g! H# c$ T% Q7 e
  3. <font color="Green">. N) u% U2 Y# v; U1 S2 x
  4. // Интерфейс, представляющий состояния монстра</font>
    - M" v0 v; H* p8 }
  5. public interface MonsterState {
    $ U" N  I9 b0 }- k
  6.     void handleState(Monster monster);
    $ e$ j6 D4 Y- c$ b0 Q2 G5 c
  7. }& M4 V( g( T& k) _0 R( [
Скопировать код
7 _' q3 C! T. c2 y4 u
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.7 @! h2 H" i! t, [+ R6 J' T

) ]( w" `+ o0 l) EКласс для начального состояния монстра:
. Z' s( D2 c  u& \6 N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>5 z1 {  w7 V& Z( w, x0 K8 d, J: C
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 y6 |8 t- g2 a$ M
  3. : v9 U& y0 W, c4 _8 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;! u/ C/ O* t: O3 j; k' Y

  5. ! i' c& x0 X$ F* U; m
  6. public class InitialState implements MonsterState {$ s0 d- P, \+ r
  7.     @Override
    & l( r  Y: I, d& a. ^1 T$ I3 c
  8.     public void handleState(Monster monster) {. R1 D( a7 Y% T8 |, i' M( f8 B0 ^
  9.         // Начальная фаза боя9 B, ~; `0 Z* j: _0 V9 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # L9 b5 F% O! {! U' N- H7 m% S
  11.     }3 c& C5 V1 m+ H7 X. K: e/ z
  12. }* [- {" ~3 {7 L' \
Скопировать код
: p* T  m7 f0 |

. V& Y1 _7 X" M# ~8 `) b  m$ d- s# O
" P5 H; x1 M9 T1 ]) e5 d3 J

2 m# g# y, Y: G
* }% s$ H; C" V0 t+ i9 l+ f# R6 o3 C2 @' d7 z) _
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / J8 `5 I, ~* W8 x6 n( s' d
; _3 |0 f4 Z/ x4 P/ E+ B0 V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ w! p2 v& A; ^) c1 Q9 ^* |0 K0 C/ k, R7 J) {# ^
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: |4 {0 Y+ [1 S
4 I. I# m6 ]. K/ L1 D3 h+ T
  1. // Пакет для состояний монстра, f* o3 u& _+ E9 U9 ?* G
  2. package org.l2jmobius.gameserver.model.actor.state;/ E0 ^# G( z( H# Z7 q+ U

  3. 7 @. a! M' X0 m9 J
  4. // Интерфейс, представляющий состояния монстра6 U/ ?4 C3 U) ]/ q2 M& B  Q
  5. public interface MonsterState {
    ; I! }0 ?8 A% O. y
  6.     void handleState(Monster monster);" S# T6 A9 S( o( `
  7. }% u  L& R+ ~* B$ w5 g2 q, }
Скопировать код

! ]8 N: F3 x% Q# |5 f7 ^& g3 ~7 \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 6 n& M; |& A) T5 y

' ?2 j7 P) \; F$ {Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' J3 B& ~/ F# x/ r8 p; ?2 h1 s
3 p. h- {2 O4 o' l9 X$ VКласс для начального состояния монстра:
, c; E3 c" }& W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ b; u7 E3 }: K" X% R  O0 G
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 L/ g% Q; M8 l$ p  o$ t
  3. 3 h6 L- e/ N( v- L
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 G0 s8 N6 {% _
  5. 0 o+ V( M2 T; l! z4 \9 y6 Q
  6. public class InitialState implements MonsterState {
    / W! V/ M, s5 i* p( H- i3 w
  7.     @Override
    5 K, J) B: S" Z$ `) V
  8.     public void handleState(Monster monster) {+ T5 i; a; W  K
  9.         // Начальная фаза боя
    ) V, q6 L4 n0 p" u4 N6 r0 ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 J0 M2 ]  N- d: ^( E7 Z8 S8 b
  11.     }
    / n3 ?; }7 ?4 b8 h1 I% j
  12. }, ?. u% X6 F! a! J
Скопировать код
Класс для агрессивного состояния монстра:
8 h7 s; J4 b/ ^* p! `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # |# R( c+ z1 A
  2. package org.l2jmobius.gameserver.model.actor.state;
    * u6 M+ P+ Y( c/ V3 U& ?! |

  3. # g- a( T% i: K! i0 y3 S
  4. import org.l2jmobius.gameserver.model.actor.Monster;  T6 _1 ]" F$ k0 N; t! U' R
  5. 4 B: a( v) p  G  p  @* L7 C
  6. public class AggressiveState implements MonsterState {
    ; n: M$ t# [; O" Z) B! Y
  7.     @Override
    3 L3 D2 \1 a5 T- \; @
  8.     public void handleState(Monster monster) {) q1 Z/ |0 J4 L& p' R! w1 j
  9.         // Агрессивная фаза боя7 b8 m% V3 {- E8 ^
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    0 C2 V+ B; Q+ u7 D& E1 O3 Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    " n0 k5 L7 d+ b
  12.     }
    . K7 D5 z1 _0 O1 Y) X$ o
  13. }( H$ \8 Z. _* j& ^) y; H2 `
Скопировать код
Класс для финального состояния монстра:
$ o0 N( h) H3 I  r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 U: I1 |- v' x
  2. package org.l2jmobius.gameserver.model.actor.state;7 n# Q* D1 e7 c- j# A

  3. 7 h0 {6 ^5 l& w% u! _% I1 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ Z: }5 w$ f" |( i! ?$ L3 X

  5. 6 t/ M* K. U  v3 G, N( p& v
  6. public class FinalState implements MonsterState {8 X) h7 ], p/ k: Y
  7.     @Override: [: G" J6 {  q1 B7 Q
  8.     public void handleState(Monster monster) {
    5 W1 X( I1 E9 G1 m
  9.         // Финальная фаза боя5 h5 z. ]0 J# S# A" `
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");, Y7 i. Z  |/ A9 ~+ f9 U2 d
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    # H6 ?: {7 y/ J% O3 D
  12.     }: U! p  M& ]$ d0 d  Z$ d
  13. }# g5 n7 e: p+ l7 v( [$ L0 e
Скопировать код

8 \9 m$ s5 x6 ^Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% h+ H* U: v$ J! ^6 `/ A8 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 ?0 M. H1 I2 V% k
  2. package org.l2jmobius.gameserver.model.actor;
    % x! ~2 K2 g3 v" F$ @. o4 w

  3. , g# ?3 o7 x0 c( i7 y/ _
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 {  q4 O# ]5 z. C
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # c9 h* H* j0 `+ `" Z6 j6 i

  6. ' p& w: e+ a; p4 l
  7. public class Monster extends Creature {3 x' z2 f4 u% `3 Y8 B2 s4 v* ]8 i
  8.     private String name;
    5 x" x* ~. _9 E  O! v
  9.     private double attackPower;
    9 u& K* u3 u' g5 L
  10.     private MonsterState state; // Текущее состояние монстра( t1 P" c/ F& L( w& T! w
  11. 4 W0 T6 c" V! _' N" r
  12.     // Конструктор монстра
    0 C& j2 ]! I, P/ Z
  13.     public Monster(String name, double attackPower) {
    1 Z! K% P, Z. ?$ X; ^% H
  14.         this.name = name;
    ) [9 o4 m' c! F+ G# a
  15.         this.attackPower = attackPower;
    ' ~4 q5 f& @3 \/ X# w, Z: C7 m9 ?
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ [1 [) y: u* \# W# b
  17.     }
    ! M: ?* a' ], s
  18. ( h6 n  t* ], m: l! I
  19.     // Метод для смены состояния! u2 [$ f' s# U
  20.     public void setState(MonsterState newState) {
    ( W( @6 l; t# _9 Z! L
  21.         this.state = newState;% W% I; B* f' q# E9 G. x. r
  22.     }/ d' @7 _% e0 I5 P' {1 F

  23. / U* R2 u, E) j7 z/ R: T
  24.     // Выполнение действий на основе текущего состояния
    # }. f6 T. ~* @
  25.     public void executeState() {
    ) c% X  j7 ?- h' h" I
  26.         state.handleState(this);+ v/ X; i  }& e9 V
  27.     }1 D6 `4 i$ _3 y/ v( B' x
  28. 2 o; E" z$ h6 C! H$ D
  29.     // Геттеры и сеттеры2 F3 X7 K3 H$ f$ B
  30.     public String getName() {
    5 H1 W- t/ `* U7 e! ~1 Q
  31.         return name;
    4 e# `  z" ]+ j
  32.     }9 Q; W/ w% ^- |7 N

  33. & b0 Y+ H! e; M& z1 w- F/ k' W& U, {
  34.     public double getAttackPower() {
    , ^7 O/ Y& |- N8 W) _. [
  35.         return attackPower;
    ' s3 g: R! x! p# M- h  o, ~, v
  36.     }/ S" l0 T" }" }+ U0 J" n

  37. ) X3 d; s- b8 y1 l
  38.     public void setAttackPower(double attackPower) {
    " W' V1 H5 |  C9 y" L5 M9 V
  39.         this.attackPower = attackPower;
    , z2 h9 Q! i% I
  40.     }1 }+ g9 Y+ p5 \2 h2 g1 N/ p/ t
  41. }, r  @7 j0 Y/ ?6 _# q
Скопировать код
+ P  d& a" u) }$ K! n, p+ m  I) D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
1 n4 o1 y, ~# A; a( \5 \
2 E9 x4 p/ A1 S
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , T( t2 z7 a6 T5 w4 ?
  2. package org.l2jmobius.gameserver.model.battle;; a% y3 b3 S1 S; K# [
  3. ; z- k# }: I$ X6 P3 E: J' i( C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " X, L; V! {: `, s9 u5 ]. {
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! s+ `' G+ h; r, [* ^4 ~+ d
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ( T+ u; x% X8 e

  7. 4 u7 X5 N9 {. t* W. [
  8. public class BattleSimulation {
    # [+ m3 E% f0 L. G( @9 Q1 |
  9.     public static void main(String[] args) {
    7 Q6 [; [& q" O9 B3 B2 e
  10.         // Создаем монстра с начальной атакой
    0 g. x+ O8 u& B! a3 K  l
  11.         Monster monster = new Monster("Дракон", 100);
    + K1 @  l& z2 D0 G3 W/ \6 U

  12. ) M+ X8 Q( q6 O! h
  13.         // Начальная фаза
    2 y& x4 l  K" }. d
  14.         monster.executeState();0 r# d7 Q& S& m% ^: ^* G
  15. 7 ~2 _1 G% N, `+ ]$ ]
  16.         // Переход в агрессивную фазу
    5 `$ S& G6 I' C7 S6 e8 q/ N
  17.         monster.setState(new AggressiveState());$ {* h/ n2 v1 ?2 Q  r1 h9 i
  18.         monster.executeState();
    5 i' S  }7 I: L3 m: p. z  K; t  T1 O

  19. 2 J' j" `0 D; _( s
  20.         // Финальная фаза
    8 M6 N. n! ]+ k, R% V6 H
  21.         monster.setState(new FinalState());
    ! h  s( L* f$ ~/ _
  22.         monster.executeState();; n3 A" e. `. `) h
  23.     }
    / m, M( f2 B+ @4 n, F
  24. }
    , G( }5 f: t+ T8 f
Скопировать код

1 ^" t5 @5 G+ y' G! |9 PКомментарии по структуре пакетов и классов:
* a6 ]" V- }4 r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    9 J$ s# `) _/ r6 }# ~6 ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ s# X, ~; J3 d5 x: Y7 A+ x# n; S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 I: ]2 k- [! V) b) c! v3 J

0 j* N7 N8 y- k- }% O4 B: [) p& w- v9 Y! Q! g

/ E6 j9 U' N' O
& I1 C. q( X3 E  s: J) y
2 O, o9 W8 W; Y9 `' d. \
* y; }+ _3 o( K; |9 m$ y% @* Y! a# M) j0 m0 c

, o7 `- L3 L. _$ G
( t3 S* u4 A2 h# x& D6 ?6 \; {' r# ~5 ]1 f  r$ B- X% n

/ k+ n! c& y' M! J7 f+ ]7 h1 C( M( l3 H5 h

' C0 @. @8 z1 a- A# ]. e( ]1 K1 U8 l; y: {$ j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 m; P& A9 c" Y  y! u6 K) P
Для управления сложными взаимодействиями, такими как  ...
. c3 G) Q8 m* z5 }& c9 i- M
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
# d* k2 e; t2 @: y: cОтличный подход! Использование шаблона "Состояние" де ...
) g" [$ @7 f. o$ F$ y( W* J" v  ?
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% l: M) a& ?* h9 X3 Q4 U& _5 E- Y4 b! O! v5 ]* J( G
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.3 ]: h: Z8 ?" f# N& {( m8 E- _' Y
+ T  R. u2 \. t, t( v3 H2 H
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( J; o: S' p! z4 v8 v. y0 W" \
  2. package org.l2jmobius.gameserver.model.actor;
    3 x$ H" y3 v; T( W1 Y

  3. $ W% t1 N7 H0 t  F
  4. // Перечисление для типов атак! P1 w1 |/ Z0 C+ [
  5. public enum AttackType {; l: \8 ~3 h' O: F  I
  6.     PHYSICAL, MAGICAL;' u; X3 }0 Z- ~
  7. }
    - b) j/ T" E, R& N3 I5 K. `( Z
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.& n7 d: u6 k% H( ^
Обновленный класс для агрессивного состояния монстра:
) x' L: s# x! J3 l- H$ e* D6 v5 I4 C/ |+ C' F: a  a) d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 n2 ^, d: t: ?9 r, k
  2. package org.l2jmobius.gameserver.model.actor.state;) }' |/ u. o% X6 n1 L
  3. & Q5 I# n; j. U; S, J
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 u. K9 t6 N% _$ ~
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    1 ^1 m4 p2 _* @8 m. N) Z1 X* K
  6. 2 f  A' s. K3 t& T- B: W
  7. import java.util.Random;
    7 Q% A0 L( _9 i) _3 p2 d$ r( I3 B

  8. 4 u. @: x% a4 }5 t, N
  9. public class AggressiveState implements MonsterState {3 Y& d  j# x* C' ]- o. ]& n
  10.     private Random random = new Random();
    7 s2 |# A% x9 a, I" U9 b+ o

  11. / w9 _% F, r, ]8 |7 E' y" D
  12.     @Override
    6 N. m+ p9 b( T& ]" o, D
  13.     public void handleState(Monster monster) {5 @0 U4 }! K0 }: v: `
  14.         // Выбираем случайный тип атаки: физическая или магическая0 S6 V$ a  ^! R2 k0 u3 O- Q
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    . u6 G% m7 d, `7 M) o0 \8 w5 Y

  16. 4 r; q% o, y, V, G# o
  17.         // Логика для агрессивной фазы боя
    4 {" C/ [8 E* _9 i5 N% o% k
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " * X, ]4 A& m. M7 T7 w% {& }
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");8 v! u1 N# w5 P1 N' U: D
  20.         8 C, K' w, t6 Y7 d7 q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    * I" W+ l5 u6 |3 J
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    7 e6 @; \3 W% u" @2 ~! i6 R
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ' v+ Z5 ]. Q( E9 h2 i7 R2 U( m. N$ h
  24.     }
      H& x* `/ c9 I0 K4 @3 B8 `
  25. }7 C4 ]' e) V) h/ R9 O
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
& {8 P2 |( f$ w$ d  |$ I
+ c. P! E1 M6 Z$ w
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 F6 F3 r' m( e2 k/ s
  2. package org.l2jmobius.gameserver.model.actor;
    2 P7 J+ P. v* |! |. y

  3. : f3 N6 q5 s3 z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . d9 P7 K9 X3 o! ~7 G+ s; f, C" y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 r5 u* d5 |9 ?; Q$ @

  6. ) C' I& w% r5 y8 H4 M. j/ w6 _
  7. public class Monster extends Creature {
    - e% ?! K1 g  ~: p+ A& c' O! z
  8.     private String name;8 k. o( K: j! @$ E/ _4 e
  9.     private double attackPower;
    : k& y% [- {8 K
  10.     private MonsterState state; // Текущее состояние монстра5 M+ }( S. U" `- e9 r
  11. % F4 |; s$ P3 Q- C
  12.     // Конструктор монстра
    $ |9 L' {, x2 M4 |" z  q
  13.     public Monster(String name, double attackPower) {
    5 y3 H, y; I! p& r/ r. @
  14.         this.name = name;
    " E0 n. L* x, w% |4 ~5 W
  15.         this.attackPower = attackPower;
    " J0 Z  E  x: G6 Z. O/ `; G1 O
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 r6 R! s+ d  F( T1 U
  17.     }0 W  ^; S' S# G( z$ R

  18. + x" E1 d% [$ B8 c( d
  19.     // Метод для смены состояния
    6 h' L+ R7 K3 b4 ?. k
  20.     public void setState(MonsterState newState) {; Q/ Z  t& a1 L0 N/ }: w% l
  21.         this.state = newState;% K( F1 j$ C3 h; [& x2 l! e$ g- X$ e
  22.     }6 g/ K6 Q" \7 }1 U2 u
  23. ! l% f: s% t5 r! d, q8 N( u1 @8 b
  24.     // Выполнение действий на основе текущего состояния
    : H4 Y4 K  R" D% H0 x
  25.     public void executeState() {
    + e7 y- s) E0 V4 e& x: w& s
  26.         state.handleState(this);
    / Q& o6 `3 z# g; q" j  }
  27.     }8 b6 e! _! @0 s$ d, s
  28. ' o$ O; d# d7 R" S: G+ {
  29.     // Геттеры и сеттеры
    " A, ^/ l6 T. v4 l$ P
  30.     public String getName() {
    0 ^1 O$ K8 h# n$ u$ I
  31.         return name;
    - v5 K9 Z- ?$ G$ U# r+ @6 o
  32.     }
    & A" h. h4 j% o

  33. 8 G  U/ `# s; U% R3 N/ W4 R
  34.     public double getAttackPower() {, h& s4 b& h( e' {* ?5 N
  35.         return attackPower;: i8 F( l' G: B* a3 m
  36.     }2 d8 m, Q9 I0 [7 b

  37. * U% o! c4 ^) Z, Z( k
  38.     public void setAttackPower(double attackPower) {; ^/ o5 P% h$ e# {! S7 R1 @
  39.         this.attackPower = attackPower;
      e( Y+ C8 Y7 v9 R, T
  40.     }1 P. V5 T8 i& u5 ~& X) B
  41. }
    6 Q0 U6 S8 q7 k& d! e" p
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
3 B  g3 y$ R, M9 R1 A6 @! L. F8 D- z4 O
  1. // Пакет org.l2jmobius.gameserver.model.battle  R9 D) f; O3 S; U
  2. package org.l2jmobius.gameserver.model.battle;% N; t. S: x2 I" _. \0 q

  3. ; V, \7 t& q# c$ e( y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . y% p9 a( _4 z+ b2 G; X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      H6 G; |" C" P! z6 B$ d

  6. 0 D5 T* T; K! M" J* M' `. z6 \
  7. public class BattleSimulation {
    # G% u* Y' X. Q* |! X$ s
  8.     public static void main(String[] args) {4 O4 u" z$ P; [$ N- ^  h
  9.         // Создаем монстра
    8 M7 w! D* |: ]0 b) }  l7 _& O
  10.         Monster monster = new Monster("Дракон", 100);& A( X4 n  R( s7 J; n" |
  11. - z1 J+ p8 L1 c9 N* K
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ) B- p) n0 g; _) t9 E
  13.         monster.setState(new AggressiveState());: J3 X$ n5 m3 ^5 z+ X. {
  14.         monster.executeState();
    ( E$ p; v( j) T* N* g" T6 {# }
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ R* L: C, w5 x3 ^" p
  16.     }* k) U  ]7 \# k
  17. }
    ) _% Z7 \  Y5 ]8 S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
& C% J* c0 N6 |* R/ N2 {Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
/ o% ^* @" _8 z2 H
3 ]5 _* |+ T/ i* Z6 M; _8 n3 m  ?' B& B; w8 {  ~: ?) X8 D, r

- P) w* I  h  K3 N+ o7 ^; N$ o
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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