Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!3 p5 I9 E2 d, W7 @* K
) C6 }. n1 n0 w

; _8 c3 e" a8 f4 l: ]7 o6 x# J2 nЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы., i1 i% H' k, \2 l- x" U# Z
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
1 Y% x# d8 i" JАстралия ?! z9 P( F2 u* Y% ]" |' `

+ U+ `* p' t% Q' B4 b6 h* ^

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
5 w3 \1 k$ `* I# s9 D7 o. l- Y0 hВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 a/ a9 ^2 r& F5 J/ h& U
* p$ u4 K& f; I: b1 X
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ! [! b" u8 @8 q- V5 N
AlexCoder опубликовал в 2024-10-16 18:31
' i5 B4 y# a7 Y2 S8 g. L+ K& hДень добрый!
8 i5 x* U, `, i3 I) b, hВ статье описано взаимодействие игрока с N ...

" _' I+ Z9 H" F9 e: k! r% _. \1 YДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 i) W: W* t) I. V  _% y# N$ d% J& |

1 }( h" v8 L! Y" JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' T" @9 t3 Z( c9 L" A) }
/ W( w: L; O- D9 B2 {" dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 V* [( u/ _' m- [* f& h! d
7 ]# j! Y! e3 ^2 _* G
  1. <font color="Green">// Пакет для состояний монстра</font>
    9 N. b- \9 Y$ }2 m& |
  2. package org.l2jmobius.gameserver.model.actor.state;
    + N4 G. Y6 s9 C) h3 S
  3. <font color="Green">! ]& w5 E2 o4 v2 W$ C
  4. // Интерфейс, представляющий состояния монстра</font>
    2 z* h7 ]* Q# V, X- d  X
  5. public interface MonsterState {
    0 L, x% ^4 s0 {) ^$ \. C
  6.     void handleState(Monster monster);
    . l$ j+ @* w6 V2 ?; j  |2 f+ x
  7. }$ t4 e: ^7 F' ^. e  P* R' F9 t
Скопировать код
$ _4 _" R2 f& _9 G$ L% ^5 v
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ n% p( ^' Q* |
. Q- Z" I  {  R& _- Z8 RКласс для начального состояния монстра:
7 Z1 P+ [: k" V" K; f3 u* F2 ]
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    : R* B/ J% m( C7 j
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! y1 H' R# k4 C+ J
  3. , W# S' G% C* Q7 H& V: K# i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 d+ u$ S& [! r% h8 Q" e" R- V+ u
  5. 5 c" D6 v* ^, L2 o
  6. public class InitialState implements MonsterState {
    ( _+ k3 r9 c$ _" o6 n6 i
  7.     @Override
    6 {% O3 J5 [, n* _/ a
  8.     public void handleState(Monster monster) {1 E) Z0 K, G( F/ @* r
  9.         // Начальная фаза боя
    8 }, r  R; S6 ~6 a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * Y2 C" [2 {/ J9 ?) L, c8 k, ?0 M
  11.     }, T  ?5 g: t! _8 \4 f
  12. }
    " I1 f9 X8 f3 ]! j
Скопировать код

# T7 K! E. d- K# m4 b& i3 s' f) {2 r& d6 T4 F; i, I" `+ A
; x- I5 M1 i3 y4 b4 b/ D

# h/ U1 m' e( z" L
3 k, k6 y% @  ^3 Y! a* T2 T4 N) T

; D0 r8 E5 v# v5 i! @+ w; L8 Y
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 0 M! p9 t% M  B" e) U& a, g/ o* Q6 u

8 |' q6 L% b# {# KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' A& C, L( ~. e, i: x8 h! M9 o  M4 L" H4 ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 v, R3 s4 C. k) e8 y3 S& Q
9 Z+ n: g7 u, L- ~; h) b7 K5 s
  1. // Пакет для состояний монстра! I$ Y4 ~/ _! Y9 i. Y0 Z
  2. package org.l2jmobius.gameserver.model.actor.state;) O0 _" r& C7 h0 C8 f
  3. 1 z- k: G+ b" ~, u
  4. // Интерфейс, представляющий состояния монстра; a  E$ e2 P, M
  5. public interface MonsterState {+ l. c  `7 N( p" l; `
  6.     void handleState(Monster monster);5 \2 k( }8 Q- l
  7. }7 X  j) |; k5 t& K$ l# x: G* H. j9 f
Скопировать код

; G/ q" M3 X7 M# h" zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# Z  w4 s0 i5 u& N7 V  P7 M. W- v8 l1 q
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ a2 g6 s) V4 f% l
: _, `) M5 `1 YКласс для начального состояния монстра:
& ]. R3 O  t$ b% D* p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 p1 J7 J6 |' n  ?' ~
  2. package org.l2jmobius.gameserver.model.actor.state;
      S5 a4 \9 p. N8 H* l6 C

  3. ! I/ q. O: u& Y% [* t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 I1 @8 t6 T; Z( L9 I0 s

  5. 8 W% g( w6 T2 K+ ^
  6. public class InitialState implements MonsterState {1 c( L' z2 ^6 t: k
  7.     @Override
    1 a7 M4 N* O/ f: b. f2 f% C
  8.     public void handleState(Monster monster) {4 P' O* M' J+ v
  9.         // Начальная фаза боя
    ) G$ S5 O- s- f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( ~, y% \8 w, f" _+ {3 z4 r" @
  11.     }
    9 `& U: T) k2 u! g( F4 m7 I
  12. }/ Z9 T- w* a- g. z# M
Скопировать код
Класс для агрессивного состояния монстра:) ?/ e8 _9 I# U: [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ `, X5 h) G7 M" x
  2. package org.l2jmobius.gameserver.model.actor.state;8 T" K  o0 B) }3 l/ ~3 W
  3. 0 ?1 W: Y) {  B6 A* T7 M8 j# v. {$ |
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 b, M0 H. E! Q& w9 Q6 e

  5. - p% u5 t+ E7 a7 a, J' @! x
  6. public class AggressiveState implements MonsterState {7 m/ n% }! q$ Y* B# K8 L, t/ O
  7.     @Override
    7 j1 D7 k4 [( O' y* \* l6 k
  8.     public void handleState(Monster monster) {
    & C  T% o( X: S, e
  9.         // Агрессивная фаза боя
    / K' q8 B6 m. v' i$ _4 J% c+ H" P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* P% R3 [; T; K
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки5 z0 P7 C% D% ?# r9 l  R0 v
  12.     }
      B$ f0 g; o% K' q" W) B* o0 M
  13. }
    3 {) A: r: R7 ?1 o9 ^% c% Z: e
Скопировать код
Класс для финального состояния монстра:
7 L$ S3 z8 Q1 `1 ~3 j; Q# k4 O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * m0 @6 T% V4 V5 s, K
  2. package org.l2jmobius.gameserver.model.actor.state;, p$ o4 k. T; `- K. v' o
  3. % f1 O# a1 J5 ?0 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 ]" ?- V' Y9 z5 M7 N

  5. $ `" Q0 Z! y0 {' a8 s( o- f
  6. public class FinalState implements MonsterState {
    $ `" P- ^9 L$ i; i/ [; m
  7.     @Override
    8 k, i: i0 {: u. D- Y; C
  8.     public void handleState(Monster monster) {
    # d( {4 x2 P0 O/ M# [: @  t
  9.         // Финальная фаза боя" q1 [8 w0 y4 w: b- v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");, R! A" L$ ]' F" s9 R2 H
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" t( n( C  P3 N( c
  12.     }
    * m$ F5 L" }# n, T5 G' \* Q& t3 r% A
  13. }
    , X6 E3 R. }6 _8 a- A
Скопировать код

7 v4 k! \& I7 @Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) L% ^; T; k' f) @$ W$ o( m
  1. // Пакет org.l2jmobius.gameserver.model.actor
      a! ^% [" T  W* F
  2. package org.l2jmobius.gameserver.model.actor;
    7 t  N$ W, ?) C

  3. + D# k, k% O& ^. u" p/ P# ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- q2 G7 J% i7 n2 Y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    3 I2 J/ S' a% j) u6 ?: l
  6. 7 a/ V% v+ z; q) A
  7. public class Monster extends Creature {$ u# H. A$ o: U8 J# j2 n7 U
  8.     private String name;! p" x. d! `1 E; Z; ]+ [
  9.     private double attackPower;
    ! H/ a4 _. p: G6 r  `
  10.     private MonsterState state; // Текущее состояние монстра1 S) d8 t% U( @# q

  11. 5 I4 H, e9 X; k4 t8 Q' U
  12.     // Конструктор монстра% B( L6 Q8 L1 s7 h+ E8 \  z! W0 m' X
  13.     public Monster(String name, double attackPower) {( D( a4 s! H7 T- d0 A
  14.         this.name = name;
    + ~" F" c$ }2 R7 {3 x% ], @
  15.         this.attackPower = attackPower;3 H, P0 D4 J7 t, {$ [
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние( ^5 z! b3 w6 K* A/ w
  17.     }+ q5 v6 b. N% V) M
  18. / d4 Y# r8 h/ c9 N
  19.     // Метод для смены состояния
    6 T: S8 ^7 o' t, v/ [1 ?
  20.     public void setState(MonsterState newState) {& ?% H9 v, U. c3 L0 U9 T
  21.         this.state = newState;6 @" v7 [. F. h- ~/ M- a
  22.     }- P  N9 G7 V& \2 u4 I: \4 E
  23. & c' L$ |( q2 R, z# r
  24.     // Выполнение действий на основе текущего состояния) X" o2 ~/ g; A' t6 y( d8 f7 m# j
  25.     public void executeState() {
    ! M! O5 K0 \. D) X3 F
  26.         state.handleState(this);
    ) G) i2 @; v  z1 R, R
  27.     }
    $ ]/ H  Z+ L) v
  28. ! T' A! O3 y* C, k
  29.     // Геттеры и сеттеры& r7 ?; s) K" y7 Q4 s
  30.     public String getName() {, h! V$ f. d3 K9 Y6 \& R; T7 @
  31.         return name;) w3 L6 i6 z$ r/ _1 V2 h( h5 J
  32.     }# x% Z9 |. U( G- w! F& w
  33. # ^5 P5 ]) d3 k  O! S& \
  34.     public double getAttackPower() {. @& p+ e6 `5 R
  35.         return attackPower;
    2 i. W( h" ^9 _3 ^2 K5 P4 F
  36.     }( p* V3 c9 R) G8 A# b

  37. : B: c; U. s  w7 l6 {
  38.     public void setAttackPower(double attackPower) {4 V; U! |3 Q. m# y; O( f. @! t* B. b
  39.         this.attackPower = attackPower;
    & H) w% ?+ |3 N4 F  s1 r$ _& l/ w
  40.     }+ O- s1 j+ D- J. I
  41. }
    $ L6 r8 Z; `4 i. [, C; d
Скопировать код

5 \3 s" m: _. E1 f9 d9 C3 yШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
; D9 {6 k& V4 s0 L* W6 P. F: P, _0 {3 B7 B* Q8 P: {5 X
  1. // Пакет org.l2jmobius.gameserver.model.battle
    " U1 O  n9 v8 L4 S
  2. package org.l2jmobius.gameserver.model.battle;
    ) {' `' p0 d1 D/ h* l

  3. 2 w, g( N) U5 q4 O7 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 O: `0 Z/ o* o# ?2 g+ ]0 \
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 u% ]0 g; D( Q& ~
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
      \5 ~2 ]7 s! T# ~- c$ w

  7. % D3 E$ b% f& \; `* u: \" b
  8. public class BattleSimulation {9 P3 R3 K2 L& {/ R9 ^3 H# g
  9.     public static void main(String[] args) {4 f: U5 o3 U% t0 H# k0 Z, O
  10.         // Создаем монстра с начальной атакой
    5 [9 c: x  G8 {
  11.         Monster monster = new Monster("Дракон", 100);
    : s2 ^; T+ D9 I
  12. - l6 J( s3 ?/ Q+ F" O1 H: Z
  13.         // Начальная фаза4 F' z5 j  Y9 w
  14.         monster.executeState();/ u, y7 y7 `/ O& W2 x

  15. / |8 B. y3 Q7 v& H" j3 }
  16.         // Переход в агрессивную фазу
    ! ^0 k0 b* v& |# q+ O& K
  17.         monster.setState(new AggressiveState());1 n5 D! l/ f1 [: H6 e6 Y0 d
  18.         monster.executeState();
    + g, j4 P/ N- S4 u, y

  19. ' Y( I; u% j/ Z) q5 G8 w
  20.         // Финальная фаза
    ' k' [! p6 G" W( M" h3 K/ L
  21.         monster.setState(new FinalState());
    . g8 g% z( {3 f- z6 W4 \/ s
  22.         monster.executeState();
    3 ^6 W2 a5 e- ]! b
  23.     }
    9 D/ n% v3 R) @2 U% P
  24. }) t& T( |' f# H0 S1 R$ Q
Скопировать код
1 m. [* J" z; E2 p  ~, O! e1 J3 n
Комментарии по структуре пакетов и классов:
4 a2 D3 b: U% D( p6 c  ]
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ) c  P+ U6 q; `& I. K( ]  v
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( }$ e; b8 b2 V% C5 Z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 F; s9 W% _- o  h) ?' L, S5 h- W2 e# n
, t+ g* E- N; E

# ?: i- C0 o9 e# Y& R4 o6 U" m  x3 Z
1 L* j7 g4 Z( i0 j6 _
! q- D9 Y( V* s; j. h6 i

" \# Y* o% P0 ]. Q" F0 N* W- b+ }! _$ ]; Q

4 Q  a# B6 J4 }. n
5 x7 d$ k  ?+ l$ }; f  f' S8 v7 V1 e; p9 R: N/ v; n

9 t2 K) U. a- U
0 W# @4 F/ a( h1 k$ M8 a5 _3 ^& w1 p0 `

3 _8 r1 g7 }* N! R' e
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
& B: H- c. ^9 QДля управления сложными взаимодействиями, такими как  ...

# C: H0 ?# S9 d. |; I9 l, h# i: _Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ A& _# Y/ W) O6 V+ g  p! m; t/ gОтличный подход! Использование шаблона "Состояние" де ...

( v" q! R- w* b# M$ r( V( x' Z" [Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 @; `. l( o8 i" l9 d. ?3 l9 {# v# X7 v- D8 f! ?8 b
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
0 ]3 U9 N/ E2 U3 J" B( a+ @' H1 Z) z* ^, ~- A; n$ Z/ A
  1. // Пакет org.l2jmobius.gameserver.model.actor* r: k3 A! M% P: d
  2. package org.l2jmobius.gameserver.model.actor;* y7 P6 t8 c- }2 m6 B4 u
  3. % e0 [2 C  z% D8 F# e0 c# p) c) h
  4. // Перечисление для типов атак/ N) z& I. |2 j: E  r2 U
  5. public enum AttackType {
    " F5 d6 q) D" z% p. U! E% n
  6.     PHYSICAL, MAGICAL;
    # @+ P( \/ j3 W6 e8 N
  7. }
    % U3 V( [2 D( O/ {( Q! o
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
4 z6 j( [1 k. Z: a1 B  JОбновленный класс для агрессивного состояния монстра:
& ^7 I! b8 `% q0 G
8 b4 b: b% k8 w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; K8 X4 S& E: Z# J  w
  2. package org.l2jmobius.gameserver.model.actor.state;3 w- {' F  a: x' Z2 e
  3. 9 l$ O; E, w, [; N6 L8 i& q: e
  4. import org.l2jmobius.gameserver.model.actor.Monster;( S# l. G* g- O; `% A
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' |) D# Z0 |1 M0 k" i
  6. % M7 v% Z5 U( ]* y; R/ @- C
  7. import java.util.Random;
    & @8 f: J; W- v2 T0 f1 Z4 Q
  8. 4 M5 B# q7 Z+ F3 Z( s: r: g
  9. public class AggressiveState implements MonsterState {
    7 G* ^: u9 k7 K7 ?% t$ N0 |
  10.     private Random random = new Random();9 Y2 Z; L; B1 M( A

  11. 0 T0 Y; ]  b& v; z
  12.     @Override
    ( W0 I+ \. i2 b5 y" O1 `
  13.     public void handleState(Monster monster) {; K' e4 W5 V( S1 B* {3 y; h
  14.         // Выбираем случайный тип атаки: физическая или магическая
    & c; b8 J3 [% L& c2 O" K
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    - [8 C, r8 E7 x1 i! v% s, N( ]* r

  16. 2 {8 |$ k0 z4 {7 ^5 g* w
  17.         // Логика для агрессивной фазы боя" m) }, I8 J* \4 a- ?" C) u
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    / M( _( ?2 D* e/ ?3 @* k
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");' q) @+ Z( @* X
  20.         
    + I' N( i1 r# L
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    1 L) B3 e" y2 U  v
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    . ~% n& n5 z/ _0 ?$ f0 P! v
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);* m1 N* [1 u  d! p: {& ^3 o+ f
  24.     }
    ! [( Z$ u4 _6 k# p+ Z% O, Y
  25. }! R3 y3 J) r7 \" P8 i* j
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки+ O: h* ~$ d: g! F' ^& W
' \' H7 u: c' a4 n$ I
  1. // Пакет org.l2jmobius.gameserver.model.actor% u3 I% U4 z+ P% p1 V1 r1 p
  2. package org.l2jmobius.gameserver.model.actor;0 U8 B& G' @5 ^$ E5 D
  3. . g! K: L2 W% U5 X& e
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    # j8 d5 z- t5 r" f- U6 D, @% |
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ u- \' k- V' d
  6. 9 a" s. _4 C7 y* E5 ~7 m9 S
  7. public class Monster extends Creature {- f% h% O3 C* M" P' m* n7 s
  8.     private String name;
    $ W  b2 H/ {  u) u/ c1 t
  9.     private double attackPower;3 |* h  I4 O4 E, e2 h$ E$ H
  10.     private MonsterState state; // Текущее состояние монстра
    / h2 l" }; y! z+ ?- _" A

  11. 9 a: G" B$ f* h# Q3 C/ P9 B6 U- r
  12.     // Конструктор монстра5 [# I1 f5 g( W5 L$ H2 U1 y# E
  13.     public Monster(String name, double attackPower) {$ r7 q" u8 X& @+ o+ i! j$ w
  14.         this.name = name;; v4 E4 x( _3 l% r
  15.         this.attackPower = attackPower;7 G6 v% o) x0 c) c- e
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    / o2 X& e% ^) j! T
  17.     }; n+ _; l2 M; q  a) ?% T8 I

  18. % `0 v- j# ~; y7 G3 ^" k
  19.     // Метод для смены состояния; m& T) N8 `2 Q
  20.     public void setState(MonsterState newState) {6 T- r% G, Y% \3 c5 t" e: @
  21.         this.state = newState;
    & F! ~3 Z$ Y+ r/ I
  22.     }% S" |8 R+ Z/ a. w) A+ L
  23. 1 h7 K# ~1 y6 V) W! [
  24.     // Выполнение действий на основе текущего состояния' B3 a4 l3 b# S* ^$ l
  25.     public void executeState() {( W: I3 |1 V( w$ [
  26.         state.handleState(this);/ I; a; F! L  Q" Y9 d
  27.     }
    & @6 `! W2 Y) v; Q" y* c6 Y- @
  28.   c: k5 }6 B0 \9 F
  29.     // Геттеры и сеттеры$ V3 j& A% v. ]7 u
  30.     public String getName() {
    0 ^- ^- E& X( f: z& W  R% d
  31.         return name;
    : V9 a1 N# r/ P! O) P- I' E: J7 A
  32.     }* V3 n; e% i) z% p

  33.   m$ G6 j5 p. t1 S# e# {/ X
  34.     public double getAttackPower() {+ X3 ?( i# R  f$ x& @9 m
  35.         return attackPower;
    9 N' w/ {% W9 o1 h. E
  36.     }
    3 h* j3 b# u' u+ W

  37. , M& r" n( ]0 K7 @0 M/ f* ?
  38.     public void setAttackPower(double attackPower) {4 c, H2 p8 e* o, ^$ P3 e
  39.         this.attackPower = attackPower;* ?) _" y# e- [
  40.     }
    5 ?6 n2 L6 z7 N, Z7 e. }7 q
  41. }, E- B& J/ C* c
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 Z; E! a* i8 ^# a8 X# U% _5 z8 X$ i  g. S2 {- t0 A
  1. // Пакет org.l2jmobius.gameserver.model.battle
    $ k1 V& G, T- Y6 V
  2. package org.l2jmobius.gameserver.model.battle;& m" o3 Y, }* P7 D
  3. 9 C- X, {4 d. h3 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 W- c; R9 l' ~/ e7 g# X8 e
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 O/ M8 t" \1 m4 M) V

  6. ( t' [5 A  _4 z
  7. public class BattleSimulation {
    7 e0 M& f; \. N
  8.     public static void main(String[] args) {+ p2 K/ r3 O* {, f+ O& H) d
  9.         // Создаем монстра
    # U' s) h0 k) v# r; F  t8 a9 [
  10.         Monster monster = new Monster("Дракон", 100);
    + ]0 g& Y2 T7 e' t

  11. + ]9 o6 C( O3 S( X
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак4 V6 i; r' ~! g2 F. g% N# e$ N
  13.         monster.setState(new AggressiveState());
    , z% s$ L- Z; L
  14.         monster.executeState();
    7 D6 [& }$ h7 x
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 Q5 S0 S" q1 }7 [
  16.     }
    8 W4 `% |; b! d7 H
  17. }
    5 F0 }& Y1 _3 S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.- a: X+ k% x3 Q4 S# I
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
" E( s4 H' ~' Z2 Q: D- J( ~4 y) C( O$ b) C* H: I2 u

# u9 u: e% [1 }  O; ~
- T  u" [% Y# J6 q; F, S
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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