Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
3 B6 n1 N% @& L2 ^2 Y  F' \
; `2 ^, r" P+ L2 `- D, p; }

% J, v1 t  P4 i4 |2 G$ eЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
8 o+ ~/ ^2 s+ FЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 b, w  v3 \6 R3 L% V2 m- _; V
Астралия ?
" n. D7 A. a  h6 c8 J. z+ q' F4 R) U$ m6 T! L; `& ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!& G! ?+ t/ i5 n0 v! L- H! w% J
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?9 a1 V6 s: Q# L* W0 L" M+ E

. F) s' q5 @; n
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ e$ ]7 A4 l* L/ L, u' A
AlexCoder опубликовал в 2024-10-16 18:31
1 [0 E0 H5 M  a8 w, M5 ^. P" WДень добрый!
* l* z2 g7 x/ r- B: k5 n% oВ статье описано взаимодействие игрока с N ...

' c* N; b% B3 z3 jДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* i! f2 e4 B5 g6 T/ g9 e( b2 C. h# H" v* i
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.9 W1 u- @% }7 O  ]" s' ^6 a: g# |

6 b' r$ j) p) uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 Q8 Z9 R; g% N& Q2 w  w" p# k" h+ C. x- R$ S
  1. <font color="Green">// Пакет для состояний монстра</font>) Y: S: N0 V/ q$ N
  2. package org.l2jmobius.gameserver.model.actor.state;2 N1 X7 K( l- ]! {: E
  3. <font color="Green">; U/ Z* H0 L' C" ^0 J8 `5 T
  4. // Интерфейс, представляющий состояния монстра</font>
    5 e3 }; d0 U9 v5 ]5 c- K, U
  5. public interface MonsterState {% ~  M- e( l$ g  c4 M0 u
  6.     void handleState(Monster monster);
    : u: X! U' ~. j
  7. }
    . j- P4 R7 \0 c  P3 o/ @) j2 s7 e
Скопировать код

3 R$ F0 Y" t1 k5 pШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  B- H' M) U0 g' |& }/ \
: ~, c+ \6 }3 g) S- S* i0 i; r
Класс для начального состояния монстра:
; U" _* E. O  `* [
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- f# f* F8 f/ e% V5 E! ?! X
  2. package org.l2jmobius.gameserver.model.actor.state;
    , |- o) m- T; J

  3. ( E* j+ |8 z8 c6 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;) e$ w* s+ u2 T4 |; y. P& O/ X
  5. 6 |4 \1 z, r+ d- a( C- v
  6. public class InitialState implements MonsterState {' o5 Z2 S' }% j! s0 @* ]: [5 n
  7.     @Override
    $ P/ `" V! c" }
  8.     public void handleState(Monster monster) {/ ~0 R+ [7 F+ A
  9.         // Начальная фаза боя
    . i& X9 `% x) Q, q, v1 E
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 n. B( G  ~, ?" n+ n& |
  11.     }3 d1 H. V3 L# b% t" {5 K
  12. }
    + l3 ^8 j* B4 A1 Q; Y% l7 c3 o% h& V$ g: Q- N
Скопировать код
0 F! C- e: }3 o. ]) L1 t

4 W, U' Q, @+ V+ e# y' L# [- y: {* S$ E; E: {) S
, G; Q% i! o5 F: R7 T
8 M2 P0 l  w& s& A; j/ w
3 y" f0 e8 I+ ~# x1 f- P  _

- q6 `( T6 C, R( }3 ?% c; O
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 y5 x: p% M$ d6 v
. _- W3 t8 X* `0 {8 x5 R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 w7 R7 N- d1 G( }" T! \7 T# U+ J$ w
" X- g. _1 I, x" W) r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; }& n' A/ ]6 i8 Z0 e$ w5 Y

6 X" q9 F$ @, b
  1. // Пакет для состояний монстра- J: R8 p! j1 R; u5 \" g( u- m
  2. package org.l2jmobius.gameserver.model.actor.state;. G+ f6 I  ]$ \7 l2 F3 }& ?

  3. ; X2 ]/ }$ m6 D# e* ]; I$ c
  4. // Интерфейс, представляющий состояния монстра+ W3 h& g, k( B0 Y- a: v
  5. public interface MonsterState {
    1 b+ e" L  m4 \0 K7 c& }
  6.     void handleState(Monster monster);: F! D: H  I7 G) O8 D; G6 j8 \: G- b
  7. }
    ; V$ c2 E* F$ |% r- R" R
Скопировать код
" y; p/ M6 c7 w( ?6 @- x0 P5 q9 p
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * @  {  Q  a9 f% r1 V5 W
7 T* G- T: I' Y5 U" Y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 c! m5 ?, \* x4 q9 o4 }4 X% h; p5 W( g9 R; p8 U, e6 R4 G
Класс для начального состояния монстра:
* b7 F- _+ J3 }0 t  t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 s& D/ a3 H. K: c# P9 d
  2. package org.l2jmobius.gameserver.model.actor.state;# R* r4 T# l8 p1 }+ n# X
  3. % `% X, C  F6 L6 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 l1 b: _% {8 l6 K
  5. : k" v0 v6 t7 H/ L& n
  6. public class InitialState implements MonsterState {
    " {2 s! D7 V' Z; k' U& ^
  7.     @Override
    + {6 M9 m3 _4 p' B
  8.     public void handleState(Monster monster) {9 N( z9 X8 h# f8 i3 h1 u
  9.         // Начальная фаза боя. ~/ {# }" k& p5 \  U
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    . G0 ^5 V( V2 E8 Q. C# G1 L
  11.     }, U) L  r$ Y* [7 L
  12. }
    + C4 v3 l4 V; \, Z( z
Скопировать код
Класс для агрессивного состояния монстра:+ b5 a; U7 z  u0 r) e+ W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / g4 G0 e5 D  t
  2. package org.l2jmobius.gameserver.model.actor.state;
      u( c: R" A* U  |/ K$ E3 a7 c
  3. 6 U! \9 F8 P9 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;! C: Z( F4 Q+ @4 r5 {: a0 q
  5. 6 X) S' t$ D8 Y1 Y0 A
  6. public class AggressiveState implements MonsterState {
    ! g$ J& c9 v' Q( R- |
  7.     @Override. o5 }- `- M, F; y: n& {3 ^9 _9 i
  8.     public void handleState(Monster monster) {6 C+ h/ b- ?3 o( H# {: E6 a
  9.         // Агрессивная фаза боя+ D4 w9 p% {) _$ P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ; m  p, j7 k. e/ ?# b; r9 l4 \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ; H% l  p9 |% a3 D
  12.     }
    , F: R# Z# o1 U1 Q( R8 c
  13. }9 T4 Q: \7 s6 H8 O
Скопировать код
Класс для финального состояния монстра:
' P, m( W3 V9 L- o0 H: H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 k) V* O- U. ~! x+ c  S
  2. package org.l2jmobius.gameserver.model.actor.state;' M9 A6 p, X, R

  3. 9 w7 Q) M$ c" w2 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + z: Y3 q  b+ t4 e- `6 f
  5. / [% u: v7 w: N4 i
  6. public class FinalState implements MonsterState {& X4 Y* f& m7 _- g0 V+ k$ K
  7.     @Override
    : O" A; B; Z) h: H8 _
  8.     public void handleState(Monster monster) {
    # S9 t" ]4 I" t' w. x- K
  9.         // Финальная фаза боя  Y, a0 m: n/ u% _) ?! p  ~( \
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 a* ?. H2 }# N9 g. v" F4 K
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! R! U6 q8 x0 V) U: C! C
  12.     }
      f) I* N! |5 @; z  N- b! Y
  13. }
    / D) r0 ^/ d4 z; l) b( n+ Q4 E* U
Скопировать код

& z' y9 q  {, M$ E1 h# Q* ~. V# ]Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! J7 I$ i1 N& @! q8 B5 e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 \( S- U1 D% e
  2. package org.l2jmobius.gameserver.model.actor;
    + Y4 \0 E  e- R% H3 N/ d. S
  3. 4 G3 \7 h- t% |5 o% U6 U3 ]8 i5 m+ n1 e
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;; {+ o* X$ P( k' |. X/ j4 R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    " [* K# _" o" S$ t5 u) l

  6. " b2 l- H4 }* T. r. S
  7. public class Monster extends Creature {
    $ A+ C: `4 p- X/ L% f, Y) E1 d
  8.     private String name;
    % z4 r8 o$ d) h2 ^
  9.     private double attackPower;6 V$ s/ _, l! i  i4 o! {) s# ^
  10.     private MonsterState state; // Текущее состояние монстра
    0 t  s! I6 s; }

  11. ! N* z# V; S4 }' a, k* i
  12.     // Конструктор монстра
    1 m6 i& i8 M, O+ M5 e
  13.     public Monster(String name, double attackPower) {6 ~! _- i6 w" F
  14.         this.name = name;5 b1 P% Y4 q8 \3 S0 v4 j% U
  15.         this.attackPower = attackPower;
    % g' a+ F$ e! V0 T
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ C  N" l! t" X9 i
  17.     }
    % }# e, M/ i: r3 l8 J0 D) n

  18. " a8 O4 {# P8 `
  19.     // Метод для смены состояния
    ! `. L/ ~, Z* c# Q5 y7 Y
  20.     public void setState(MonsterState newState) {
    ' S# h9 f" L/ y
  21.         this.state = newState;
    # i2 r0 h7 K" U# [' e# e
  22.     }
    # e6 p6 |$ C: l

  23. " r& x9 j% R. b) G- y  S1 ~+ O) i
  24.     // Выполнение действий на основе текущего состояния/ T: C  u1 G0 x7 w2 L( {# s- k  `
  25.     public void executeState() {: c% L- w  f! u; v
  26.         state.handleState(this);
    " ], C5 X- `% ^
  27.     }
    ) r8 H# p6 U' K9 N1 |
  28. - P" ^8 p2 v5 F0 @
  29.     // Геттеры и сеттеры
    9 T8 W$ \; U8 j0 O  i# o8 \
  30.     public String getName() {( h$ W- d. q3 U% I
  31.         return name;8 N* ^( V$ j. ]! I* g+ N& B
  32.     }: O* `0 h% R* j+ e: n% ?: }/ K
  33. - Z. n$ B; h+ }2 @2 l  a0 x" g
  34.     public double getAttackPower() {
    3 h' D+ c2 q' i, L  p9 o
  35.         return attackPower;  }7 N0 h2 d/ @4 n" T" H9 `
  36.     }
    0 m( E- N( b* N+ a1 Y
  37. / D% c  ]% t/ ]) S6 r
  38.     public void setAttackPower(double attackPower) {% E! v; I& v! _" S) @
  39.         this.attackPower = attackPower;& A, [$ k+ f! Z3 H" i8 o
  40.     }
    : U( d/ b4 F" d; G* l
  41. }
    7 n. Y% S* ~0 `9 f# O% N( S  v# M9 z
Скопировать код
- [" P. O5 h7 d, l  z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! t+ c6 \2 \& \( Z% m3 e
2 c' p+ G+ |# M% c, ~
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : l# D0 l6 R8 j0 Q3 ^1 f( x/ ~
  2. package org.l2jmobius.gameserver.model.battle;0 {, A; V( l# _( ?2 L' g" k

  3. $ Q( [$ ?, C3 ?4 \3 m# S# Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;' }! [6 g, Q, v; g- e% Q2 S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 t5 Z# r5 _% \7 `$ o) c
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;( D% p7 ~' l4 a5 V4 E$ j0 j
  7. 7 L. A5 z8 b, j6 a: x
  8. public class BattleSimulation {
      m. C' q' ?4 T
  9.     public static void main(String[] args) {
    0 A2 m3 }7 h% P+ v) e2 u
  10.         // Создаем монстра с начальной атакой
    6 @7 D- z( j1 Q  S$ J
  11.         Monster monster = new Monster("Дракон", 100);
    # Z! \+ f# r7 P* H% U9 _2 ]# E

  12. # O  w* Z1 @9 A+ s
  13.         // Начальная фаза
    " V% T- g6 Q  \' |3 o
  14.         monster.executeState();5 h- _* T/ [# g/ i& l5 O

  15. $ G) I8 X$ h$ A% k7 j: a. x: O& h% O
  16.         // Переход в агрессивную фазу
    ! N9 W$ D4 [0 t" k5 o9 b; M& A
  17.         monster.setState(new AggressiveState());: n1 e! m9 A  A: M/ y1 g! U
  18.         monster.executeState();
    3 D" S0 |' f, O
  19. 0 ~' C; [7 }- U! a; N
  20.         // Финальная фаза% L+ }* q0 P, I( H
  21.         monster.setState(new FinalState());
    / v3 P) M- G" l) B3 l
  22.         monster.executeState();
    ( Y2 c* @3 Q4 @
  23.     }
    + v; v! L) U8 s5 D# A
  24. }
    - @9 q" x0 N# x+ ?- @" e' }
Скопировать код
% S& E3 c& U5 h9 @) k) C8 c; s# ^
Комментарии по структуре пакетов и классов:
7 \3 |) ]  A8 ]7 \7 c8 F
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.! D/ S: Z! ^: ^$ |7 r0 u: ]
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 B8 g$ E- @: h, q: j$ jЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 l* U4 |- O* w& k$ o/ b0 c* j6 d# ^: B- k2 m. L5 N

* L7 Y0 ]1 Q8 Q8 M4 }" P! v+ O1 Q8 m' @1 M; U0 \9 y8 t
. [: F7 N8 \1 h8 d3 @( [0 m! Y% V

! N, P8 U0 M0 V( W6 b
9 K: C* G) h' y- o( B3 U7 l+ ^
) E$ g$ W8 T( r! z

( ]& U$ A5 ?& E1 {4 G8 e9 \8 ^/ Q5 Y8 H  R

4 \0 R5 P* d- a' P# W' ^
6 V8 `9 y: f$ q$ o  Z9 A1 f7 m. K. g( T% K
. g9 j0 ?7 K6 a8 y
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
: l# Z, i2 }% _; G. s- aДля управления сложными взаимодействиями, такими как  ...
: u% [+ J+ j7 L4 X  M, P
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
: U3 ^  m1 A/ [/ r& X' {$ G, YОтличный подход! Использование шаблона "Состояние" де ...
! S  c, Q0 Q1 o5 g5 w
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% a+ B6 u0 q) C% H
* V, A  S$ a9 w! jШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
4 M& i2 H: |9 Y& j5 r. ]* u4 Z
( z7 ]3 G# g( Y+ ~* b& |. |
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , ~; t3 a1 M# @3 T6 i
  2. package org.l2jmobius.gameserver.model.actor;
      e# T: S, u% V
  3. . S% z7 L% y' d( I1 Y
  4. // Перечисление для типов атак
    + `( T  w  P$ w! {  }1 j
  5. public enum AttackType {+ P& r+ P; C) T0 E4 J
  6.     PHYSICAL, MAGICAL;
    1 H1 {4 H$ e' {) |2 F
  7. }
    + ~0 w% l6 Y# j, T" y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
& ^- K1 S7 F' A3 k# iОбновленный класс для агрессивного состояния монстра:! C) H4 ^' t3 p6 @+ L
  e% d) Q! ^7 G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 _: ]8 ^1 T/ D% Z8 Z2 P! B, j( z
  2. package org.l2jmobius.gameserver.model.actor.state;
    : f. D8 D6 _( {) _8 s  c7 q' k
  3. 2 A: u2 k; G; A- {) u5 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 m& ^8 ~+ S( Q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    $ w9 T8 \  Z# f! \/ U3 H
  6. . _/ d( M7 s; I
  7. import java.util.Random;
    8 S, Q, J' D- }* n

  8. # i4 o! s& e9 D* Y9 J0 Q
  9. public class AggressiveState implements MonsterState {
    9 ~# x- _; X4 ?, L2 G* [' G
  10.     private Random random = new Random();2 }! M9 L2 d2 j. e

  11. $ B; c" Y9 G2 P. Z  ]0 m  ^$ L
  12.     @Override
    & L, `2 t5 H& |" U
  13.     public void handleState(Monster monster) {
      C1 c2 a2 G# b! h: m8 i9 l
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; |2 s; Q$ a4 c+ ?& E8 b  J, }
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;$ L" z% N, Q5 k# n& o

  16. 8 v. x3 d. Y* |
  17.         // Логика для агрессивной фазы боя# d& B; g7 u/ }) Z$ w! k" \
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "   Z* o3 I% G8 E) t: y% T
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    % _' k9 u' B! J1 C0 |5 f  v
  20.         ( R/ H! f: A1 h7 h" ?1 L' a, M
  21.         // Увеличиваем силу атаки в зависимости от типа атаки( [4 i* i5 s! @/ F7 [7 p
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;0 V& F" r, e/ O$ F! o" S: L
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    8 U  Z% c0 G0 j8 f- a3 D7 ?, _; I. P
  24.     }2 t0 b5 a2 g0 r$ W
  25. }, Y) r0 F! Q& l3 L) V; o" i( a
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки, j) Y& [  g+ I# K- l
7 z* A9 f) t- G; z; H
  1. // Пакет org.l2jmobius.gameserver.model.actor
    # e, t9 p) J( N  f# E4 T* X
  2. package org.l2jmobius.gameserver.model.actor;$ |) |( B8 [( u+ H0 C

  3. 1 `4 O' ^! S  ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 _+ Q( Z4 I$ O/ V* b, d
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 b1 x+ m  f* V+ b6 b. D& z1 Y
  6. 1 o# C' q& {& n6 q! C
  7. public class Monster extends Creature {, c2 f6 K/ c+ {$ u/ {! G9 ~
  8.     private String name;
    + A- D2 p3 V- Z" M% w2 G2 }9 B
  9.     private double attackPower;
    , U3 `9 _" c3 `8 z) V
  10.     private MonsterState state; // Текущее состояние монстра
    + G! v! ?8 K; Z6 _5 d3 v2 t
  11. / [3 A9 V% |+ y( x# ]! e" _7 e
  12.     // Конструктор монстра
    * k( e$ Y1 F# Y- \- O9 y, ], Z
  13.     public Monster(String name, double attackPower) {  r/ R. c) p( w. y; [: n$ H
  14.         this.name = name;* m& {! C! P1 K# ]& x6 s
  15.         this.attackPower = attackPower;# b7 }: I6 C1 d& R- U& M3 |
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию7 J. r( G$ ^0 s; _( M+ H
  17.     }' E: k7 a* ]# Z/ n' E( u! G" U

  18. ' i/ b6 Z6 x- T# S, ]
  19.     // Метод для смены состояния
    % q2 A: W. t& X8 j0 T" s% s7 }
  20.     public void setState(MonsterState newState) {0 d! k( P1 @2 s. W" a! z' k" I# P
  21.         this.state = newState;
    4 ~" U  u2 L& Y3 Z* C
  22.     }- \5 e7 Y9 `6 h# _! {

  23. . T9 ?8 t- Y  p: c) u
  24.     // Выполнение действий на основе текущего состояния
    * l+ m  }# E$ s5 p* {! b' d! m
  25.     public void executeState() {
    2 |  Q( y4 Z! i& h6 ]# ~  @
  26.         state.handleState(this);3 l. k" h6 @/ t; g! V
  27.     }/ }9 K7 Z$ t& d  z; X1 ~7 z

  28. 1 B- w0 B0 k/ N8 ~
  29.     // Геттеры и сеттеры/ a1 V5 \3 y7 ^( a  d% s
  30.     public String getName() {
    * ?; C& s) a( f0 h
  31.         return name;- j5 Y4 A& i  ~* y1 g& t7 z
  32.     }
    9 k" T3 W6 n- b* y  S, ]7 M

  33. $ B( C6 h8 t2 W; ~3 _
  34.     public double getAttackPower() {
    % \- d6 ^! A% E3 ~' H9 a/ h/ H$ f
  35.         return attackPower;
    : y8 Q/ M7 k' @; `+ s
  36.     }: g4 T* }) z$ k
  37. ( F& j; @6 r0 N1 }) x# w. K$ T
  38.     public void setAttackPower(double attackPower) {
    , N9 i8 ]5 r  m7 D2 l$ j) N: Z' b
  39.         this.attackPower = attackPower;
    * Z+ ]0 [  d. i; U; }; ]+ W1 }
  40.     }
    % k- _, p# s4 T7 ~, l' u; A& X3 Y5 U
  41. }
    ; D% L- G# O; e
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
" e) x) \) s  r6 ]8 A7 o
# w& G1 W0 P# C. Z' S
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 y% m/ `' ^9 Z; j
  2. package org.l2jmobius.gameserver.model.battle;$ M( @* d! w: a" K3 r1 \. }
  3. 5 V% F8 f# y) H9 D' a3 c0 m3 T, J% Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 g2 e, D# x- z/ c
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " m& T6 K$ f4 ?  Z& F( _

  6. ) @; b' {, T8 }' t2 v7 Z1 O
  7. public class BattleSimulation {
    4 p7 F9 l, B: ^2 c- r* H
  8.     public static void main(String[] args) {
    ; h7 p% W- B( e: e% v
  9.         // Создаем монстра
    % |% K3 f/ h7 g) W% S
  10.         Monster monster = new Monster("Дракон", 100);' E$ k9 ~2 S3 Z0 K& _
  11. * ]8 j* w" h! a* _" }  J/ K
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ! Q3 ^( U8 i, W) _5 I: ^
  13.         monster.setState(new AggressiveState());4 N% W( n+ C+ \8 c
  14.         monster.executeState();
    - e6 e0 f9 d! ^# Y- w% b4 s3 b* x
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ H# l9 X( X9 b/ D. s
  16.     }
    & Q5 k4 h6 n$ \2 I2 j/ r
  17. }
    ; j8 y& L; U: f; U
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
) v# \$ O! D: U# w: l' IЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!8 f  R8 Z0 ?% }* R$ D, }& O' Q
' a! I8 u: L# B* E* L4 B( Z
* Q$ S' W, m  w- y" O, j  C/ @) N0 m: s
. a3 s0 m# r# a. N$ K) ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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