Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!* Q& t, c/ P4 f# [+ h2 }" C
& Q! D  V: B8 x5 N' _

! L  x" L2 [: v0 }Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
  ^/ C0 ~3 O- f. X$ w" |( HЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!$ ]! g2 I3 w5 j
Астралия ?
- s  f4 x8 ~& n! ?3 t
! O! L& M# U! ^/ |

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!1 x1 \2 Y5 j2 R' k3 ~$ I
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
  @$ Z) o% ?- ^; `5 p, V
9 @; h. ~, {* Q' s& j* v- r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 : `5 r3 ~# ?8 a
AlexCoder опубликовал в 2024-10-16 18:31+ n5 q# K) h. \- B" [) i
День добрый!
: c: F2 @" |6 J1 q# p! d. |В статье описано взаимодействие игрока с N ...

2 V6 P, B: F* _: ?' C* FДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - e# ?1 o0 [# d1 v" H% Z# h

6 v) i  h$ m3 h: w; X* J: sЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  n) z6 m; Y7 q7 s+ O+ [3 n: y' {7 c: M5 Q( P+ R
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% w' O* M5 d* Z  P% s& c) a; m0 h7 h* q" T5 ]' D6 F4 y- y
  1. <font color="Green">// Пакет для состояний монстра</font>9 ~- A4 _1 j& H
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 i- w& m% u4 S3 T; z; {/ U
  3. <font color="Green">
    1 t0 O/ z7 Z& a% f/ \0 j1 P
  4. // Интерфейс, представляющий состояния монстра</font>' R1 \0 T1 H$ V+ k. f6 K, k4 }
  5. public interface MonsterState {
    ) l' U% w, I; m3 Q  n
  6.     void handleState(Monster monster);
    ( f8 K( }; d9 a) f% }0 G* y* d
  7. }
    " q5 D; S% Q  O$ `4 G. `  O
Скопировать код
/ x" J9 j* Z3 R8 R" W
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. Y2 n  k: a$ D( J
1 i7 ]8 U' ]3 K4 m4 P
Класс для начального состояния монстра:6 x& Z0 ?8 h' J# o
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    " v4 `0 A4 ?, I6 h: D, ?% n- M% U) {
  2. package org.l2jmobius.gameserver.model.actor.state;8 x! l2 z7 O$ I6 g" R
  3. . `. V# a9 n+ E! b! }2 z$ b# n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * \$ W5 \6 H6 d; X: S" i0 G
  5. 7 B, w+ |! q% R8 N. X
  6. public class InitialState implements MonsterState {
    2 w: {1 Q. M( o( @( y
  7.     @Override
    1 v5 n. n/ r, N( g" A: f
  8.     public void handleState(Monster monster) {- Z; {1 W  J. b
  9.         // Начальная фаза боя4 [$ B2 X. y" d/ e% W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ) Y4 w2 b0 ]& M- L& r- Y. R1 q
  11.     }6 r5 I7 }* Q3 z
  12. }6 |/ R8 ]8 T9 E5 {% @. y  d# x
Скопировать код
* v2 I. t4 u- _0 f9 F  r; f

) X: U, U, P, k& s2 s5 q$ f" L# u, B8 o

. d8 B8 |, p# m) V& `2 s7 p7 B6 C* s: x0 D- \$ V2 c) D3 m, L

" _' ?5 C# K0 y; F7 Z, \9 T/ H% c+ g4 U
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
' {- B% M. \" i2 q! ?) }1 A/ M- o! o9 h8 F) ?4 {& V# _* f- s
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 [9 E. C, e/ q- J/ }4 T$ N5 k! N, ~
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! \5 z5 {) [# n* v, O; {4 y
# s; ^$ ^; V: l6 B% h' q
  1. // Пакет для состояний монстра! c" @9 S" W; n: d
  2. package org.l2jmobius.gameserver.model.actor.state;6 I( K3 W* y6 e2 S' V! {
  3. . t3 ]0 R4 P( S7 W3 {
  4. // Интерфейс, представляющий состояния монстра: F5 T8 m' Q8 {3 n# ?1 ~7 u
  5. public interface MonsterState {( }! o1 p9 m. \: N, h7 o8 e
  6.     void handleState(Monster monster);/ r5 c$ p8 ~2 O$ X
  7. }
    9 Y% h' B6 V0 {4 H
Скопировать код

/ }- }  g5 ]/ V$ O3 lШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ R% V/ {7 S, ]- e( t& P& P

0 O8 H5 g9 k" {4 e' i, u' N4 rЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: Q3 {0 V1 q1 D0 Q) D
, u# p& W9 t% A1 c) P
Класс для начального состояния монстра:9 q7 ]; Z8 a- F8 H0 s0 b! O! Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / y0 Y& R) X7 R9 y# E. n. P1 W
  2. package org.l2jmobius.gameserver.model.actor.state;. D! X  p3 q- q) r

  3. ! Q6 a8 s, g! V+ k: e
  4. import org.l2jmobius.gameserver.model.actor.Monster;# e: n) c5 E! ?, s$ i& f8 `1 D
  5. 9 n/ l/ T; r( ]  ]7 C+ i8 |5 W2 {' e
  6. public class InitialState implements MonsterState {' {  z$ g, \/ S$ T
  7.     @Override
    , o8 N' Z8 T' p" ^
  8.     public void handleState(Monster monster) {1 a3 G2 M6 S! @
  9.         // Начальная фаза боя
    ! P1 R2 Q9 @8 [/ }' L9 `. @% u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 Q$ t' A3 r( r, H* `  P
  11.     }
    4 j) F; S0 ~6 n
  12. }
    9 j! U4 Q+ G0 ]
Скопировать код
Класс для агрессивного состояния монстра:% w" h) j2 L, }: o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- Z! k( ~! M! p. b
  2. package org.l2jmobius.gameserver.model.actor.state;7 X3 {8 `+ w! a$ D; n( I7 ?

  3. 9 X$ Z* `7 P' A* H4 _3 T2 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! ~8 ]! e) G' ^; Z
  5. 7 b/ r' v' |/ e  H+ S/ P
  6. public class AggressiveState implements MonsterState {
    % B- H" |& f/ z( V
  7.     @Override
    $ r1 D1 {  B3 _+ A
  8.     public void handleState(Monster monster) {
    ' B# }# x! A% R- t9 c) U
  9.         // Агрессивная фаза боя4 w9 i  P' {9 }# P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 g+ [9 S% z: q, b0 k
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки7 ^2 r9 N8 j, o
  12.     }
    8 |, k" u: Y# u0 b" i$ ]
  13. }
    . b, c  |* A0 r! Y# l! c
Скопировать код
Класс для финального состояния монстра:8 E3 G; b) n/ Z, |4 d& V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* ?8 A6 |9 e7 w0 L
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! z- k- l7 a9 z- H  C& {
  3. : F# N5 R) N2 O5 f0 G( w+ Y$ j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 [# g3 S% Q9 s
  5. / m6 F" V8 d* K
  6. public class FinalState implements MonsterState {0 o) C6 u! I- G1 K, f
  7.     @Override3 x  S0 z( S$ r5 H8 U4 Z
  8.     public void handleState(Monster monster) {: H' f, c$ y! y1 [, D( @+ N
  9.         // Финальная фаза боя) T  X0 i# g7 d3 J6 Q4 @: }
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");1 t# L2 f! i3 c
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : o8 I; |1 j6 X5 W: ~
  12.     }
    # v, `% j" \. D
  13. }
    4 o: ^& G3 L# c
Скопировать код
0 _3 u5 Q) ?6 ]5 u
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
3 y( {/ g; Z6 x2 Y+ h- U
  1. // Пакет org.l2jmobius.gameserver.model.actor% W2 _- X3 e. f3 N7 l2 }6 t* A
  2. package org.l2jmobius.gameserver.model.actor;
    0 j+ `/ ^' L: `; j3 F9 K

  3. ( L) v- b! F" Z6 ^* b0 ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' {. e8 I% C1 n# U! O. v5 s3 s' |3 p
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 @8 ?8 M6 u, l' B% |( g; _3 M
  6. 3 f5 ^* v; Z4 Y  B  R: y
  7. public class Monster extends Creature {! }! ]( Y) w' L! D" Q, G
  8.     private String name;
    # }- I* w' s7 g! E
  9.     private double attackPower;% o2 m* p" m; R0 G! D% `+ v  s& q
  10.     private MonsterState state; // Текущее состояние монстра  B4 |# O0 f; i! `: V6 X

  11. # U' Y+ w: l' _0 @* o: @, @3 t2 l
  12.     // Конструктор монстра
    : Y8 ]7 P1 P/ b  c7 C3 X
  13.     public Monster(String name, double attackPower) {$ m! K) P* H8 K$ C! Z6 E- k
  14.         this.name = name;
    ( W+ Z" W8 s2 w: H
  15.         this.attackPower = attackPower;- E. V% S0 g6 Y0 g
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние* f% S9 T: K0 z' p7 D
  17.     }8 e* q/ `  B. n; b: w
  18. 9 `: F! @3 J* _5 @
  19.     // Метод для смены состояния
    + _1 w. D! x0 ]1 z  t
  20.     public void setState(MonsterState newState) {
    4 z* x* r2 C* M0 a
  21.         this.state = newState;" U* _4 _7 t% S9 F2 F
  22.     }
    & K) J1 c8 _/ U

  23. - j% p+ ]- s% P% ?0 M
  24.     // Выполнение действий на основе текущего состояния
    5 [8 D# V) A: R  Q2 ?
  25.     public void executeState() {# V7 F9 i3 \$ k" G7 a
  26.         state.handleState(this);. V/ C3 O$ ^# }, T6 h! v
  27.     }
    : r; I  d! X8 V5 _- p, A
  28. ( ^1 ]( p( S' [  {: g
  29.     // Геттеры и сеттеры
    + }2 j& y. f  v$ c6 R% z4 t3 o
  30.     public String getName() {
    + ~( Y! W  o& @5 @, K# u# Q
  31.         return name;
    ' B# @5 h! M9 W* _7 w
  32.     }
    7 i4 V8 K2 _5 X. j

  33. . A- c9 B' |$ H- v. l
  34.     public double getAttackPower() {+ n- _2 F4 _6 E4 j( _
  35.         return attackPower;
      X, n; W4 ~' d2 k2 s1 J0 B
  36.     }
    : E' j' X! R" _, m0 }! l
  37. 7 M1 s: p- K& \7 k
  38.     public void setAttackPower(double attackPower) {: y& O% s1 i, I/ b
  39.         this.attackPower = attackPower;
      f7 c! J/ e( \6 b9 d- x- P
  40.     }  ^; Q' Q0 }( X1 ^+ ~, t
  41. }
    + g4 t  [. `% X  q
Скопировать код
) W* F8 ~5 Y/ ^, K# v7 Q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 r- B8 y3 \( B( J, k
& s- w+ b" |8 X. \5 U3 l! F+ Q0 o: _
  1. // Пакет org.l2jmobius.gameserver.model.battle
    7 F' U( ~; Y: Q6 }# o# G
  2. package org.l2jmobius.gameserver.model.battle;
    8 l3 I/ x" }4 ]3 W( w
  3. . H+ |- l4 n/ z0 f1 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + R4 P  v8 H; |: T' L1 ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' C# D8 y9 d4 L4 J4 b; m
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;3 ?5 T" z! g0 }3 B! @

  7. . q. F& R1 ^/ f
  8. public class BattleSimulation {
    * V5 a' t  L: n  Y6 s& M% @
  9.     public static void main(String[] args) {
    - x1 i$ T% k. H' w0 C# }
  10.         // Создаем монстра с начальной атакой
    5 v1 T/ ~# @  G" I7 j& F
  11.         Monster monster = new Monster("Дракон", 100);- F  E9 t' E. N9 m' ~2 g
  12. 5 G/ S- k8 ~9 A, v/ A7 h2 M
  13.         // Начальная фаза& T& v" M% Y. |* _1 M1 @
  14.         monster.executeState();
    , s9 W+ C& A1 ^3 ?6 U

  15. ( h' q+ M2 V" Z$ g  [" Q! Y
  16.         // Переход в агрессивную фазу' J6 ~+ Q6 [: d, o
  17.         monster.setState(new AggressiveState());
    + G+ O4 z9 x7 {* ]$ g1 W9 a9 t
  18.         monster.executeState();
    3 w0 ~6 L) ]. m9 W& p
  19. / A. N9 u) e2 e# x( L
  20.         // Финальная фаза
    8 Z" F& P7 n8 t, d
  21.         monster.setState(new FinalState());6 `" H( v* T% {
  22.         monster.executeState();
    4 e+ h2 A8 T! k# V- X8 p' a
  23.     }
    . r/ q* F4 Z0 @9 i% F2 M; O1 z
  24. }4 W: m8 p( j8 l/ p0 M8 c9 V3 e
Скопировать код

' }2 I4 [% G1 }- y6 ^# Q4 r  ^Комментарии по структуре пакетов и классов:( d2 m9 S( j$ @2 C
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.. Z; H; \6 u* l3 G1 e, K
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; N! F* |- B, a, h
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* E# B( Z  P  y( d4 ^; l( r" f0 @9 F" d, E9 I1 Z3 A
6 \; }5 t; p; \$ }0 ]' u6 M# i
/ A/ i7 k2 H* ]$ |, Z
* N: J7 X1 V# o+ o9 X0 O. \! C
3 o; A2 v0 S- U; }7 y# S! H

. G4 y0 X( x' {! ]6 w
+ {& y) U. U$ k. K# K& S' K5 ^) [3 i
( D8 X! {5 j% o3 h0 [! g

1 A: _1 n$ U! F8 w% t4 p+ G+ d
( o! ]4 {$ y& m$ I5 d- K9 _; d+ \+ h4 B; S2 v
4 I5 s6 @1 E% z
6 w/ O! H$ h0 }( G& d/ N' m6 ]6 s
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
( k1 R, s0 j1 L* ^: ~# B" k9 d0 WДля управления сложными взаимодействиями, такими как  ...
6 Z# ]9 D: h9 a* I  d2 w
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
  U8 a* v$ A7 f; F# e% ^6 l% A0 h8 zОтличный подход! Использование шаблона "Состояние" де ...
. d& ?/ `2 ?- ]* i, t. D7 c
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% w; N6 v# ~" v1 f6 z  m$ {4 [8 V9 z# y
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.  P/ [2 h$ }! U$ e6 X2 Y$ s- a

: q8 t2 y  w9 m" n& i/ f# g) r% b
  1. // Пакет org.l2jmobius.gameserver.model.actor, Z) W3 P: ?" C4 m
  2. package org.l2jmobius.gameserver.model.actor;
    + E7 Y- d, c$ Y2 H: m7 F; R

  3. 0 u. W9 p3 d2 w$ N: ^3 d
  4. // Перечисление для типов атак6 _7 w& c# J7 s+ a
  5. public enum AttackType {8 @) q$ g7 P; U8 |5 C# n% a
  6.     PHYSICAL, MAGICAL;
    ) c7 l( C% u7 E
  7. }
    + n. v" k* d2 m
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
* u( c. [4 C( KОбновленный класс для агрессивного состояния монстра:
7 C% q* y7 a& j, k+ k
5 K& F3 O0 O0 `( b1 J5 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % R6 j- j/ V" Q+ {
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! x: V+ \  [8 X0 ^# s3 x6 v  h
  3. * ]+ J8 J, Z9 W$ L1 a1 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 s4 N8 S5 A& y6 n0 W! T8 `
  5. import org.l2jmobius.gameserver.model.actor.AttackType;0 Y6 h" [5 o* Q; m4 M

  6. . A8 z; ?/ ~0 z) X4 }9 m
  7. import java.util.Random;- E0 d; O2 i( ?1 f! O% z2 ?. n
  8. # B6 e" R' J, |7 i8 c( H9 X) t/ K
  9. public class AggressiveState implements MonsterState {
    ( e2 W, X4 ]0 {8 Z
  10.     private Random random = new Random();
    4 i* x  z9 L" x! I4 q  u
  11. 6 }. b& y1 \, ]' J" s1 ^
  12.     @Override2 m  F4 p" `# `1 D  {
  13.     public void handleState(Monster monster) {6 q7 ~1 q: @3 k& d! r8 ?9 e
  14.         // Выбираем случайный тип атаки: физическая или магическая
    . a4 T' n' D( b# t0 N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;1 K/ U0 V7 A7 b, `0 x" B" W" d

  16. % Z8 y+ \. X+ b
  17.         // Логика для агрессивной фазы боя  E* e* d2 P* C& ~6 a# h& e) p
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ! p( D' |  a4 _! M7 g  L
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    9 K$ u$ K0 n7 N4 P, z1 R* R
  20.         
    9 c7 C5 ~5 o1 [
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    / w4 `) A/ I. F% V7 m0 x$ |
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;4 _$ j8 O$ O9 A$ U3 I& C
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / B* [  w6 ~: T
  24.     }
    & W2 |8 c2 _: I
  25. }; `  ?* ^9 c2 x6 f4 D9 t  K+ U' O
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
: M/ D9 @( h) U  v  ?# d1 Q) q  S. i: C/ a( A0 c
  1. // Пакет org.l2jmobius.gameserver.model.actor1 @) ~! r' ~! f* B9 e- M# Y; Y) W" R) I
  2. package org.l2jmobius.gameserver.model.actor;) ?& F! b' I5 R4 ?# F
  3. # e$ \3 |2 p4 A- E, m6 I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ) _- x! N$ M6 K- l* F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 I  L0 U% X. A2 u0 h

  6. $ t$ K$ M; h8 M
  7. public class Monster extends Creature {& _+ w3 Z1 z8 R: _9 p3 G
  8.     private String name;1 [; l9 }) W% J' w! v
  9.     private double attackPower;, i8 w5 A/ i; K0 A) F$ h9 d! Y; A
  10.     private MonsterState state; // Текущее состояние монстра
    3 y; H) V6 V. M- U! w7 L

  11. ' L( {; ?+ N/ k* F, {; `9 l
  12.     // Конструктор монстра
    & i, \9 |; _% T- k" W$ [
  13.     public Monster(String name, double attackPower) {
    - [1 M4 A- J6 l, B. l6 `$ b
  14.         this.name = name;. V5 `$ `4 D8 t( m3 S
  15.         this.attackPower = attackPower;( |$ n/ L: Y6 [0 H) }
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию6 |; j5 J2 q1 `5 w9 ?. B' W
  17.     }) X. F. N7 r: `

  18. % t4 m8 i0 A$ F! U4 {
  19.     // Метод для смены состояния" L' j8 M. Y$ ~
  20.     public void setState(MonsterState newState) {+ m, C4 K$ }: i7 F& ]
  21.         this.state = newState;
    9 E' M; ^$ R9 O; h, u
  22.     }
    ( f/ E, X2 Q1 ^% ]8 M& k
  23. , C% z0 m' L; P/ j: R
  24.     // Выполнение действий на основе текущего состояния/ X, `, T; i! a0 W
  25.     public void executeState() {5 x- F7 w. K- V3 i3 H5 o- X
  26.         state.handleState(this);5 [8 U2 g! ]  ^
  27.     }
    % M+ r  H: n8 G* c9 ~! b9 A1 J
  28. % h- X  c& u5 c" ~: W. H. A# r
  29.     // Геттеры и сеттеры
    " h' {6 Y. E; m. n$ Y
  30.     public String getName() {
    ( I. ]% c6 f! W
  31.         return name;
    9 I8 {3 P# d4 X; e* m
  32.     }
    ) ]  f+ O4 O6 C0 S  n

  33. ( B  W$ C! a( |! U6 s) T
  34.     public double getAttackPower() {
    & z+ y9 Y: F% l6 Z% V
  35.         return attackPower;4 b- {1 }- P% \: c6 N: r+ u
  36.     }
    , a9 o0 F) g& u2 D/ K

  37. ; X! L. e6 N3 \& Q/ p& a7 u" _
  38.     public void setAttackPower(double attackPower) {4 W$ U+ g3 n! K. T. m% a
  39.         this.attackPower = attackPower;) p% N- Z1 ~9 \/ ~% R
  40.     }( c' j+ W, K- j4 U
  41. }  }5 y9 _6 d( n! p
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.3 ~6 p% |: ]1 t) ~; Z* {0 f
/ o3 x' H1 O5 ^$ L! @! F
  1. // Пакет org.l2jmobius.gameserver.model.battle1 b9 n2 n2 A2 M; {5 ^3 ^
  2. package org.l2jmobius.gameserver.model.battle;& d2 v% P2 G& |4 }8 s  Q9 |

  3. % D4 d/ |$ C1 E, W
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 G  k3 t0 ?% B5 j  o, V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    + p) a+ \: [# t/ x9 y

  6. 6 g- N) T! C9 V1 ^8 @+ v
  7. public class BattleSimulation {
      K+ R) `  {; J- Y
  8.     public static void main(String[] args) {5 v/ T3 U8 R# \/ l# v1 ]! M3 T
  9.         // Создаем монстра
    ; e* q9 r7 R5 U" t& {4 V
  10.         Monster monster = new Monster("Дракон", 100);
    % Z3 Q( U$ w/ e! A

  11. 7 C( v7 x+ H2 F$ g: i( e' A3 z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( x. P7 {0 w; `% M* U
  13.         monster.setState(new AggressiveState());  M( O1 @# t7 E% X) `# L( Z
  14.         monster.executeState();
    4 t$ v( E2 x) T) b6 {
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 s7 D+ b$ S# H9 \5 y7 }+ D
  16.     }
    - P% Y2 z7 h, U9 F- K0 [
  17. }
    ' f) s, W# e; t1 o) ^* @
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
: V  V/ \5 f/ Z% u: ^) lЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!/ F9 W! m! A" u( M
3 q" ~+ c/ @, e# K. T8 w2 ^

- o9 D, w) z1 g  v
0 N  Z- p2 ^) U8 l2 q$ O  X
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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