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

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

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
" |7 w/ J2 x% r: h+ p( g: W; c0 b

! M4 b1 Y7 w0 n, O2 M3 gЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 s7 u; e0 f4 k$ F, M+ V* M7 Q! J
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!$ `; k+ K5 a( _; r4 L$ x
Астралия ?1 J# C4 f& b0 q% e* R7 T3 j) ]
# s; ?9 x, [; |; _# ?

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!
! ]( L) W0 {2 z; I- ]/ s) ~В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 |+ y9 G) Z8 p5 g/ ^4 j7 w/ P- u8 s$ b, d$ ~

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
- S7 d  \' P8 X( U
AlexCoder опубликовал в 2024-10-16 18:31
3 F7 x. ^# r$ i) ]+ cДень добрый!
8 B* ~* h6 G& b; Y' {. NВ статье описано взаимодействие игрока с N ...

- F5 S/ z: n, r8 C5 AДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   y* u0 t, N4 W0 w& c8 S+ G

2 E# K6 W! \* i( [& T6 nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' V2 F" S( C$ ]0 _0 ~# L1 O
+ w- I( f! G2 `1 k5 H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.* Z: c8 D6 u) }5 g6 R: Z* d% H. |$ @
" f, @+ p: W% w8 Y% Y
  1. <font color="Green">// Пакет для состояний монстра</font>/ m: v# f& L2 X* \" _1 c  `
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; ?6 O  c& ~, K! l
  3. <font color="Green">
    ) f! [+ Y! V$ n# z
  4. // Интерфейс, представляющий состояния монстра</font>
    5 e1 ]/ \* j! Q, k
  5. public interface MonsterState {
    + a/ U) O, F) ?# @, N/ n
  6.     void handleState(Monster monster);
    9 C3 I) L( [9 O  ]1 \, M/ t* \
  7. }( r/ t0 X7 S3 E
Скопировать код

2 M! @& r* G+ Z$ @9 Y$ q; XШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
& {8 G6 t3 \+ T! I2 X
* Y) ^+ D& e/ j& ?- ], D. tКласс для начального состояния монстра:
2 F" s' h. R. G) m
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>: n/ p9 @( @% ]8 k. z# Z
  2. package org.l2jmobius.gameserver.model.actor.state;. s& u4 s$ V' F

  3.   D* C" ^6 \$ C! l- _' A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) l- o* r! L% k& ]$ {/ C

  5. 7 {4 w: R. g6 J- {
  6. public class InitialState implements MonsterState {
    / ]; d+ b0 ^- u
  7.     @Override
    3 b0 _( W1 u" V# I* v6 ~9 V
  8.     public void handleState(Monster monster) {
    $ Y/ }8 y+ j. u; Y
  9.         // Начальная фаза боя1 h5 q. z, e* `2 C8 n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* V0 u' x1 K$ A3 c# b. I
  11.     }
    7 m! t+ b2 U! Y/ @
  12. }
    4 Q; H' p% c- _) n1 i$ y
Скопировать код

& v- P9 `$ G6 ^# ^& z. r; N: o& w0 Z0 q, `; Z  y$ ^6 |

9 E; Y; D# w7 i' d+ m3 L, k5 [. w: K0 G6 Q7 J; O8 u0 e  \
( |% v$ M7 Z' t) ^5 n

3 v$ X! ~( ^7 g, V* p! d/ C& @7 x9 f6 f0 b/ Z/ A% s" ^0 b

Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
; [+ F+ w6 l! b, e3 z/ b- |1 E3 A& w, j( i! t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ r7 p& W( m: y6 L, O

3 b4 G: w3 X* W: G  d% K& fШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 n+ M6 W+ {  Y
4 U$ m+ o0 }( M) _+ B# `
  1. // Пакет для состояний монстра' {8 u  s9 [' X2 c9 j
  2. package org.l2jmobius.gameserver.model.actor.state;+ ~1 A# a" D5 Y
  3. 4 O8 w* X8 g3 n) @
  4. // Интерфейс, представляющий состояния монстра
    6 R; B. w; Y, `2 f2 ^% ?- t  }$ z
  5. public interface MonsterState {3 r; n6 v9 m- a' H$ G; J  u2 z
  6.     void handleState(Monster monster);
    + M8 I% E* r. X6 J5 i
  7. }
    4 {: o. j( `% _; U, t( O( h7 R
Скопировать код
/ K6 c( j5 ~4 K, `$ s
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 r6 B, z3 S. i- i+ a! ^' }

- ~- \/ {; m% b+ ^: r7 U9 V% PЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ ?" P+ w! W1 W" C, B8 b$ H! M
7 ~+ {0 O# n5 U. h. ?
Класс для начального состояния монстра:1 ?. Q5 O1 y4 @+ g" w$ f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " Q$ w6 i5 R& E! L, `
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 x$ W8 K3 \# i" _' e+ K1 f3 e8 l
  3. , E0 j5 @" l% B" K' ^4 E5 ]2 b2 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 H) Y2 G. e$ m$ [  ^7 ]  p! H

  5. 3 T8 [0 _: B8 w
  6. public class InitialState implements MonsterState {1 {  i7 I/ h$ {& B; c
  7.     @Override
    : b2 P: o9 A# o$ v& H% e$ G
  8.     public void handleState(Monster monster) {6 I/ z) z# T: O' i* P
  9.         // Начальная фаза боя
    % }" z: H. B7 l- x' [% k5 c5 k
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");/ J$ t. u5 v  _5 M: R& R; r  z
  11.     }# w/ s6 U  D6 D
  12. }
    " \- [: F7 N/ f' _& e7 m
Скопировать код
Класс для агрессивного состояния монстра:0 A4 C! N% L9 t6 `+ ?5 S) p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) A1 }$ Q6 z9 D) w1 V( r. M
  2. package org.l2jmobius.gameserver.model.actor.state;( o2 \" [" b+ A& W2 X% A! |

  3. 8 r" b! L. Z9 [% j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + f+ Y4 a% \" r: r
  5. 3 G4 w$ r3 Y( Y# B8 T8 U
  6. public class AggressiveState implements MonsterState {& t/ c+ P3 I% R3 T' v+ G. p
  7.     @Override8 l: L2 O( ^' L+ r6 h) @
  8.     public void handleState(Monster monster) {
    # \7 X$ F5 T! W1 x8 E7 |$ {, q: Y
  9.         // Агрессивная фаза боя( k0 T( e# r' T( A1 U& H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 m+ w' O+ ]! e' P+ m( r2 K
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    # z( ?6 Q7 i4 \6 t# D6 s2 r
  12.     }& _$ A5 Y3 c+ L
  13. }6 j/ f3 {2 F+ v0 G/ Q& b
Скопировать код
Класс для финального состояния монстра:' x: F4 C' B" d3 l" ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( f$ Y+ l& ?5 B/ p' F
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 p% C0 Y7 c2 ]6 M: a

  3. 3 I& a9 e' v4 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 _7 l2 v5 n4 m+ C

  5. 0 E& w0 y/ [& H5 h( V4 M
  6. public class FinalState implements MonsterState {
    & E$ E& P% t3 T0 z' Y, A
  7.     @Override
    + p$ ]* o2 ?' X) C' L
  8.     public void handleState(Monster monster) {
    % b/ V4 V( a3 g3 H
  9.         // Финальная фаза боя$ ~' H2 ~* V  [. I8 z9 k
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");: ]* W( Y# l' v1 q8 p* }
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    4 J, o# _) \: j
  12.     }
    ) K. v8 ^' Y2 S; [$ l
  13. }" h9 `5 b6 w. Z- R+ S; [# F
Скопировать код
2 Z" @& q' p, p& K( w
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' }4 E: o+ `: o4 j# W$ }
  1. // Пакет org.l2jmobius.gameserver.model.actor+ L" h$ j/ y3 B4 t& p0 U
  2. package org.l2jmobius.gameserver.model.actor;
    0 G& B8 x1 a2 o( R/ Y9 |  {

  3. - J; y3 M4 _* @1 ~& j, Z/ F7 `
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    2 d  d: }6 N- W& y- X
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; R' o9 a* L  l- S1 B( q" @+ I
  6. " w$ G( C& N$ P8 ^* W
  7. public class Monster extends Creature {( X5 |/ W6 A% {0 K
  8.     private String name;  \6 V7 j* V( L3 S* @; f
  9.     private double attackPower;9 h) x! P9 E" e1 v, }7 q* ~4 }
  10.     private MonsterState state; // Текущее состояние монстра( Z, Q  `$ t! g% }! h. n7 _
  11. 7 d& U* K' ^$ U/ F' q' Y* _  }
  12.     // Конструктор монстра' A; N2 D) E# i/ B
  13.     public Monster(String name, double attackPower) {' `" e- x* x) t' n5 l) A  U) f
  14.         this.name = name;3 {# H: s) o6 f4 d; A4 D
  15.         this.attackPower = attackPower;
    2 \! c& `* F: [+ m' x/ p
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    & _6 x1 I9 `* y
  17.     }* J- s8 A& z" ^0 O

  18. + H/ _3 s' w+ p/ Y0 Z* t" U- p
  19.     // Метод для смены состояния
    9 D/ b) M% W* B
  20.     public void setState(MonsterState newState) {* ]: y0 T+ Z4 a3 D5 v! m8 e
  21.         this.state = newState;
    ) d  j0 t' ^, W+ q
  22.     }
    6 @( U2 p8 \! D6 r5 m$ y

  23. . I: Q3 x3 p0 E% x! S2 P
  24.     // Выполнение действий на основе текущего состояния: a2 N7 Q9 ~) n% p& Y4 M/ |
  25.     public void executeState() {
    - n  P, y4 B! D# S( f6 h6 e
  26.         state.handleState(this);
    & a3 H4 j" s- f0 e4 U+ Y0 [4 Y
  27.     }
    . i5 ]- p$ T9 V' n/ Y, G# x

  28.   g5 s0 D) h: `# |- M, E" X
  29.     // Геттеры и сеттеры
    ! C0 ?7 r1 x( w. p. v
  30.     public String getName() {
    / _; ?" L: y9 ?$ _0 S$ ]- z- J
  31.         return name;
    , M. J2 L2 P4 g; ]; t
  32.     }
    ' B1 v  k, V! E

  33. ' g" k  C/ b+ L2 L" f$ ?) k
  34.     public double getAttackPower() {  U! N' M) G) ~) [! q" s
  35.         return attackPower;
    & e4 _# g  Y9 C+ G
  36.     }# g/ T5 Y. X  j8 w, Y5 K

  37. " X) N4 Z8 I! b5 E( d/ @; H# {1 H
  38.     public void setAttackPower(double attackPower) {
    $ A. O: O6 T/ j, B7 }* p
  39.         this.attackPower = attackPower;
    # O+ l6 h3 u6 _+ @
  40.     }
    / N. p7 V( Q; b, z& K' P
  41. }' h; O9 u) C+ d" `. O) k
Скопировать код
4 v* B+ a. ~- H, p# l! ^
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 H3 }  ]/ k/ ?6 _
7 T; ~! O2 j' d/ ?6 s8 b4 ]/ z1 n
  1. // Пакет org.l2jmobius.gameserver.model.battle% k+ h- z, h* U" M
  2. package org.l2jmobius.gameserver.model.battle;, j6 \/ M' ]- W. C* L# h  q

  3. # ?8 N- R9 z" d
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 G# _% C2 U8 A, k$ P) K
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;$ q$ n+ F& H. t) I) z. \3 M
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;/ `; E- b7 p( p6 p, S
  7.   a, n" Y6 P2 T" J: G2 c: g
  8. public class BattleSimulation {! ^$ ]6 _; d* i9 l' Z: i
  9.     public static void main(String[] args) {
    $ e* l$ l6 u- e( R( n$ J6 l0 f
  10.         // Создаем монстра с начальной атакой: U/ e( d3 r( O' Z
  11.         Monster monster = new Monster("Дракон", 100);- ~3 ^: W& ^9 _2 D. U! Q

  12. ( I8 i+ K4 U- F; B  p! Q" l. D. r' n8 H
  13.         // Начальная фаза/ ]1 _4 c' U9 |, @
  14.         monster.executeState();
    2 F9 Y  |% ?. ]9 f5 m1 ]( D! C; @

  15. 6 d0 I% M+ `3 G2 l: i" i0 b
  16.         // Переход в агрессивную фазу5 d: m5 q. m4 y+ h
  17.         monster.setState(new AggressiveState());
    6 P7 X# g. s) }4 |
  18.         monster.executeState();, P3 j$ L5 |  S: r& w* Q$ V/ J0 j

  19. 2 H& g: E# l5 {
  20.         // Финальная фаза2 w" [, G7 ^2 a& L
  21.         monster.setState(new FinalState());
    " j* S% Q2 _0 P
  22.         monster.executeState();
    0 J' K2 ]% ]. e6 l( z
  23.     }4 ]$ f5 R  I% u0 T% @
  24. }0 P* G, |3 {* \4 m
Скопировать код
* Y" D4 I" @* p6 y$ }" h, g
Комментарии по структуре пакетов и классов:
: G' H2 z, k4 e2 }! o' Z1 @- H9 hЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
9 ^  o& j6 R8 J! M- j+ R1 DЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% s$ t: g% d5 z. C. f
. [; Y  J" w. f6 w% r% N
8 W# e/ B! V9 F$ M8 S0 Q5 g3 w
* {. T. R2 d$ g8 F# @
8 d  u# k2 Y, |; F
3 h, {/ \8 w  [8 z/ u9 l/ q/ w7 N" Y) y& {& c

" s2 e8 Y8 \, K/ h
% i( S) o# U# G; ^" ~" `& l& P% Q1 }1 o/ f

% k! j8 a5 z- a0 s% K5 H0 G+ p) P1 {
% O2 V* m( X! Q* k& X# s1 D6 }9 m2 ^% T: M5 @6 o" s

  i2 j& B+ S: O1 Y* r0 _- N% u& W% M2 J, ?6 y9 p

Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:040 f% S0 ]% t% B/ g: r! }
Для управления сложными взаимодействиями, такими как  ...
; [8 O" |( J+ O+ V9 F, T
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
0 q6 ]" q! K) `Отличный подход! Использование шаблона "Состояние" де ...
' Q# n9 k  y3 Z+ y: z, s6 ?
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
* p8 o% Y" k0 ~$ k% F+ G# S2 P7 \) l6 `( t/ e3 h2 U
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
2 T0 H4 o7 j: u: [2 i
" u+ ]4 U: {" h  m
  1. // Пакет org.l2jmobius.gameserver.model.actor5 m" _- P6 L# n) k* ^
  2. package org.l2jmobius.gameserver.model.actor;, O% ^3 M+ b  [8 m/ o$ D: M
  3. 2 [8 {- L: @; l6 H0 p
  4. // Перечисление для типов атак
    - M" e9 A& d+ ]( a7 h/ }9 |& w7 \( |/ s
  5. public enum AttackType {
    ' Y+ @) ?0 i6 z1 b# j
  6.     PHYSICAL, MAGICAL;' i. n5 \- Y, L  d  E7 B7 l
  7. }
    " q% |% x* c, H) a
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
4 t+ R: f+ z3 w! d3 H4 x7 mОбновленный класс для агрессивного состояния монстра:
8 |6 i% t% f/ y" _: r% Y# N  k
, n+ F6 l. ]; `% b- V- \& |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 c3 m/ u5 K0 ^% g9 d: ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 U( n6 p5 ^6 v& _

  3. 1 K) e8 T. x9 `9 \3 }
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 f* r& K% H* K0 y. ?/ N- v2 x
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    - _# _  Z+ z4 z; V
  6. ! ~  f% }/ t4 ]5 p) f( c' Z. D& E& j
  7. import java.util.Random;! B8 H: S( N! J# \* i+ h0 a6 e

  8. 6 G) s4 y5 H1 ^: {4 j$ W
  9. public class AggressiveState implements MonsterState {
    * D' f) [/ @' ?, }. o7 C
  10.     private Random random = new Random();$ ]9 R) V0 B' ?& O% z7 g

  11. - M2 a% \+ w3 B  Y
  12.     @Override
    0 `' J: A2 i" A) f# o9 u1 n
  13.     public void handleState(Monster monster) {7 z" h8 w& }0 |8 d0 L
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; T6 w  L: c( @, p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    + ^# z8 w% `8 H- i: L/ ~3 _% n3 Z

  16. 5 y4 o4 q* A( s' T/ M8 U
  17.         // Логика для агрессивной фазы боя
    2 Q1 W% b# Y- p* ^& V! l) W
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ' A* f; R9 j! J- P7 B1 F5 ^
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- n# j3 E" _% q9 v8 A7 W
  20.         7 E) d- e& t9 z
  21.         // Увеличиваем силу атаки в зависимости от типа атаки& T5 g$ s. }4 _4 `+ `) A
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    % U3 i' _+ T. N/ K5 z2 c/ r
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);4 Q. q' \3 N' S3 z* S1 p
  24.     }8 ?5 S6 N# `: l0 Y$ ^" Q
  25. }9 c% g" ?+ z& l6 _9 m% {' c6 ?! S
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
/ X$ N$ ?. ~- ~  ~, M' W% m' m. S( K* W* |( ]: u9 Y( Y7 F
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + i+ O7 N& ^$ i8 j! H3 U
  2. package org.l2jmobius.gameserver.model.actor;
    & U/ R6 C: ]. W" P, ]! g7 Z: E" l

  3. ; k6 z6 |% ~  v
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 W5 C" g. r  {0 P, u. x
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 ^  O& x: M- d+ V9 l+ _! u& d

  6. / J5 _* f+ ~9 b- d/ b" h" {9 x" i
  7. public class Monster extends Creature {- e: m5 ~# y7 ~$ g( `" m# E
  8.     private String name;
    ( A5 ~# M; g" {( W* S
  9.     private double attackPower;1 n1 _4 u9 C8 W
  10.     private MonsterState state; // Текущее состояние монстра* v& R5 K$ E2 u9 M

  11. * ^: q2 Y4 A. s5 Q; [/ \
  12.     // Конструктор монстра
    4 N5 E1 T/ o+ J: y, h2 C
  13.     public Monster(String name, double attackPower) {
    3 e" O# L) J" E  i% ~: z" L
  14.         this.name = name;: \& `7 s! Z3 |0 j+ ~6 h
  15.         this.attackPower = attackPower;
    2 @" i5 m8 b5 @) S
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    1 c: ?+ E; [' }
  17.     }
    - A7 T7 h4 S; z  q! B4 F6 o

  18. + X% [; p* a' R, Y- C  r; m3 K
  19.     // Метод для смены состояния# b: g+ _2 {$ h
  20.     public void setState(MonsterState newState) {
    9 ^8 d. n7 [# s. d  v# R2 W
  21.         this.state = newState;- l- t3 @1 A+ K+ f" z! k
  22.     }
    & l4 b+ |( p: W5 C6 I/ [" c
  23. & B! |3 q7 M% [6 s0 W/ C5 s
  24.     // Выполнение действий на основе текущего состояния
    0 v, U6 ^9 V& b. ~: L
  25.     public void executeState() {$ t3 }- u" i; l8 D
  26.         state.handleState(this);
    ) i4 B4 K! e) }7 b6 c7 g
  27.     }
    & j0 c) S5 U* \, s( ]$ F; a# V

  28. ) p' ?% @1 `2 ~% [: d
  29.     // Геттеры и сеттеры
    7 X6 E  S+ Y( N; X( V# K8 M/ M( ~
  30.     public String getName() {
    , F% l* s; |: Q
  31.         return name;/ T' a" t9 o5 c( i  f
  32.     }
    0 u3 u: s; p' x+ X7 U) h; t
  33. / g6 V4 `- U, R) o' a
  34.     public double getAttackPower() {' W4 V3 G- ]: J1 C
  35.         return attackPower;2 b% _% V$ J: v& i1 s, U  t. n
  36.     }9 i% P# ]# `. E2 {) Z. H  }( c
  37. ( j: \$ i# I1 Q4 N8 I
  38.     public void setAttackPower(double attackPower) {% t/ ]: {/ w9 \1 @# s2 p
  39.         this.attackPower = attackPower;& s3 N0 B1 h# @
  40.     }3 f! ^/ q* d. {# N. h6 T1 W. I& |0 [
  41. }  T- @0 K% J9 n
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
1 ^4 \: B& |* F$ [- d5 K! D
  o( ~5 U, ?3 _$ c7 E
  1. // Пакет org.l2jmobius.gameserver.model.battle
    " w3 _7 b6 J- I* a
  2. package org.l2jmobius.gameserver.model.battle;
    " G, _8 ^" W7 T- w; J
  3. . @; Q  v  |! v* Y- w) `5 ^5 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 w, j/ ~4 W, H: a
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 g, l& i0 w! B/ k
  6. " ~1 o* K0 t, \3 E; |
  7. public class BattleSimulation {
    ' N& b+ V  R' w! W
  8.     public static void main(String[] args) {) N2 z0 N' v) I. G* o( c
  9.         // Создаем монстра  S4 x( a# L( e1 f
  10.         Monster monster = new Monster("Дракон", 100);
    ! _, o7 N) @( g; c4 l0 [& l
  11. 8 f. W9 ?. ]# V7 L- f9 _5 Z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак2 n6 L0 W! z4 O) F8 {  e8 u  A
  13.         monster.setState(new AggressiveState());! F7 D- k; S5 F
  14.         monster.executeState();9 E9 a2 v/ v- F( i1 G) q3 \  b# \
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак! w/ Z4 ?4 ~/ @& M' A2 ^
  16.     }
    3 g1 E9 }! ?0 t. X3 z  Z, u" q
  17. }
    ! l! j4 P0 ^) F
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.8 f( D2 h; m* A4 f7 v$ B
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!/ U1 c6 c% w4 R) O( s# E% V
- v) q1 S6 `4 x- s: T+ Z

* t; ^9 J) p6 q3 C; r4 j
2 O- S: O7 k/ k




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