artace.ru - творческий сектор

Название: Шаг 3.3: Взаимодействие игровых объектов [Версия для печати]

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!0 H8 {, I  W# y& ?+ _- l* g2 P/ m! k

0 h( O1 U$ m8 m9 T* n# N
1 ~- j4 ?+ Z) M2 l+ A+ K8 D6 S
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 E# a+ Q; L/ ~/ v+ H
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
, D- i4 q$ L2 ?% Y6 b( a, G- H5 EАстралия 🌟2 h' q% t2 m1 R# X& Q( B! s4 E' m2 h# N
. ~' j! r# g. Z/ R* M

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
8 z5 i- ]+ |- ?  _' q4 i7 LВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?* b0 E6 x# r5 @. x

0 v1 b5 l" D# o5 g9 ]- z4 J
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 # I" m& J) ]8 ?  k. }, u5 m
AlexCoder опубликовал в 2024-10-16 18:31
9 j! D3 Z% c, A4 b& _" c% yДень добрый!% W: V# E3 m. q
В статье описано взаимодействие игрока с N ...
" s# D6 S4 k$ H- |
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & u6 t$ `2 F! a6 Z! v

' {7 ~" a2 f# Y' KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
& N: P  f& S! c+ e3 P$ s6 m% @; _
/ b- r4 z! ?! z# N2 WШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.) d2 T- p; X/ V; a
2 s2 B  }3 H' @; W* T0 |
  1. <font color="Green">// Пакет для состояний монстра</font>
    % j8 U0 @6 [/ J6 `
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! a, K% F: o$ ^& s2 Q! O
  3. <font color="Green">
    $ f' N1 R& z8 c
  4. // Интерфейс, представляющий состояния монстра</font>
    + n1 T5 l& e( {) L" d+ l3 ~( i
  5. public interface MonsterState {0 z) d! v1 M0 Z( D* L
  6.     void handleState(Monster monster);
    0 z7 P4 ?& d% E* k. s8 I9 F3 @( ^
  7. }0 @+ u) M: A' Z1 w) B3 a; d$ g
Скопировать код

7 s, ~5 r5 H- e& E( |# P1 o' R) D% WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 r. N3 L9 M- K$ \4 n+ P( g
/ p5 K$ T& J. N& C7 U9 O+ I4 h5 d
Класс для начального состояния монстра:
* f; s0 U. }- x# |9 g  ^
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    + |1 z8 T, G* F5 v5 y3 T
  2. package org.l2jmobius.gameserver.model.actor.state;. n+ Z6 X3 u3 K; x0 S& M
  3. ! f* d5 ?9 Q2 p8 }/ R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) S  @4 ?- d( U! b

  5. ( h* o/ L. i, ]
  6. public class InitialState implements MonsterState {
    3 Q. K. m& F; c' H, D4 ^4 @8 F4 }
  7.     @Override! D$ R6 [4 E( \) ^6 m% z! Q
  8.     public void handleState(Monster monster) {
    , a5 a0 M2 K! g( X: I
  9.         // Начальная фаза боя
    2 _5 [* m9 Q+ w) a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ c/ O' b% S  R  J* [
  11.     }
    # C  M! }& F# S: T7 |
  12. }
    - y: {& \! b& V4 D  O, g
Скопировать код

, h/ U, d( b: E* c4 }9 ~
5 V4 z: j$ Q8 G( c
$ n- G# o& L2 c  Y! M' h0 C# K% t7 N3 J. }. _5 [2 y

( A% l6 k" V' C0 c" k
! `% [! i+ B. g/ D1 k0 X9 G: P( D! r4 G. s- z' L

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / c) S5 c8 h3 L% T( L0 X9 J& p' D
. G" ]; {  v) |7 c0 t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 g. Q3 X, e- a7 \/ C: x& T/ w
# j; d# ]! ?- `' b4 K( U: `3 n
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния." z# k5 H9 z* \+ z
" f( h. z  ^$ v3 K$ A: |
  1. // Пакет для состояний монстра
    " ^1 w8 `9 \7 H, e. o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; T% R: \/ w9 ]4 d! w  }9 v
  3. 1 R3 N1 Z4 P  {+ r  F, [
  4. // Интерфейс, представляющий состояния монстра/ u4 g$ t9 w/ N5 @* c
  5. public interface MonsterState {+ Z/ j. T8 S/ P! z8 V
  6.     void handleState(Monster monster);; a  l- {! M3 j
  7. }
    ; \- O  f. B& U2 R8 S+ S2 W
Скопировать код
5 Q: D! H+ V6 X# u7 I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , u+ Q& R9 a) h: \3 O$ F, s: L

6 `0 e! I6 v$ K9 H; E6 D+ ZЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. u$ v+ {% f. _7 E6 J& q
8 W+ H! |$ Z' b, k: v9 z
Класс для начального состояния монстра:" m  c% Q! M7 e# h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ d+ e$ c  x  ]( F$ L
  2. package org.l2jmobius.gameserver.model.actor.state;7 I) G! `; D2 }3 T

  3. 5 `* c2 {! @2 H# T" h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : E6 S" {4 V2 e& L

  5. ( R( I" q7 j! ]1 _9 D
  6. public class InitialState implements MonsterState {1 [+ d% {- h, L. @# h5 Z  P8 p
  7.     @Override
    7 j8 r. r8 {' @. L# I/ \
  8.     public void handleState(Monster monster) {2 i5 G) V" z5 f$ W
  9.         // Начальная фаза боя, r/ y) y' R) h. {+ C5 k2 x" ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! b- G3 o' ]/ T; ^/ k
  11.     }2 B% Z( L6 [/ h9 O( `7 h& s
  12. }
    9 ?3 g6 N8 d  H! i& T6 {. P
Скопировать код
Класс для агрессивного состояния монстра:# j) m3 `' C( J: t6 G% @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" v, N! {- X* B4 Q2 X3 H3 k2 `  I
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 d8 G- P7 h5 m5 ~
  3. / d: c. d0 x) ?3 ~( E7 o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 `7 @! A# G2 A8 X7 z$ \3 n' J# r
  5. 7 y% @! p: y- k2 D9 d- U4 z) @- h
  6. public class AggressiveState implements MonsterState {$ E" Y( C! b* P7 m4 q" c, _
  7.     @Override
    : K: a! }, \/ }+ g4 g
  8.     public void handleState(Monster monster) {
    0 s( t8 B4 H) r% g, `3 ]
  9.         // Агрессивная фаза боя
    6 k8 U, D7 S2 B3 A, M
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 U7 e0 {9 r2 f; F) c2 ?) T- i8 u4 u; y" H
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    7 Z& m5 e+ p. @
  12.     }/ j% K& K% P! h4 }( x7 o; s
  13. }, C* m4 ?" m* M2 H$ @
Скопировать код
Класс для финального состояния монстра:0 \. H% J. }0 P. |( |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 F2 n( L5 Z9 H/ U0 N; u
  2. package org.l2jmobius.gameserver.model.actor.state;/ C, ]3 S/ G! p, j6 t$ I
  3.   z$ J2 q& n: b( N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; |) N+ I6 f! S; Q; K, o9 l
  5. 0 E% E( W; ]0 T) Q
  6. public class FinalState implements MonsterState {
    4 O% M( M( {# e5 n$ |- y# e! I
  7.     @Override+ b& a" q3 U$ S. q- o3 l) \+ s. O
  8.     public void handleState(Monster monster) {
    6 v" @" k3 A! x# e) W3 R
  9.         // Финальная фаза боя. ]( s, F8 p& ?
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    * v- _4 d7 h& g# o# I2 r# ?% d" d6 m
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    - p! y7 H) M2 P# T" K; H! A3 u
  12.     }
    4 t5 I" W  y8 R. Y5 H6 C) Q' D, d
  13. }. \& M4 x" f/ q& L
Скопировать код
9 `/ F; F; ?: o1 C, |
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.% f& ?1 `0 ]0 a
  1. // Пакет org.l2jmobius.gameserver.model.actor- b3 b) N: f2 D* L5 {: P
  2. package org.l2jmobius.gameserver.model.actor;
    0 F" y) Y7 k# Y: K9 b

  3. 1 ?% ^0 B, G5 r
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ N- V& b* ~( M
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + m, p- K$ N/ q/ \6 }& A! Q1 D& T( ]$ d
  6. 0 u  N5 ]! U) G" b, O
  7. public class Monster extends Creature {. `) W0 }9 z; o/ Y; s2 R/ `
  8.     private String name;
    2 ~. H$ K6 p+ V- Q  e. A+ O6 o7 X
  9.     private double attackPower;
    * u; n. Z# |- C- g* @: ?
  10.     private MonsterState state; // Текущее состояние монстра2 r! [9 q) H9 ~1 t( V1 a
  11. + R0 N! ]) }: G" N& b+ ^" E$ t
  12.     // Конструктор монстра# B+ E) H$ Z& J6 y/ L2 v% T
  13.     public Monster(String name, double attackPower) {! W+ X; T  r6 m
  14.         this.name = name;
    . L* S* C/ o' B8 l& j% O$ U. ~
  15.         this.attackPower = attackPower;1 K* _$ I7 A5 Z1 P1 ]0 r
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    : a1 M7 ?7 {. M/ I: R4 e
  17.     }7 @7 z4 k2 g: y% V: u

  18. # d2 M: C+ U1 T0 s* n
  19.     // Метод для смены состояния
    ! ~2 P: h$ U  ?
  20.     public void setState(MonsterState newState) {
    - g+ F/ ?0 ^2 `5 D( l
  21.         this.state = newState;
    4 G# R% y' g# x( h4 s: A
  22.     }
    4 j( `" s# D1 Y9 ~' s$ v
  23. - [5 x/ Q2 n" O! r4 k% N# t
  24.     // Выполнение действий на основе текущего состояния, [, P& i0 S0 \8 z
  25.     public void executeState() {
    ( a7 A! x6 x8 l' B
  26.         state.handleState(this);, g6 T% @0 l0 `5 u: u7 j
  27.     }( C0 u7 Y- A( c& ?7 O3 i
  28. 8 F! l0 H6 c' {$ {3 D4 W. [
  29.     // Геттеры и сеттеры6 A1 J; x7 R& b$ t- Q5 [
  30.     public String getName() {
    ( a- ~0 k) h3 p3 K3 V' I1 W
  31.         return name;
    ! ?7 ~2 w. G4 P9 y- i
  32.     }
    6 X, _9 N" t) x: V, y% V
  33. 1 ~* ]: F* s& c( E% b- g& A
  34.     public double getAttackPower() {
      _  m9 R7 p+ d! F. a1 S
  35.         return attackPower;
    & E' H% x$ w% e! Q" r# J
  36.     }
    7 \- `7 e4 p$ I6 ?6 q

  37. 2 Q2 q* O  R, ~  Z; Y
  38.     public void setAttackPower(double attackPower) {* ^! F) ~% T0 t+ J6 L  V0 ]
  39.         this.attackPower = attackPower;$ N, N6 g' @4 n" H) s, b
  40.     }
    2 D1 C* u! @+ S* b& z
  41. }5 \: O7 l2 {) I5 B4 Q% y
Скопировать код

! P5 s& Y3 n9 L3 MШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." F5 ^( Q2 b9 O& i; G) Y) D& E
/ Z) E) x' G1 Q" p
  1. // Пакет org.l2jmobius.gameserver.model.battle' m4 u# j7 G+ \) T2 N
  2. package org.l2jmobius.gameserver.model.battle;& n- n4 J2 i* H) h' b/ i4 P

  3. ' o$ p0 _% @' K; `! @6 I: H; Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 D' D9 O6 y' r1 [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;# w8 U& y9 n! b
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;& t5 S% N. {. F: d: g3 a

  7. 8 J- U) u' d% r6 E, d% I! [. a$ g
  8. public class BattleSimulation {4 U5 M* t8 V4 p' q% h, x0 A
  9.     public static void main(String[] args) {
    ; R. ?; K% i2 \  K) ~/ A% t
  10.         // Создаем монстра с начальной атакой6 c  B4 L, o, L* @  V
  11.         Monster monster = new Monster("Дракон", 100);
    / Z/ p% y  ?  O$ Q! J+ G* k( f& M

  12. ; v2 i: v% t3 V! w# Z" q( H
  13.         // Начальная фаза0 h# Y- g" D' U  _2 X' Y- v/ S
  14.         monster.executeState();& S; l/ R% @* u, }
  15. : e+ z& W: b; Q
  16.         // Переход в агрессивную фазу
    * K5 H; A; a6 d) E$ u+ }
  17.         monster.setState(new AggressiveState());
    ! E. I: \) w, q& }
  18.         monster.executeState();5 v3 U: U+ j( ?2 q. {5 r1 x
  19. + Z+ E# R+ P1 E: P) ~# h% i
  20.         // Финальная фаза9 l5 \! _2 C/ K, i  ^4 V, M# ~% W
  21.         monster.setState(new FinalState());
    * E8 a, @  \( a) T: V
  22.         monster.executeState();
    0 {3 s/ J2 y) I4 \; I2 ?' c3 u" s
  23.     }
    6 [1 i5 I  c' _$ Z
  24. }+ X, a1 \# B% b  O' Y
Скопировать код
+ |* N) }& l; a4 g6 D. x2 |
Комментарии по структуре пакетов и классов:
; N5 z( l- e$ @* |0 m5 ^0 xЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.* ?2 m2 c1 ]0 s5 ^4 [% ^
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% \1 Y! l7 I& _2 |
. O/ B; ~: r5 C* u6 l! ^: L3 a! N+ ?( D- U
1 B8 J& Z$ [; ?$ P" k) Z$ d8 D8 ~

. L( P9 G, y% T6 ^, a/ O$ B% A8 U' [" I' S, D+ r8 R

) Q1 @( T( {0 {& t) e9 N, T  }) X6 H7 ]) M$ ]5 c" ?7 c

7 I: e7 Y0 b( @, }4 ]# X/ y& B0 Q4 S: `. G5 ]  ~8 m4 m6 A# X- c
  V. \8 y5 [0 k2 e
+ U! F- ^/ }0 z. e4 W
6 l4 Z/ L6 m# G+ U$ D# B1 Z
" r7 J; H* ]; l$ Q/ P' b/ G5 C

4 j- w0 b3 H8 ^' y& ^
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
  R: q2 ]6 D  ]9 i6 [& C5 h* SДля управления сложными взаимодействиями, такими как  ...
& Q! x% j4 G6 T; k" M5 t% ?0 \
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21: v* L2 r) E* \6 y
Отличный подход! Использование шаблона "Состояние" де ...
8 N' [0 e$ u  [; G7 m# @3 z
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.: o" A1 k3 r4 f8 @0 B

( S3 h4 g; l+ a& @) j1 tШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.. T6 U# ^. c; n8 J
8 t1 s4 O9 z3 Q% a+ c
  1. // Пакет org.l2jmobius.gameserver.model.actor5 Z2 F& d  Z. X6 I. c2 E
  2. package org.l2jmobius.gameserver.model.actor;
      _. N5 U2 @, W* G' K
  3. 9 \8 y2 I7 I% g5 Y7 h
  4. // Перечисление для типов атак" W4 B, Z, C6 p
  5. public enum AttackType {
    ' e! C6 @" o: d! s& p( a! z
  6.     PHYSICAL, MAGICAL;
    / ]9 Q5 M( q5 g2 e5 S4 I. D3 t
  7. }' T" ^! Q; h- ]2 T
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.* A! S5 U9 y  U( J7 d# \
Обновленный класс для агрессивного состояния монстра:
! y+ h4 j/ A/ v$ J. c% d, a. y; y; ~( F, P; r4 w! h9 s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 C  m8 p; {3 @4 Y3 G7 l9 D* h
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; D7 H5 `; ~7 `( I3 k. z

  3. 9 e9 P! ?4 c; M8 I/ y  y, a) {+ C
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 G  d* a$ Q! C1 A; x& |
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    7 h3 ]3 t* P: Y& A6 z

  6. 1 |) k% C  h3 K$ f( T/ \/ s9 X# q
  7. import java.util.Random;
    # }* L" R& `/ F# Y2 i8 Q

  8. $ M" l/ q4 j; _9 R1 {
  9. public class AggressiveState implements MonsterState {; }* l. C! G3 i  ?2 L
  10.     private Random random = new Random();6 D; m/ _8 |# L4 I+ A" r, E
  11. 1 g. s- w+ n% G5 `6 H; V( \
  12.     @Override
    ; |; X: b% Y% r4 a: J. \
  13.     public void handleState(Monster monster) {
    7 E8 s2 {- R5 U7 A3 y) O% f
  14.         // Выбираем случайный тип атаки: физическая или магическая/ M) G/ c" q2 w
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ( k$ X: ]) Q+ d7 r

  16. 5 ?/ ^+ z' S7 P* x, ~
  17.         // Логика для агрессивной фазы боя
    - H7 y; {3 Q+ w
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 Z4 C! A- ]" D0 @) K( x% m+ a
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
      j" a# U2 t0 e  M
  20.         
    9 y. A: [/ y( C' Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки' g5 ~* T; T% P8 F! U
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;" R7 E: m6 `( i2 e6 R4 K
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    * Q5 W! U, M0 l4 ^' Z2 N
  24.     }
    - ^$ n) p: q+ ?3 \  Q
  25. }- ]+ w# u/ i, Z. X4 [9 |
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
* F5 L& c' n" U+ h+ M# x0 s4 n  T/ q- g
  1. // Пакет org.l2jmobius.gameserver.model.actor% X& H( f: X& x9 n0 |! U
  2. package org.l2jmobius.gameserver.model.actor;7 z; u( z- J) W7 d7 d4 c5 Y7 @- J
  3. $ r# U" B0 a0 ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 {) _# {* w! Y/ E+ t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  g" O' Z6 m3 N8 ^6 v# T
  6. 5 h. P) D6 u2 i% v
  7. public class Monster extends Creature {
    % E; Q0 s7 z4 y) J. j! I
  8.     private String name;
    ( s& t( J+ Q7 n8 X3 s! P- {9 K
  9.     private double attackPower;
    1 G" A) p5 R, Z$ m0 `* C
  10.     private MonsterState state; // Текущее состояние монстра
    6 z% Q9 `7 }; \: Y5 k0 R$ x5 u
  11. 6 p  |) M, y. u6 \: b
  12.     // Конструктор монстра
    ) H) E3 I0 ^% _3 E
  13.     public Monster(String name, double attackPower) {
    7 f% h+ O" L- f" O, I- x2 H4 m+ x0 Q& O
  14.         this.name = name;( h( u( w9 b; ^# q7 _2 s& w6 C
  15.         this.attackPower = attackPower;
    & [! ]! G3 ]; {
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию0 A$ q6 ^- ?0 G2 M9 R+ Z
  17.     }% H1 N/ u; r. ~" j. Z
  18. 6 e& k- O, u- d2 W, q0 v; f
  19.     // Метод для смены состояния
    - \2 ?# A" F9 l) T  W: E* W
  20.     public void setState(MonsterState newState) {
    3 @' L( ?- J- g3 Q
  21.         this.state = newState;* L9 g3 E) }! d3 Q2 \
  22.     }) _6 E6 P! ~" o9 j1 D, L9 J9 b

  23. 4 k4 d+ c7 V" g
  24.     // Выполнение действий на основе текущего состояния; `5 \; |7 K6 C/ w- B
  25.     public void executeState() {! u; n0 b+ R* E
  26.         state.handleState(this);0 H0 {/ C/ Y) s$ O$ o
  27.     }) C( @7 m' \/ I% v

  28. 3 ~1 s: w+ |! @0 O
  29.     // Геттеры и сеттеры
    ( Z: i' P6 Z. J/ ?$ [. [
  30.     public String getName() {* A$ ?& C: @8 n& s& H
  31.         return name;
      t5 d6 M+ A( H
  32.     }& g6 W0 C+ z0 m  Z) n$ P

  33. 1 x1 K1 [% e8 e6 C, G$ o: F* X" i
  34.     public double getAttackPower() {+ f3 t; B3 s$ b" ?
  35.         return attackPower;( _# u8 Y* A) `  B& g
  36.     }
    * K; n, t/ l# D9 I$ Z/ e: I

  37. ( U+ z! g9 F1 F1 e$ n6 S
  38.     public void setAttackPower(double attackPower) {1 Z5 l3 ]- P! ^9 n5 S# R7 H9 y
  39.         this.attackPower = attackPower;7 Q0 q2 X+ Y: |# N  q0 Q# g! v. E
  40.     }6 K9 |4 R1 Z" s3 F2 U% F( D
  41. }: ?) M: S+ t/ `- I8 q: q# {. Q; d3 b% [
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
7 F, T1 j" t5 k/ a/ z; U+ i# a3 Q- w. ]+ ]2 {
  1. // Пакет org.l2jmobius.gameserver.model.battle
      ^! f9 [( L0 K& s6 Y
  2. package org.l2jmobius.gameserver.model.battle;
    : J0 h% X- `# d* P9 z1 Q/ F

  3. 5 }, [: f! j: v2 h$ S# ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ ]4 X) y* p: |! Q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: Q3 c1 F& u( E" C
  6. & |6 h' a" t/ z5 ?" @
  7. public class BattleSimulation {- I3 L" ^; v) S9 q8 X
  8.     public static void main(String[] args) {
    # G$ b) W8 @4 g9 R
  9.         // Создаем монстра
    / f$ ?. Q3 C  Z4 O# v3 a& X
  10.         Monster monster = new Monster("Дракон", 100);0 s+ ^( p2 h- y. R% c
  11. # q# q8 ~" |1 \1 ]+ m
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ ?+ D/ N2 U4 }. O  {# z6 l
  13.         monster.setState(new AggressiveState());' K9 s( V- ^, L6 r# C1 Y( ~
  14.         monster.executeState();, X  D! o' z, i4 _7 O
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    4 C( ?" u% ?! V2 K+ h# n  v0 C6 i) d
  16.     }' @" X+ r" m# u0 _4 L$ @- o, |2 U! i
  17. }# ]$ Z( q: ?9 u+ o7 X
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.: j% W/ X/ J" r* i8 R4 o& a: f
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!5 e. V' r* y* d8 @% @* _, X- o

/ _0 S, N5 y/ }" R" p2 I; J+ _) z% e8 ?. |% w
" ?* E8 _9 P7 I0 ?+ o) x





Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/) Powered by Discuz! X3.5