Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!/ p7 u& |6 |" L7 ^' j

9 `/ `2 e1 m! {# l. F6 H5 I

8 y9 |! h3 W7 aЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.4 B' }# X5 ~2 p+ z: g/ A( g" z
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
: Y. x) w6 @+ v" I% IАстралия ?8 k0 F5 Q8 Y; J7 N* n& j

, V/ W# q! Z8 m2 B# Y, _1 H2 E

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
) N% s7 V* o: c, u2 d& B" uВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
" {$ z- @! H( ?' B! y
1 l7 p% k7 s$ p% W: W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
; b1 F  [) Y; P  g4 ?- I/ b
AlexCoder опубликовал в 2024-10-16 18:31
4 h. ?0 w/ F1 _8 K, w/ f7 QДень добрый!* A9 j+ r/ q2 x) D
В статье описано взаимодействие игрока с N ...
1 N9 J1 s7 Q7 A
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 q: n7 i, a& H+ S; C) a# u% y  ^

% n# J6 ]7 x' g' |9 x$ u2 zЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.8 ^7 N2 t0 u: S/ e; }" ]

# j* N! V' }% d( Z( P( ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; O% D4 m0 }3 E5 w* P7 O5 V6 R: O7 k
  1. <font color="Green">// Пакет для состояний монстра</font>6 Z7 p. z# s: m4 k. n* B
  2. package org.l2jmobius.gameserver.model.actor.state;' J: W  ~2 I! R
  3. <font color="Green">
      K5 B2 S( Z) ]/ n6 o' S
  4. // Интерфейс, представляющий состояния монстра</font>
    3 r! v  O4 P0 J& I3 Y/ b
  5. public interface MonsterState {
    ' w! F% A" d! J9 D6 V- C
  6.     void handleState(Monster monster);; B$ Y: i; r. v1 w( S: t& P
  7. }  B. @0 l3 c4 b" S1 N5 L
Скопировать код
/ A# ?' e1 f) M$ J, _* f
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 P, V  w# j9 Z
0 d+ B( ?8 {% \) S' P9 xКласс для начального состояния монстра:
- O( l! ~$ Z/ [0 x2 y/ j
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    4 P  s, g  k2 r$ X4 @( B3 i! N, z
  2. package org.l2jmobius.gameserver.model.actor.state;! j5 x4 }6 U2 v3 C7 R% g4 n4 a, m* {+ Q  _
  3. . ?, C# h: U0 O3 _! V
  4. import org.l2jmobius.gameserver.model.actor.Monster;# f4 j0 b5 d- p: f  g! D

  5. % ~" B1 G" s. @# [8 A5 `
  6. public class InitialState implements MonsterState {9 ]5 ^1 L. W  C1 D! a& I. {
  7.     @Override
    . t7 l7 T! d3 u1 E! g. v
  8.     public void handleState(Monster monster) {
    3 r. ~* o$ d, L+ X
  9.         // Начальная фаза боя
    % A, N! \- X  y; Y0 d  S5 o9 M- A; D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 M) @/ e& D9 M( j  B* {9 V9 B
  11.     }7 S7 t* Q5 A, z# z" A4 i
  12. }- u9 J; Z6 t& ]" S' B
Скопировать код
  M: K! R0 f* y* b: f; a7 {# {

9 p0 ^% R) i( V
  Y5 I% J+ h& @7 l" j# ]0 s& h0 ]3 k( e9 W8 r% s4 P

; [3 ]( w1 y3 E/ g
/ u$ K( B' d3 ~5 h8 J( ^0 B2 O* U7 O! N1 B" b3 c0 W
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . d% W1 p  Z% p4 d1 c8 X) p
' }' G) Q1 o3 q, y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 f0 i8 ]8 _' m& Z2 J  D& Z" i, l
+ ^  Y+ x3 N/ _" ?8 B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 B# \& ?1 C! ~) T4 z, U$ F

% @) Y. j5 e1 \3 e* n
  1. // Пакет для состояний монстра& E& h$ p7 A; U" ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! [1 d- m+ W# a, [# n$ G9 c6 {
  3.   O+ u. A4 q4 r, |4 P! Q
  4. // Интерфейс, представляющий состояния монстра" p' U+ Y$ h; I
  5. public interface MonsterState {* d- R9 W  S* S! r
  6.     void handleState(Monster monster);9 k3 F! F& J2 X' R+ ]+ H
  7. }
    ! U6 H) \9 k6 d, [
Скопировать код
+ b* E/ ^7 j* n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
9 n% q6 S7 c* i+ @0 s0 d# ^1 c9 L- D) q0 ?
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% r# _' u) S% A# n- o/ r( W

: G: z: {3 s. m7 n6 `/ b7 F8 c0 ^Класс для начального состояния монстра:9 a& g+ @6 C8 `: |. |5 ~: N" [) o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! L9 A4 b' g- H
  2. package org.l2jmobius.gameserver.model.actor.state;5 p3 c& k: a# U# K

  3. 0 g! r+ F- j/ H) _  y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' s. W4 h! P) e0 L+ Q
  5. 5 b# o" K$ O: Z* y2 U/ ~
  6. public class InitialState implements MonsterState {
    * L6 i' o0 M: ?# D3 e4 h% X
  7.     @Override
    " x) N6 y% m  x9 |; o
  8.     public void handleState(Monster monster) {
    ' m& c& h4 r3 t1 W9 d
  9.         // Начальная фаза боя+ O9 b4 M* v; ]1 u" y2 t# w6 }
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    9 C& J/ {5 i6 Q2 s; e
  11.     }
    : w& g) V# k/ {. P; T
  12. }- h5 B& V1 G2 ?9 B5 F1 A$ \" I
Скопировать код
Класс для агрессивного состояния монстра:
: v$ F& n" ?5 v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! t: x. E- Y& {( m) y
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' H% Y# V. l8 ~+ t! u: d
  3. . h) S; w8 D$ ~. r
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 m" [( n2 {2 B: ^: I& g6 j
  5. 2 q3 q; l* E/ d9 X' G, s
  6. public class AggressiveState implements MonsterState {
    $ H2 ]8 P* H& r/ @
  7.     @Override
    ' P+ w2 J$ b. b+ p
  8.     public void handleState(Monster monster) {
    $ _9 w, e* m6 A  S
  9.         // Агрессивная фаза боя+ f  {% \" ]* Q5 E
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    & D  }* q2 ]( @2 m: ~
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ [( a( |8 ~1 C) ]* j7 u- ?
  12.     }
    * r; a; e+ |, ?; }3 |
  13. }
    % \8 f" K, ^6 l6 ^* l
Скопировать код
Класс для финального состояния монстра:
# y9 I1 t+ o: B5 a/ S3 ?1 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 _8 \* w8 g7 `" `& m& K( @; P
  2. package org.l2jmobius.gameserver.model.actor.state;9 B0 i9 u1 D% f( b

  3. . g- C0 d* N" K3 R* L0 b/ ^. Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % q" k- Z. [2 O' L* W
  5. 7 q8 w- ~  o. R
  6. public class FinalState implements MonsterState {
    , c8 K# ~4 Y% ~: H
  7.     @Override6 ?  W- k* p' [
  8.     public void handleState(Monster monster) {  V* X" r2 m$ B2 E
  9.         // Финальная фаза боя
    / M- [! W- p9 K( z' v$ Y
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    # h; C5 j" K; u4 T  {" [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    & r  ]% u5 y9 |( ]) ?/ h: x
  12.     }: [$ W. l8 Z; S6 T
  13. }- q7 e/ I, N( r
Скопировать код

4 c. V* x8 _8 \8 m. @+ \Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( Y: S, q7 c' R$ e/ e
  1. // Пакет org.l2jmobius.gameserver.model.actor& {' f, C( J. ~* q5 v, I% k
  2. package org.l2jmobius.gameserver.model.actor;2 z5 z3 J/ `) V. }* A, q

  3. 0 H8 R, X, O, W& J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    3 O, K9 V2 x% C; x- J
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- j8 K$ p- Q: K* x

  6. # U' {& Y8 w% j! w$ ~
  7. public class Monster extends Creature {
    1 E& ?: L" m: y# V5 y) s! Q
  8.     private String name;3 w7 F* ]" C6 w4 G" T7 ]0 m
  9.     private double attackPower;
    2 {/ E0 V6 G6 ^  }' K, r& Q" x
  10.     private MonsterState state; // Текущее состояние монстра
    9 {8 U# S9 t5 r! C0 b9 `

  11. 7 H8 q( j: y9 Q0 G
  12.     // Конструктор монстра8 Y, `/ n9 ^  B
  13.     public Monster(String name, double attackPower) {6 l7 F' N5 \: t  s
  14.         this.name = name;/ K% h, n5 \( }5 }/ b1 D: Z1 r
  15.         this.attackPower = attackPower;
    : a: ^  N: N) W3 u3 K& [& R2 g; j! h, c
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    1 o% N. S( A, ^$ b; X
  17.     }
    ; G' M) d; K8 {7 M' l  D, x
  18. 0 M- P9 y' G0 W: s% }+ E) H3 @
  19.     // Метод для смены состояния# F, E, M/ U& h- c" W; f# P; j
  20.     public void setState(MonsterState newState) {( ]/ }. M# `8 Q+ H% I5 j
  21.         this.state = newState;1 h& j! Q4 K+ h- F2 P
  22.     }9 d$ V( k* R5 X* @  |$ W, A: c

  23. 0 m, p5 N1 [( F7 Q4 y7 P. z3 B2 R
  24.     // Выполнение действий на основе текущего состояния
    % e" y' H' e$ t" k& R$ y
  25.     public void executeState() {& x" Z- A5 f' o
  26.         state.handleState(this);
    1 I2 X2 }' Y/ u6 X; |5 o
  27.     }: G& @; K+ t' s/ q5 n% Q- n
  28. 8 P( x/ h/ b' t6 R2 w9 }
  29.     // Геттеры и сеттеры
    / g) N! \5 M$ a& ]
  30.     public String getName() {( O' M" a+ G9 _; o
  31.         return name;: h4 w  r' F% q% M( i1 r! d: p! ]
  32.     }
    % r( m: `3 t7 E2 }0 q$ H5 d: g
  33. 3 e; w; y: a' f1 b* f1 q3 F- r
  34.     public double getAttackPower() {
    $ L0 I$ @0 D) i
  35.         return attackPower;
    : v9 U! J2 f! U; E, V) s
  36.     }8 X5 `+ r8 w) S1 F8 L/ B( u4 K! q, R

  37. ) Z$ V0 X7 R3 l) ]* q5 r
  38.     public void setAttackPower(double attackPower) {/ ~6 G) h- O" U! b7 S
  39.         this.attackPower = attackPower;. G( U. @! o( j
  40.     }
    - L2 I# S0 _% V
  41. }
    ! D3 o3 O) t1 n. {+ E( q, h, [! \
Скопировать код

5 k+ Q, c7 H9 D+ d- S) I/ r, _Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
3 v* Q7 _0 _6 V
9 O% j* S* w' X: }1 ^
  1. // Пакет org.l2jmobius.gameserver.model.battle, W6 R) ?$ u& x9 ~3 v' w: c
  2. package org.l2jmobius.gameserver.model.battle;$ |% h) _% T+ A4 l% K' P" Q
  3. $ M2 K; `3 F2 a4 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 ?( [+ _# e3 k2 j% b, P! D# Q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% g" ^% T" X) X; J% P
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;5 a4 i! p& g# s" a) V
  7. ! r0 Z; `0 f$ v, V2 }+ [
  8. public class BattleSimulation {1 N+ k( O) G1 m0 O4 A; m
  9.     public static void main(String[] args) {$ _, o+ d+ E. ?) W9 X# p2 m
  10.         // Создаем монстра с начальной атакой
    $ \7 N2 N) \6 h3 A$ ^8 q
  11.         Monster monster = new Monster("Дракон", 100);( w- ~: ~% H  T4 S# L
  12. 1 F0 v: {2 p& ~. H1 C. v
  13.         // Начальная фаза% v9 m4 p* O- ]+ N5 ^
  14.         monster.executeState();0 ^) ], o( J6 Q4 f+ {3 e$ Y

  15. 8 J  V. R0 |9 I
  16.         // Переход в агрессивную фазу
    # _+ l8 `: ?' D* D! j1 c  \. z
  17.         monster.setState(new AggressiveState());+ }; W7 N- Q7 `# e+ G+ T" p
  18.         monster.executeState();
    6 u& G% U7 r7 F+ ^, {
  19. % a, A- x4 c& |5 l; G0 r7 o2 O: Q; I1 z
  20.         // Финальная фаза
    4 x' t4 M, w4 t6 `
  21.         monster.setState(new FinalState());
    3 y. x- r( h8 q* w" q
  22.         monster.executeState();" x! ?6 f. ?& A$ @$ c/ h4 f) i
  23.     }
    , V3 e3 B; \) H2 {1 k; @
  24. }
    5 c! p7 ]: \8 J, n
Скопировать код
8 Y  n# K& j3 u6 W
Комментарии по структуре пакетов и классов:4 K$ c/ T$ T, [. u0 I( g% R- }
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    $ F, G+ j2 B1 R& P( W2 P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
- p/ }5 O/ j/ ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 ^: n0 u) B* {* Z9 w3 h
* f. m8 |& R- i6 d

: F* w2 z! M3 S1 ~4 }5 D7 x& Y
+ _6 e! ]2 v& i$ O0 O' s  O
/ E  E7 o) ~# G4 m" A1 p/ @' a; S; L6 @! U

7 B. }: D( D- M/ c1 r, b
* T% G& p8 d5 U  s
  ~' r# c2 T( ~: X; |/ |8 ?
9 o2 l- L% y3 f6 S4 F! F6 b; D0 C6 S. a. n" W  \  X

# B) [* z7 u+ r+ e, _' l4 S0 o8 q
/ D" O0 D' Z' B' d& S# {! {

5 l7 s' t: I# ^" n0 X3 L' V
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' L! I4 h# k* A( EДля управления сложными взаимодействиями, такими как  ...

; d) v# e- ~2 [8 Q2 L* A. bОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:211 I$ S/ u& p1 f6 N
Отличный подход! Использование шаблона "Состояние" де ...
+ V1 t1 c" s4 S$ E2 B  W& N4 V! o
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
; I2 {" ^. T  k1 E0 n: j
2 b7 A4 T6 M6 F# a+ [Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
$ r# A) }8 P2 s0 @1 N8 j) N* G2 @0 T7 X
  1. // Пакет org.l2jmobius.gameserver.model.actor) D1 i# I4 V9 R$ j( t9 |# Z1 {
  2. package org.l2jmobius.gameserver.model.actor;
    " J% `# [3 d4 Y3 L7 E. W9 k4 \
  3. * z2 Q; `# S- L. q  ~  p
  4. // Перечисление для типов атак3 \; f% i* F# h& `( r  l1 [* M6 J
  5. public enum AttackType {* K- X/ o0 C2 `( A& E
  6.     PHYSICAL, MAGICAL;. D/ }  @  F, ]& U4 r
  7. }0 e0 x7 l8 T' b) ~8 e# w; R. u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.+ h0 G- r" [* @8 D) l9 f' Q3 R1 |: O
Обновленный класс для агрессивного состояния монстра:4 f3 U+ N6 A  E5 Q6 \

4 y2 s- ?1 G0 v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    8 a: g8 H7 X% h  u) K( `) ]: T5 _
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 C& W  B, J( p; T5 O0 z$ s
  3. - c- o: @; G- V" f% X5 K; Y. R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 t) Q& \" l& A' w& f; b& A
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    * ?! @- H9 }* Z3 w6 g3 H
  6. 1 P3 H6 H8 f, p, J; z. Y
  7. import java.util.Random;
    7 {+ j) d" [9 T8 g

  8. " w: }8 a* j: y* [, H/ |
  9. public class AggressiveState implements MonsterState {
    1 a3 Z5 g; m3 O1 e3 z
  10.     private Random random = new Random();
      ?8 v% v, G2 g

  11. ; n7 ?) V8 U" x" u; x3 \* V/ s
  12.     @Override. T* z) a8 p( x
  13.     public void handleState(Monster monster) {( `1 C' E" a: I2 i) E
  14.         // Выбираем случайный тип атаки: физическая или магическая  L6 g3 A* O( `2 h; A; b
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;* }. n" S# G6 h2 h4 q. s
  16. 6 R' b& J0 K$ C; K* X$ g
  17.         // Логика для агрессивной фазы боя8 Y5 H/ ]5 X0 L: m+ W. }: H
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    2 {6 H( L$ O2 D$ H& v5 e( q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");5 A( y+ z- {9 g& h, |* e' M: @: ]8 I) E
  20.         
    , Q  k- w2 M) H9 E
  21.         // Увеличиваем силу атаки в зависимости от типа атаки# x) N' P% Z" Y- |( w# r% k
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;! [* j+ X( D2 f8 ^4 G9 r
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ! C6 U! K( ~) ?8 n! n8 R
  24.     }. `. Z) J' ~  S  e/ V+ Z9 P
  25. }+ ]  D+ d4 A* c
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки$ M6 X& P+ K' p, |$ w/ D

1 ^$ F$ e6 U! i$ X+ G
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " k4 o) }# A! |( M+ d4 ]) U
  2. package org.l2jmobius.gameserver.model.actor;
    # H, K) k3 W- j8 G

  3. " u1 o3 G9 h$ ]8 L/ ]0 x  B& }" I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. K1 [3 T! P0 r& \/ [7 }9 i. M
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- ~6 i2 |% K/ ^: ]* C' n/ ^1 d
  6. 8 [: M8 O! |4 V
  7. public class Monster extends Creature {
    9 m1 x# ^- @7 o
  8.     private String name;2 I3 W% Q6 @% l8 u" h
  9.     private double attackPower;
    + _; Z) |' q! [, s
  10.     private MonsterState state; // Текущее состояние монстра0 p7 k, ]% X; b& t$ \; c9 Y- e, @: V

  11. 3 @8 {. d+ N' h( A- @4 x
  12.     // Конструктор монстра
    2 _) r, ~/ b' p1 L3 ]- H) k
  13.     public Monster(String name, double attackPower) {
    3 T9 ~: N) Q5 ]" ]8 k8 K/ b
  14.         this.name = name;# v+ S$ y1 G4 G4 {7 m; K, W
  15.         this.attackPower = attackPower;
    ' q3 i+ X2 l, a7 r* G% E
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию+ `! g# o/ @1 b  c' o
  17.     }% y4 V8 r" V! y/ J& m( c! r9 m

  18. . E5 l, U3 k- N+ n' P/ s( t
  19.     // Метод для смены состояния- t6 i' |; C0 d) x
  20.     public void setState(MonsterState newState) {- |. h, K8 ?! r/ ~+ h
  21.         this.state = newState;, K  [% M6 Q7 X; M9 c2 d" U3 u& J
  22.     }. @4 `9 [  k, S: j0 S
  23. 2 f# r, n' Q  C  O5 W
  24.     // Выполнение действий на основе текущего состояния  n/ K/ o* B/ D2 j7 B- F" E7 A7 o* q
  25.     public void executeState() {) b' H7 w0 ]% A7 M, a
  26.         state.handleState(this);
    # w, L1 U7 q. B3 @! U+ g1 R3 Q
  27.     }
    + q0 \1 [  t: F; b% d; [* [3 |; e

  28. # k- ~' S, I1 i, u# j5 J
  29.     // Геттеры и сеттеры
    & G, O9 Q* F( v
  30.     public String getName() {
    5 E0 C2 K- S9 }1 H7 L% D/ j
  31.         return name;" `! [8 k4 B8 v- a
  32.     }
    5 s6 c; }# p. f5 H

  33. ; j5 i/ ^$ {3 {0 b7 u  B
  34.     public double getAttackPower() {
    1 O+ t4 p/ |/ S8 }$ y
  35.         return attackPower;: r; O, X. o2 [
  36.     }) I. |, L$ b3 K8 d& K3 G) `4 `8 f  o
  37. 5 N6 ~4 m6 a3 w+ u* F0 U# x: J
  38.     public void setAttackPower(double attackPower) {
    . Y! j: `, ^. Q- R2 G# d  y' k
  39.         this.attackPower = attackPower;
    2 |4 I- t  i2 N0 N* W7 y
  40.     }$ ?# x3 ?' W7 m/ }
  41. }
    7 p5 V, |* m/ [- M5 E, z& s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.& R  p* F( U. w0 _
- p' n( \/ R, }
  1. // Пакет org.l2jmobius.gameserver.model.battle
    % U+ r* z1 d- N! ?
  2. package org.l2jmobius.gameserver.model.battle;
    # {" Z! O; Z0 \: X
  3.   r" S1 v  s7 f9 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . @/ K  a1 l. m' u" P' q/ F) A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 u6 @8 I1 h6 z) N( E% H! G
  6. - k5 a% g3 o; C- L  r9 T: k( ?
  7. public class BattleSimulation {
    ; I, ~# D9 j8 g/ N3 U
  8.     public static void main(String[] args) {
    1 U+ H9 r. X$ {
  9.         // Создаем монстра
    1 w3 l$ C5 l  ^6 P' {  e, ~2 a
  10.         Monster monster = new Monster("Дракон", 100);, ]- J; A2 l: ~) e

  11. ) S7 D" W9 K; m/ u! l( b/ j
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак- [& m0 m7 q2 F8 F
  13.         monster.setState(new AggressiveState());
    : z! O' D$ [! z- d* E3 T$ h& @
  14.         monster.executeState();
    ) d! V0 Y+ I1 p* C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак" x) ^% T. |9 E, E7 Q9 s: k. B
  16.     }
    6 F* G: u3 ]# _2 D6 v
  17. }, Y$ C6 M  j2 C$ V( I: B
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
2 F6 m) u- P* f* S' G; f1 N' uЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
7 s  c0 L. K" @+ T4 O! e/ b/ W6 `/ o4 n5 O* y

# U# g: {2 z( B! L8 R
8 N3 Y/ A* n/ X" z. ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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