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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# j  A+ N/ ]# f) z: q
) C5 @  a& E) V5 Y: s" d

& [, K3 {4 D( }: v8 S4 mЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
0 Y; {4 ]4 f5 A( i% H7 yЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
. x. u% l  J9 [$ V& O: ZАстралия ?& ]3 {0 V2 N- c& s9 C$ [  h! ~
8 ~2 _, E) }' }2 z

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!) E$ q% Q" ]/ _1 E! X" ]' _
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?# D4 ]7 K; t$ S# q, L/ W! n* F. T' `7 s

* w+ V, s- d' u! X( A# K2 N
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
/ \. I7 S: q+ I8 U5 X
AlexCoder опубликовал в 2024-10-16 18:31
; M/ q# y- P( }& X4 R, l; n' _' lДень добрый!
! j5 H$ q3 W+ o. i+ u) QВ статье описано взаимодействие игрока с N ...
! \3 R, C( t" U: G' @. ?5 P
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
# `  e8 Q) A9 G- ^* x* ~7 }+ c6 ]# k$ M
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ Z5 S+ X% M" {  l7 Y: s! b# b' L# U

: v( |# X9 i0 nШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.* X! H) s0 [! b" h. `
8 Q7 E- ^6 P3 ~. Y2 F
  1. <font color="Green">// Пакет для состояний монстра</font>9 R$ w' y' Y, f
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 B; B4 x# x& C: [/ [
  3. <font color="Green">
    : @1 V, t( j6 S5 o$ X
  4. // Интерфейс, представляющий состояния монстра</font>
    / Q% r8 `5 d( w. w- t4 h( L
  5. public interface MonsterState {- f* c9 q6 J, v' T4 H
  6.     void handleState(Monster monster);1 r6 @. N$ h3 C0 A5 c
  7. }
    * [; d# l" m/ {' ~) k# e5 ~; {
Скопировать код

- j' ]! o  Q9 u+ y* o" g0 GШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) b& r" ^* F1 b1 x
7 S% _7 N/ F! g. WКласс для начального состояния монстра:+ D/ ?) x  ~/ z4 j, t3 z! P
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>: w8 z. J' T8 l5 }% [0 B# i
  2. package org.l2jmobius.gameserver.model.actor.state;/ Q# l9 D$ s% c0 A% j1 t

  3. ' q# e. w" n  f# S$ _
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 t6 A3 G! N% i  G  e, H

  5. 6 h* M9 E" B/ R
  6. public class InitialState implements MonsterState {
    " l& r& e0 i9 q; ^! u
  7.     @Override; c0 Q* H  ]3 m9 }
  8.     public void handleState(Monster monster) {/ r% v; o0 l. H! y
  9.         // Начальная фаза боя; D) r: Z4 p; R( b# C% [
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " g8 ~7 w, |% T0 i* ^
  11.     }: g  A  {2 P; A: F$ [' v% c9 A4 Z
  12. }
    ! C1 R! R+ p  V4 a7 V) O
Скопировать код

  \; _. L, H( D: `+ F. ?- H7 y3 ^7 p  o
" ~* k; R9 m% ]" H& c
1 z! g9 L$ o6 C$ z$ u
$ U- X7 j2 T6 ?5 x0 q% e

' b5 ^$ P" P/ D/ d! w9 g) X0 P; w6 n$ O/ s1 v( H  s6 i0 t

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
/ Q1 k* w: W3 _2 M. X- ^0 f/ m4 B) Y& K, E, O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ \) }- C0 w' @' M  X) H2 I
) ?$ `2 ~* I" ]
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; F! `6 c/ ]6 B2 P9 E/ U+ C% d
: T, ~# W5 P  x% ^8 }* L
  1. // Пакет для состояний монстра
      c/ K0 I& G4 D& n% O! E
  2. package org.l2jmobius.gameserver.model.actor.state;; x' ]) ^8 d( ]7 r2 l% P4 }
  3. ' e% x, ^  e0 J1 ^) G, I- @
  4. // Интерфейс, представляющий состояния монстра. q' e( V8 {( C& T. e0 @: }
  5. public interface MonsterState {, }& i. [, X) ~1 A! l, M
  6.     void handleState(Monster monster);
    9 G. j0 I2 ~. l4 F% r( p
  7. }
    7 W/ w  q9 o3 f' f2 d7 b$ G
Скопировать код
" j, }' t% G3 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ) \4 @' }  a8 }  Q) L! g

# G! p% M& z7 Y8 w$ T  a# [' `( IЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  ~1 F& }; E! H4 Y* W

4 M8 X' ]% \8 h, R9 I% W4 bКласс для начального состояния монстра:) M( c( w: \" l% O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 t# c! N3 Z. i2 S* o* N
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 a* B0 D* ]6 |5 N. ^0 L  T, j
  3. . }. }; j; e9 D- w/ h; d% g
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ \9 U: L# B5 u. i/ K4 F- |

  5. 1 E9 H& ?% q( e+ R2 [! O1 C
  6. public class InitialState implements MonsterState {" o/ A: B5 P9 K, ?
  7.     @Override- H8 R! w) D! o2 L- y* j+ x
  8.     public void handleState(Monster monster) {
    $ ~: g5 _6 g/ j+ T
  9.         // Начальная фаза боя
    ' k+ A% ?# s5 n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * |. c$ q4 t. T, o3 D* R: A
  11.     }8 W# @2 N' R0 R' u; z$ e# C1 l
  12. }% e; A7 y) R" u( N) j; j  l
Скопировать код
Класс для агрессивного состояния монстра:# a" |0 q2 A! W$ ]% b2 r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state4 x$ K* g. f4 u) _. O5 q+ n7 `
  2. package org.l2jmobius.gameserver.model.actor.state;3 M1 {5 d8 _" \6 z; s$ M$ ]

  3. ( |2 f) L3 S- G- K/ c5 i* w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      y4 L! t, A% K$ ?5 E3 f  U$ ]: ]; I

  5. 5 ]  F$ e6 ]2 `! {
  6. public class AggressiveState implements MonsterState {, ^2 o' Z. l2 A* \# q5 ?8 o; s
  7.     @Override& }- T3 N( V5 q& g1 n' S, P
  8.     public void handleState(Monster monster) {
    " i$ S' H3 t1 U+ H4 |1 p
  9.         // Агрессивная фаза боя2 u2 W! k6 ^; O% O. i' Q. s$ z2 b
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , R2 \" H* ]# F8 ^; b: P
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * X9 E. V' q! [  p. j7 f
  12.     }& l' a( A0 s( D2 y" X8 n" a
  13. }, w8 _! w4 T/ T6 S# [3 S' t$ t
Скопировать код
Класс для финального состояния монстра:. R+ I: B" r- M5 H. _4 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' Z$ v$ M. m& X% k
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! D+ O+ T$ w. a, D0 R
  3. / D9 C" e, N* g1 h1 R$ I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 w3 k* S% _8 n4 D; n
  5. : O) R& }- K* ]+ Z" @* W# T
  6. public class FinalState implements MonsterState {, V- l$ g8 l% K' o2 t: j7 l
  7.     @Override5 C9 l+ f# }2 a7 @8 X: O
  8.     public void handleState(Monster monster) {  A, J/ |9 ]& G7 q* l7 K
  9.         // Финальная фаза боя' j+ s: N- R' \% z/ Y+ W
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");/ X! s! e, ]! [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    + W+ b1 Z3 r: f/ M7 f- f
  12.     }! z* Y0 e) \1 b4 X/ J& y9 u2 z, u! @
  13. }8 s& X* ?0 I& B1 Z' y
Скопировать код

1 U' J- A- L0 c4 `( R  V" UШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: I1 p: u+ B) K5 s! c; {  r% Z5 u
  1. // Пакет org.l2jmobius.gameserver.model.actor* G7 c3 R+ h$ Z/ Y& o* F
  2. package org.l2jmobius.gameserver.model.actor;- x) C; c4 M3 `$ E3 J
  3. 1 }% p7 A. N7 y% F# }$ L/ q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& L9 I* Z  `( `) p# v* {1 e  I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;! v; H" L' K) G4 A6 M

  6. $ r. o( w! T& w5 e
  7. public class Monster extends Creature {
    * A3 {$ ]/ C9 q. C
  8.     private String name;
    / y' n0 Y( A# W" ~& t
  9.     private double attackPower;9 D: c- o- D! N3 f* U
  10.     private MonsterState state; // Текущее состояние монстра* [0 h9 a9 a: [- l5 k( H

  11. : f4 `- e/ y; f& S+ X1 ?2 y
  12.     // Конструктор монстра
    3 _: p0 v/ M6 f4 o
  13.     public Monster(String name, double attackPower) {
    # b( b7 I  e* W, v( t1 h1 Z; F
  14.         this.name = name;- V, A- M8 }  E8 o  F
  15.         this.attackPower = attackPower;- K) z7 n) j' k( E1 a& Z8 T6 W# G
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние! W4 i& ?/ M* D: p
  17.     }5 f* O. `( }2 a+ D- e
  18. 0 J- g" |+ W/ C2 O# B* A
  19.     // Метод для смены состояния
    * K2 Z" y, w0 [
  20.     public void setState(MonsterState newState) {
      z4 n+ V2 S9 |# F( O
  21.         this.state = newState;- s/ p! o' I1 N5 A
  22.     }
    4 g) K8 k  f7 F+ N4 B, [; D
  23. & B$ i) d& c; v" U* f0 I. o
  24.     // Выполнение действий на основе текущего состояния
    / @- \! s& B# x. k9 F
  25.     public void executeState() {; ^- I5 h" K# N- o- F
  26.         state.handleState(this);
    8 c, q4 f" _  o8 @- E- h: \) C# B
  27.     }  }+ O3 b: c5 W8 H2 @) R$ Q
  28. 9 T- W0 I  ~2 L- A
  29.     // Геттеры и сеттеры
    4 Y# }6 F3 @# ^. i5 M1 p
  30.     public String getName() {
    / J- h# a5 G3 {% P9 v/ X3 C$ ~
  31.         return name;
    0 f% f+ {; J& V: C
  32.     }0 d: @  q7 C- v9 G

  33. 9 X( u" m- M. v) n) f3 Z$ F
  34.     public double getAttackPower() {
    1 _- `( B) U, k4 B! x2 O  w
  35.         return attackPower;" K/ R' h% a  g
  36.     }
    " O6 ^; l9 X; W' `6 F

  37. : J6 ^+ M+ L+ M' U/ m- a" w
  38.     public void setAttackPower(double attackPower) {* _& c! K3 _% i7 b. f
  39.         this.attackPower = attackPower;
    , r0 F  F% a% d; O
  40.     }
    . Q! d  I" v7 {( `5 a5 w+ l( K
  41. }$ t  K7 C4 V0 f7 H7 \- w
Скопировать код

( d. N- `, J& a1 `5 J8 `8 m( FШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
2 Z, q, n8 f, ]# K) M) h/ t) G* A+ r1 N2 P* _1 N' G" P
  1. // Пакет org.l2jmobius.gameserver.model.battle$ v$ ]) g" {" A
  2. package org.l2jmobius.gameserver.model.battle;, O' c1 z7 u, n& M* }" J$ f4 c& x

  3. ! V( o( N+ W& C0 p* H3 c9 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , o' a/ m5 N4 y2 l
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) n& {2 X1 H! w# Z
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;. L- ?, y+ {; c: ?! F( M

  7. - l+ E/ S9 Z4 Z( ~1 d5 d# [: [" I
  8. public class BattleSimulation {$ U& M) ]4 W: I! c1 G
  9.     public static void main(String[] args) {, m8 t3 r6 @1 t, o$ D6 U
  10.         // Создаем монстра с начальной атакой
    $ P; `8 c/ [6 G$ o; Q
  11.         Monster monster = new Monster("Дракон", 100);
    & q4 d. h0 }% L" Y$ Z2 `1 Y

  12. 3 g9 |1 L5 X( b. @4 V" C7 s
  13.         // Начальная фаза1 H: V) D0 s6 @" @% f' B8 p
  14.         monster.executeState();) m$ t1 m' D+ o  R
  15. + a% I* @% i" {% T2 U( m7 u0 I
  16.         // Переход в агрессивную фазу
    + V" Z  m& e; O; o0 c
  17.         monster.setState(new AggressiveState());& H( E" C: {2 _6 e
  18.         monster.executeState();
    , B/ b' d+ r6 k) Z& @9 `5 X

  19. $ }6 `% s7 O. V# H% R; x; N
  20.         // Финальная фаза# k. Q4 I' k( Y; p3 L
  21.         monster.setState(new FinalState());: J  K4 {1 |' @( m( a
  22.         monster.executeState();
    : c# p7 j7 l5 S5 U4 A; H/ S7 z
  23.     }
    ; n# M/ w1 U# {! m1 e
  24. }/ o8 N. \  w& S' M, P  ]2 g; L
Скопировать код
: F/ {; ?. X: e* X$ Q
Комментарии по структуре пакетов и классов:
  J. h8 E( e# ?, l8 D' iЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
, U2 A% X1 }; b8 DЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
2 k8 A- a/ N0 U. V! X4 f- y* t  K# j

; Y6 H1 J4 v3 p+ p% [. T
4 [9 Q# e- A0 p3 i& m, L# Q! |# @: p. \4 \2 D: ^

/ M( a$ K2 o! c% }* z5 \0 D1 D; Y9 I8 W

! Q2 g* Q  `: J
/ ]# N2 `; q1 D2 C2 X0 w& X
8 l4 }' l& I+ |- w7 p( c
9 m# o' j' S* o5 d+ [: |7 V0 N& b0 s2 M9 E5 a* ~

2 I9 N) Q& _. N6 Z) c! l1 i/ t1 t9 O, x) w$ a* H; H( \5 c9 R

' ]( s" M6 g3 Y& `* H
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
- ~' y" d* w/ S9 }* J; G. lДля управления сложными взаимодействиями, такими как  ...

3 R( B9 U' {) A4 u/ BОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
' K3 f8 ?6 U+ qОтличный подход! Использование шаблона "Состояние" де ...
% y7 u5 [3 o3 }5 u4 H5 ~( w) ]
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
6 I$ q* K8 n6 ~, y6 o4 o; K: [% q$ S* ?0 z; T
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
4 `* h- y% ?" @: c) z6 P: \6 I9 t# {3 Q6 F/ K7 @7 {$ |& Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : J% a$ H7 q0 n8 |+ t: X
  2. package org.l2jmobius.gameserver.model.actor;
    2 }9 n( d1 S7 o) b: u2 D/ Y3 [6 |0 G3 F% p

  3. 7 J' i7 I8 |* J* A. q% C7 Q
  4. // Перечисление для типов атак
    8 n/ N9 q3 `8 Q3 ]8 |
  5. public enum AttackType {. J4 P& ~7 J7 I9 v* k" h8 b4 e$ X
  6.     PHYSICAL, MAGICAL;* Q% u3 N5 ?0 k4 P" J- q7 h
  7. }% L) @/ y$ [8 m4 r. I
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.5 S7 s# B, t. R' n* k3 B2 K3 s/ v
Обновленный класс для агрессивного состояния монстра:
5 x: e9 K( q; e+ Y5 L6 ~
8 H5 y7 E3 u4 w* \- w3 t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& G: V5 [  ]. v* \, A
  2. package org.l2jmobius.gameserver.model.actor.state;2 U  W; X8 n& ^$ m  ?  D- |
  3. ; m9 n" s4 w5 E1 R: N) q; Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;( _/ Z, c- V6 b/ h
  5. import org.l2jmobius.gameserver.model.actor.AttackType;: T7 K' `3 ^6 u& c
  6. - G/ c" _/ k. z9 V- ?& `4 p
  7. import java.util.Random;+ N+ C+ @/ {3 E8 I1 [  e: x

  8. % _+ M' Z5 t! @# V( t
  9. public class AggressiveState implements MonsterState {. E2 ]$ a( f3 T: i# O
  10.     private Random random = new Random();8 w6 N3 `$ B+ m/ Q2 y. ~) ?7 i
  11.   t8 D; ]9 s- o  J, t
  12.     @Override0 G! f; p+ p! ~4 I# p9 n
  13.     public void handleState(Monster monster) {
    * b6 `2 j1 y, E# n4 W$ l
  14.         // Выбираем случайный тип атаки: физическая или магическая$ ^  Z" k4 }  `. S
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;' Z! N) q  T% O  d4 r3 h( N

  16. + d# q, |( z3 e( \
  17.         // Логика для агрессивной фазы боя
    , S2 {7 U: `7 n
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    # h# L! \. u' {" Z9 {4 P+ y- U
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");& I) p+ N' G. m* C
  20.         6 f5 D8 K. M8 U
  21.         // Увеличиваем силу атаки в зависимости от типа атаки7 h- P3 ]- T7 `( A( Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    / O' _7 O) W2 \# F& r4 C9 D* n
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);% J* K, P' I$ H
  24.     }0 ~0 g* p2 N4 i  I! i5 k
  25. }
    6 W- }: v" |* q" k
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки1 L0 z8 u  ]0 c: e
. {# a( Z+ I) T* |0 c& k+ |
  1. // Пакет org.l2jmobius.gameserver.model.actor6 Q. _9 O& T7 z. ~$ l
  2. package org.l2jmobius.gameserver.model.actor;
    ) h1 E7 Y9 D! @9 W# V5 j  ~* K
  3. . L9 f5 B( Q# _1 z5 |2 F/ I% G3 p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ n* J& t6 Z1 z% N9 l2 h/ b4 I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : i9 [0 ^7 Y; Z3 m
  6. ; _( I9 p7 R. Y$ J) b9 ~3 S( `
  7. public class Monster extends Creature {
    + h7 u" q6 Z2 V5 d" W
  8.     private String name;  c6 y6 \8 C2 D
  9.     private double attackPower;3 B) Y$ p  x3 W! [) t9 h( G
  10.     private MonsterState state; // Текущее состояние монстра! M3 C, [( {3 O$ O2 R

  11. ( M1 c* f: V# g  g4 i7 o8 X
  12.     // Конструктор монстра% u( a7 Y5 k, f8 s) l
  13.     public Monster(String name, double attackPower) {# \$ M4 d" s& C9 u& Y
  14.         this.name = name;
    ; C: u$ ]5 W( Y5 f; M
  15.         this.attackPower = attackPower;$ P2 Y) ]4 K; h% c  O
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию# {) E% Y% {: h4 n) v3 H! ^
  17.     }' n/ b6 m  S/ |; ^0 x. c
  18. : @8 A. w2 K& l: Q' ]( K7 y
  19.     // Метод для смены состояния
    1 l7 s3 o2 O: T
  20.     public void setState(MonsterState newState) {$ }0 M; z8 [  J% S% K3 R9 ~
  21.         this.state = newState;/ j4 x' d/ x( b
  22.     }
    4 M6 ]1 `# E0 ^( ]: l( U7 ~/ B
  23. % @* r, T. A' }
  24.     // Выполнение действий на основе текущего состояния: E  `) u) c2 p  z7 ^' f
  25.     public void executeState() {4 C- x: j' o( s
  26.         state.handleState(this);4 Z% n9 K. P1 ~' D3 I0 j3 r
  27.     }( Q  P/ T: j- l4 h

  28. 2 J9 p$ ?7 j( X$ j
  29.     // Геттеры и сеттеры3 ~; v- _0 M' v* p
  30.     public String getName() {! W% e/ l# s- f9 y" B* p
  31.         return name;- E5 s% }0 n- V  ~
  32.     }/ R; I/ A1 i: f& K* {( D

  33. 7 C, F, L$ f, e
  34.     public double getAttackPower() {1 |! k/ b, u3 f
  35.         return attackPower;1 D- u: d/ `# F3 u$ e7 j
  36.     }) o+ Y. `. C( {8 @
  37. 1 J# u; e* a1 X$ u  a5 h3 M- W
  38.     public void setAttackPower(double attackPower) {* O7 X* u& ^: w+ |, @1 t! N% z
  39.         this.attackPower = attackPower;
    9 X  ]1 R! m4 f* I2 S- ~! x
  40.     }4 _' Y3 N  ?- Z3 s+ ]
  41. }
    $ a8 \+ Y% B, t6 v* l* {+ s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.+ O4 _5 ^5 l0 x2 A  P8 E  y$ }" b

2 x* l! f" z$ P. f
  1. // Пакет org.l2jmobius.gameserver.model.battle
    6 t. z- t" @& Y1 b# V' X
  2. package org.l2jmobius.gameserver.model.battle;
    + k% u2 j# x7 h
  3. 5 B* X# A. y5 O5 [9 q/ V) O' Q8 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 \& e" Q) }& L  C3 e! y) n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , C0 c( Y: R! S" s% [
  6. % a1 s/ ?: d. b" W7 m% `  i/ B! g
  7. public class BattleSimulation {
    . {$ J; i, I; N) R% F( f7 A( L% U# _
  8.     public static void main(String[] args) {/ ~$ x6 p, P& Q3 B3 i( ^$ L
  9.         // Создаем монстра
    9 ]+ [& T8 k, h7 c) q' Y
  10.         Monster monster = new Monster("Дракон", 100);$ C. ]) z/ Q, p9 j, g8 ]
  11. 1 {+ c; u3 K1 }0 p1 R2 x$ C
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак4 z0 L: \# a0 b0 u+ v# n
  13.         monster.setState(new AggressiveState());
    8 x5 H+ _; Q' Y, }
  14.         monster.executeState();. |8 X" O. ?3 A$ A+ i
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    5 g" X2 V& V" [! t7 f* B1 w
  16.     }) M3 m! ~" U$ G; Q# U$ ^
  17. }5 }  k6 Q' ]* o  ?. g. ?$ {
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.8 g4 w0 [7 R6 ~) f" _: L
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
# `+ _4 [* _8 G
$ i  Y3 C: [: V5 R4 Y8 C1 S0 t. N7 b# \- B0 G! O1 P# k# N' q

: X/ Y+ j3 S3 o* @& O8 o




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