Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
% Y5 e- U) s; q+ ^: L% \. P" ~2 M. t- e( R) ?: J' p" D" J0 x' }

/ {8 \- I' t. r" d9 B; GЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
1 t/ C( U1 E) P. x" V1 W' W5 jЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
. g0 G$ }( I1 M& A7 XАстралия 🌟6 G6 p$ k6 G' \' O+ M

5 O# Z9 z% ~! q& |5 P1 q

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
7 K$ c' G0 L) ?" h; U& X, K9 t9 g: xВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?, N% i* A* A8 H/ }7 X5 b; y

7 P8 q$ H) {+ s  w" i
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 6 [2 Q* \1 E% H; \+ A" X
AlexCoder опубликовал в 2024-10-16 18:31
( v' s: V% h5 j9 {% ^1 z9 `: }1 b$ ZДень добрый!& r6 Z  m& y4 o, [5 a0 ^1 q$ T
В статье описано взаимодействие игрока с N ...
& e) T5 P7 e: q* K
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 L1 [5 E7 b" {" ?% l' Z

" C7 @: r5 W. Y( ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., s2 t6 r: j7 F) Z! \& `
1 Q* H+ p' N3 E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; ^* {+ A$ Y4 z- \  ~& x9 v1 b

6 E: P+ |% J- D/ i0 a2 }
  1. <font color="Green">// Пакет для состояний монстра</font>
    ! {3 }  L# q' U- @7 V
  2. package org.l2jmobius.gameserver.model.actor.state;
    . D; m  g& f# v/ s. @- C" C
  3. <font color="Green">
    7 `9 Y: n. O& f+ X+ s6 r
  4. // Интерфейс, представляющий состояния монстра</font>+ M& u1 u6 g8 y+ |! s# e9 ?
  5. public interface MonsterState {
    6 M' o' @( _8 j
  6.     void handleState(Monster monster);
    ( t. w4 h% P- O) m3 J: ~
  7. }
    5 |$ D  Y$ ~- L8 @/ c$ ?1 R9 k$ x
Скопировать код

5 q3 C+ C# y3 }2 X. xШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, b- v, |! N/ ^6 B2 X: y& l. x. n* _. F2 D# U* A
Класс для начального состояния монстра:; J/ Q2 ^* E/ H& B5 u
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>( u5 K" B8 V# F( s! ^/ y$ {% i6 R& n
  2. package org.l2jmobius.gameserver.model.actor.state;; W- C  B) N. N$ a5 X0 z1 _; b

  3. 8 ]; f" V/ x2 Y# Y( E0 n  R
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 K9 \8 e  l9 ]# ?8 ~  i" }
  5. * `5 Z9 T' u' J4 L
  6. public class InitialState implements MonsterState {
    ( z; h0 n+ o+ M4 ]
  7.     @Override4 L/ I( m- a$ d5 F# T0 n
  8.     public void handleState(Monster monster) {
    2 Q2 _+ i- V, {' \" j$ D4 C
  9.         // Начальная фаза боя- J9 a: n# F' a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 O, D1 p- {2 r# L
  11.     }
    ) T9 H1 ~  C& Q, f. k
  12. }% U. |* p" U  z) F( c
Скопировать код

5 K) o$ m# F, y0 y
7 u9 e" H5 B7 E" t8 I: I' m. i- x& r6 E- E: Y, u
) _/ A( z. C6 G8 U3 Y$ r% e

  F" r/ {. k# H: p. s2 A  i, e0 ~- |, e5 s3 |
: R8 z8 u4 W% q0 G% E6 b2 g0 k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ t) I+ g6 I! P, |! Y/ P+ W5 a
& e7 y6 @# C3 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 X' `, U& J9 x8 ^" u# S
. q& Y! l$ }% W2 h" r9 D/ X) F3 z( ^# N4 X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., |3 W" I2 l) L
! V* d# a% c8 X9 ?
  1. // Пакет для состояний монстра
    ! ?/ Y4 E3 S/ I9 c9 a
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 E) q& M' o1 J) G! t0 o8 |
  3. 0 @/ D) `7 i) s2 V( K: N2 y
  4. // Интерфейс, представляющий состояния монстра, A( i0 I  f; E$ K% o4 H2 ~+ C% e
  5. public interface MonsterState {
    ( {+ q$ Z1 X0 q
  6.     void handleState(Monster monster);5 c. t5 @* t0 Y5 R
  7. }
      r+ k# T  o5 D9 u( x
Скопировать код

8 c% H9 A  F5 K* `5 W/ g* f# V% `Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ W' F% |  a; Q9 O1 d) E& G+ [$ O6 Z* W+ t
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  w6 c$ W$ M1 g$ A7 b  H
* Q4 U7 ^* C! ^/ mКласс для начального состояния монстра:
; ^% r; K9 G9 d* t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 D$ C. o* C6 ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    : h; H- q8 Z! P+ l) X0 t% W- i

  3.   `' _/ }9 Y& y) x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , Y7 b  F+ l- F" V8 _* M

  5. 8 N2 N/ H8 u& M+ L8 e
  6. public class InitialState implements MonsterState {) c% [4 k' \# Q" x( a! Q: W
  7.     @Override2 W' ]7 p3 ~( G+ t' Q
  8.     public void handleState(Monster monster) {
    % k/ c6 T' |" v6 t3 z. R
  9.         // Начальная фаза боя  V. e. N- `0 U% o0 `! F8 @! r. m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    2 b$ |0 L# `9 C9 \/ g) Q. @$ P$ e8 u
  11.     }% e' h% ^  s7 H/ t+ N
  12. }/ T" q8 a& K3 P9 K" o! L3 Q' k
Скопировать код
Класс для агрессивного состояния монстра:
7 P' W$ O8 I0 B% r# |- p) c+ x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      n: E& o) |7 `2 i( p( F9 _
  2. package org.l2jmobius.gameserver.model.actor.state;$ Z- f1 Z5 Q, G7 X  I

  3. . W) q8 l6 P, ~9 `, C. S0 C) y+ o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 y/ ?5 @" B' \# O  H; T" R0 P- E. v& }

  5. , U7 k- k) S7 K; e% g6 R* ?
  6. public class AggressiveState implements MonsterState {
    3 b. a: K( `8 h& F; A' Y5 ]
  7.     @Override
    $ b! ^: r1 z4 I8 m! R2 X4 g6 p' J
  8.     public void handleState(Monster monster) {
    + R4 m$ J* }' z+ Z% r! M9 G
  9.         // Агрессивная фаза боя- B) h' j& p' g; C
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    + D9 S: u' u) w& B/ L/ e
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    # o$ i! B2 f( X, y; w! X
  12.     }
    5 o# ?9 }, q, B$ I' S7 C+ H- G
  13. }4 K: H# |8 g& B+ Y6 G6 i: r
Скопировать код
Класс для финального состояния монстра:, i% E2 K) m: q& m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / b4 I! l. g. h6 F4 l
  2. package org.l2jmobius.gameserver.model.actor.state;
    / T0 J2 Y; b( p: o9 K; Q

  3. : t% g2 g( S! t8 D0 P+ ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 R9 w" c" y; K. d) L' O# p5 X

  5. ; ~6 q6 X2 U, E# \2 N/ p7 b/ d
  6. public class FinalState implements MonsterState {7 f2 E7 s- t$ J% W% E8 h
  7.     @Override% K" F, j+ b/ q+ I
  8.     public void handleState(Monster monster) {
    " T1 h6 ~8 j. n% I) a7 {; u
  9.         // Финальная фаза боя5 f8 R" |7 Z4 M! T& G
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    # ~% R0 B4 d4 @5 P+ V5 f
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ T# z9 x/ a+ |7 S8 Y5 c
  12.     }
    % p1 k  X8 `* g( P6 R
  13. }
    ) {# H/ ?' H% e* G& u( H
Скопировать код
" Z% P" p# D$ p8 i  e, {/ L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- i( V  B! _  }5 k' P' G
  1. // Пакет org.l2jmobius.gameserver.model.actor$ y6 N* T- l( i/ |% f
  2. package org.l2jmobius.gameserver.model.actor;+ x( K! M4 d% J( o0 n+ k7 d

  3. & ]5 F9 N6 J  \% q  U; l
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ p# e- J& X4 o: `
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # A2 G9 P9 P! F1 a* @9 i

  6. 1 y5 P3 f" y( K/ z5 y0 c2 r! \. I
  7. public class Monster extends Creature {3 ?% w! ?. l' ]0 J# h
  8.     private String name;
    : K( U6 L3 i2 h" S
  9.     private double attackPower;
    , h! g0 I3 ?* R- m8 i9 q( f
  10.     private MonsterState state; // Текущее состояние монстра5 L+ ?* e4 i0 y( |6 H
  11. 6 E0 n5 p3 D9 G- o4 C- p* V
  12.     // Конструктор монстра! T7 u5 d7 O$ e5 G2 r' x4 s- G
  13.     public Monster(String name, double attackPower) {: n9 i- R/ Q# O) B& W$ Q/ [8 T
  14.         this.name = name;
    0 V- [7 t6 M* ?3 K. M5 X
  15.         this.attackPower = attackPower;
    5 c+ D7 m8 i9 U7 ^
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние. Y9 T7 M/ ]) a1 ?
  17.     }
    3 z9 S! b( c% w* O% w6 T/ Y
  18. ( o; g4 r, [' G5 }$ a  G# A3 X/ V1 a
  19.     // Метод для смены состояния9 r, ^( p! T- l8 ~) H" S' J
  20.     public void setState(MonsterState newState) {# U/ {% L' b/ F! E3 ], M, n
  21.         this.state = newState;$ W$ V  `0 T2 ~3 R0 ?" s* q+ l
  22.     }
    * r. o. }5 X6 j7 q. w

  23. - P! N6 }/ D- V
  24.     // Выполнение действий на основе текущего состояния' n) n4 O0 [4 G
  25.     public void executeState() {
    - D3 u; c  P8 B& f
  26.         state.handleState(this);; \8 d0 i: D- F. q/ E; @* P4 M
  27.     }1 x; O* B; |; c1 a
  28. $ y! g& C* {5 K# w' x8 U' k
  29.     // Геттеры и сеттеры
    % |4 i- b4 A2 @4 S+ a/ f
  30.     public String getName() {2 Z/ `1 E8 h5 c
  31.         return name;' r( C# p! l* d* G  M  \
  32.     }. k' w+ A5 e) N% E( X6 A# D

  33. 7 L9 S. O* q8 s4 H4 {5 K
  34.     public double getAttackPower() {( X2 I, [! K! S# X
  35.         return attackPower;
    - l6 G4 L& p8 u7 N, Y, f. n2 I
  36.     }% y+ ^. Q8 Y: p" ^

  37. , K3 y$ ?- ]0 v, \) h  L
  38.     public void setAttackPower(double attackPower) {
    9 H5 I8 R3 G  [) i3 T
  39.         this.attackPower = attackPower;
    $ ]* }) B8 g1 T; k8 ^/ n; C
  40.     }
    $ s! r2 H0 A+ Y) y7 `
  41. }9 U! x( |" ^% o+ x# \
Скопировать код
8 E8 _% M! h. G! i& k- a
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.1 _9 w$ s& D( O  w! N& x: x/ h

& `8 _  {% T+ N, t; s
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ' t9 |2 Q. j5 E* t! w
  2. package org.l2jmobius.gameserver.model.battle;% \* r+ f( }! S) l  b
  3. ( B0 w; g7 s% _1 Q9 j8 {( M" ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;% j% L. b$ Y3 N: {: m" ~, W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& G) h3 D- B' l( R3 \
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;, r' O% P0 ]0 ^1 r

  7. : y2 Z& K# D+ Z
  8. public class BattleSimulation {) M2 \( e2 }# b5 D& |
  9.     public static void main(String[] args) {
    + T+ l3 W5 F) Q3 B
  10.         // Создаем монстра с начальной атакой
    ( o  t5 w% j9 z& f6 ^
  11.         Monster monster = new Monster("Дракон", 100);8 A6 I: n2 `, }/ q& X. z
  12. 0 c$ z% r$ B2 d- p
  13.         // Начальная фаза
    / T1 j+ p% ]( t# i1 c7 f
  14.         monster.executeState();
    / {5 S* q% c8 N& c

  15. ( B6 K0 c, i& Y
  16.         // Переход в агрессивную фазу
    , @* a3 v" W) q! @7 m: R
  17.         monster.setState(new AggressiveState());# k8 _0 S# w$ G: K, R
  18.         monster.executeState();4 Z- M5 K1 u4 R7 O4 \) e* j  k
  19. 8 O- K$ e; I9 o3 B' ~/ ?
  20.         // Финальная фаза
    6 P- ^8 e" D4 K, H) |4 }8 ?
  21.         monster.setState(new FinalState());8 [" N& N) \7 ]3 u) z
  22.         monster.executeState();: Z. K2 _  z$ f9 {  _( T
  23.     }
    * P, x* G8 `# E
  24. }  r8 p0 ?% B0 H! T% @
Скопировать код

% t" n8 R7 R& R6 kКомментарии по структуре пакетов и классов:
% V& N' M: y6 j- H, J
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    , w, z5 N9 J4 p4 b+ p
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; H" n% i8 a& s1 wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" E2 T3 V9 ^- ]5 c0 A, p/ c5 t. L, F9 @
! ?% e" M/ @( \) Z' r. I8 r% S

! Y% a! M* S6 W+ [4 }. M/ O& h/ k. K0 d% O& m  A$ j  Z/ Y% m
! o& s" C$ Z% Z- E" h

- c( B! v# ~, F& a; n& {; s! ?' i7 |6 y  c: X

( ~* u! w, P1 ?1 o6 @. `) p
% K* ^( a2 d# N" G: T/ `9 O, V& w8 G* i. @  b. {. t
1 L4 {) i0 z; L# X+ Z, m, Y
* }2 J# `/ ~6 E; g+ g+ ?
5 H9 {9 @5 T9 g1 P1 q7 _# S

0 v: P! b3 H! N4 C
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04+ l) B- I* U" J! r$ V& Q: b
Для управления сложными взаимодействиями, такими как  ...
7 T) f: w- g5 ]/ q( c% g: W: A- D6 z
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
4 x: j3 O" \" K" I# {Отличный подход! Использование шаблона "Состояние" де ...
0 r9 k3 d  W8 O. o. f3 S' A
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.8 ]. f2 `$ v# i% d; r# O

, |; U; z* F! D9 m" y; l: wШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя./ ?: j+ Q4 b; U! b4 k4 F) l/ s# X

* ?  h* C* ]9 @# n1 K
  1. // Пакет org.l2jmobius.gameserver.model.actor/ `6 [9 J% t% Q/ k  n# A
  2. package org.l2jmobius.gameserver.model.actor;$ D/ U/ B  C' i, {6 A
  3. $ K0 z: T$ @; Y  t
  4. // Перечисление для типов атак# b% z: j& E% B. L& [' D# e. F
  5. public enum AttackType {
    3 @" W% ~3 F2 C: z  K8 T* m+ o
  6.     PHYSICAL, MAGICAL;( X  a3 d- |5 D  _# O. E; C
  7. }, S+ y) |' S6 f, c6 W
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
- F0 Z: O* K8 t) u* x$ VОбновленный класс для агрессивного состояния монстра:% \2 W& J$ J& R

, H% z: |2 d" V. O% w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 e. e% v7 P9 X1 t9 S6 f7 P* ^
  2. package org.l2jmobius.gameserver.model.actor.state;7 M( J/ V) W% V
  3. 8 V& }( Y( r6 h, S4 z4 n: n" \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , J8 S' ?. i- |  x
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    2 N- c" U$ U3 Q
  6. 5 T+ Q1 d: o; a( Y# ]3 Q
  7. import java.util.Random;- H$ [( V6 b, E

  8. $ e! I# Q8 ]1 W
  9. public class AggressiveState implements MonsterState {
    4 X' |  W" R- a6 V& d
  10.     private Random random = new Random();: y4 \+ p% u0 \3 N9 t# v

  11. $ d- y5 s5 H9 \# A" ?. Z
  12.     @Override; a+ L: A+ s# q+ y9 P# \7 [2 m, l
  13.     public void handleState(Monster monster) {
    0 G3 g! s: y9 ~1 ^
  14.         // Выбираем случайный тип атаки: физическая или магическая
    * k; m3 m3 S& \2 k( N1 X, |: i" D6 l
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;( v0 Y& O( p2 n1 k+ \
  16. - ^3 `# Z5 [9 F8 V! n
  17.         // Логика для агрессивной фазы боя
    2 Y) g8 n. k6 H' h6 ]: ^/ U
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : s' t5 @& l3 [
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    / h1 Q# F0 p. k6 `* |, ]& o* @! T
  20.         3 W8 F" A* n/ {1 w8 f6 b
  21.         // Увеличиваем силу атаки в зависимости от типа атаки. X' ~1 H4 _9 S- `
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    % c) C* `; J" m# Z
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / N8 g& w2 }- j* z
  24.     }! Z0 }2 j; T3 M! G4 y
  25. }; U9 H+ z+ L7 E+ b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки6 S5 [% s8 x- ~# E' D

  a( i% ^! _0 ~8 p( r0 P& d& \
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 I) C) C9 [# Q8 ]4 d
  2. package org.l2jmobius.gameserver.model.actor;
    + P$ _  I* E( a

  3.   B7 t. b( }# o, A" a; ^! P
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ! f( C! E# ^* A* N& o4 _/ y& L& b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;) V+ X: k$ q3 a& e) L6 c, i5 ~& i/ E

  6. ) x( {- Z4 N7 W, ~. |7 Y7 b$ I
  7. public class Monster extends Creature {
    ' B3 q. R, T: |" q
  8.     private String name;
    - X4 E+ u1 v0 ^0 z  T
  9.     private double attackPower;
    : v: ]2 W+ ~0 r+ x
  10.     private MonsterState state; // Текущее состояние монстра
    % k+ F9 T  ]! F' x: A; H* R/ v
  11. ' V9 T# f9 i; ?! N9 Z9 k
  12.     // Конструктор монстра* o1 \! n2 u3 h$ m- a" s3 Y  J3 k
  13.     public Monster(String name, double attackPower) {
    " F+ L9 H7 _( b, g7 H( @0 m
  14.         this.name = name;2 U! `2 f/ A0 @9 R8 A  |
  15.         this.attackPower = attackPower;* W: \( b& W8 O- J
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию" H5 a  B) ^% ?' E! J- w* ]8 S
  17.     }
    / Y8 O8 ]4 _( a& o$ C8 [: l
  18. / W) d2 M6 T" f8 h5 u+ X) }
  19.     // Метод для смены состояния
    $ D3 K% ?! W4 }
  20.     public void setState(MonsterState newState) {
    . B  I. [  T8 ?  u
  21.         this.state = newState;
    5 J2 ^* L% z/ }/ _8 c6 @
  22.     }* f. t. {' w8 `7 @# I% K
  23. 6 x0 [  ]% I- @5 I* j" e
  24.     // Выполнение действий на основе текущего состояния
    ( `; h2 `" {. n; V# {7 N
  25.     public void executeState() {
    2 f1 M5 s2 G, Z/ j4 @
  26.         state.handleState(this);
    " {/ ?2 i3 d( Q
  27.     }, K( i( J2 C, [# x/ a

  28. , f. j% X6 C' b7 \4 \% L7 Z" q- o
  29.     // Геттеры и сеттеры
    , y$ n% ^6 ?1 ^8 q
  30.     public String getName() {- C( A% U! m7 K5 e+ [3 p
  31.         return name;! o$ ?( O. Q+ z. \  j# x' `8 c
  32.     }
    $ O$ V8 _# y0 M# w$ b

  33. ; l6 x, k# r* e5 g" w
  34.     public double getAttackPower() {9 ?% a* \* R; a$ w' w/ Z* V
  35.         return attackPower;
    1 J0 \7 p5 t3 E* o, S8 @3 d
  36.     }
    ) _  H, n- H/ X7 B
  37. 2 g9 `- k" H: T- P: _2 ~* t% l' H
  38.     public void setAttackPower(double attackPower) {0 v5 u" G: ~$ L( N4 @
  39.         this.attackPower = attackPower;
    , R; o# k" k/ R" `6 e, w' H% b
  40.     }
    6 w3 ~1 o4 t: P* h8 Q( X
  41. }/ a( a$ \! e6 h: R; x+ R4 |' {
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
% N$ f, i( X# B" U, J- Z$ u7 {6 s1 q+ {# N  t
  1. // Пакет org.l2jmobius.gameserver.model.battle
      ^$ H; P0 @6 d7 @8 L
  2. package org.l2jmobius.gameserver.model.battle;8 t; w( _) K1 _! m
  3. ) t7 N- K  f+ {- _9 b. s
  4. import org.l2jmobius.gameserver.model.actor.Monster;( Z. W; R+ A! s! e% b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % R. A+ C6 y# n: i1 u: p6 W

  6. 5 {& C' c; s" V- z3 |& b& G) j" o4 q
  7. public class BattleSimulation {
    2 G" f/ a6 X' y* m5 g& E# @
  8.     public static void main(String[] args) {4 F4 M2 o! @+ A* F1 [, d9 V3 U) }
  9.         // Создаем монстра
    2 f- t# F0 J3 C, Y
  10.         Monster monster = new Monster("Дракон", 100);, W9 T6 }( h+ {/ E) E9 ~

  11. ; F7 w" v( Z- _' p
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    # c5 _. j. {8 }6 d2 \1 B
  13.         monster.setState(new AggressiveState());
    $ B- r$ {) ?7 Y0 P7 ?4 c$ r. h: G9 A
  14.         monster.executeState();9 |3 z9 z% J9 `6 N* y
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    9 T  r5 K* w$ x: q1 `
  16.     }
    ; ?/ k" ]/ U4 Q" b
  17. }
      \0 T6 \# R6 y1 J
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.- A/ G) ]2 V: E" p
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!; C) A% W. r- y' s! F
+ a' A. l+ l, ]2 a& e' p; V5 q

3 L2 A8 D4 D5 Q- M
2 f$ S1 I8 ?: ]
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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