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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  j- a8 [6 t2 T( P7 W
# z7 m" t" x) M- s7 V: K

( b1 J7 v/ a0 u: ?& p& }9 _/ m2 D. mЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
* p8 e, w, T8 ]Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
# B" P- g! R9 A. K8 X" `Астралия ?/ b% n1 O2 h% V# |. j: G
* }" G% F  M) ]

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
5 C3 x* y2 D! L' bВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, S* x2 D6 [4 H- {* `- a" A8 F7 P1 G6 \4 e6 A* P/ r

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ' l, l! r: f) P7 F" N$ w
AlexCoder опубликовал в 2024-10-16 18:31, b+ t7 O( }5 {) x
День добрый!
& a4 I6 O8 O1 ?5 F, uВ статье описано взаимодействие игрока с N ...
) b( K( P, q6 q" x( n0 @
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, h" o" V, G* V# q( }$ u
. m+ ?1 A2 U+ {  H3 }Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 M2 F, f# H( V4 V! l& M. c, x* \' Y4 h2 z/ y/ x8 w
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( u+ {; w# D: w
+ p  |$ x) z, Y' ?5 s
  1. <font color="Green">// Пакет для состояний монстра</font>
    & k& K3 B$ Y0 B, D4 B4 Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 G1 Y# L6 @+ I# C
  3. <font color="Green">
    9 Z4 p; j1 O) o/ ]- h9 x- N
  4. // Интерфейс, представляющий состояния монстра</font>6 M, i4 d4 I! S6 }; ]0 j0 _, z
  5. public interface MonsterState {
    - a# }1 j& [! _
  6.     void handleState(Monster monster);
    % P; J, H2 u- A$ F/ k
  7. }
    # I4 `* y) q# j' M! d5 ]/ \
Скопировать код
' ?4 J$ x6 R' K0 B* u; P
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" `8 j' q1 D( q6 I" U5 P: V$ n: m) X1 S" b2 @  v: P
Класс для начального состояния монстра:
3 F* v7 A$ ?' K  V" _$ m4 N5 M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ; s9 [6 i- T/ h4 b  P
  2. package org.l2jmobius.gameserver.model.actor.state;$ A8 {7 ]  O8 g2 _8 K( p5 y

  3. % ~, ?2 M5 I& \4 u6 [+ Q, j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * G' h7 b  |1 P' x1 o4 ]

  5. 5 E0 U( y' f% T  j
  6. public class InitialState implements MonsterState {
    $ o3 s! M, ^7 W$ B1 ~
  7.     @Override
    5 z+ e# H4 {% W, T4 @
  8.     public void handleState(Monster monster) {
    $ B" e( h* E, c. n2 d4 b. t
  9.         // Начальная фаза боя- w$ ?' a' C% w
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 q& b. L3 t4 J5 R
  11.     }
    5 f: L3 P* W/ W( S, t
  12. }; W& @7 ]3 |1 H4 c( @
Скопировать код

5 Y/ b7 G7 U$ I/ ^7 V1 O* m# ?. ^
. e+ |) m( n/ E( _, F
. T3 s  z7 A5 k7 j+ C' u

0 s. I- ^/ d$ c8 X* M5 |  \
3 |+ ~, X7 b  Q+ x4 K7 i
, I5 h2 @! h5 E& f1 g" d7 P( R
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & R+ U9 D, K5 V: F9 R
# a3 n& \8 d7 C+ @$ j  j7 F
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- j% V/ I4 [1 B2 m! Z

3 x2 R( w0 c2 h" j$ ^Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% `# n2 m" E1 B0 }1 o) j- S5 U

0 j, \  N. x+ C3 l1 ^- Q0 g* x7 U$ T. ]
  1. // Пакет для состояний монстра
    ' K' x7 n, l! w! P8 v
  2. package org.l2jmobius.gameserver.model.actor.state;/ U8 P4 L- t5 d0 ~8 `5 }6 u% P
  3. 4 ?; l, v9 R- v, V9 l' [  M# O1 R6 z9 Y2 ]9 G
  4. // Интерфейс, представляющий состояния монстра  T0 j5 n! Z( G. y% k" L
  5. public interface MonsterState {
    6 _( b' Z/ t2 {# N0 S/ ]7 y
  6.     void handleState(Monster monster);
    ; t/ q4 e& B7 g8 I% n. N, K
  7. }
    * k( k' L& W! C8 Q  V) f
Скопировать код
2 a5 }) Y# v# r) n$ a& O7 Z
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
' w9 z) R" Y" j, N6 z% ~7 K! S! Y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' q( o$ D. q) w" N# d$ V4 k0 a+ Q9 `2 Y2 t2 T$ t  o
Класс для начального состояния монстра:1 ^* `: \: r+ X' V" [5 \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% D' _. c( n# r8 r! n( {& P
  2. package org.l2jmobius.gameserver.model.actor.state;
    % M. R4 O8 ]* T6 Q) x" Q: d

  3. 0 d5 ?: m$ T% {4 v+ R( m! L
  4. import org.l2jmobius.gameserver.model.actor.Monster;: B4 h2 }1 |5 s9 ]  l7 k/ u
  5. ' @4 I6 }/ E! V) E+ I5 Y1 ^3 b
  6. public class InitialState implements MonsterState {
    ( w2 n" T% c5 t6 z
  7.     @Override
    7 g5 N' W4 u5 w; _$ o- o
  8.     public void handleState(Monster monster) {
    : m0 A7 T% _" g6 Y
  9.         // Начальная фаза боя( \% R" `/ t* s5 c
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 I$ o, [% y1 x& j1 O  d2 F$ g
  11.     }/ S5 t+ L/ }7 P4 k1 k
  12. }
    - y2 F) T, N  ?. Z0 x, j% _0 M, w
Скопировать код
Класс для агрессивного состояния монстра:" a) H, J3 _! `& W6 e/ [+ Z5 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 L6 S0 h; {' F: T4 N, M
  2. package org.l2jmobius.gameserver.model.actor.state;  q% Q, Z9 e$ w
  3. ( e/ t# O) a% X; E6 M/ v
  4. import org.l2jmobius.gameserver.model.actor.Monster;! A; P% h, C8 [2 t( m/ x

  5. $ m5 b$ v( h# y5 k
  6. public class AggressiveState implements MonsterState {  R+ T: k! F2 s& N& \
  7.     @Override, l; S8 T5 i  d- |' |6 t
  8.     public void handleState(Monster monster) {. q# l: I. p" [
  9.         // Агрессивная фаза боя" G& F3 A; g) P/ D) Y9 }" i" Y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    2 o, X! W  S/ A* M# ?0 M
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки2 i/ h% g" ?: ~, B
  12.     }1 E( V, N# [& q) O* k
  13. }
    0 l+ ]' R3 ]' `! n& T2 c. u) U
Скопировать код
Класс для финального состояния монстра:# ~/ {: A1 B, m' r# f/ S
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 a9 \3 }. m* x0 R# d
  2. package org.l2jmobius.gameserver.model.actor.state;; t! p& o  Q2 U! ^5 S
  3. ( ]( T) `3 ?7 b/ |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 V8 n2 K+ a; W' a- o
  5. 7 i# @2 M& S7 j: o- q8 b2 u
  6. public class FinalState implements MonsterState {; |$ l& U3 f( {7 u+ O" G$ Z0 l) d
  7.     @Override( ?7 z1 B1 N3 \( S& K4 z2 b/ g
  8.     public void handleState(Monster monster) {
    * t4 h8 l' e' n! i, l" L$ _
  9.         // Финальная фаза боя
    . q+ Y) g; C% g2 N: d
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    & s/ S7 @" U% {/ i6 v( ^4 s
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ F7 u5 O, y& ~1 r' ^" e+ F
  12.     }+ l/ Z* {) j! o3 o4 ]# X- F
  13. }9 y" I) T7 T" i. u' b5 S% K* v
Скопировать код
2 d1 `& W8 }7 Q+ g
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
  v2 {4 n' v. t8 K2 ^1 T- W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " l$ _, h6 A4 F& g* `% V
  2. package org.l2jmobius.gameserver.model.actor;! Z$ P9 s0 {& m( }$ n) L$ Y4 p  ]

  3. * B3 e& P8 I3 i& \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;% s9 |& U% K; N( L; Q7 q, M: F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;( k, A, ^* B3 }* M  N
  6. 8 l. @5 e1 o7 }8 v. i+ D) ?0 o% P6 m
  7. public class Monster extends Creature {
    ' P+ ~+ Y+ [' i. L) |5 T& U7 r
  8.     private String name;) b2 z& l! N" q8 u
  9.     private double attackPower;
    ) G( k# V6 @0 h1 Y3 Z7 d
  10.     private MonsterState state; // Текущее состояние монстра( x" r& G" ?8 e, {
  11. / G# J0 F5 k5 z" k. Z# m
  12.     // Конструктор монстра
    1 U/ ]& r; ~) C
  13.     public Monster(String name, double attackPower) {' O/ i0 A6 S* ?; s9 p1 ?8 B
  14.         this.name = name;& H$ |0 z* L  G$ b; w6 a8 L
  15.         this.attackPower = attackPower;
    ! ^& p8 m# I$ D2 I0 G3 h4 J
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    . U9 H* }+ J8 ^% p( H# c; T1 q
  17.     }
    1 F  Q- w0 ~6 ~# U+ i! ~

  18. 5 h! G/ X4 p! F. D; V8 j
  19.     // Метод для смены состояния/ J/ ]1 `& T: ?2 f, i+ D' D
  20.     public void setState(MonsterState newState) {  ~: W+ w* D3 u7 A0 |" j
  21.         this.state = newState;
    - p  o' r: r8 z: |. T
  22.     }
    * e- x9 b/ B9 |# p, Y
  23. - o# J+ s6 F' {% h' I* C
  24.     // Выполнение действий на основе текущего состояния7 |2 @' {% K6 K
  25.     public void executeState() {
    7 }3 x8 D) @( @7 w9 D
  26.         state.handleState(this);
    5 c7 ?/ t, M7 F& b
  27.     }  H* W+ m' m' a8 }

  28. ) \0 h* W3 `) b0 v0 U' n1 l
  29.     // Геттеры и сеттеры
    0 M- g! i3 ~+ |. B9 l
  30.     public String getName() {+ l& n7 `. E- \# K  g  C- z8 W2 B+ K4 Z
  31.         return name;
    6 X9 E2 a4 O$ s' t# k/ C
  32.     }4 {6 K1 s6 q  C
  33. - k( N3 c5 X* r" m7 M  l
  34.     public double getAttackPower() {4 E7 l9 ~4 U4 e8 }% h! ^2 C
  35.         return attackPower;
    $ M  o2 t; u# f' X) L
  36.     }
    8 O% \8 c: J8 n! X( K

  37. ! T: {7 K6 U8 e$ i/ \; @# G/ y
  38.     public void setAttackPower(double attackPower) {& g7 [5 f9 V+ D# Q: v& o0 G
  39.         this.attackPower = attackPower;
    ' Y, ^" Z- C/ {" t0 t- G
  40.     }
    + P- _* Y6 u. o# D3 r: x6 ]
  41. }
    $ m1 b2 r7 _/ R- P* k& n
Скопировать код
3 f9 F7 v# l; R1 [3 U5 z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
, D! o+ O/ K5 y5 C8 m5 O. q( }" k& e6 j" r- O
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; U$ O# e9 E. q7 G6 \) U. O
  2. package org.l2jmobius.gameserver.model.battle;( O0 p+ m$ c' w% I
  3. : b2 c6 _$ z2 i1 X5 A7 H) \2 q  ^7 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) H3 M2 [0 `5 b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& p6 C/ p- A7 j/ ^
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    : z$ h, t% V2 R8 T/ j1 U. B5 z: u" S
  7. 9 P2 ~6 g4 B9 \3 D; ]& }
  8. public class BattleSimulation {
    3 A& s6 p. x* {6 ^' L
  9.     public static void main(String[] args) {9 J: A3 y0 F0 B* _
  10.         // Создаем монстра с начальной атакой; V- W6 T( ^4 g- I
  11.         Monster monster = new Monster("Дракон", 100);
    ! K0 v7 A5 M2 [: {" H+ V& T* @6 N

  12.   \6 d5 A9 \4 G
  13.         // Начальная фаза
    8 N4 x/ z' q2 z
  14.         monster.executeState();
    0 c* G" ]$ ~, j! P

  15. 4 x7 u5 c& |8 J! Q
  16.         // Переход в агрессивную фазу
    7 ]; o8 c* f4 q
  17.         monster.setState(new AggressiveState());
    ' O$ z8 Y8 x7 [$ |1 D
  18.         monster.executeState();7 |9 N0 \, J% E$ ^, w( k
  19. ! M7 ^/ ?! C9 N- N5 j
  20.         // Финальная фаза5 O$ H5 ~, o8 T: y" P
  21.         monster.setState(new FinalState());
    ; t  d9 ]& d( t
  22.         monster.executeState();
    ) Y; _* `3 Y$ j1 Q
  23.     }
    : t3 d; T6 u  l8 F
  24. }, A; Q! m' K, H7 ^, P; n& U, n
Скопировать код

% P4 i1 Y- F; b2 Q% E9 ~Комментарии по структуре пакетов и классов:
: p) H: t& ~+ G% X8 e" d' ^. Y5 Y# w+ ^ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.8 f4 ~0 U/ U, o& ]$ m
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!3 D# R2 m% J5 M" n/ K

9 U/ A& P8 v5 d- x# K% P3 h- p
& @* p5 X: H9 O' t7 ^, n
5 |/ d) c9 W! A# Q: I! o, T% ^9 u" i: n5 l: t4 \7 W# J
4 ?. J: v: w9 h

' Y% [- y# S$ \
1 d# K) @" g* w5 S& @5 k! {% D0 K
9 V! K) @  g7 S& ?/ y: t, q
7 [) u, b* h3 ^: ?3 K8 k
, I3 s& {  P' V, i. O8 s: [1 O  H5 q, K. h9 T& n+ a3 d/ {  v

& n' {5 n, U& M& k! P; S3 j
  r; ?* X7 {5 G7 X& S* V- N! b# M: A2 O2 V

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
* y3 @; M& Y% v7 z) GДля управления сложными взаимодействиями, такими как  ...

9 z% T" K2 y; x) `. g0 S- uОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
! b8 b3 r# |; v: T& h  O' r  dОтличный подход! Использование шаблона "Состояние" де ...
# _+ S. o( t! G$ `  d3 J
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.( c) d- p8 v! l

! W! Y" Z; Z- ?7 B2 }. mШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: p; Y  [5 y2 c3 O
* r9 _# l# ]6 Z9 n& {, z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ I# e( k+ N9 H8 T
  2. package org.l2jmobius.gameserver.model.actor;4 B4 s1 V' w* R5 `- g$ f2 I7 x

  3. 5 b# C4 i6 m, D3 |( z8 R! n- J7 H
  4. // Перечисление для типов атак. c4 H% R  R9 G" U8 p
  5. public enum AttackType {. X* R) n# f0 s6 `) k
  6.     PHYSICAL, MAGICAL;% c3 W0 {$ ]+ V
  7. }/ _4 x- @! |- K$ K$ {
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.9 {% I' `7 k5 l) F. Z2 N
Обновленный класс для агрессивного состояния монстра:. m! L8 f# s4 {# O$ d
3 U. w* E) [9 o3 C" u  |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 V/ w0 c& X- W! ~+ R
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( x5 C8 V5 o2 ?4 v& \9 k
  3. 7 g7 t# i7 e4 ]6 h+ H  h/ J$ g7 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 R) k9 q/ S4 M; }6 n
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      N+ T) m3 c7 L3 {' S: `

  6. " o. I0 b/ g, ^
  7. import java.util.Random;, X, `0 q3 o/ ~# q

  8. $ p3 E( E" ~# [' h* I5 H* U
  9. public class AggressiveState implements MonsterState {' ?, M- h, I# ]& m3 o; e
  10.     private Random random = new Random();; U+ N* {3 p, _0 W* o5 W
  11. % r* k9 V, p' v6 z9 T7 Z
  12.     @Override: ~+ x. H# q* J& D
  13.     public void handleState(Monster monster) {5 a6 P" F$ H0 N6 E
  14.         // Выбираем случайный тип атаки: физическая или магическая) `$ n" K$ J, d; d7 s2 I$ O
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    7 R7 v2 {# K/ G- t. B

  16. ( g; S% _6 I8 U; A1 k
  17.         // Логика для агрессивной фазы боя, a0 p$ l# n9 c9 |2 X, {
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ' T# S9 F. z5 [! t8 Y) J, C
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    # [0 A, e0 _/ G2 L& P+ e
  20.         / b) C1 w  w6 B5 E3 A* S" b9 e
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - O: Y5 v& N6 l# f
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ! ]& b7 M% u% f# p+ |# Q! A3 o
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ; ^: q# Y6 V' \; i2 k- ]
  24.     }" x, C5 \! R0 |; C) u* }
  25. }
    * f+ p+ Q) H" u" b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки7 D" o" T+ @. G8 E) H7 h% E+ h

& T3 }/ s( I+ A2 q1 h! ^
  1. // Пакет org.l2jmobius.gameserver.model.actor$ _2 Y; Y" H6 X0 k. ?; D
  2. package org.l2jmobius.gameserver.model.actor;. k/ M  x! h  i: d/ i

  3. 4 l( G9 {: P. B# S* j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 W6 [3 }4 F' r3 Y3 F$ F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( w- `5 D. \1 ~8 Q2 O# y
  6. 7 e! S+ i- [9 _0 R& a2 }+ \
  7. public class Monster extends Creature {" g' J" H% |& Q, ^" E" R
  8.     private String name;
    1 {- n5 G& _; ?) |
  9.     private double attackPower;) l. r; p: @  f+ \& Z0 Q
  10.     private MonsterState state; // Текущее состояние монстра2 o/ A( L3 ^  F' ?/ f! r! Q
  11. - `' F" Z. n( N/ {" @
  12.     // Конструктор монстра
    / r3 ^, h- h/ X5 z, L1 K
  13.     public Monster(String name, double attackPower) {
    # A8 n" d$ O/ G+ R$ T
  14.         this.name = name;
    0 t# ~9 q; t& v3 Z' I( ^) ?
  15.         this.attackPower = attackPower;/ R/ g9 T$ J) ]& o" Q2 w
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию0 v' M3 b- A: n& r3 I1 W( Z$ R
  17.     }8 T: }! g5 i& u% V" l
  18. ; X+ i9 I, q$ l2 n9 n! F, A. k
  19.     // Метод для смены состояния
    $ T, ]7 d* a6 {
  20.     public void setState(MonsterState newState) {4 u+ i) V6 H6 P- O" J
  21.         this.state = newState;, j! L: b0 X. T+ t- G
  22.     }
    - q) K. N! E9 b
  23. ; B8 z0 h0 ]7 k0 c1 v
  24.     // Выполнение действий на основе текущего состояния
    " S! T/ A' {: z/ d6 g6 S7 r
  25.     public void executeState() {1 y+ x2 H( K2 g  W3 o' ^
  26.         state.handleState(this);
    % q2 b; R" J' p8 p8 G1 ~; I
  27.     }
    , a( N: D1 I; a$ w6 I) Y2 J6 o) ]
  28. 3 x' V8 ~+ W; H5 l
  29.     // Геттеры и сеттеры# M* z2 o- F& [
  30.     public String getName() {
    ; X* G: L6 d6 R" c; E2 A- n6 A
  31.         return name;
    9 K6 o- X# ^6 Z+ q
  32.     }
    4 H  A2 p4 j7 f2 r, y2 C
  33. 8 f9 T1 g/ k  d! P3 R3 {4 K
  34.     public double getAttackPower() {. Z; V; U3 N: B; d( l
  35.         return attackPower;
    2 ~# X- ^- w4 T" s8 o
  36.     }& b' R' [: W3 g; f9 P7 j/ v( [9 ?

  37. : d% n  d! I" b
  38.     public void setAttackPower(double attackPower) {# ?  D% u# Z, \7 |, o
  39.         this.attackPower = attackPower;( k) _: P* k6 |+ j& u0 w
  40.     }
    8 D: [/ _: [4 v' w6 `
  41. }
    ) r% _. `) F/ j% @# i6 o9 _
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.) N5 C4 ]7 }1 m( b5 X

' ?0 `$ w1 }: J  p6 r. |) Q) o, ^
  1. // Пакет org.l2jmobius.gameserver.model.battle; B2 f6 f' @$ D; i( `: D; N
  2. package org.l2jmobius.gameserver.model.battle;
    ) A: V* \# a7 o2 ~) L* G2 O( s

  3. & j$ Y+ B5 ^+ S% d
  4. import org.l2jmobius.gameserver.model.actor.Monster;  k: }" a4 n0 [$ ~, ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; k; d& P/ ?& y* @
  6. 6 p5 G; `# N. n* G
  7. public class BattleSimulation {
    " N! I/ W( B; I& E1 r0 D0 j2 j
  8.     public static void main(String[] args) {
    8 F7 j6 Z7 n9 N: m: J" T
  9.         // Создаем монстра# r$ r& S+ W7 J$ [; O
  10.         Monster monster = new Monster("Дракон", 100);
    6 ~- }% z+ I2 ]# R( Z. ?
  11. 3 T. f6 K, l& M7 C
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак; W  L2 q: B" [/ B
  13.         monster.setState(new AggressiveState());
    3 C& `7 V3 F6 {# o
  14.         monster.executeState();6 v1 ^/ W9 b+ a$ m+ ^
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
      B: G; s! t9 l9 P! G" @7 Y5 j
  16.     }
    : s3 \( G) Y, E, s
  17. }' Z  i! P% x; h8 Y, O/ ?& Y' Z
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 D: P3 U0 Y' N% u$ o& j* L& cЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!1 L/ z. o' ]: q7 U% b' n  q3 v

! v, ~' M9 H" O* c  z" D8 q2 f1 i$ P$ F$ Y( E; _3 W5 a8 |1 y% g

! b4 j3 Y- [5 o; _! n




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