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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!) Q$ s$ J2 k" C! c: @

) j0 p* d8 s$ j9 E" B: G

5 ^0 g$ d2 ]1 Q; QЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.* h: ?5 {4 r' \
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!' i' J" F/ }. q' u% o
Астралия ?
% i) \6 c; }' M6 B2 u' ~/ w6 {/ w; ?3 M% V" }0 o

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!3 Q, c+ q: h$ |/ N
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?) P% F( W0 O4 x# U0 C

. {, D! V, ~5 L- k
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
. H. L3 Z+ j" {) c6 C+ ~
AlexCoder опубликовал в 2024-10-16 18:31
! o6 t3 t1 Q; @6 v( ZДень добрый!
3 r) a7 y3 o8 I& F0 S7 bВ статье описано взаимодействие игрока с N ...

6 g( U' ~; D. ]. w" z" O, tДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / @5 v2 a" ~/ z3 `* f/ J  P

$ \4 K! m' X: O: CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ x1 N! j, a  C3 d

- ?3 L1 h! l% r+ s$ {; qШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% f4 \$ l/ B6 M1 T
8 i1 u) ^- F" n0 s6 {7 ?
  1. <font color="Green">// Пакет для состояний монстра</font>7 G# p% L+ \4 R
  2. package org.l2jmobius.gameserver.model.actor.state;& }4 h2 U: V2 S. i. v" x- K
  3. <font color="Green">
    & m; t5 j+ N# P; G
  4. // Интерфейс, представляющий состояния монстра</font>: ~8 Q* F6 s9 g# P( q8 Y
  5. public interface MonsterState {7 `" I7 ]- N- s, _) {
  6.     void handleState(Monster monster);* l8 q0 e7 m) R7 O: ]+ }
  7. }3 x) G  y, l' M  n& S" k
Скопировать код

7 G( r: R- l5 O. F8 |1 fШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 {4 G: i3 A& g- @1 I7 u# O& N+ p: p& d, W" j7 x* {/ [& P
Класс для начального состояния монстра:% ]+ g0 }  K* C" [+ {. w8 x; s' M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>+ S) g! E$ m$ V. j
  2. package org.l2jmobius.gameserver.model.actor.state;* t- S8 [! e  |
  3. : s. K* P; M. B- q9 X# d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # t% _6 W0 ]0 D& m9 u
  5. 8 j& ]! ~, h! d, \
  6. public class InitialState implements MonsterState {# I$ K. i0 z, E* W8 g
  7.     @Override
    5 y7 q8 [6 N) J& B) n7 {
  8.     public void handleState(Monster monster) {4 v" x7 Z8 T4 s1 v- i1 h
  9.         // Начальная фаза боя% d2 H( F! V, F$ V5 k! {" ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ) \- m& Z( z+ c
  11.     }, B/ B: s8 S/ I
  12. }! A  i! y, ~- p. d" A' B2 T3 }  [. {7 ]
Скопировать код
( L; k9 ^& ?8 F

& X9 Q* b2 E% g/ H4 u3 W+ _9 _
  d9 g5 ^/ A" G, j( ~# M
& T/ o% V" [4 Q1 m# w
, t+ n5 c* N) z# ^* C: W5 ]9 N& q! B  S% H

2 h$ Q+ K) [2 e- y$ x/ ^. e
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- W+ Q: N; U4 i3 V/ X8 `+ l
4 [& b  W0 g# {# wЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., E4 o) R8 S& I) @' G7 w+ M& _$ `

. \! C( k1 k+ n' {$ s( q6 M$ {Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ N2 _  }* ^* K' F7 m6 A- `

9 M& N; x8 Z2 _! G9 {
  1. // Пакет для состояний монстра
    ; c) i9 s( o0 y& g) G
  2. package org.l2jmobius.gameserver.model.actor.state;
    % q7 Y/ J3 Y0 ~$ Q0 Z$ X

  3. ( t2 B4 e$ T7 t4 E. W
  4. // Интерфейс, представляющий состояния монстра
    $ i9 ?* D. A5 x7 z/ L& z
  5. public interface MonsterState {
    8 n2 Y1 M8 V6 q2 t+ Q3 W( g: R% L
  6.     void handleState(Monster monster);
    , X5 @% T/ A$ H. R  y4 I
  7. }
    3 |2 P: E/ u+ j" w
Скопировать код
1 q3 \: S$ q. S8 `! ~
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
) [+ V4 _7 V' j2 ?; }5 {/ ]
+ s2 F- ~! R8 c4 A( kЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя." o4 r5 _5 y/ {

3 n! ^' s' A; I* L1 bКласс для начального состояния монстра:+ ^8 x3 w8 A; {1 l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 _  c5 @! b6 V6 X& Y# s4 U
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 u" A9 R8 M- s$ n) p; C, @0 i

  3. ( @2 t4 }$ i) @" |
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 E9 N+ F0 b. d2 c$ g- O& ]) M& x( ?

  5. / L/ `( b' V' t' z! @+ J
  6. public class InitialState implements MonsterState {
    ' }. I+ k" b1 d6 i9 w6 ]% P
  7.     @Override
    ) n' T4 z6 O& c
  8.     public void handleState(Monster monster) {* T0 G4 P+ N! Q0 {7 V
  9.         // Начальная фаза боя
    + ^6 c- x8 _( ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    - U3 L- p+ M) w( V
  11.     }% K0 d% ^% ]( Q& K
  12. }
    $ T/ K8 A( B* n' h1 W  e
Скопировать код
Класс для агрессивного состояния монстра:
6 T4 e; l+ Z% m' v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 }' S8 {1 U5 `$ A1 L
  2. package org.l2jmobius.gameserver.model.actor.state;  z- A2 T# E0 W& e: e2 B- K9 z
  3. . b) r6 f) S6 \+ E, Z- ]( Q! ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " f. k; s. S, B% \. p: o5 @

  5. ! c. w. _  K( r) Y+ E
  6. public class AggressiveState implements MonsterState {
    5 {/ N6 n+ J1 |, D
  7.     @Override  ]: v( G$ j# n2 B# T% ~% t0 J
  8.     public void handleState(Monster monster) {9 ]# z* y) x4 i
  9.         // Агрессивная фаза боя
    / x  `( n) h, L& b: m
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    * b  A+ f& M# Z0 S- {9 L. Y9 a, ?  j
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки) e; H1 d5 j- R& V  d
  12.     }
    . v, {: F/ m, C4 u' _
  13. }
    6 d" q, g' b+ B: B$ n
Скопировать код
Класс для финального состояния монстра:
! B: ]+ k+ Y3 a+ c" D6 k6 v1 C, {- \) Q" P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / P9 a6 z5 j8 ]
  2. package org.l2jmobius.gameserver.model.actor.state;; _  q3 S0 j% k6 O- _9 f8 b
  3. 7 b) M, Y$ @! l" l' \2 ~- R
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 ]( b) w( E; W% ~+ S. o
  5. 8 k; U% E, m- h8 T# B& L
  6. public class FinalState implements MonsterState {
    9 y7 C, S2 ?6 b
  7.     @Override
    % D7 [* k5 S8 `1 {' |  e
  8.     public void handleState(Monster monster) {
    4 B7 a; M+ W5 c) ]0 _# F. B3 s
  9.         // Финальная фаза боя3 b' y. N, D6 Q: W
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");/ b$ `$ p( Z& @  s. @! @) V$ c
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : Z+ l( O" f: e' N" G& J# V, I
  12.     }/ D/ J/ Y! s/ e* M- |7 F$ _( r( a  A7 K
  13. }- r5 N9 R- D6 E# e" V$ |9 s
Скопировать код

6 I0 b/ d7 J0 ^Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! f: T; o$ t; K8 m8 [) @9 @/ u& o, O
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , Q6 g) r) K2 W2 i2 [" K- p
  2. package org.l2jmobius.gameserver.model.actor;
    , [( n! j  c2 N  ]0 _' ^! I

  3. % I' q) G6 E- R) I8 o" Z- B
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : R5 p1 F4 y: P5 f7 I4 [8 H
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;& Z, x- i! u3 H: B. H2 [3 U0 Q$ |

  6. . ^' @7 C! v0 l7 L- i9 @* R: q) Q
  7. public class Monster extends Creature {9 f) \. p0 ?$ {% m2 Y
  8.     private String name;
    9 J% ]  I; o+ Z# ^
  9.     private double attackPower;' e9 T4 }; V6 \' ?- ]# f- I
  10.     private MonsterState state; // Текущее состояние монстра
    ! K- l& @0 R' a" D- |- p

  11. + G; @- W% y' z8 f+ W" b
  12.     // Конструктор монстра
    . d8 a- f; K; ]" j
  13.     public Monster(String name, double attackPower) {
    0 s: F/ f/ F4 a8 L0 v3 e' X; l
  14.         this.name = name;6 d! q! f* k' ]/ e, \2 k6 {
  15.         this.attackPower = attackPower;
    + c+ ~% m, ]0 J" ]
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ; e3 ]8 o# L% }& t! ?
  17.     }1 f4 O$ v9 s: y& a& g

  18. + t% s1 J7 P, T
  19.     // Метод для смены состояния( r7 @# {, Z4 D! T
  20.     public void setState(MonsterState newState) {
    0 l+ a. r. L! [( o! v8 o3 N
  21.         this.state = newState;
    . u6 V4 y# }; A( |
  22.     }
    3 t% Y1 ?$ l% t' v% {. Q9 E
  23. $ K0 f) [  S. d
  24.     // Выполнение действий на основе текущего состояния% S, U  {+ n7 [  G; b
  25.     public void executeState() {
    6 G! q1 L% I: E/ H) P
  26.         state.handleState(this);; h) S5 O* t9 W5 X
  27.     }- ?0 ?! u0 b( `- p3 [, n+ r
  28. " j/ N- p' q$ H/ c: a
  29.     // Геттеры и сеттеры9 o! h4 `' v# b' {
  30.     public String getName() {
    9 ?$ u9 K: f# D! N3 W) I
  31.         return name;
    / _1 C  `8 m2 S5 ^
  32.     }! F# z% T  M7 v5 T; P( F2 g

  33. 6 u9 F. X+ o" }* a- k
  34.     public double getAttackPower() {
    $ P; l3 \' S6 S$ M
  35.         return attackPower;
    ; B1 S4 r4 K% M: W: P- `
  36.     }
    ( b0 y9 O4 m6 I% r/ j* i  f' l6 e

  37. 3 b% Y) F, s1 M4 h
  38.     public void setAttackPower(double attackPower) {* P7 q9 `( a$ O! j
  39.         this.attackPower = attackPower;
    , r( }0 g; D, c, @- v+ h% k. ]0 l
  40.     }; i) m5 s  O$ u' }+ K9 t
  41. }
    9 e% |! f6 L/ w3 {4 d5 D5 u
Скопировать код
. P8 {* o3 A  N1 ?; ?
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.) w: D3 G) u1 Y

0 E! z2 v: N8 S0 W; \( m
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ( `9 L5 q; u5 z9 Z& a; C0 ^
  2. package org.l2jmobius.gameserver.model.battle;
      x" D$ ^( f1 D& ]2 Z' a( @" k

  3. ' l$ r/ M( D6 `- q4 z3 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      r/ j0 k0 G: s2 I$ }, O3 t+ ~
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ }7 C6 b. Z4 z2 _
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;9 \7 x2 _9 U, Q0 T" }, s4 b- K) f

  7. 2 C$ L' z. O! z: y* `( x( t& f3 `
  8. public class BattleSimulation {
    3 [4 \% v9 I' m1 |/ f
  9.     public static void main(String[] args) {
    ) _8 G' `3 R0 C" g
  10.         // Создаем монстра с начальной атакой" C- T& m4 O- J5 M' i) O+ [- E
  11.         Monster monster = new Monster("Дракон", 100);
    1 o6 h+ }( N9 n- L0 T: U& I3 |3 t
  12. , n5 D( N$ g6 k+ Q2 r! k
  13.         // Начальная фаза2 y0 C& m1 g1 E. V) {- m' I
  14.         monster.executeState();* D% b8 ?: {! o3 e) l/ p
  15. - u  f2 S8 k0 J8 P5 P- b
  16.         // Переход в агрессивную фазу
    1 t* l0 G/ \9 Z$ m, A+ x3 E
  17.         monster.setState(new AggressiveState());* K0 q* m3 [: H/ d% g% E
  18.         monster.executeState();4 L# L1 O  C* Q' J1 K
  19. . s0 _" j8 }9 G. \. u1 m
  20.         // Финальная фаза
    & Q8 v# x- O8 s+ P
  21.         monster.setState(new FinalState());
    . O7 Q7 x; |& k6 e- c
  22.         monster.executeState();8 o2 N6 b: b1 P% V- W
  23.     }2 T) ]- n$ W4 k. H  w3 C
  24. }
    ) d8 B, b" ^* t+ x4 H- }
Скопировать код
" i7 w$ p. p1 r" ]9 {- f
Комментарии по структуре пакетов и классов:# ~; H) @* u! }( }0 ]
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ C6 w' v: j: A: R( V% r( O5 ]Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
1 U" I& n, k4 L4 C( I7 g7 O6 T2 K: }

( p" R# l' Q* H4 r
7 A, o- V3 t0 B2 J7 L+ A" y/ w9 v- {8 Y" U( I9 C. e: c
. V+ r) f- @9 b9 u7 @, ~- T

3 `: x5 v6 w) G; n. P. F3 S1 H% f8 R6 n) n

/ v5 Y# r8 j$ D' g  K) y6 z7 O/ I, W1 z

" O/ d1 ?. G: N  Y5 x4 W% [
/ S4 H; p& c' j7 Q# y6 L. @$ M1 ~. c9 J+ X  {/ m! ]1 }( s

1 m. K1 j  O* l2 f  m/ O& ?4 ~- e8 N4 e4 H2 C

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
7 P3 {6 ~- e# e, Q) UДля управления сложными взаимодействиями, такими как  ...

" |4 A3 ?, A# Q, E( v. G$ w) SОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21( r" y: G" Z6 R$ p% V* ^2 t, ]: Z8 Q
Отличный подход! Использование шаблона "Состояние" де ...

8 C4 ]& d- ^9 S3 \; dХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
* C3 r% [3 V: o1 Z' G' G; t3 w
2 b' w( W* j1 MШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
/ h) X! p  L8 d! D0 A+ \# c: H% L9 ~1 T+ x0 M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 F& V. r8 R: i" U. X$ D
  2. package org.l2jmobius.gameserver.model.actor;
    ) B9 X9 {2 N0 u6 ]8 H' d& U* R

  3. ! {2 S9 ]4 z, I+ R
  4. // Перечисление для типов атак
    7 A4 T: a; d6 n" `& m& i
  5. public enum AttackType {4 p7 J6 t" Z1 D4 X8 x
  6.     PHYSICAL, MAGICAL;, I5 y( [3 V5 V9 j$ b6 Y
  7. }
    1 J2 l$ J$ |6 Z$ R( L" c6 s* @; F
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.! }; H/ k2 O1 k% o  h* M% I
Обновленный класс для агрессивного состояния монстра:* Q) G; g- i3 m) y5 x) f  e3 P' A

- X2 U% k& p( Q3 G' W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( E$ N; n9 ?$ A0 a! N1 ?# O1 A
  2. package org.l2jmobius.gameserver.model.actor.state;$ F/ K/ Y- T: S5 q3 T* u

  3. " r5 N9 `/ ~- @5 q( `" D( D
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 \/ W# u% c& L
  5. import org.l2jmobius.gameserver.model.actor.AttackType;5 h# C" E& U% N# i

  6. " s+ u) H$ a: L( c
  7. import java.util.Random;2 ^/ J; p8 C, \" l! M1 \2 `
  8. + b- x% r$ E1 j; G% Z; [: w. j
  9. public class AggressiveState implements MonsterState {
    % s  j$ c' u1 k1 a4 e+ |
  10.     private Random random = new Random();
    2 M* |. Z  R% m# |9 O7 U

  11. # d& m" n) P& b, T  p; l9 J0 ^
  12.     @Override
    ( ?, C- G: U, |# D: ]! Y0 ^- U0 E4 F
  13.     public void handleState(Monster monster) {. P1 N) `# g5 z0 R1 g% T. S
  14.         // Выбираем случайный тип атаки: физическая или магическая
    8 h* n8 }# l+ G+ `
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;1 l4 e( X* a7 L( L' o- b6 R
  16. 1 M- |: l0 N  D6 x  N8 U; O+ D0 N
  17.         // Логика для агрессивной фазы боя) Q" }) u- X0 g4 M" c1 @  `: ?
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 q* L* }/ N, q  M& X
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");) |% X) _7 z+ |- R! L+ H0 x
  20.         ! W7 R$ O2 h; G: B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    2 q, h6 N9 y* Y$ [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;7 }! Y1 J" P/ @" v9 A
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    6 W. S( s% ~& B0 e8 b* L
  24.     }
    ( f& z1 d" ^1 A; w  c
  25. }, w! \/ p/ S0 U$ [/ @$ u
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 h; B2 b, i' m* [7 a8 ^+ |3 H
- t4 l) h2 S3 [
  1. // Пакет org.l2jmobius.gameserver.model.actor, v0 ~! e+ b: [$ k5 W
  2. package org.l2jmobius.gameserver.model.actor;% a2 W. p8 u% d  S4 n

  3. * _. |3 ~! Z8 c, t1 I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : P! I5 o5 h7 M/ |# {# h: B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;8 q  e1 b) V0 I) Q0 m
  6. . z# q) [+ K% ~; [  |7 H( u% E
  7. public class Monster extends Creature {2 n7 `' N) K, @2 p7 H
  8.     private String name;) |+ i! E3 |+ o! o. L: W0 Z9 S/ F
  9.     private double attackPower;
    * G! @- g) b, ^4 z* s& K7 N
  10.     private MonsterState state; // Текущее состояние монстра
    ) d3 G, N* R9 N. Q  F

  11. " k6 Y6 j; {$ v& w( ]# F& b: G
  12.     // Конструктор монстра# ?! k9 B5 K! x  ]8 g( H$ o6 P/ ]4 w
  13.     public Monster(String name, double attackPower) {
    8 c5 m+ G/ d: V7 t, Y* ~
  14.         this.name = name;
    + r  p2 e( }5 p/ f% ?& l
  15.         this.attackPower = attackPower;
    # H9 s+ e, I6 i. N. I+ R
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ) ?7 j& F1 K' X5 Z, m- X# W
  17.     }: X0 i' y+ |( Z. `9 a# t9 C% J9 Y

  18. 4 W8 x! E5 o6 h# q. i: w
  19.     // Метод для смены состояния1 j2 Z; c5 D* b! {4 u) I
  20.     public void setState(MonsterState newState) {  }( W* b0 U$ `1 L6 V) J
  21.         this.state = newState;- e- e1 _* R8 J. X
  22.     }* f8 g6 f  N4 }1 }

  23. 1 ~& z. w0 n) Q% R  P# D
  24.     // Выполнение действий на основе текущего состояния; D0 |- r' {, E. S8 J1 I
  25.     public void executeState() {% x7 `, F# r  ^$ L8 H* L
  26.         state.handleState(this);" u: T7 k1 R* T6 W  Q1 ]
  27.     }9 Q4 W& _8 |' x5 b$ c$ I1 d0 m: z! ^& U

  28. ) ~1 h% P- x1 }3 X6 N, w4 R
  29.     // Геттеры и сеттеры; R% {  b4 [& M3 `- a  {9 \
  30.     public String getName() {
    : m+ q( ?- a" J3 q+ L8 r
  31.         return name;8 l. a. t) o5 x$ G( U
  32.     }. ~" f" O" P5 {5 h2 a+ m, M

  33. 7 y5 w" H" I/ n6 \5 l8 U
  34.     public double getAttackPower() {
    3 D8 v0 p7 T, J. N! Y
  35.         return attackPower;
    % Y( q" x2 Y. I. [
  36.     }* S' S3 P) F( b0 }" |- p
  37. 0 s) Z8 P% n' n: \8 ^3 ^
  38.     public void setAttackPower(double attackPower) {
    9 f0 i5 @2 u' |  y* Z7 P* w0 j
  39.         this.attackPower = attackPower;
    5 i9 N4 q; K6 z0 C8 }
  40.     }
    ' @: u$ T, Y' W# e! m
  41. }3 O. s- h' ]! r( P1 O6 U
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 }* D/ V  }' }' @

  h& l# c* F  ?1 H/ |. @# k4 D& `
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; m! K/ j; v8 G4 {& c; \% d+ n# G
  2. package org.l2jmobius.gameserver.model.battle;7 Y2 S  r% R5 V# H" V9 B
  3. , g  k- J$ e8 F
  4. import org.l2jmobius.gameserver.model.actor.Monster;; n1 X- J. B5 c: O! s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % ^) e8 J, t/ S" \4 l, P
  6.   s- }) @0 @' K( ~& F5 ^
  7. public class BattleSimulation {
      V% i1 N1 d$ P) P8 F
  8.     public static void main(String[] args) {! v# |2 X0 {) V8 I' b2 E- z0 @: n
  9.         // Создаем монстра" R7 S8 m1 [) |/ i5 Q4 a' x
  10.         Monster monster = new Monster("Дракон", 100);
    8 d, G, `- E0 Q  ]- A' o  @2 D- g

  11. " A& }. L6 d" j2 |) L+ G
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    # @9 H: G7 S6 \  O# @. r+ ^
  13.         monster.setState(new AggressiveState());
    $ a9 {" ]! o9 m/ |1 Q
  14.         monster.executeState();7 w$ B& T# ]$ \0 x) i* L: M3 A; \
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак" B% P2 ^: @9 N$ c* P2 C
  16.     }4 V4 J0 v- X2 f& Q
  17. }0 R9 L5 ^" n" N' r7 Q
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.! U  K+ E4 y2 s: a# @/ B" V
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!2 s+ w! T- A' U( Y' L" m2 C

2 C6 p1 t  L" c4 m& y0 a
# m4 k1 o1 i/ Y
% ~0 \* t9 v% X, u4 r0 |; ~" Q




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