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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!: G! f9 R2 |$ [  o8 I

& [, Q- K9 d" G: U. t
& n# k! i+ V$ r
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
: G4 m2 m, m' N/ j, QЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
( T! W5 t4 e: r* M* hАстралия 🌟9 D7 I0 [1 U5 ?5 V1 a( H! _
5 a5 i( z3 M$ F. `6 X

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
- e6 {% g0 R7 V7 ZВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?( Z4 ?. U0 ?+ w. U; H# a

  @# W9 Q) T6 O6 V2 |, o6 l  \, [
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
7 P$ c* ~0 ]$ ]! G  r' Z
AlexCoder опубликовал в 2024-10-16 18:31) {$ o5 o% N5 W# w
День добрый!+ Y% n+ t2 o* b$ T
В статье описано взаимодействие игрока с N ...
6 p6 f+ H& e, \9 I
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. _9 v4 W# J4 z
6 Q+ C. _$ \7 q. x4 t, d$ YЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) u# f6 y  o+ t# ^, V. ?+ \
# C+ M" @% C; M" N# Q- b! N+ q) pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 N. h1 m- M' D4 X
$ ]7 i* S: e- @9 j- g' J2 N& \6 N" Z
  1. <font color="Green">// Пакет для состояний монстра</font>* L8 O  e$ v- o1 L3 \& ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    & d' t# y0 t. D4 _# g2 J) m' `
  3. <font color="Green">1 c3 i, A, O& X7 r" r# |
  4. // Интерфейс, представляющий состояния монстра</font>
    # o) n- P9 b, Z2 u3 e+ m
  5. public interface MonsterState {% g6 x3 [8 t1 ]& W
  6.     void handleState(Monster monster);
    $ z1 e! }# ~) l( W6 k6 o. W' N
  7. }
    / w6 z6 ^" {7 W  Z
Скопировать код
1 Q* B1 \/ }1 Q1 d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., s' [4 L8 ?' N
" c! d9 ], i' O/ @3 u
Класс для начального состояния монстра:
" B4 M9 D2 a1 p8 p1 [
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>+ j' k. E' U3 }- {9 j# N8 ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! o: _. R0 ~0 W3 D& w

  3. 6 ], L) p2 D/ p
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ }2 l( C$ N( S( w3 Y0 n( r) W
  5. ( V8 T  U! U. l2 d
  6. public class InitialState implements MonsterState {
    . A9 I+ J3 t7 O1 H" A; M
  7.     @Override! F% W4 M7 Z9 i& I
  8.     public void handleState(Monster monster) {! p* @; ?& @$ }- I) ]% ?
  9.         // Начальная фаза боя$ f7 @0 x* m9 l7 ]7 @8 z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 J3 G& E" s, {! f( O/ m  Q, |* p4 E
  11.     }
    6 N& m# r- v$ Z3 K' W2 f' y5 p
  12. }
    % R4 V4 E% M9 e/ \6 L, q8 f1 x" {
Скопировать код

6 V2 S  [# Y7 B  Z
4 q  ]) c) N, [: s! M% Z
8 f2 Q  _+ o5 y2 W% L
4 J7 |3 @; Z2 f& i; f8 x
  f$ R. k: a5 Q& o. o3 L7 I) ^# \7 K' z: S
% o' H0 J0 @4 ^8 D- ]  ?5 I" A% e

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   s0 l) X' H1 A- }, O. V

; P9 @6 {  k0 }. O4 lЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- W) b# C# ~3 B9 B; N5 J! c

8 G7 u5 [/ B5 ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, N$ X6 j8 U: }* Y( P: H; N
5 n7 ?) `& X3 {# a  `
  1. // Пакет для состояний монстра
    + ]8 }0 b0 M, g' s6 C+ W+ m
  2. package org.l2jmobius.gameserver.model.actor.state;
    * P" Q9 B5 B5 Z1 i
  3. 3 \3 |* H) X6 C
  4. // Интерфейс, представляющий состояния монстра8 u, q: t6 f$ K" F  `- q
  5. public interface MonsterState {
    ! l) I9 c0 D- O# E
  6.     void handleState(Monster monster);* h6 f' I- ?* {. }
  7. }
    : ~5 C& X% t3 q$ K3 v3 @, I6 U
Скопировать код
' U' G5 f7 L8 ~% A
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 F- d( {( c: N. V, ]3 o* Z

% e, A- }2 O$ [Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
. T1 l2 }9 P: T  H3 p& I0 L9 k3 E0 h- h2 |1 c0 w7 v5 i
Класс для начального состояния монстра:# N; G- x/ A& U1 D. f3 b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& R; o. c$ K) M- t' L$ @
  2. package org.l2jmobius.gameserver.model.actor.state;
    , E0 q% n% X6 \( T! Q$ |! R0 j. L

  3. 4 y. N  D9 N+ y- p! A/ i0 ^. N( d% j
  4. import org.l2jmobius.gameserver.model.actor.Monster;! t  |6 C0 u. B; q$ B4 S- B1 i. }6 z! G

  5. 9 K! q5 T1 U+ F* P+ A) M: z' E# u& ?
  6. public class InitialState implements MonsterState {
    / w9 W) {; w5 Y) Q  [% K4 y
  7.     @Override. m+ b& c/ \! Z
  8.     public void handleState(Monster monster) {
    6 k% h' O6 u+ z8 O& R8 {
  9.         // Начальная фаза боя( R( P$ j4 u& D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    4 P( F( n- ~/ g* y7 e8 }
  11.     }4 g$ m- Q6 V5 J& I
  12. }: v9 @& O' i* U
Скопировать код
Класс для агрессивного состояния монстра:; [; x$ e* k" l% g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 V( f% y0 U) J  G/ z( t
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' g/ e" h2 }. y% d: d3 j4 M

  3. / X. k' T5 p6 p, q$ S& K/ A' }1 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * J) t: m+ q; a  p# u' h2 b) ~0 ]' m

  5. , E; L, j' ~1 N/ A0 `0 N5 @& ~' J
  6. public class AggressiveState implements MonsterState {% P; a7 P+ H& {/ B$ G. j& M
  7.     @Override
    / F1 o9 w6 M& I7 Z% h+ Z
  8.     public void handleState(Monster monster) {
    1 V3 e. H. w: M1 b
  9.         // Агрессивная фаза боя+ h( T! J# m8 z8 p& K
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 E9 U' \$ d& X! q/ s& _
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    " n3 G# |6 J/ I* d( Q
  12.     }" e1 D  v1 d( \+ |, M! S
  13. }" y; x4 R- w& t* v; R0 [
Скопировать код
Класс для финального состояния монстра:2 V0 a" ]7 `$ N1 h! y, t+ d: g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / o8 l$ M, C1 b: V
  2. package org.l2jmobius.gameserver.model.actor.state;8 B- O" m7 X5 D) H, A

  3. 3 y5 I3 R# e  Y/ V
  4. import org.l2jmobius.gameserver.model.actor.Monster;. j% a( M9 L% K% d: [# c0 C

  5. : l: t" E- S: Y3 c. s4 h2 @
  6. public class FinalState implements MonsterState {
    % I: @+ T$ O( ^% s( Y: f% v1 H
  7.     @Override: g5 P0 Z* C0 c* r
  8.     public void handleState(Monster monster) {) h% s9 A4 ~+ ~( j$ l4 J/ f
  9.         // Финальная фаза боя& a; n. d8 F/ h/ r
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    + V' }7 m3 u$ g2 q& U/ ~
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки8 A+ t+ O" O- R) R) S; x4 [
  12.     }
    : v, f' \5 @* t( ]' F# q
  13. }
    6 m0 c2 h! j- s/ W' S
Скопировать код
' j6 C# e4 ^% r* X; ~: Z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.( D+ {5 Y, }, U9 _4 e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 [, M' z. T5 C3 Q; q+ F% t0 ~; G
  2. package org.l2jmobius.gameserver.model.actor;
    - N& v& B) e. I7 P. ~, ^) N

  3. 0 P* [+ L6 k# m  n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    3 l3 l' }) }* J/ q$ D  j7 I# [
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, `: n1 T9 f) o( `
  6. & ^# E- z6 L! G1 n
  7. public class Monster extends Creature {2 I. Q5 R& l5 F$ r& ]! v6 c
  8.     private String name;% N* }; o+ x. y' Z7 ^0 g% K0 b! Z
  9.     private double attackPower;
    1 F, c" p4 g- L! V# ?! I2 C6 J& {( N
  10.     private MonsterState state; // Текущее состояние монстра
    & W) c6 i7 y# }1 n$ a1 ~

  11. : j0 h, f" h; p/ S
  12.     // Конструктор монстра
    0 `1 \) e! \0 B
  13.     public Monster(String name, double attackPower) {
    ! @, V& q9 S! T# g& `& {8 e: B
  14.         this.name = name;
    8 u2 K0 |7 g1 N" R7 Y  R0 r
  15.         this.attackPower = attackPower;
    6 E3 Z) |# A/ n6 O- R) _) b8 \
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние7 y% }- j7 p( U) u  T) d  n5 ~" R
  17.     }
    2 M2 g+ g$ `5 o( x

  18. . g. f4 O# }  I- y5 U
  19.     // Метод для смены состояния
    9 T" q0 F- n1 n  G; f9 A
  20.     public void setState(MonsterState newState) {4 T7 S' e: y- H4 c
  21.         this.state = newState;
    9 n! ]7 W- R( C2 P' @( h' \8 {3 }
  22.     }9 c: e# A+ o4 l5 i
  23. - E( M, R: a8 q- b
  24.     // Выполнение действий на основе текущего состояния- x& j6 @5 B  g& E0 r: i7 S
  25.     public void executeState() {. n- t2 f4 Z* W' h/ {, t# `/ U& _
  26.         state.handleState(this);6 s+ }- ?# \5 K3 X
  27.     }
    : z4 @: g1 ^' `' W: t# V
  28. 7 d; C# _# q6 {
  29.     // Геттеры и сеттеры
    % w9 J. J  W/ `$ B1 B: E" D
  30.     public String getName() {
    + {  `2 R4 P; k" M, O: G: _
  31.         return name;
    0 \/ h/ t  w4 m
  32.     }6 E4 C3 Y* N& q0 [

  33.   e/ ?+ H% l/ z( o/ O
  34.     public double getAttackPower() {
    7 u( e9 ^$ R' l
  35.         return attackPower;
    9 N1 r& y- `  `" x; R
  36.     }/ i/ w8 I0 L, b; u) n% M) a
  37. 5 y8 c/ j' Y  ?% F& k$ t
  38.     public void setAttackPower(double attackPower) {8 Z/ `0 \- a9 G9 p. u
  39.         this.attackPower = attackPower;
    5 I/ I/ D1 |9 h; }- [/ n5 l9 q
  40.     }9 N$ u7 n- w  W( R
  41. }# ~  A) \$ o% ~" l8 ]1 g5 X
Скопировать код

. O. N) b* ~( w* A( t6 B% x( VШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.5 \5 I- R1 L% R- ?2 v

( I; i2 f& E& X0 D& p4 |  l( ^$ d
  1. // Пакет org.l2jmobius.gameserver.model.battle' O9 W6 T6 P# H
  2. package org.l2jmobius.gameserver.model.battle;( j2 }( O2 O8 t) ~
  3. $ V+ `1 a  k) X  q  Y$ F- o3 p( l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 m3 s4 A0 N  ^, ~! @8 G( m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* _6 C% Y; Q3 X4 y# c" _4 c- o
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 Z( l1 S4 q+ E/ K
  7. - E4 Y: _0 L  D$ I# s8 R! V
  8. public class BattleSimulation {. B0 m+ ~8 o4 d, `9 N
  9.     public static void main(String[] args) {" P, t( m: M" `4 u3 x
  10.         // Создаем монстра с начальной атакой
    - J5 _# I8 c9 h' B6 U
  11.         Monster monster = new Monster("Дракон", 100);
    , v' B2 _! z# S! D+ r: n9 {

  12. 1 Z1 i6 D3 |4 g5 S2 r, C
  13.         // Начальная фаза
    4 e& y/ q/ E/ ^5 u" m
  14.         monster.executeState();
    3 `: c$ N' s) o6 [- C5 o8 z
  15. ! V/ R0 @5 Z0 ]2 T7 l
  16.         // Переход в агрессивную фазу
    5 ]( }4 r$ j$ h% I8 ]( M% l8 P' u5 z
  17.         monster.setState(new AggressiveState());
    2 B' l( h  ?$ n! d! \1 y0 m" F
  18.         monster.executeState();
    # n: h9 v2 z7 u& y( I

  19. 4 N, N* Y( a) k% w
  20.         // Финальная фаза
    # j0 l2 x8 K, U4 C& b! E8 R' ~0 p
  21.         monster.setState(new FinalState());
    7 L* D9 o" a+ c8 Z: E9 e! S
  22.         monster.executeState();
    0 k, B; R7 b! ^3 L
  23.     }
    2 a/ z$ w. N6 o, ]3 r
  24. }
    ) L* M  j" Z4 x; J
Скопировать код
0 e* c' `  O0 d' A
Комментарии по структуре пакетов и классов:
7 x& U7 X3 j" I# H/ }3 JЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ ~) x8 n/ Q1 F+ n2 q0 e7 [# C& I; y, ^Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" N' W% t% L( m
" S0 X) Q$ M) V& f- U
% m7 c/ q! U& i! S

" P  L' z2 g+ |8 M/ y: O. K7 U( l% v, @5 z' ^
' \4 b; w0 h6 y$ x0 P* K
+ ~/ i5 E8 q" I) C8 P. a
( U& l9 g9 Q' k6 g1 O

+ O. g9 u: M3 ?9 u2 h% E! S6 {. j" x/ `! E, H9 R0 k+ w

8 `7 _% Y- O  H' ^  E; k, p& _
% M7 T1 t, I8 x  q2 c& W, K; _2 i
& f5 Z' I7 {' q  c
1 u' s3 Z' t, O* L- V& g
- ?( F6 C7 K' X7 `1 V: t0 d
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
6 J0 Y: V, ?6 j7 v  pДля управления сложными взаимодействиями, такими как  ...
6 \/ |: Y& @; M* l/ N
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
  z7 z2 g; f: [# f0 }Отличный подход! Использование шаблона "Состояние" де ...

  z1 S9 `& w5 B! b( s, ^" cХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.% i! G; N' l* c, K
+ I' q" R: m2 {: _2 i! n( m
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
% k' t2 h* e  D; S
8 z' E& \; D; ?. V
  1. // Пакет org.l2jmobius.gameserver.model.actor3 V5 R& W+ {) S% C
  2. package org.l2jmobius.gameserver.model.actor;: [( Z* B) O1 w% ]/ E
  3. * |6 |' Y9 y" x3 v/ S) y# J% L) m
  4. // Перечисление для типов атак
    6 g+ }) V& O( m, }0 `: U
  5. public enum AttackType {
    ) ~5 [" |& g1 A
  6.     PHYSICAL, MAGICAL;, ?4 o3 Z5 e2 @" O7 d5 [- D
  7. }# B- u! k+ |2 d1 w4 n: S
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
: @+ O* W3 J' F5 ?4 g9 g  d8 SОбновленный класс для агрессивного состояния монстра:
7 X) N9 d5 t) E8 f! F
( Z: D/ F7 _2 m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; Y) }& ]9 e* M* f
  2. package org.l2jmobius.gameserver.model.actor.state;
      G6 v+ O( {* O3 O. `- c# e
  3. . U( |/ q& C, G1 E8 o, M
  4. import org.l2jmobius.gameserver.model.actor.Monster;) Z' @& C. p; j5 K! d
  5. import org.l2jmobius.gameserver.model.actor.AttackType;+ D9 r& A& Q, n8 D- P# G

  6. % l6 d4 ?8 v* y4 G
  7. import java.util.Random;
    : J5 w* {1 W" l& b6 S& A
  8. 7 \6 G) i# A# H" e) z* J( ^
  9. public class AggressiveState implements MonsterState {1 E" b  E6 j$ n: h
  10.     private Random random = new Random();2 C& y7 R9 S+ Z( u

  11. , h1 x8 @8 l  Q- ~% Z
  12.     @Override
    / i( d2 h$ V1 q4 _
  13.     public void handleState(Monster monster) {# k3 V5 y6 P* Q: _
  14.         // Выбираем случайный тип атаки: физическая или магическая  F3 m# T5 s, S2 F/ ?5 U
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! b& R1 i" I# }  H0 }$ k

  16. 9 ?" W) r) T: B+ \& h, ^' }- o+ E
  17.         // Логика для агрессивной фазы боя4 F  o- J9 v" c! O! A
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 9 `. ^0 }- @& \2 y* O' Z% c4 n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    2 A( {  s6 ?& N
  20.         : p6 X, j$ n3 w3 J: M" y% `
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  _) R2 f, Y1 g- P- j
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    % v8 v+ {" u% [
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);8 J7 e! `. L3 y/ N
  24.     }  E( g" }9 z( W( j/ L# k
  25. }( B& z4 b+ }- q* y. ], v) B3 g5 V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки: i) l6 w9 `2 {& z, q% x& n
4 Z# p% j3 J/ g8 x$ j
  1. // Пакет org.l2jmobius.gameserver.model.actor5 n3 F  T/ p' t' M
  2. package org.l2jmobius.gameserver.model.actor;
    / ]7 p6 |/ E- `5 C% b- p

  3. * `6 L4 G% Z  ?/ r0 [# m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' a9 V# D% H+ d0 G3 `6 f$ e2 F1 N3 H
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
      B* Z( L, u# \$ U2 b2 ]) c$ ^

  6. ; i+ v# A. `$ H, h7 }0 ?( \
  7. public class Monster extends Creature {" b+ m* f  g2 G+ Y" l7 f
  8.     private String name;
    1 Q# f7 L$ ~, V% M2 f% E4 _
  9.     private double attackPower;& D2 p7 B" q8 ]: ]6 H2 r0 U
  10.     private MonsterState state; // Текущее состояние монстра
    0 O5 B1 Q' t9 I! R$ Q6 }7 e0 B. ?2 O
  11. / C: q: E0 Q# \4 \; z. k( G' K
  12.     // Конструктор монстра$ O  z; s' v  t: {
  13.     public Monster(String name, double attackPower) {
    4 N) h) s5 g6 t  \6 Z  U
  14.         this.name = name;. e; X3 T& S+ D9 k* c- ^
  15.         this.attackPower = attackPower;% R# s; p6 ]$ Q  P" I
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    7 }2 }! a4 r4 i1 M. o/ O
  17.     }8 c; ^3 x7 g; P% Q- P
  18. 7 A4 d- ~; ]) v- I5 i
  19.     // Метод для смены состояния
    * Q3 d5 d! O. h/ d; @
  20.     public void setState(MonsterState newState) {* R+ F! T: f5 g4 S: E
  21.         this.state = newState;
    & G* c+ p/ l' G1 z! o- U6 e
  22.     }
    1 K/ W' C# M9 h8 ?. G

  23. ( V: J& I% n; c7 [
  24.     // Выполнение действий на основе текущего состояния
    ) c9 Y$ w* z5 [. ?$ @: B% N+ y
  25.     public void executeState() {/ |- e! a9 Z5 T( Q! q0 ]6 Q/ p
  26.         state.handleState(this);: ~3 O! Q2 F3 q! D  D
  27.     }9 Q5 P& Y& T. h

  28. % M. u- w/ \: G) ?1 O( F
  29.     // Геттеры и сеттеры) W# L  }# n& Y; N$ Z
  30.     public String getName() {! ]: @' v1 O' _# r" Z
  31.         return name;! v- B* q$ O' [, D  B" ?8 E- M
  32.     }1 k) `% C$ p# P2 C' U

  33. * B# j4 D6 C8 V% t
  34.     public double getAttackPower() {
    5 I* t+ A& v6 A
  35.         return attackPower;
    4 k( ~: r' ?- f- V. r6 p+ g5 ]
  36.     }4 d/ h0 N* Y8 D- a/ t% b( }7 ~
  37. ! F3 y" H- L  T5 m* W4 ]
  38.     public void setAttackPower(double attackPower) {! T' d. e5 r3 |. G, J9 ?, `0 u
  39.         this.attackPower = attackPower;  K1 t) r% Q$ L
  40.     }
    , n0 U, A" _0 L8 o9 S
  41. }
    ) H9 q, X! V4 n: t) x! M, @
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.1 F& D. h# o8 |$ `! a

  j2 X" ~' E/ R' C0 B+ R/ u8 v" W
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ! H4 F2 K& U8 U* W! Z
  2. package org.l2jmobius.gameserver.model.battle;
    5 Q6 t- m% G* p# T4 t. L& q2 {- M7 i6 K
  3. ! ^* U6 k4 @) S, s5 g
  4. import org.l2jmobius.gameserver.model.actor.Monster;. c' J, z5 J8 E/ i+ }
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' P# x) @' m* F7 e" A% L5 }

  6. 0 ?& j8 m5 g2 \* c% I) f9 c" E& [
  7. public class BattleSimulation {$ H3 \# G+ P) J! N' `# `  ]
  8.     public static void main(String[] args) {. S7 M/ c8 C' `% x
  9.         // Создаем монстра  L8 a3 t+ ?" Z$ p5 w) w7 ?: y
  10.         Monster monster = new Monster("Дракон", 100);
    6 k2 Z* f3 U# {1 s! s- v( n
  11. 4 N& W0 u4 B) v& s. f
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак" o7 y" [9 }( I% w( `
  13.         monster.setState(new AggressiveState());
    - o2 ]2 F) Q# C, o: i9 H3 L+ v* b+ n  G
  14.         monster.executeState();
    8 A) \7 `( _' {3 o* e
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак% f$ _: l9 ]4 E' c
  16.     }
    , t1 a$ U. L( p" S
  17. }
    / v8 [) }; u, m2 s
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
& c7 V" e5 K) _. pЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
/ I; Y8 c% Q( \  C% }
8 e; ]( q$ D4 ]2 r; W! T' R  t5 x. P# f' O$ L9 `
: H) p7 ~1 B) d$ P- w& A





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