Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# ?& {0 s  q' P5 \, d5 c4 M/ Z6 E" ?7 y' o

( b; T: m' S7 V$ V+ Z5 PЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.' H0 n2 M, |7 w, N* t) g  k* Q
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!2 O# Z- v0 t' z! u6 y4 n& Y
Астралия ?/ y1 z3 D% ^8 R+ O4 ^- c$ N

" m, ~1 `! s3 ^# o) ?7 p

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!4 U+ |2 [6 l  Y) S
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?6 q  T4 }% X2 n8 I) H7 c

/ C2 Z6 _! ~( ^0 D; p
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
( x  G+ X5 i& \# y& A; q3 s
AlexCoder опубликовал в 2024-10-16 18:31- g" u0 ~' T" F$ f3 U' F" j
День добрый!
2 e" A! \2 Z1 ]6 y) W' q5 d' v- M% CВ статье описано взаимодействие игрока с N ...
7 H/ U+ B3 d5 \3 ^
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & ]- E" N" B: ~  C1 I
# n, G2 g! M( ~" w* b, D( j$ d
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
, m. L6 {, a/ r- T6 Y; Q1 Z& K! h% r( G4 |7 q( O
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 f6 ?5 n9 u# y- _) H! q9 D
6 u) n. ]) X* P
  1. <font color="Green">// Пакет для состояний монстра</font>
    ) V9 o+ [0 M) y9 J" x2 v9 E
  2. package org.l2jmobius.gameserver.model.actor.state;
    # U+ B! C/ [! u! Q, c5 H
  3. <font color="Green">* C% c+ U$ A# L# l7 w' o1 G
  4. // Интерфейс, представляющий состояния монстра</font>& y7 B  [+ J. M! M1 f! D" n3 G
  5. public interface MonsterState {1 D: G- g! u  C7 |$ h; `/ p
  6.     void handleState(Monster monster);
    2 D& v  y( V  `& f+ D: s! t
  7. }4 e9 L9 v5 r, g( V6 e1 s
Скопировать код

( C, p/ u, m  c- M. g: ]Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 g* J8 `. A8 @5 C8 A" {, m; w
) J+ Q! G# I4 S) J1 |Класс для начального состояния монстра:. j7 Y% e1 L" j' P! I% A- _0 Q
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* e& n2 S  P  M* e0 o0 V+ y
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 t" ]$ ?1 B6 B

  3. 5 s% w  J: N5 W/ G% S
  4. import org.l2jmobius.gameserver.model.actor.Monster;! z  @4 W* n: @
  5. ! e) h( {9 K1 k9 D5 c8 {+ H( e( {6 |
  6. public class InitialState implements MonsterState {8 g9 P# v- t) R1 }. w0 d4 Z
  7.     @Override
    * _) E* f  Z6 L" f9 _* ~
  8.     public void handleState(Monster monster) {
    1 A7 A6 z0 s' |1 |& ~5 K+ P3 ]
  9.         // Начальная фаза боя% F+ h+ D8 B  G) U0 s* x# N
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 n; C+ C2 H. n9 N5 y) q
  11.     }! R8 k3 \; X) J7 Q+ E
  12. }
    $ n% \6 X! r9 F7 ?/ X. q
Скопировать код

  S3 i3 @0 n; N6 v1 o- ~; s
; r8 l0 ]7 K+ e8 G( P. @* D6 M) Y; k7 _5 b" f  V& d" s  o
, q; M: G" t& K# [1 L
/ [4 [, C0 ^# Z

: O3 n8 E) j% q' a3 J7 k/ \  p/ e% g( {2 U
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 0 E' N# ?5 t( W( u7 G/ t
) R1 }& a( p& e  e* _# i" t, I
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., A9 G. D+ Q9 `& c
+ D) S0 Q4 s9 M2 X  X; `
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 B" o# m  R1 d1 G8 e. H* s. a/ U
4 {. v- }& v; d5 X2 v
  1. // Пакет для состояний монстра
    , N6 ?2 O9 Y5 f# @, T$ `5 n7 ~
  2. package org.l2jmobius.gameserver.model.actor.state;, y( j1 _9 i4 u+ w: X& e
  3. $ h! P' M- a& c' ]
  4. // Интерфейс, представляющий состояния монстра% @  h9 L  o4 @6 M4 @
  5. public interface MonsterState {
    - s2 z+ b5 R) _' Z6 M3 {: c6 }
  6.     void handleState(Monster monster);
    ) B6 M# k% A- l+ u- N
  7. }; f& u, z0 ?1 D' {
Скопировать код

2 u6 J+ ^8 S# ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 u1 {. X. ^. ^5 V4 D) B; |1 d" M6 ~: r
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.- C8 G  l0 Q0 u4 {4 K

2 q3 J% F" |% T  m2 B9 I" V7 nКласс для начального состояния монстра:
9 |' N& L9 V4 b3 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' u7 |8 b$ |: f$ U6 ]* w6 r# R: y
  2. package org.l2jmobius.gameserver.model.actor.state;5 X2 c# p  h* g5 d

  3. 8 \2 S- l4 Q* f( ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , w' o6 ]; o  R1 }, Z$ v* ?* M7 ^1 X/ D

  5. 3 L; k& ?; Z: F& t+ [
  6. public class InitialState implements MonsterState {
    0 Y! c3 \3 V6 L" O0 G7 T
  7.     @Override
    : b+ K1 e# d# Y$ T8 K/ t' c% J
  8.     public void handleState(Monster monster) {1 c2 I: r, ^% N# x8 L: Y$ F' ?& z0 F
  9.         // Начальная фаза боя
    0 d! l% J* x7 h+ B! X
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");1 [7 g2 P) ~; N( [* i
  11.     }4 l* K# W$ P) |9 a
  12. }
    * |) F. Y7 v2 g9 I8 G( d
Скопировать код
Класс для агрессивного состояния монстра:
( }( W) \- q9 ~* s1 X6 L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 @' L9 O5 N. \- y
  2. package org.l2jmobius.gameserver.model.actor.state;) d8 @* d% i  k- r$ i$ P/ h+ l
  3.   c1 s- o/ L( U+ S% R- H6 V
  4. import org.l2jmobius.gameserver.model.actor.Monster;* h: L# X! j0 J0 Y
  5. . D$ ]  r. ?( h2 h" S/ ~# R9 [
  6. public class AggressiveState implements MonsterState {
    % _2 ]$ L8 n" t6 ]
  7.     @Override
    - R7 i( Z, b( F* t
  8.     public void handleState(Monster monster) {! T* @) m9 r" y8 Z& Q- f
  9.         // Агрессивная фаза боя4 c9 ^6 l8 W) b$ E, H( |4 i0 Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    $ l( u# P- Z" K+ l0 a
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки7 D6 d; z( n  f2 g
  12.     }( W2 {( [# c/ y* C- V! b
  13. }' G, t( u+ ]+ A) c$ h, s
Скопировать код
Класс для финального состояния монстра:
% J" ~8 [& Z1 V3 d& K6 R& F; t: h: M
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " }2 Q' n8 a& Z7 D
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 X% q- r3 x1 t* q/ F) W

  3. 8 l# T1 \  G4 s% E; P/ N( O8 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 @7 M% r$ v' l+ y$ y
  5.   S. U9 P' v( U; h4 b
  6. public class FinalState implements MonsterState {$ T0 X, Y5 }& A& |; r( x, f
  7.     @Override
    4 n3 d% X! e' t& Y* ]5 K
  8.     public void handleState(Monster monster) {
    - D6 Z' e& O5 ~7 P
  9.         // Финальная фаза боя
    8 m2 [; ]& L2 n% b3 {
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    - k& H0 W$ [; n! A
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    5 e0 F% z! @5 h
  12.     }" d* _+ o3 E1 S9 o# l
  13. }% }$ S% D0 A3 o$ `9 q: I+ f
Скопировать код
. E, w3 U8 I4 q. D% @
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* ]" b" c% W' z# H& x$ u
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , |4 G$ I9 s8 v
  2. package org.l2jmobius.gameserver.model.actor;
    + P' n# e- a/ _- S

  3. , l0 \% j* j9 S7 B5 |8 G0 ?) i  I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 f/ I- g7 {1 f$ X- X0 T
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 R5 R7 \2 K& v; N* W+ r
  6. 9 l( l- {6 ]  k8 d; \
  7. public class Monster extends Creature {
    5 g( c) z8 p( z" s
  8.     private String name;
    4 x3 T0 ]# p' W7 F
  9.     private double attackPower;
    3 U) Z7 x% H/ @
  10.     private MonsterState state; // Текущее состояние монстра
    8 o4 S" M- d! o1 U# A! h

  11. 9 l* _1 c8 Z. z5 Z
  12.     // Конструктор монстра
    # V- b4 O4 q% Q5 d) g2 S
  13.     public Monster(String name, double attackPower) {( o0 t/ c( J6 A) ]0 `" q0 z
  14.         this.name = name;6 ?' ^( f8 L3 ]0 h5 v- T2 p
  15.         this.attackPower = attackPower;  @5 H% y3 p0 F
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ; h4 m- p3 A$ m: k2 c+ p0 n
  17.     }
    4 J' w% E' m, s) ?+ r: g0 W
  18. 1 M* ^6 b5 G! t8 v2 d
  19.     // Метод для смены состояния
    : f8 B  y) t3 K  A) W
  20.     public void setState(MonsterState newState) {5 {5 S% ]. a7 [5 |
  21.         this.state = newState;
    " v& x* K" Z/ W3 R/ p9 _$ [& K
  22.     }
    , q" g! n% [- l" M
  23. $ n! {" i# U% b/ _
  24.     // Выполнение действий на основе текущего состояния+ \% h7 q8 V1 b
  25.     public void executeState() {: _5 }! w* \! x2 ?! ~( d
  26.         state.handleState(this);
    : x) w; o5 @2 r3 P
  27.     }
    / y; t" _# z; [  s3 ~# |- |
  28. ; L: M7 x1 B, f
  29.     // Геттеры и сеттеры
    * k$ `1 S! W# {1 X. m5 n
  30.     public String getName() {
    ( D: m, B+ p6 q7 n
  31.         return name;7 Z5 E8 c  S5 }
  32.     }. G$ e6 M  j' Y. S2 V1 |( y+ ?2 Z

  33. 7 E5 k" A% w+ R5 ~& b, E5 o" N
  34.     public double getAttackPower() {3 |+ \7 P3 n# o; E
  35.         return attackPower;
    ' V) f8 y5 ^" @" }5 I, }1 _
  36.     }
    , R) B  C2 q. c; o8 L

  37. . G. y( C/ u8 R: x9 u1 Y2 j  X" d
  38.     public void setAttackPower(double attackPower) {4 J1 c$ H0 Q9 V: r8 w$ ^
  39.         this.attackPower = attackPower;9 R0 R- P9 d; n$ e
  40.     }
    " Z  \7 E! o0 R2 P
  41. }
    6 j7 N2 p. s& l  ?
Скопировать код

' c( b/ p/ \! j) g, vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 P9 F! u4 |7 @* D. Y% |
9 a% S# s+ t0 f9 T; T% F/ I
  1. // Пакет org.l2jmobius.gameserver.model.battle$ t* ^$ _+ o# M) T6 M' o+ \0 a
  2. package org.l2jmobius.gameserver.model.battle;
    - t4 S+ W/ j5 H3 b$ ]

  3. . o/ S8 r( e- x9 J9 G3 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 N' h. h' T5 F$ V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 P6 }( {- o- i
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    8 R% V) f9 I8 V! M) S: z) y8 Z. K
  7. / p6 E' Q- G% `0 d8 v
  8. public class BattleSimulation {$ n$ p6 c. n( k% S) o' a- R
  9.     public static void main(String[] args) {$ o; [2 t# u, i; A% H
  10.         // Создаем монстра с начальной атакой8 A  U  c8 \, b7 n% X) F% x, c2 K
  11.         Monster monster = new Monster("Дракон", 100);9 _8 T3 K% ~$ o" u2 |0 }
  12. + c) O" |1 H9 T! {! \3 f
  13.         // Начальная фаза1 M7 O; b7 J3 [5 o3 S7 u1 t& R0 d
  14.         monster.executeState();5 X8 h6 W- m/ D" s0 u6 Q% M

  15. 9 t; c0 i0 J, N
  16.         // Переход в агрессивную фазу
    % J; {+ Q5 ]9 `
  17.         monster.setState(new AggressiveState());4 C' I" K# R% m, H
  18.         monster.executeState();
    ! b; X: M; @- j6 q* ~; t; w  @% b" P
  19. : `2 a' O5 O. p8 o
  20.         // Финальная фаза
    - r* ^/ E/ l7 E1 U& l- Y
  21.         monster.setState(new FinalState());
    " `3 r. ]! {$ n  A5 @4 g$ J
  22.         monster.executeState();  ^. \! Z- ?$ X( E6 A8 e
  23.     }$ e/ H8 i: v  p, i
  24. }$ J+ H* ?( C9 }4 j
Скопировать код

  \, s9 c% ?9 y8 ?% u  yКомментарии по структуре пакетов и классов:
! E8 P/ t1 x! I' s
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.! Z$ ]5 X) v3 E4 v, q5 `! X! u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
" k' s* S% Z2 B5 n  z# kЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!  l3 G$ m. e, P4 f0 ?, z- r
! p2 e$ z8 M9 r* I0 `

$ g  ~2 n. i! q
1 y& }' w1 ]' g  N/ c* i8 J$ F5 Q
& c5 C1 L' C2 }* }! C& A1 x" q7 ~/ i& S# w2 H- l

, p) E+ G! e$ p( a3 o( ^. L5 X
, E2 j; Q9 L0 k$ J* X
3 }- [+ ]/ {# ^+ g! E$ U1 o) C9 Y" y

: }! f' p5 r  i* E( M, A; {' E6 F+ S' t

7 W+ a! V: ~0 \) y! \6 ~- T! i: ?# I/ E- }! w) h
+ ~- a/ G! r2 w/ E+ k  G* c
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' r! s6 \2 g# P! z" h  W" M: rДля управления сложными взаимодействиями, такими как  ...

; ]& q3 l3 M. d6 ~$ R1 u& tОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:217 W7 R; R: n- z; v! G; C2 }; H
Отличный подход! Использование шаблона "Состояние" де ...
+ K* G8 U: ^1 i$ b5 q( A5 A* X. J- r
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
7 t0 `5 `  U/ h6 T4 q- h0 B- Y, }8 a( M# Y  c
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.' }' s8 h5 f9 A- n, s! [  r; c
. E5 b) ]6 V- V
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . D" @$ v, o& E
  2. package org.l2jmobius.gameserver.model.actor;7 T: p" J7 t1 Q, y6 O

  3. % ^* C; Z) Y0 c5 A
  4. // Перечисление для типов атак
    9 R. Y* S$ ^$ r9 C  X7 {: \7 b6 u- e
  5. public enum AttackType {& Q& _4 @; p( m$ l- B* ~2 X& u
  6.     PHYSICAL, MAGICAL;3 M( Y8 G% p% [
  7. }/ `, X: x! h; s1 ~( Q9 m
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.' q: c; @1 Z( d% o
Обновленный класс для агрессивного состояния монстра:
+ F) U2 {6 Y- q
7 m2 n. Z! A; I$ h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # b9 @% ?* }0 d) A& a5 O. k0 D6 z& j% R
  2. package org.l2jmobius.gameserver.model.actor.state;6 O* s3 B6 h" b: \' Q6 ^) U, ]

  3. ( A% R6 a( e4 \/ k% }3 a- Z* l
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ V% z# \6 o  ?: q9 r
  5. import org.l2jmobius.gameserver.model.actor.AttackType;+ Z0 E% x( Z+ W* A

  6. 6 e" N) R# H5 D* u! p
  7. import java.util.Random;
    8 |" j, O8 D  s
  8. + v5 @" R; C- T1 a; k+ |6 G) E
  9. public class AggressiveState implements MonsterState {
    ' E  n9 ?& N" L9 g) i5 ?+ R9 }
  10.     private Random random = new Random();- R8 `$ L$ d$ J, S. g
  11. 2 N: g. `% F; j9 o7 z
  12.     @Override
    9 o7 n& c* X4 k9 _$ I/ \% {
  13.     public void handleState(Monster monster) {
    . Y" {( G$ M( T* @
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ( U) _% r6 N" w2 G2 N& `' y' {$ M' n
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- P7 D9 g. a: m$ I
  16. ) N5 o; o; C) c4 x2 j* Z; x
  17.         // Логика для агрессивной фазы боя
    & @4 k- U$ W5 g
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 4 F/ e/ w5 p1 E2 |! y5 \
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ) L; ]7 m  W# `4 H- F' H' [
  20.         
    ) i8 v) t. I- v. `: F5 \
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 z7 V' S7 n/ L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* E9 n. |3 e- i  \' J, x, @
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);" X, v. r* N- n! K+ q
  24.     }% t  \! `3 n3 V( F2 [6 [
  25. }4 Z- g3 K4 S" P) C0 v
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
2 p6 ^  P/ S$ m8 m5 S5 o/ _: d# b7 R1 i% M& y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 ~8 W4 Z$ G/ r% i
  2. package org.l2jmobius.gameserver.model.actor;
    $ D. s; ]% Z( l+ [2 M: M# c7 h( t

  3. ; z6 |% f7 }1 Z" }$ P$ x0 Z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' B; Z1 l/ r; Z- W  j5 O# K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    3 x% }- `0 [% `6 r1 L# N0 J

  6. 6 ]; t& C) O9 e1 \- s0 N. o% b
  7. public class Monster extends Creature {
    - s* C8 y0 w( f0 o9 f: ~6 q
  8.     private String name;4 N1 x& z5 Y7 A6 V1 D! ^
  9.     private double attackPower;
    5 i/ Y& q& g. c
  10.     private MonsterState state; // Текущее состояние монстра, V* X0 @7 m# s. c+ d* T0 T

  11. ; l* X8 L/ S! R! Z/ i( u" b) d! }
  12.     // Конструктор монстра  Z9 `+ b1 }: Y* J8 y) P
  13.     public Monster(String name, double attackPower) {
    5 b1 s% t/ m; `# l: ]+ I
  14.         this.name = name;
    1 _: X0 H4 j6 j; ~* A+ p
  15.         this.attackPower = attackPower;  x1 @" q8 P# s3 |- @& _& K/ {5 W0 ]+ Z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 r1 V/ G( H4 J! e0 q3 s) w
  17.     }1 U- ?) m+ E  R0 D  A0 Y
  18. ) t) S/ y7 [$ q
  19.     // Метод для смены состояния% F8 ^! D+ Q2 A! x( F7 H
  20.     public void setState(MonsterState newState) {
    / S( G0 q8 f) N7 f6 O/ i
  21.         this.state = newState;
    4 U6 f9 j: }$ _9 z0 M
  22.     }3 @! N3 l" ~2 g3 O
  23. 7 Q0 C8 Z$ M3 |' p! t: {3 {/ r
  24.     // Выполнение действий на основе текущего состояния
    . a  Q! `& h% r; F5 W+ b0 n" |
  25.     public void executeState() {
    8 k' r+ P1 ^. _. A2 y5 s
  26.         state.handleState(this);
    $ m# F1 Y0 F) ^2 ^
  27.     }
    0 H* c/ p  Q0 {% I/ j2 S3 R
  28. ( s) X' c  P* ]3 ~, A- `
  29.     // Геттеры и сеттеры
    0 o9 T0 G2 `# [+ s& [# W
  30.     public String getName() {  H/ G+ l( I0 o0 \( U5 i" K9 M
  31.         return name;
    - \+ I) V# v/ H: V
  32.     }( T/ ~& x+ U' {2 r
  33. 7 X) `' t) u3 ~& X
  34.     public double getAttackPower() {# k+ k( T3 x0 m# H. e" n
  35.         return attackPower;
    5 a, Q% a& C/ f$ k. A
  36.     }# D+ w8 Y. i, j& q$ Y6 }% }
  37. 3 P! o: w+ Q4 v
  38.     public void setAttackPower(double attackPower) {7 K/ V3 m4 W: k2 j5 R* [" r
  39.         this.attackPower = attackPower;8 G+ x" h9 R7 t  t/ v/ E* E
  40.     }! g/ I' z% m% r$ \+ w
  41. }) _! e1 B; ]$ E, }
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
1 p3 A6 c7 g; ?
3 W- j% A% H1 G% E2 i# [
  1. // Пакет org.l2jmobius.gameserver.model.battle
    / d+ f. c7 J. b+ v1 }
  2. package org.l2jmobius.gameserver.model.battle;
    ( B( N1 C6 _2 H  S! |  i$ a, T
  3. ! e& s% t% U' Z+ h& c' T+ V1 R9 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 u! R' S% [% O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- T6 w; u: n2 h  d9 r0 O; m( a

  6. . O5 {8 _# D3 R! j
  7. public class BattleSimulation {
    % P' q* T3 ^, q* b2 n8 P
  8.     public static void main(String[] args) {
    ! q8 I/ a) t  H$ W5 u* i; }
  9.         // Создаем монстра
    , f( ^- u! S6 w! d
  10.         Monster monster = new Monster("Дракон", 100);* p. Z7 ?5 a4 T' r% `

  11. 8 Z$ T6 ]& S7 ^. G0 S0 m
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак# W7 f& y! `/ Q* U$ v
  13.         monster.setState(new AggressiveState());4 t( P- x8 M' r# e( y
  14.         monster.executeState();5 ~# W- `  i8 t2 Q3 |
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак& ]4 n) S- a$ b2 l1 l0 q
  16.     }1 I8 v6 I! t2 l
  17. }2 l2 U- k3 r# G  f+ {+ c0 t
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.  o" g9 d- B; p1 r
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!# u7 O" z: M, ]% z7 E
3 a$ o8 x- w" h8 G' p
7 b: K: ^, [" j. A

9 ]# M/ r; b7 m- S& v
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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