Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
/ I4 [$ j, L" A9 r) [, B
, c7 \9 x1 B  s0 b! ^* G
6 z% ]' Z* }. n) f: b
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
' p" }; W) @9 sЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) x% R; Q: t- v! l, }& N9 w1 hАстралия ?; W0 \6 c0 z9 c
" h6 a6 I. R7 Y$ H' j, k' j. F

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!6 N/ a0 p  A  j+ e
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
2 ?: z: w9 a5 p$ s3 O! d- c% ?/ i: a% \# b# X$ x. O  e
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 0 y( m. \5 _0 Z: N$ Y
AlexCoder опубликовал в 2024-10-16 18:31
+ W3 ]1 X$ r: N8 k3 I8 \& D# W$ HДень добрый!
4 v; p3 M$ c* w+ {9 \4 UВ статье описано взаимодействие игрока с N ...
; T8 t# j$ J8 @% A0 W
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( o; J1 U( m# g( k$ ]
* J  e7 s: W( qЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
3 o8 d0 z5 K& Q( P% g1 Z* B" r* _
9 G0 f4 j0 i# R' k+ b- BШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
) S) s  Y% S; c3 I) K5 ?: P% f/ M: W& d; B7 ~) P2 i) D0 k
  1. <font color="Green">// Пакет для состояний монстра</font>: L7 H/ A% w" y6 X5 H
  2. package org.l2jmobius.gameserver.model.actor.state;" j: h3 y2 \. c4 N
  3. <font color="Green">
    + @: ?: S& @% p+ z: J
  4. // Интерфейс, представляющий состояния монстра</font>
    # E& T! r# N0 J  [" ~& k& s% ~) ]
  5. public interface MonsterState {
    3 M- s3 L3 N4 ]
  6.     void handleState(Monster monster);
    7 S0 Y6 @8 c' l) M9 V
  7. }
    * H* q! B# l7 W" U& r
Скопировать код
- l6 q& g3 x8 L
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 I3 U( U% H0 _+ H; L- B

. V' n, ~- Z6 t* ^. m* ~8 {Класс для начального состояния монстра:# F- L: }/ w0 ]
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* G3 k& Z9 |" Q6 c. N' c
  2. package org.l2jmobius.gameserver.model.actor.state;. G& e4 U3 S. H& g) t% Z% l

  3. ' @; h8 H1 b5 e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ a; _3 z- @& X- ]

  5. , H7 f$ e6 f- I; U4 X% J3 E
  6. public class InitialState implements MonsterState {8 q9 J- d1 i! T* D6 u) h0 ?: o
  7.     @Override
    $ ?/ F, r# {7 _8 X; b1 R, n
  8.     public void handleState(Monster monster) {, U- O3 x* B  i9 \/ @
  9.         // Начальная фаза боя' e' Q3 W! z! j" ~: t' n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    2 Q% v% n$ }) E3 f8 \8 ?
  11.     }
    % h. \8 b* b# q9 D) q
  12. }$ \% F) V* t  k- |
Скопировать код

# r6 N6 B6 ~4 n/ R; s0 g
" y* p! `' C1 [5 f* O$ _# J6 l  m9 v/ P! q, U) I

2 L/ |( _/ {8 w% J* k' n& K8 _# |% h% U1 R
7 J+ i' O' R3 G) _9 o
) {6 E# T- i4 V; @; e! L4 ?
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ D. C5 t! ?; O& r3 v9 L8 X; }' S
8 e0 M8 l2 P3 R% \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' k3 ?1 ]. @. }( c. Y2 w6 V$ c8 x% l0 G, E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: _# y4 E6 _, G7 y9 q/ [+ G/ k4 {
  1. // Пакет для состояний монстра
    9 ]0 f6 T. b$ h
  2. package org.l2jmobius.gameserver.model.actor.state;/ j1 E9 N0 o* [% t6 H$ r
  3. & ^7 m; ^8 w& G6 j: j' c( U8 M
  4. // Интерфейс, представляющий состояния монстра
    ! F" }# p/ f# K8 N; T( h
  5. public interface MonsterState {+ e  F; w" K; e
  6.     void handleState(Monster monster);8 T  [" G; o# m+ f+ e6 K
  7. }8 M0 C* N9 ?4 d1 f; o/ g
Скопировать код

4 Q8 z* Z  ]% Y3 i. jШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
, O* n3 N1 p* I  @' }8 Z% u) V1 J% k+ K: a& Y- F1 X9 w0 M
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- }6 m1 n# ]7 U! X7 V* ]9 U
1 S% L' F' z; Q+ k! [Класс для начального состояния монстра:
9 _1 y% ?# @7 @: W' e2 h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! w* |& s, A- Z. c" r" Q  P
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 c7 y3 P2 N+ K/ J* U  I7 n
  3. ; q- j  ]$ ^: y0 t* i( l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 h9 l) b& L/ m2 a5 a2 t6 E) H

  5. ( f' a+ G4 q" Q! G" U3 A
  6. public class InitialState implements MonsterState {
    0 A; N/ [7 Q4 ^2 V1 c
  7.     @Override
    ! b  l. y% v! E* W' ~+ Z" q7 D6 P0 z
  8.     public void handleState(Monster monster) {1 X: z/ M! K1 y+ L9 m
  9.         // Начальная фаза боя, x4 e/ R' H0 L7 X; r, p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");2 f/ Y1 N& R8 Z. B9 H; V# V
  11.     }5 n: s2 f+ k. y1 ^2 |- J2 w+ m  k! a
  12. }9 Y0 [  \* |  B" U) x4 K% `
Скопировать код
Класс для агрессивного состояния монстра:
: d7 }* A% C. F4 x! g+ _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 C, R: }' o! E+ @! ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' }+ l+ d/ F, h, k( Y5 k# E9 a6 k

  3. 4 `( F1 w8 H3 F, O' R7 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 J* w, F2 h) k3 S7 f% c

  5.   m: h: b9 B2 x( L" L' P: o
  6. public class AggressiveState implements MonsterState {# T  {$ Q* l2 {
  7.     @Override/ k' G6 x  l, f$ F; m' G
  8.     public void handleState(Monster monster) {
    ' M- P- d+ q1 W% o# A- z3 {! q5 t1 Y
  9.         // Агрессивная фаза боя8 q6 g  h. C6 ?; O! z; a
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");. C! Y7 |* d$ B
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ' q5 D  a; U' p8 Y: a0 _
  12.     }
    9 F. ]+ T3 E5 q2 m
  13. }5 j6 g2 m, w. v& G
Скопировать код
Класс для финального состояния монстра:: E) {+ m; o% K2 D+ |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " ]2 l! w" K1 R$ p3 m$ x5 E7 m2 {
  2. package org.l2jmobius.gameserver.model.actor.state;- D  M& H  X# A# Z1 y. ^# q
  3. 4 |: k3 g9 ^& X" d( \; ~" y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - D" `+ V- M/ r, E% j* |

  5. + ^& F2 e. Z9 A9 O( F2 w
  6. public class FinalState implements MonsterState {
    $ ^! P0 r7 v/ A" K
  7.     @Override
    6 ?* n5 P. Y$ ?! J# R
  8.     public void handleState(Monster monster) {7 |; }0 H$ O- g- H1 {
  9.         // Финальная фаза боя: j9 N. W& Z  M
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    # p1 V' B- {2 H. a& v
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ T: v% W8 U4 @6 K# B) _
  12.     }
    ' z$ \! l3 M! m# f1 b0 L
  13. }! {/ M3 b' f# J! |! z2 f& g$ n
Скопировать код

, K' ]. M, l5 q/ v' e6 ]Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.+ \- Z. Q7 r: Z  F* B8 ^4 ~2 _/ V
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " @$ n' ^6 l5 b$ E* y7 |
  2. package org.l2jmobius.gameserver.model.actor;
    % @: l" J, J% s
  3. + z6 \6 U) ]# }! F& I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. k' K; P' E- V7 D
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;& L6 ~  z: p/ I$ q1 d8 S/ y

  6. ) d# W" Q0 \. w; N0 ?( e
  7. public class Monster extends Creature {
    . k& B! J9 D; F: [" h+ T' i/ b) V. M1 r
  8.     private String name;. Z/ |9 z% F5 {% q
  9.     private double attackPower;4 N: @2 ~$ S5 I& }$ y9 M
  10.     private MonsterState state; // Текущее состояние монстра
    2 d- B- c$ D/ o! w. q( J

  11. ! U7 F; H/ l  K& y& g
  12.     // Конструктор монстра
    ' k3 N; j* g- c4 I5 o- l1 ^0 H1 E
  13.     public Monster(String name, double attackPower) {" X# v' ^; n8 `3 p2 G" _6 q
  14.         this.name = name;
    4 Y& V! G; j0 |
  15.         this.attackPower = attackPower;4 u4 R$ S, C7 ~( |  Q" o9 U  h0 C; c' J
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние7 z7 ^% c5 E* C4 u: `
  17.     }& ^. i+ j* ^$ g2 _7 R
  18. 5 X" x$ r: _" e- q' R1 W" o
  19.     // Метод для смены состояния
    ! T; X' P9 R; U8 b  j# S
  20.     public void setState(MonsterState newState) {
    9 e1 Y9 v" Y; f
  21.         this.state = newState;* {, f2 M: t, o3 {
  22.     }6 i8 j% V; y' w- J

  23. ! M  s6 a  m! u# A! H/ t' P+ ^( B
  24.     // Выполнение действий на основе текущего состояния
    ' E9 u7 ~4 `1 @* r; v
  25.     public void executeState() {& G: D) f) V1 r
  26.         state.handleState(this);
    1 e( W3 |$ K4 [$ l
  27.     }9 [7 a( F. J5 t6 s
  28. " f( J2 [- Q% g& y# z
  29.     // Геттеры и сеттеры
    9 F% R) s; E, b' S
  30.     public String getName() {
    + N5 |1 y! |+ E& U
  31.         return name;" e3 x5 G3 u8 E/ L4 @7 `& d
  32.     }4 y* M. l+ y. B/ ~* {8 L

  33. ! U" F2 K' T% u* o# u4 m
  34.     public double getAttackPower() {1 u' H- m3 X! }+ i: n3 y
  35.         return attackPower;, ~+ m5 \1 |* b2 x( J4 z7 t
  36.     }& m3 u  ~& D2 \
  37. 6 P0 E4 _3 W1 ]! N
  38.     public void setAttackPower(double attackPower) {
      T2 w; Q0 X4 l8 m
  39.         this.attackPower = attackPower;
    0 T$ h2 Q$ b6 e2 u% O7 d% T
  40.     }1 [) U( U& f1 A
  41. }* o) i+ Y- d5 }5 r* `0 T% Q" Q
Скопировать код
# E7 p/ i. W/ u' l
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
2 F- H* ^8 @& C6 [; B: k0 O& I. z. J1 i. @
  1. // Пакет org.l2jmobius.gameserver.model.battle# U: d/ \3 h7 v, P* F; M
  2. package org.l2jmobius.gameserver.model.battle;  T. t! J9 [. I

  3. * y# S$ x( k# ]1 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / F8 f! }7 @' \7 q8 b$ f
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ K+ i4 u9 R' J! x* a; m: I: `
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;: w7 D0 \* Q) T

  7. 2 {  d3 I! Y. Y$ Y
  8. public class BattleSimulation {& v% s' v" u# `* S
  9.     public static void main(String[] args) {
    # W9 \: D* q& B; ^
  10.         // Создаем монстра с начальной атакой4 w6 [% |" o2 F& }8 F- _( u+ `
  11.         Monster monster = new Monster("Дракон", 100);
    ) K: ?# T/ g' V4 j/ f, t
  12.   H* p" H% P4 }0 ?1 K7 D7 e
  13.         // Начальная фаза
    ) v' q) W, f' \1 A  l
  14.         monster.executeState();
    ) u; f# A5 t. P6 N, ~' r# q
  15. ( O4 |. a$ W* K& i1 ]  h3 m
  16.         // Переход в агрессивную фазу
    6 O( p" D8 W7 V  I! m# c6 F. l
  17.         monster.setState(new AggressiveState());) T5 _6 w% }! @3 D6 l
  18.         monster.executeState();# a5 ~  j1 ^3 W" w" l  D- {4 ?

  19. 4 V, c! N9 z2 V( K" [" @
  20.         // Финальная фаза* W* {7 W' k3 P+ T1 q1 N# y4 N$ u  V
  21.         monster.setState(new FinalState());
    # ?( F; z9 \( h! c# Z
  22.         monster.executeState();
    # R: T: R' O  w7 k3 n" v- I
  23.     }
    2 v; N( \+ K( i; p9 Z! y9 Y
  24. }6 y& k7 W: S8 o1 }' a. D5 e
Скопировать код
4 M2 P3 T, K4 C' m
Комментарии по структуре пакетов и классов:/ r% e$ U9 b* ~) q% y7 H0 n
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    * q% }$ D( ?& e5 A: ]1 Y& v8 Z, F
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.. ~9 {4 q& f# j) \6 v+ k* \
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
/ @. R7 e1 H! X* Y% `. _% L, h- Y# L+ R

# y8 U: y8 X7 R0 d2 U% ?2 s  ^6 ^% a, e

, D- G; M6 {/ K6 A8 D/ T, y) {. k
6 a; W* t. X+ X" {6 c5 q6 ?/ P* L, Z; _/ O- b3 z' H) U$ b
4 F3 Q; Z  K2 i6 j' U
' Q) L( ?: n3 t3 q7 @6 X4 {/ J

" t5 R2 ]1 N* G' Q
% N+ b- \& X" k: ~) |9 W! W& \; K2 B1 Q3 I$ _* C

* F/ X  j$ F: ~5 Y! J, z4 x! l8 ^1 e/ }* a9 ~; x0 c+ W4 |

+ F+ c1 E5 N/ Q  G1 Q! E
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04; N6 h& A+ D# e1 O' R; v
Для управления сложными взаимодействиями, такими как  ...
, I& D& z! D# K0 Q3 r
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21+ p3 b# y3 r4 [5 S6 L" N
Отличный подход! Использование шаблона "Состояние" де ...

$ W# `1 L+ ~: v. W0 @9 q( _& zХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
* X- r: n* v/ R1 ?; O2 m. P
/ _1 _6 n' ]2 \+ T( {! zШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя./ H' E9 S5 ~" v2 N3 {+ e/ l! O0 H$ x

9 d/ c' d3 T6 P. e" U
  1. // Пакет org.l2jmobius.gameserver.model.actor; w6 t+ `7 o5 G# n& I
  2. package org.l2jmobius.gameserver.model.actor;
    % B7 Q9 x) X% `* I2 I# {; B
  3. * p9 [( m+ S- f3 ?% W
  4. // Перечисление для типов атак
    & p/ C! j: P  S' l5 n/ z+ W
  5. public enum AttackType {
    2 |9 P: ?7 k: Q: _- A  i
  6.     PHYSICAL, MAGICAL;" L# }% e) _7 T' M+ o6 l/ f' A
  7. }
    7 }7 U$ Q- S* M- F! O
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.) }9 M4 |9 K$ {1 E6 e
Обновленный класс для агрессивного состояния монстра:/ j5 v  Z# M& o( F% _6 O( [
  ~3 T, o1 g+ o' ~0 B1 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : w4 ~6 s% \4 c% s! ^2 Z+ C2 p
  2. package org.l2jmobius.gameserver.model.actor.state;, {* P0 T# q  p1 Z+ V- \# X
  3. : Q0 }1 o. S! }/ R2 p' d$ I% C
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 n1 p2 T. W* O8 r
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    % [& O! F, U. Z5 Z; A, W8 ^' @% K
  6. 8 Y' N* W) s  C
  7. import java.util.Random;! P5 n7 _6 N! @1 ~
  8. 0 O& F  C* a3 t
  9. public class AggressiveState implements MonsterState {, Y; K/ N* A! I" x- ]6 a
  10.     private Random random = new Random();
    ! t/ [0 T0 b& X5 P5 `
  11. 7 P4 Y" N  E  s" s; c
  12.     @Override
    * l$ w0 J8 M: j; S
  13.     public void handleState(Monster monster) {) r- q/ D4 v  x% F$ b
  14.         // Выбираем случайный тип атаки: физическая или магическая
    3 g3 ^7 ^9 ?. _
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;$ X/ S2 x5 }: W& m
  16. : x9 _  u# i5 y2 f# q; O; g7 H
  17.         // Логика для агрессивной фазы боя  R7 ~: }1 X- u  X4 |, ?2 E
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    2 w# S: `: M6 h! h
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");% B1 ^3 u: E+ G) ?5 l' L- u( Y  x0 z
  20.         
    5 i6 b) Y6 J4 m$ s. L$ o( n
  21.         // Увеличиваем силу атаки в зависимости от типа атаки4 K6 i* b/ A5 Z$ W: x
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;$ X4 o8 J" [. M) B# W+ i, w" A
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    9 u- c& i9 X; f0 A$ ]% W
  24.     }
    $ R1 O* a% L7 t& _2 f& T3 C& R
  25. }
    + j; I6 {; Z# \) `9 n/ w
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки, p- E7 z7 f$ O, N. z5 X
- B) {. j" u; F" q3 b5 J& l7 r
  1. // Пакет org.l2jmobius.gameserver.model.actor. ~7 N3 e9 M2 e/ C3 y- T" I7 e
  2. package org.l2jmobius.gameserver.model.actor;$ A9 \% S6 z/ r3 V+ n
  3. ! W: h  X. e2 @
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ {0 I, U& N# A$ [; ?4 w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;" ?6 _! s9 z6 j" X! X# u
  6. & d% w8 a, a8 K
  7. public class Monster extends Creature {
    ) s( C. D# ~0 I6 d  ]
  8.     private String name;8 y3 H5 e. |  S6 X; o: W, S
  9.     private double attackPower;' Y$ p2 f' H7 l8 [5 K  n
  10.     private MonsterState state; // Текущее состояние монстра* [0 D% }+ P1 x. i0 h( M
  11. $ e. M. \0 \+ X% q" b' U  b4 {
  12.     // Конструктор монстра1 M% G. v3 K4 G% x1 K( V# y1 T
  13.     public Monster(String name, double attackPower) {- w4 L" H4 ?4 ~& O$ u/ t
  14.         this.name = name;0 |" _2 w' _; ?  W% k
  15.         this.attackPower = attackPower;
    2 B& t' i" e+ r9 y, Z1 k# O
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    * {% f( E( u0 E" d! y- I
  17.     }) B1 k* d9 l$ A

  18. 4 `# ^5 w: A# L0 u2 ^2 ?/ Q4 b+ e
  19.     // Метод для смены состояния8 i3 \4 V% _8 \0 l; g) o: L1 ]
  20.     public void setState(MonsterState newState) {4 r; [7 H0 Y6 b; k
  21.         this.state = newState;
    1 d; @& Q: I0 R
  22.     }  m, W, n" J3 Y2 V, x( [/ d

  23. ! f. R0 K$ I- }
  24.     // Выполнение действий на основе текущего состояния" ^: }% w* R$ K
  25.     public void executeState() {+ g  n  R* F: o8 W) f
  26.         state.handleState(this);, o8 Q( p  x0 O9 K& ?- E0 d
  27.     }
    7 g# }" s( q  W7 w7 N
  28. & K% R* t4 q8 L
  29.     // Геттеры и сеттеры$ |  O) U; ?3 R# W
  30.     public String getName() {5 Y9 F8 |& Y7 |6 `( w
  31.         return name;1 {# a2 s0 h7 @" G
  32.     }
    , T& S2 Y, \" Y' f
  33. $ o, s# ^- J; v. @  ]
  34.     public double getAttackPower() {* V' k# ^; x( [* W
  35.         return attackPower;* s0 b1 k( g7 w2 r8 h/ X( Q
  36.     }
    2 K( `8 h; d  w0 O) g: p# D9 c
  37. " `5 c5 Y* b3 Y0 V3 `7 t
  38.     public void setAttackPower(double attackPower) {
    $ A- h+ Y2 R' b' n
  39.         this.attackPower = attackPower;1 y2 {1 b. m3 ~+ p! {; t; I
  40.     }: d8 W# s& \) t0 v& E
  41. }
    - R* l; p. e: C1 v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: T6 o1 g3 ^9 V% |6 L/ D
6 k6 b6 A2 |/ `: w, S' k8 J* p
  1. // Пакет org.l2jmobius.gameserver.model.battle8 |, V: P# V4 t1 C1 h
  2. package org.l2jmobius.gameserver.model.battle;
    1 T1 \# u7 i* [- [, H
  3. ' [1 U! s" |  q% {
  4. import org.l2jmobius.gameserver.model.actor.Monster;: e* ]; Q( |% L7 h: `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; }! v0 y! _( I+ ^5 [- ]" O* W, J
  6. 7 w4 j5 l: L- d
  7. public class BattleSimulation {% f4 m" g8 r9 i: R. `  O
  8.     public static void main(String[] args) {
    ' X, s3 p1 j! b7 L
  9.         // Создаем монстра
    / _0 k$ i& L1 n$ {- n
  10.         Monster monster = new Monster("Дракон", 100);- B8 T, Y: Z0 R/ `- ~9 ^
  11. 7 i7 v) U7 _3 G2 a! F0 @
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак5 @+ S+ M2 ?* H, Z. a9 F
  13.         monster.setState(new AggressiveState());+ F6 d( x* O& g# i, n" F
  14.         monster.executeState();, {# o, L. A  w( ~$ _) P# h$ z+ ~! l
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак6 I* Y. d6 U3 g8 }+ |$ R
  16.     }" `8 f6 i+ O" E( e2 V
  17. }
    , I* r: |! @" {- v* m! o9 I) G
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 E5 l( b/ r7 N0 W8 |5 Z' ~Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
, U* x* w" l4 B
5 R3 ^0 ]0 s) N" ~5 n. R/ X
6 U0 _7 Q7 \% _' d8 x0 r6 r- s2 e# F, _
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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