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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!8 k) t1 N; X$ m& O9 A& D
" U( k0 ^5 |) j; c, M

0 {% c" ?! T* Y) X' C6 p5 S, v! cЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 q6 X5 X% G4 |
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
% ]7 Y! [4 n; E0 ^, l# [Астралия ?
9 b- A, ^7 B6 c+ D: i
. t  V# j7 E6 ], ~3 d& `9 g! f
Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!6 t' Y% [& e7 J% {- q1 E2 O
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- W& [& s/ Q8 K9 x: s
' A8 S4 g) |! q
Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
3 _+ r# _: p7 b3 r/ y
AlexCoder опубликовал в 2024-10-16 18:31' P0 B# g. w6 L
День добрый!
! z6 F( P# D) h7 bВ статье описано взаимодействие игрока с N ...
; @% f' d6 h7 ^' ?
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
! U2 ~7 W7 \% n8 C" \0 z# u) P# g# t8 Q4 R! q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- m1 q1 ]1 o+ [) n+ d- _, d  ]# h( |# E( k7 }7 a, ]
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  a2 x4 B/ ~" C" v7 E9 t& \$ w

" J) u/ I, I4 `9 g/ C
  1. <font color="Green">// Пакет для состояний монстра</font>. |% [' z: Z' W% X9 s% ?- p( b8 R6 f
  2. package org.l2jmobius.gameserver.model.actor.state;7 b- ^7 T9 x* @9 s: e
  3. <font color="Green">
    ! ?# m7 B& p4 C, G# `. {
  4. // Интерфейс, представляющий состояния монстра</font>  \/ G) ^( F0 }$ M4 Z$ g
  5. public interface MonsterState {; A; D6 c3 q- n7 ?
  6.     void handleState(Monster monster);" Q1 e* t# j& i$ [% G+ f7 a
  7. }
    ; S2 G+ ^5 O/ d
Скопировать код
1 V1 [  U8 P$ a( R- m8 m
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 D9 k) R; v3 c4 f5 G
( j2 @' l; a9 OКласс для начального состояния монстра:! Y5 {. `; ]( Q* i' `
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>4 B! G& y+ y4 e% T" L
  2. package org.l2jmobius.gameserver.model.actor.state;/ m. c% c/ n" B" p' `4 ]

  3. . Z0 n) `+ C+ K9 j4 q) X, }0 Z; E
  4. import org.l2jmobius.gameserver.model.actor.Monster;% b. L7 @; [* u  Q. i# u

  5. ! e; _3 u$ a: n
  6. public class InitialState implements MonsterState {
    + ^% k5 b2 t( [& j1 ^  |6 }( u
  7.     @Override
      f" i- c( V# b+ b( j+ J
  8.     public void handleState(Monster monster) {9 d: y* B8 K9 e) R% q: h5 w$ C
  9.         // Начальная фаза боя
    / z) A4 H0 R, A2 g6 c$ H$ A
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, G- g+ R. o; C  E; b
  11.     }
    9 N. t, T! R. q5 ]: O
  12. }
    + O4 h1 y- z) [: K
Скопировать код

: o7 s: `' p3 W, ~
( I& j9 t* _9 p. f1 X0 Q- V. j+ C) o# f6 }3 I9 h
2 ?7 o$ V7 H( U5 f* ?2 a
. z& T) q: g/ k8 u; Q1 F4 j

; P+ J. X; S- h. K8 C9 B5 f  l% m3 l+ M1 d, s7 I: I

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& b7 B) p/ ]  O9 q! D! @2 V8 A6 o
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- M6 E& G0 v9 R. r7 w

4 e$ U) ^7 W9 S( X! ^0 eШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! x8 W6 Z( M4 R$ f9 x; v
/ U( x* d& Y: x, Z& l
  1. // Пакет для состояний монстра
    5 J$ S0 H7 S$ p
  2. package org.l2jmobius.gameserver.model.actor.state;( @) P& w/ k/ T4 s0 p+ L8 z3 J! f% @
  3. " Z7 v9 G4 l1 \# R; i3 [
  4. // Интерфейс, представляющий состояния монстра  I& a3 r2 y, j* s$ z
  5. public interface MonsterState {2 y! y$ W& C* T7 ?* Q9 ?
  6.     void handleState(Monster monster);0 Q8 T, E7 G0 \0 a/ X7 Y
  7. }% H' K& f8 E6 ^
Скопировать код
  z. ?3 x8 r& |0 i6 L
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % [% |% N: y8 \% G1 j: O- Z
6 W) j- O/ {, f3 Y  |
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
* j/ {) H0 C6 o2 }2 }! Z
) Q# E! T' e  F- U: \Класс для начального состояния монстра:0 I  T  ]/ g+ N2 Y) h5 r  M+ ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' g7 ]3 j! {! l0 S" |7 @6 E4 s' ^) t
  2. package org.l2jmobius.gameserver.model.actor.state;2 I/ n6 ~8 K* M/ c) O7 r' m

  3. 0 K# N& Q- O/ u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 _! A" @' y; ~
  5. & {, a; B6 _# M: Y8 B
  6. public class InitialState implements MonsterState {* M  |' r9 B4 R7 t( p# v
  7.     @Override
    * F' d& I2 X7 g% U/ I; `
  8.     public void handleState(Monster monster) {. l7 T' r# s1 N
  9.         // Начальная фаза боя9 M# Y* Q; N; V# D& h
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");- W* U4 l% r# C1 f4 [5 i, ]
  11.     }
    + P. N5 x* Y& w+ N) X
  12. }  u8 Y# G! k4 W. ]+ b2 L* m
Скопировать код
Класс для агрессивного состояния монстра:% T2 l& X+ t" F/ d7 F# p# L: x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 ^  `  _2 {9 n4 O
  2. package org.l2jmobius.gameserver.model.actor.state;; g2 @! N$ p7 }. |
  3. 5 C9 R, }! k8 \7 f' Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! C; b1 X1 i6 v

  5. 2 C* a" o, m2 W+ ]
  6. public class AggressiveState implements MonsterState {; M6 J4 W$ J" c3 ]) o
  7.     @Override
    " Y: [3 Z8 G1 n3 C1 O) e. j' _; b
  8.     public void handleState(Monster monster) {& ^. j9 z! i, @5 l  N3 P5 S4 o) y: _
  9.         // Агрессивная фаза боя
    " X. I( O( U- E/ E# T& _. \
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");7 [( ?- j( K6 p8 s. Q' b
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    7 O  Z+ ]* q7 Q! Y- ~
  12.     }0 h, Z1 G& F5 ~2 }& g  W* D! m, v
  13. }0 q! B" c  f0 O% k  K. D3 Z3 ~8 m
Скопировать код
Класс для финального состояния монстра:; o' B; j! V) |# s, Z; Y3 g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " A* o, O8 @+ C& F3 ?  V( L
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 H" G& i7 W' A; a
  3. * Z# i: G" _8 R' n0 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;! G1 f8 ^7 h  Y1 ~9 ^8 H& M  i
  5. 2 @9 j4 ~8 m4 D" i; {9 }2 _
  6. public class FinalState implements MonsterState {
      I+ Z4 d& e# w+ }# X( P( t
  7.     @Override$ E$ m! n3 y' K
  8.     public void handleState(Monster monster) {! f  a% x5 K; u& ~( ?. I
  9.         // Финальная фаза боя* k# M. z1 n5 q- u% z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    9 ^7 C+ `5 Z2 f! V& ?7 i% o
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки8 U5 \' T4 f& Y3 C* C
  12.     }
      Z% w/ G9 v- r% s/ i
  13. }
    " I1 z- c- U) D. |) l
Скопировать код
, }4 ?  ?' X$ W; A7 e) m
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! o; m) P' c5 w6 `/ z2 y, }) s
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; b5 M" `9 M6 ]) G( w8 p# X
  2. package org.l2jmobius.gameserver.model.actor;" {, l0 u7 H1 `1 ~
  3. 6 d* T* M& ^% B7 U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 c8 g$ _8 ]( d( B1 F0 m) p8 b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % c( {  u( {5 i+ T, F

  6. 2 v( b$ T) q+ K* ]5 t0 u4 ?
  7. public class Monster extends Creature {8 H; h6 H0 ^; j: p, B) h6 Q
  8.     private String name;; t* E/ E$ t5 X# x1 b( t0 A$ |
  9.     private double attackPower;: ]+ E7 g$ N7 o6 R* B4 Z$ g/ R; h8 G
  10.     private MonsterState state; // Текущее состояние монстра0 M& U# u! Y+ @/ s5 r2 b

  11. 0 c: l& a1 l- d  w1 P- p) P1 n
  12.     // Конструктор монстра  j4 W* N  I) l5 I
  13.     public Monster(String name, double attackPower) {5 S% y5 j- M& a7 O1 F1 d+ S
  14.         this.name = name;
    ( l, o& ?# D0 W( @) t- B1 U+ K
  15.         this.attackPower = attackPower;; i. X. b4 [! P* }) ^
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние$ p/ D7 b$ f3 \
  17.     }
    - u; G4 Q8 T1 k: l, {! {4 p
  18.   n! m0 Y+ ]. E4 n! v: c
  19.     // Метод для смены состояния
    , U0 F6 F) W: Q+ T
  20.     public void setState(MonsterState newState) {
    : E( t3 @' l. ~3 B' e
  21.         this.state = newState;
    $ Q$ A* R. Y2 i9 @
  22.     }5 x; g8 x4 ]* b; u. H- r; l

  23. + M' ~" u" g- k$ o% L
  24.     // Выполнение действий на основе текущего состояния" o/ T/ h' x( w, `
  25.     public void executeState() {& S; j4 B9 H! z0 Y
  26.         state.handleState(this);
    ( f- V' N/ X; @, n3 c; T
  27.     }
    " Z' \+ B: J5 `, D

  28. # p% w! b8 j4 G! s$ k0 R5 m- I" Q
  29.     // Геттеры и сеттеры) G& g9 T  V3 W; u4 r# \' m
  30.     public String getName() {3 }1 j1 t- Q  b
  31.         return name;6 @6 t+ K* S, _' ]" `
  32.     }* q& f1 i3 X- d1 J: a

  33. & p: F; S9 h7 C9 |! ^& g0 l+ z; ^( ?9 d
  34.     public double getAttackPower() {6 x( U# @& s1 x; I/ g
  35.         return attackPower;+ \! b* S& @: r* @, P: e
  36.     }
    8 K# T, }* u/ g

  37. - U9 `. y8 C7 a4 Q  k
  38.     public void setAttackPower(double attackPower) {' u+ \. c) B$ F. b' b4 a
  39.         this.attackPower = attackPower;
      g" g1 l- ~! b$ ?8 Y
  40.     }3 D* O% N4 M5 W
  41. }( O- Q) ^- I' ^3 L0 Y  P0 ^
Скопировать код
& a/ f# I5 S; G( Q/ s  f. E
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 A4 a$ |( x' t4 d- V* E+ b. f" w5 \8 G0 U) ]8 @! B, e) p
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) D+ X, q. b& w" J% X. |& Z
  2. package org.l2jmobius.gameserver.model.battle;
    2 t  E: }( H( s7 Y/ `

  3. / Q4 \% _. w0 D$ p2 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 X0 m7 w( e% T7 [$ i& q8 i
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . F( @* M% J" [$ S7 F2 O3 T
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;0 M8 I# @- N2 \0 J- A0 d7 R# {) ^

  7. * a5 j# C' m. d9 J( C9 }% E
  8. public class BattleSimulation {  U2 N6 V$ ]/ p: A8 H& _0 P8 q
  9.     public static void main(String[] args) {  @! }' U5 U, L- R1 g5 f
  10.         // Создаем монстра с начальной атакой
    / F3 ~" }2 l. g8 L4 d% k! i
  11.         Monster monster = new Monster("Дракон", 100);
    6 ^2 N5 h4 K# F. I) ]
  12.   h& h# D  h: f, |; j4 l( u8 c  Z& ~
  13.         // Начальная фаза/ b2 P# Y1 _4 W+ V# C
  14.         monster.executeState();
    : [$ q5 q* {( m# B) ^

  15. $ ?" b1 C6 r" R$ V) \2 Q
  16.         // Переход в агрессивную фазу
    . A  c- ~3 o$ z" j2 V* z
  17.         monster.setState(new AggressiveState());  k2 T$ Q' s: _
  18.         monster.executeState();
    . j8 V4 |6 ]4 ^, r: l

  19. 3 x) h1 f+ _0 [7 _
  20.         // Финальная фаза
    / A' l7 L8 S8 o
  21.         monster.setState(new FinalState());
    7 i# C/ [* C1 j' `1 w/ i) B
  22.         monster.executeState();
    : C' O  k/ ^5 Q5 A7 t. \6 m
  23.     }
    + N* J6 Y% n' h1 _
  24. }9 h+ A& r. n; z# @2 S& ]& W7 n+ E
Скопировать код

) F; G4 B& o7 G7 VКомментарии по структуре пакетов и классов:& p- o0 [! P* g
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 }* L- ~2 W4 g- y$ X. U* KЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" @" Z. w4 \5 N( s* r  D

% m1 N+ k7 z5 g6 N
- Q3 B  R  ]' |9 W, ?
0 w: o- R+ ~+ ?% F+ }" ~7 v1 _4 b) ~& f

2 a4 {! E/ s. ~% E. S' P
+ {$ ^9 s- L6 u1 }: F% @7 g4 K
" O$ a+ c6 B9 @$ V) [
# ?; @% B( p# ]- h. C3 r8 f/ G; B" \8 u& f3 L& @
& U0 u, @0 k. H: q

  v' |+ @, \: ]# P9 }; W/ q/ s- o  B) Q. S( U
2 f( \& y4 H# Y  S, C# g1 u& W

! R0 o+ n) y! O# |/ B2 y1 [
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:04
+ v) v. T6 l% X7 |" {- \Для управления сложными взаимодействиями, такими как  ...

6 q% C/ n, X; |, K  ]! _Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
; `! w. R3 H1 k: i: zОтличный подход! Использование шаблона "Состояние" де ...

; \: V0 T2 s6 O9 d! BХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.) ?' v( V# p! ?3 _5 ]
1 E! |' m7 w! t* x. ]
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
" M: P5 g7 ?9 b+ u
6 N  e: f5 Z2 q, b3 e% m6 N
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! R. q/ v1 |. r/ j  H- ]9 G: L
  2. package org.l2jmobius.gameserver.model.actor;
    5 {, n9 h" _% D' Q) T* V. B* w
  3. . Z6 }; h. G# V6 w2 m' J
  4. // Перечисление для типов атак
    $ g, Q, J; y- u$ z% v* K! X
  5. public enum AttackType {0 n1 k9 b! N. ~5 {2 \
  6.     PHYSICAL, MAGICAL;
    : N' f" J# m  {; A; |
  7. }
    9 M2 E4 O# E/ ^6 j% n( b0 t
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 S5 j$ V5 ?3 G! w& RОбновленный класс для агрессивного состояния монстра:* N. {# p0 z5 _8 s$ E
* E% a& ~  J" L; \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 L) e/ h+ e! F- h* U
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 e# W8 B( m6 e3 v0 {6 |! o
  3. 4 k; x8 ~# W5 ?) x/ d. `& y( z1 f4 [
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ ?0 `2 ?2 `4 o
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      z- [' ^- ], i- ?' y
  6. 1 D9 W$ c7 X4 d- X9 g! I
  7. import java.util.Random;2 ]# s5 |% M* h  J$ }  ]+ r! }

  8. ) L6 Z' `/ x/ \% V6 x' S
  9. public class AggressiveState implements MonsterState {
    6 \2 y1 A) [% x; z
  10.     private Random random = new Random();' P; @/ Q3 ^9 u  t" ?9 {- Q; D8 w

  11. - c6 O) W6 S6 N: p9 g: r
  12.     @Override
    . Q  o0 F* ]% A$ T
  13.     public void handleState(Monster monster) {3 D$ E) I; z0 k; z
  14.         // Выбираем случайный тип атаки: физическая или магическая* c  [' f' p& {* ?8 f$ s# z1 y' N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    2 i% @. O+ T# y( U8 I
  16. * r" S, |- V$ [: v& I2 Z( R
  17.         // Логика для агрессивной фазы боя) X4 N" v, @% `7 \, @6 i
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " - ^1 M6 L; h; `# V* p( y
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ' Y7 g0 y; w. W5 ^. Z4 ?
  20.         
    7 c/ x, \& C6 ]4 R6 U1 n  L
  21.         // Увеличиваем силу атаки в зависимости от типа атаки8 x8 c9 w- P' Q9 B1 P  X
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;" x# }4 h' R  ]* W
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    # [" |& W- m9 J+ Y! k1 l
  24.     }$ {" B+ s0 g# w
  25. }
    2 W- h- C) d6 m# V3 _* s9 q/ M
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки1 _: J$ S8 h& {5 c3 [% l

; V* |! N; Q; {/ R. H
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 k1 w* Z1 N' Y8 \
  2. package org.l2jmobius.gameserver.model.actor;( V$ |* r4 u% M2 Z# X5 T( Q  ~

  3. # G  M  P. j+ t+ z2 A7 C
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 I) V- J8 _9 N! N  }& B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 Y/ K" R9 H: Q% s( E5 ~7 T: m( I7 r6 _/ l

  6. # M+ {3 q% D. r9 L
  7. public class Monster extends Creature {
    , a8 |4 c+ N0 x3 h9 b) J
  8.     private String name;8 s, l4 S+ w* C8 D" j, M8 c
  9.     private double attackPower;' l1 v7 m* s+ E1 M% Z1 {
  10.     private MonsterState state; // Текущее состояние монстра
    / n- `/ ]3 A# ]1 r* {0 z, ^

  11. ' ^! R+ A9 O7 Y/ F/ ^
  12.     // Конструктор монстра
    , Y3 f- k& T3 _
  13.     public Monster(String name, double attackPower) {0 k4 z. i1 q& ^* h1 h
  14.         this.name = name;
    % ?3 A4 M" p* Q6 u0 x; j) w
  15.         this.attackPower = attackPower;
    % g+ f! P( _7 Z  x% b8 {: w
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & i. s* J. L" A. r. s
  17.     }
    ! _7 i% l( Q: m- m
  18. - E) m; U  ~5 n6 b0 O
  19.     // Метод для смены состояния
    + ?0 d; }+ |% P: E& M8 Q3 a2 x
  20.     public void setState(MonsterState newState) {
    5 R0 E2 b( v* q
  21.         this.state = newState;
    ) X, X& s. N  P
  22.     }
    5 Q, H$ p9 ?, h9 _4 P0 ?
  23. 6 P. N: G" M+ F0 i" r; J4 C1 Q* Z
  24.     // Выполнение действий на основе текущего состояния; a$ F8 u/ t( T. ]! J. O$ J
  25.     public void executeState() {
    ; ?# J4 v4 A1 y& G2 p$ S
  26.         state.handleState(this);5 T, {+ C  Y# t9 G/ s4 w% N
  27.     }
    * ?% p" Y; `/ y+ @" Q

  28. $ s/ C  n1 Q1 p! g/ M
  29.     // Геттеры и сеттеры
    " _/ v/ Y6 j) ?" f( _  H
  30.     public String getName() {
    - J( y: r' x1 n# o" W
  31.         return name;  e) f# ]8 B# m$ I+ {0 p3 @0 V
  32.     }
    4 G' R4 z+ o1 Q! a1 S
  33. ) U4 i5 t$ o2 Q; j; C
  34.     public double getAttackPower() {% R; \0 ^0 i- _2 R/ L( c
  35.         return attackPower;% x0 ?6 d; X/ F( A- Q
  36.     }
    : R  r7 y: `' A

  37. 1 [$ C  X0 C; k2 @
  38.     public void setAttackPower(double attackPower) {
    8 n) b3 N0 R% h
  39.         this.attackPower = attackPower;
    ) S4 q$ a# S' m  i; ]
  40.     }; h4 |) _  x3 n' Y7 U, O5 I. [
  41. }2 C3 U! C* S5 ?% n4 B7 R
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе., |2 P; ^' C! e+ c, m1 A% r

" @' g5 F1 q8 `
  1. // Пакет org.l2jmobius.gameserver.model.battle. _- G( Y$ g. Z* c- f/ ~- L( I1 p
  2. package org.l2jmobius.gameserver.model.battle;8 ~* o* K& q7 _/ S* D

  3. " X) I) q7 v1 }% |% z; I
  4. import org.l2jmobius.gameserver.model.actor.Monster;, T+ O% I$ v# v/ I  V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 P7 @% o5 Z; X5 g4 ^" ?& d" c

  6. 1 S) |  t; H2 Q2 G3 J; Q( j! W
  7. public class BattleSimulation {- E7 K+ {1 e6 }$ [# }
  8.     public static void main(String[] args) {& U5 o/ [3 j# J2 M' a% L* j  H
  9.         // Создаем монстра6 M' |# J/ e1 s7 W1 D$ {
  10.         Monster monster = new Monster("Дракон", 100);* R) @% g# ~; K& m% I6 _" _

  11. & h3 `; D( s2 ]% C! g
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    + }- h% A. D, g) z" q! Y
  13.         monster.setState(new AggressiveState());
    % U8 O' I# T8 D8 u. Y' c! O; U0 R  T" R
  14.         monster.executeState();9 v7 j5 ?' L/ B5 h* x' m& X9 Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак/ c0 j) o( R2 F" B
  16.     }6 n! T$ @/ W7 P% D, i# i
  17. }
    , u7 h& S: M& J
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.' l; U, a6 a) F. U6 ^
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!/ i1 T' i* a+ k
2 D, K" p' |2 Y. W: |
  R% u4 R  J- L: W

' A" U$ D( g2 X1 e' i8 `2 h  Y- |




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