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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
- v+ \/ l, g: ]& T3 ~- ?: ?; M  g% r" n4 j

$ y" V# E; m0 n) p) TЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы." c# ?% g: [* K: J4 Y2 Q
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
& ]% {' a2 Y2 p3 C/ c; V: }Астралия ?' U5 u! ]; B* i  \. M0 s* U

1 e/ z6 d! T+ v# G: j5 F' x
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!' Y& g# z$ d2 l! o; J5 a% K
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
% a/ j# ~( p0 h3 l4 J" S; x
$ j" w% C$ B' [6 W6 K* I& p+ l0 J6 O
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
! l! h; b- g& h; T4 J) b7 [3 G7 A
AlexCoder опубликовал в 2024-10-16 18:312 l: e: \7 M6 u1 Y  s6 O* \7 f$ n* X
День добрый!1 i! S  s* N! I; G
В статье описано взаимодействие игрока с N ...

& Q; C  ~5 z/ \" AДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' _9 M* K1 E5 R6 o$ t1 H4 O
2 t1 F4 H( f" K- k
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" Z6 _# Z2 O8 E3 m$ t" ]; H- T5 C* D) Y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
  z5 D5 F& D; R2 e
# c) g7 s$ @+ @) t
  1. <font color="Green">// Пакет для состояний монстра</font>0 O4 K3 }' R* @9 ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! S5 L- u. V4 J( b6 u
  3. <font color="Green">
    ) t1 N2 v4 k# P! ?) g, T6 H
  4. // Интерфейс, представляющий состояния монстра</font>
    , l# n* b& x" b  e; D$ X! {
  5. public interface MonsterState {
    5 |) X  b* [0 Z. h# i. f
  6.     void handleState(Monster monster);% |! ^6 Y7 w' Y
  7. }
    : b+ z7 x$ s, n* F! Z
Скопировать код
; u; k* J$ }8 }# Z% Q: Q; J
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, Z$ W8 X. ^9 D( }$ s: i4 U, u. e+ X0 d) I
Класс для начального состояния монстра:
+ p6 T# w& p# ?4 u5 O
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>1 `; J6 a) ]4 O! Q; o
  2. package org.l2jmobius.gameserver.model.actor.state;/ F" f: n4 \  a& k) v) ~/ p! d5 ?5 \

  3. 8 V$ C  i' P6 O8 `( l' |" i: Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) ~1 f2 @! O( M) s/ W. J

  5. ! n' N% L' I' _9 @1 o' x; ]
  6. public class InitialState implements MonsterState {
    ) U; K0 u: i5 }$ F* b) P
  7.     @Override9 ~# q4 U0 M1 j! }
  8.     public void handleState(Monster monster) {
    ( M2 e  ]1 r) I
  9.         // Начальная фаза боя
    ( Z8 `* y, e' {; P$ Z' Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# R0 g+ [) b! l* U
  11.     }
    : V  ?' [6 {: u; A
  12. }. g& d0 f' t% W
Скопировать код
; ]; D* ]+ r; r  x) q0 @

" d! ^5 I9 Z/ Z  a) f. W$ X2 m
. D& m5 L4 ^( q+ x2 j
( c8 j) R% U* @6 P4 b( s0 j! }
- T8 G) j" k& l% B% Z% j6 B% l( e
+ i/ F0 B; ^3 ?+ m2 f% C9 F
( M0 j5 V- M3 f6 T
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" `) @, q' ]* t2 X* O/ O+ u3 y4 j  H5 z" E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( c) H* R# R% ~* J" y
- I( Q  Z* a4 v' FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* g3 ^7 Z' V- p8 s) i% ~+ |# X0 q) C) t. k8 x
  1. // Пакет для состояний монстра
    - |0 ?7 k* G: q( e
  2. package org.l2jmobius.gameserver.model.actor.state;% }$ C" X4 N( t" u7 w

  3. $ i: ~2 A0 H9 N# w! i8 \3 B
  4. // Интерфейс, представляющий состояния монстра
    8 ^, W: |+ }& G* o+ u; M  `
  5. public interface MonsterState {3 v( E5 n) E% o' N2 f9 H
  6.     void handleState(Monster monster);4 t& t8 f$ T: S7 W  B7 T; r
  7. }
    5 G) u4 j9 R7 Z9 e+ D
Скопировать код
( N* }+ }, V  Z" Z- I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 3 [9 Y, V4 z! O" o1 W! e$ Z" m; h" v% M9 j
; s& B' S! }1 y/ E
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 p# q% G6 Z- ^# l% E5 o: k' j; @% j

) \; [2 ^" H& D' o) j6 C" i  aКласс для начального состояния монстра:
7 K& I& E! }5 W/ e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) s3 E! s9 o1 z; p
  2. package org.l2jmobius.gameserver.model.actor.state;
    . j: G+ I- j6 `5 x6 R

  3. 5 x: e4 b! n+ X# ^$ t  w: |
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 k% n; N4 `  F8 X0 ]' i4 |5 [8 ^  ~
  5. 7 c( b7 @& T( Q" C, Y
  6. public class InitialState implements MonsterState {" g) `; X7 v7 C/ e% e5 g, S6 I( i
  7.     @Override2 y) t3 p3 |* i# T6 b* w! Q$ P* `
  8.     public void handleState(Monster monster) {$ B+ Q/ q" X5 e% K& ]! A6 x
  9.         // Начальная фаза боя
    1 |* o$ ^3 {& g! Q* \) T
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  q$ G, {, S: U; D  P
  11.     }; n" A. S( M- \
  12. }2 _2 @) f. m8 M8 S' e, m
Скопировать код
Класс для агрессивного состояния монстра:: t9 u9 V& W& N# w- o* a
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * o5 I, F+ u8 N$ q& `6 @
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 H. q( y- J- S+ O! P; @0 R8 o
  3. 3 B6 _: u# \5 \7 n5 ]$ \
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 y7 x& c2 D( b, r

  5. $ g' `! P, y2 j
  6. public class AggressiveState implements MonsterState {
    5 |0 t0 L: c2 M, @9 q3 H
  7.     @Override: E; }+ O6 A# b" O
  8.     public void handleState(Monster monster) {/ n6 [5 `) W( w# c1 n7 l2 g& Z7 F
  9.         // Агрессивная фаза боя5 |+ X4 k1 T8 r5 _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , ]- E5 j2 @+ n0 Y/ W+ L
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    . u; H' q8 z+ z: I# y  K/ Q
  12.     }! D( M$ U% |* K/ g6 L: s
  13. }
    5 G7 V/ A' O  i: x0 W/ J
Скопировать код
Класс для финального состояния монстра:! s. V9 E. j( O; H# L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 @& Y9 o( H* o  ^1 [- d" C
  2. package org.l2jmobius.gameserver.model.actor.state;  ?; T1 G, E1 C( u" R
  3. . f4 T" c$ c' f
  4. import org.l2jmobius.gameserver.model.actor.Monster;( q. C* Z; v7 L7 X3 S
  5.   c3 n5 b5 N$ L* i4 z: ^  U6 x
  6. public class FinalState implements MonsterState {
    * _6 O: Z9 C1 X  Z# t; e1 E9 U
  7.     @Override
    5 t3 N( {: D+ p& J4 q5 q8 k
  8.     public void handleState(Monster monster) {7 N* @8 g" [' G9 _
  9.         // Финальная фаза боя
    ( N8 t& A5 {1 [& K: _5 }
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    5 Y+ V; P; \5 Y3 s
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# p% ^5 z$ `* y3 \9 H. b
  12.     }
    " m5 M" \$ o6 F1 a
  13. }
    + H. [1 A7 k& I% [, ]/ V
Скопировать код
# q) }2 a* O: ^( D& _) Y% j$ z5 C: o
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., C/ w- p6 w$ s/ k  D: p4 D
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 |7 [& s0 ~, G; E6 C9 ]
  2. package org.l2jmobius.gameserver.model.actor;8 M  D' F/ g& D5 h* \
  3. 9 u* U: w8 V. ]# e  w& X7 F4 y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 s6 z% k& q' n; Z9 _$ c* W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! S: Q3 L* J+ J9 I3 Q

  6. 6 ~. U5 f& m8 x, Q7 v
  7. public class Monster extends Creature {  W7 Q$ b: T0 v
  8.     private String name;
    : w  ^8 t$ k' p% g3 ]) Q
  9.     private double attackPower;& l' }9 V! D. L
  10.     private MonsterState state; // Текущее состояние монстра4 A' u* p6 C) \

  11. ; F3 C0 S2 D: k2 _& Q
  12.     // Конструктор монстра
    : G  D% K0 m" T
  13.     public Monster(String name, double attackPower) {
    " W* c  j$ L/ L& q
  14.         this.name = name;. x' _' z1 h( `9 o0 S& N
  15.         this.attackPower = attackPower;( c) L  n% b# }  L
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние5 v- |# x/ l1 ?
  17.     }" m2 o  [+ X- ?2 W% z
  18. # T9 i8 V4 V( O* T1 F
  19.     // Метод для смены состояния' }6 H& e* v) l
  20.     public void setState(MonsterState newState) {. ~$ Y% f+ s( z! F, p( W3 D
  21.         this.state = newState;
    ! T+ }; ?7 o6 U* F; }, J; g
  22.     }8 i9 I$ C1 v3 b8 D9 l9 ^( a# q  V
  23. * e( b. o4 q# B- W; z
  24.     // Выполнение действий на основе текущего состояния
    " k5 A6 d/ U/ b. P# ?
  25.     public void executeState() {
    : X' }2 b5 o& o% m/ r$ f
  26.         state.handleState(this);
    6 z1 u+ t+ @+ \2 e
  27.     }: R* ~7 x% O+ M$ ?

  28.   y' X4 \' n8 C  s( K
  29.     // Геттеры и сеттеры2 R# V; T( b2 M4 ^, X+ @
  30.     public String getName() {: |: @. V; J5 b" o0 g/ t, ?( _2 N
  31.         return name;
    8 _& t7 B9 C6 J# K3 h
  32.     }
    * a& Z. c1 R+ z- n

  33. : T7 J4 e5 o5 M0 l
  34.     public double getAttackPower() {. s. N1 O0 Y1 {, |- w
  35.         return attackPower;
    4 J; O9 Q& `) O! q3 a
  36.     }
    % }9 Q- h5 T3 t

  37. 7 I/ C% q' I: x% I2 a
  38.     public void setAttackPower(double attackPower) {
    $ r) c3 f7 E3 z* ?) H' V
  39.         this.attackPower = attackPower;' v: T5 ]5 i0 l$ e. F- v
  40.     }; l& D# a2 M5 i! t$ T( `: y, w
  41. }
    $ F* V) [3 i* Y  q  ^7 K6 w
Скопировать код

7 `' l% p0 P* e; G& S  EШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) S1 q3 [, o3 B. |# M7 Z8 z# ?* S9 Z% w1 ^1 \
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + p5 ?! X, o# H% K- t5 S
  2. package org.l2jmobius.gameserver.model.battle;
    , ~. a) I) ]; A4 h
  3. . c8 T  d6 f$ b6 D7 X- P; ?6 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - v/ r6 S9 e% ]8 M" m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) Z, `# Z: N* K* s& W, e# `; z
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ) Z4 ~( C8 m) n' p5 H% g
  7. 2 \6 W0 \. j8 I' H+ T
  8. public class BattleSimulation {: k* W4 |: A2 K# g
  9.     public static void main(String[] args) {4 _8 b. D4 o) P, u3 ]
  10.         // Создаем монстра с начальной атакой
    2 X& {9 A! \7 Y' k% k$ w& i( N3 [- b
  11.         Monster monster = new Monster("Дракон", 100);5 R7 I1 d% L. V& X0 |

  12. " e5 C6 u, n9 ~3 M! u- l! |+ F
  13.         // Начальная фаза& W7 Q8 Z9 \2 u* d/ ]0 F& C$ M* S
  14.         monster.executeState();+ K7 A* i) ]! U6 _5 I. b) l. k
  15. . h) M8 r; N: x% A- b) U% s
  16.         // Переход в агрессивную фазу# S' \. I" g4 V7 F- M: r) Z
  17.         monster.setState(new AggressiveState());' \7 R( @2 w0 p5 K' o& d1 j( h
  18.         monster.executeState();
    " Y7 {$ s0 b" t8 l! A( m0 z5 p* Y

  19. 0 V9 o. d5 _8 V5 P7 c
  20.         // Финальная фаза
    0 ^8 L1 Z  ^$ z3 S- V% R, V3 \5 J
  21.         monster.setState(new FinalState());
    3 W5 l* G. a) W" \: J
  22.         monster.executeState();/ j4 H2 ~" r9 H9 u
  23.     }
    : }2 n- b. g  p+ I! [1 K
  24. }
    6 K/ j: i; [! N7 U3 S/ b
Скопировать код
9 _( t2 Z( T/ F! x4 |
Комментарии по структуре пакетов и классов:7 {, f1 X9 m6 h; @: i
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) j* V+ S" c0 v" d4 g+ V
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 J1 Y1 c' K! ?6 o
8 o" {$ |8 e5 Y, R
( I# X( T7 P1 c- P; @: c/ f/ `9 q, s
) E( w5 a0 Y, ]* ]
# X) D5 Y4 @; W  p1 w1 ^. a6 N) D# u6 O7 {9 O' ?
9 e: g* s9 k0 X3 G$ A
' z: [* L2 `$ v, I3 M
9 k& A* Q3 i( R4 C, T9 Q# y  r, Q6 b
  R% Z! \4 s( m# K  v6 `3 n5 I

- Q: c+ a6 ]$ P
* \) y& V( ?# E: R6 e) H  N
4 Y  y, `; d, G5 F
1 n  b* i: F: |1 g( j, x
$ f, F( ^3 B& E8 P$ l
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
. H! Y: \7 C( X9 q, oДля управления сложными взаимодействиями, такими как  ...

$ }, T5 X, Q$ y; d' p3 M: @Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
1 |. Z- w( E2 M( ?Отличный подход! Использование шаблона "Состояние" де ...

2 o" V6 g1 ?" p: LХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.1 {. @$ M/ `$ m

% B3 |' j. r! [: WШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.4 @( L% r9 R) X5 f9 x' P
7 w! {2 e3 R8 \$ a9 `% k: m
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( e4 [  M! E) ?; d
  2. package org.l2jmobius.gameserver.model.actor;* c& N; `6 @4 G4 h

  3. 1 q2 w0 l7 n3 S: c- D" K- u% G
  4. // Перечисление для типов атак
    ( |( h% v- u0 i# i) C
  5. public enum AttackType {
    7 f* e2 B% z9 U
  6.     PHYSICAL, MAGICAL;
    , Q' z1 c* H9 C6 k( S3 t0 m
  7. }
    3 p) l$ y) t% D1 N
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
' }( a+ x5 T4 \' h; [+ [# rОбновленный класс для агрессивного состояния монстра:
/ X% T2 K& l. p2 Q7 q9 u
3 ~3 L2 {$ f: ?' s- g. v  u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 q- }- @  t4 I7 {8 x$ b
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 E" N$ r" v, C  T
  3. 9 c3 r+ y! ~4 x: B: V4 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 M; r8 k! m7 a
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ! X7 D8 m) C+ b# L0 h! W! ^
  6. * x8 X# }8 W$ a! T
  7. import java.util.Random;
    8 M3 u! R' r! e/ z  [1 Z# Q
  8. ) c2 P$ t' `1 i
  9. public class AggressiveState implements MonsterState {
    2 i5 f; L3 Q1 g5 _7 J
  10.     private Random random = new Random();' s" @4 y; H$ d7 Z
  11. " G/ X9 h% {8 @
  12.     @Override8 [) Q' k# A( o& S0 J* `4 s7 Q; P
  13.     public void handleState(Monster monster) {7 A& I3 I, z6 G& _$ |
  14.         // Выбираем случайный тип атаки: физическая или магическая
    5 h6 p( u& A3 ~7 K- C' y
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    * G( d6 |7 o  I% u
  16. & {# m0 w1 L& n
  17.         // Логика для агрессивной фазы боя
      O/ V; i' ^. m; D1 @* Y1 p' M+ S
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & \0 l5 x( e# _* a9 s: v
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");% t, [" H+ i. Y- w) w, v
  20.         
    , p$ I. O% g( x) B" a
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    * ^$ `; U6 K! D# a
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    6 d6 e  |7 J) w8 W. x* }
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    & T+ y5 B5 P& K; A' S
  24.     }
    / G! ~( q4 S* A; Y& ]- F
  25. }
    2 i! ?" V1 z' }4 y# K" {
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
" L" |* }& p* H9 q( V) G' ?
' v; ?- z0 E- H# C$ U
  1. // Пакет org.l2jmobius.gameserver.model.actor' ?. T& R$ _2 b% _5 W
  2. package org.l2jmobius.gameserver.model.actor;
    0 w( ?' E5 R, o9 _
  3. 0 f2 O2 v( ~2 \* @. r
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 L- c" J' J9 r* ?$ y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( Y! S7 b% e5 O3 P" N) j
  6. 6 [' V+ F* Y9 M4 N
  7. public class Monster extends Creature {2 Q- W* C" d# l: E: i
  8.     private String name;
    2 T0 O  _7 w7 h. [3 ^& m1 n' y$ O! Q
  9.     private double attackPower;5 d0 T' L" l; O3 e7 G+ H$ l* a
  10.     private MonsterState state; // Текущее состояние монстра" ~% i$ \4 y% n( u0 o3 v% }
  11. 1 |- v5 Q+ P. _% b& T
  12.     // Конструктор монстра8 }/ t  c  M3 S0 _  u
  13.     public Monster(String name, double attackPower) {; L' r( T8 C0 U/ f
  14.         this.name = name;
    - t5 n) u! i; A
  15.         this.attackPower = attackPower;- K* g8 y4 c4 |% ]# {' A& @6 u
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию* o! ?4 {5 f+ o+ p( q% ~) i
  17.     }2 P: w/ ?9 y8 C- v" A8 {
  18. # o5 a: N' l5 O3 r3 `4 N
  19.     // Метод для смены состояния: J' d& W6 W" F& ?$ i: y8 {
  20.     public void setState(MonsterState newState) {) w3 O7 U1 Z. j' e
  21.         this.state = newState;
    ) N1 h' |$ w* `0 @" p2 X1 v3 F
  22.     }
    1 U9 @0 j5 M: Z$ \$ j# H

  23. ' X" L, \) Y" a; l7 A. S
  24.     // Выполнение действий на основе текущего состояния, i* i7 l- W1 K0 R& A
  25.     public void executeState() {! L) |7 e3 r) ]$ e5 a
  26.         state.handleState(this);
    ' B8 m) @8 T: g7 n0 G6 b  }
  27.     }' j3 o0 h: q: M( W) |/ P

  28. 9 v6 c2 I& L& B" Y1 x1 z( T, C$ j; t
  29.     // Геттеры и сеттеры3 f9 |6 W2 _' \% O0 T  @
  30.     public String getName() {
    5 F  q- k) a8 v6 y- v
  31.         return name;' ]. B7 b- F1 g  @& b0 V: j3 x
  32.     }
    9 L4 ~$ T5 `0 B1 }
  33. 3 z$ A2 U- T9 n& X7 G; y
  34.     public double getAttackPower() {( X7 t+ Z6 j3 I) [! r
  35.         return attackPower;
    4 R7 P; k; w. g8 P. A9 A
  36.     }% w5 Q% M' p% ^( R2 N" n' V+ E+ A; b+ \3 E6 d

  37.   T9 ?- U& ~! d- ~% w; ]
  38.     public void setAttackPower(double attackPower) {
    ) L" c1 d! E3 f! _& M8 Z$ p4 @
  39.         this.attackPower = attackPower;/ b; _7 F5 M. r% r7 K0 P
  40.     }
    ; O8 m- _* W& t6 l1 O2 E! r# _( U
  41. }; U: `) O7 ~. M& i- c( s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.4 n$ }6 t* R5 o% n# B$ R
6 f* Y! n& z5 s! r  [2 h% {
  1. // Пакет org.l2jmobius.gameserver.model.battle5 f3 C1 S7 [* `+ V5 a- `
  2. package org.l2jmobius.gameserver.model.battle;; J  a& }0 G  g. R$ P5 B

  3. ( s& f% }9 w' b* O& c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      o1 b$ D" N# V9 `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 ?, x" f( H& ]7 v& M- r8 S3 G. Q+ Y
  6. 0 _, ?& y9 ?2 O6 j' z
  7. public class BattleSimulation {% |) d4 v, ?+ @$ w+ J, O- t" V
  8.     public static void main(String[] args) {2 x$ g. P. z: ^! h& E
  9.         // Создаем монстра
    % C- W- ?# R" B, |5 ^6 ~- Y
  10.         Monster monster = new Monster("Дракон", 100);0 V3 h8 x( ^9 k, Y: `+ u( a. z# q
  11. 7 {6 Z) G- @9 w/ k  c6 s, ~
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак7 _9 o$ D7 O! u3 ^) Z
  13.         monster.setState(new AggressiveState());" P! S6 i# F7 Q3 a
  14.         monster.executeState();% e# |/ M7 a5 K9 P$ [3 \
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ) Y# E6 S8 n9 O* U6 j4 ?9 e2 V5 V
  16.     }! T4 U0 Z6 g4 p* n
  17. }
    9 n$ v8 F: W" e6 p- q2 E- D
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% [9 a- _% K$ b  X/ j' D( Q
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!- E: Z7 @6 ~6 T" \% @2 K# J/ |3 I

) u( c  E! G% E; ?3 M# m  l- N
3 f" q# F, I, M. s
+ E8 c% E7 F: t+ s




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