Top.Mail.Ru

[Руководство по Java для L2J] Шаг 3.3: Взаимодействие игровых объектов

[Скопировать ссылку]
Astraliya Опубликовано 2024-10-16 17:54:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
0 }; R! ^4 U' O3 S9 O+ C
& ]: |8 \% J0 h- w+ C

$ c3 y( f1 g2 `7 I- cЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.& ~9 ~% f( ^- u9 C. D8 z$ w) U
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!2 N8 x$ v$ H- m0 P9 v
Астралия ?  B, h8 {* B% ]% r  K1 T4 w

6 V* m5 A4 t: A

Сообщений в теме:5

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!9 t6 j+ B! f- q& i
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ D8 V2 j! B. s  Q2 M% J
2 Y$ j  S2 J7 q; U
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 8 D9 ^$ i- I( h# F
AlexCoder опубликовал в 2024-10-16 18:31" Z/ H% E' e: O  B( F. e* d
День добрый!
, N& V$ d* q  b1 O* WВ статье описано взаимодействие игрока с N ...
( H8 Y  u) z0 a7 ~, f2 I1 O" C
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" S- g, L8 v# Y
4 h% n( \1 x3 `Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; ^" l4 x6 y) V7 V
4 i! O- K  [8 K: Z$ MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 i- E9 d# I% ^& ^. w- j* o- h8 w
  1. <font color="Green">// Пакет для состояний монстра</font>3 g$ i- R% g, @6 t" Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! U4 m; G  L% U0 \& ]/ h
  3. <font color="Green">8 K) y1 t. r4 s% U
  4. // Интерфейс, представляющий состояния монстра</font>
    " W( K$ j8 t& W1 n1 W. U( f7 S, J
  5. public interface MonsterState {
    8 T5 b4 O* Q, P5 g1 p/ Z  z
  6.     void handleState(Monster monster);8 h: G1 e8 K! L! V+ S8 z  n; U6 U
  7. }
    ; q- Z+ z) p% A) a0 A4 P
Скопировать код
8 ^$ |. Q, t+ I0 h
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 l0 U4 o4 |6 @: i& h: x7 R8 f. q
8 I+ ^3 ?; m' }% w* ^2 @Класс для начального состояния монстра:/ D8 T+ c9 g6 R1 v) _
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 f& B1 W. C$ B6 I2 U
  2. package org.l2jmobius.gameserver.model.actor.state;7 U- w; d" Y* R5 z6 G
  3. * i" \1 E5 s0 a5 M  ?- ]5 g
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 s$ ?) E! I7 S$ I" S4 @  l

  5. . A4 ]' E8 B/ ^  j, a2 @5 m
  6. public class InitialState implements MonsterState {8 }1 v4 P! g% b( a9 d% A
  7.     @Override" ^4 y) n# |1 S2 n$ p# M) X
  8.     public void handleState(Monster monster) {
    7 W* B8 E: M6 ^4 J$ w  Z
  9.         // Начальная фаза боя
    1 ]6 y8 b. b) k1 j
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 D& e& n2 e. ^9 [( `  L% u8 g
  11.     }5 H! q: e' A. e& k0 Y( u
  12. }
    + A' B1 r+ M. L9 K% w; Q- J
Скопировать код
6 G# b( F# N, Y

/ ]( @1 Y- ]9 k, [
) o% _: i, `6 z6 j+ A3 ~& V6 t* c6 L/ M
+ M7 w: |( u; F% G) a# G2 i2 y4 E& _
, N3 E  v  ]- x0 c+ \) v

; _, U" j7 L( z2 n3 @
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " Z- f' B6 X# Q2 n' m1 `

6 T* r$ j2 I. f! }Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 l0 F0 k! L* i2 S
1 ^. l) G& _$ }; Q0 X8 t9 O* l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 g7 X$ g2 L# [/ C
3 S3 v( I4 F- @2 m0 d: X
  1. // Пакет для состояний монстра
    / C2 Q4 w" l0 A* l
  2. package org.l2jmobius.gameserver.model.actor.state;( c/ U7 S4 p) j2 t
  3. % y; S( b/ `$ v
  4. // Интерфейс, представляющий состояния монстра
    6 ]9 v+ ^# b4 E) P: s  }. h
  5. public interface MonsterState {
    2 M4 a' e, ?3 c
  6.     void handleState(Monster monster);
    2 K8 g1 L) T1 [
  7. }& G. [  n4 e$ \9 M# _$ W/ x
Скопировать код
9 n. `9 K3 M) X5 m  \
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# {0 R5 h/ O' I& _5 A7 g
' R# `9 N0 \) T3 K9 S6 wЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
( ^& _3 f  u+ u2 k8 s
$ E5 u8 b) P: W3 B/ k) g$ UКласс для начального состояния монстра:
0 u5 E! M$ h( U0 C( x: z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 _. ^& B. M: ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    % j* l4 w  w' Z, Y. |, W

  3. ) F* P9 X3 A9 M! v: r' V' e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 V4 T* Y$ I' c  f" T7 A
  5. % I8 R( F3 w( A7 a5 S
  6. public class InitialState implements MonsterState {! X- r0 B. T' v& `( t  S
  7.     @Override% s5 B+ M, l, Z0 r
  8.     public void handleState(Monster monster) {" Z$ b$ c1 R& t8 t
  9.         // Начальная фаза боя
    ! j* e5 a* n7 s' ?" l) @, l2 G- g
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 G: ?4 T4 ?; }
  11.     }
    8 L& t2 x% e3 K4 {# Y2 E" l
  12. }
    ( V. q6 _+ t0 x- ]' b
Скопировать код
Класс для агрессивного состояния монстра:! T9 v: d& ]9 K4 j0 [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 n( g  K! m3 \2 l8 i4 g/ z
  2. package org.l2jmobius.gameserver.model.actor.state;
    " X+ Z# W6 d; P! v/ I6 W
  3. 5 \+ @0 a: r3 U3 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 i" S7 N6 y" a# g1 T1 i

  5. + q7 l2 }  g% o$ E8 r) ^2 O8 s
  6. public class AggressiveState implements MonsterState {3 I: i" |( j! M" K9 L$ J) _
  7.     @Override
    # w3 a" B& o7 p: y: _) N/ N2 \
  8.     public void handleState(Monster monster) {
    % S/ r  ~: h4 E. V+ z- H  a. }
  9.         // Агрессивная фаза боя2 \& ^$ e6 U& W' o% y+ T
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( P1 N4 |% D9 \' E( O$ s
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. N: _5 C! @) @" Z  v
  12.     }
    ! ?6 X$ f1 @! `- D" t. N
  13. }: V, Q0 l" b- z' i# D/ t* c
Скопировать код
Класс для финального состояния монстра:
- E) y. l2 G. M/ k1 n5 z0 n: _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 J! C6 E. X% R$ N# w5 D' y) {
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' `' n- H4 q8 M4 s7 A

  3. 3 H  P, q5 h$ ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;- E- a2 a9 k, O

  5. 1 h  @- y, t) F) U1 y! `1 i
  6. public class FinalState implements MonsterState {( k2 a" v' a9 }2 F! A
  7.     @Override" T4 k( R* R/ B7 k8 s, z5 ?
  8.     public void handleState(Monster monster) {: ]: T9 L' E- d' ^% d
  9.         // Финальная фаза боя
    * j3 |9 S+ y! H6 L
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    6 u+ y: A/ }5 x7 U$ V
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    + \, `0 f) R1 l0 J  r# N  {- H/ ]
  12.     }2 J' m* s0 Y, l
  13. }" ]& t& a( @+ R2 ~
Скопировать код
/ ~  x- ]9 }1 C8 w; E$ R
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 ~0 t/ o! D6 w: A
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - l3 g" {" P; N, {
  2. package org.l2jmobius.gameserver.model.actor;6 I3 }) V- ^, {% T  Q7 t3 u

  3. - h& o( M! ~$ T/ f
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 b9 D; J" K" r/ ]4 [7 \3 |- R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    & q' d2 [6 D. X9 R% h

  6. 7 N& Z2 K9 R6 d# }, B& J0 c
  7. public class Monster extends Creature {
    ! S4 A+ s. c! |9 n; ^9 E0 j( T
  8.     private String name;
    3 Y0 t2 D7 x& l5 c/ d* J6 L: n: ]
  9.     private double attackPower;- y5 h3 H3 z! D9 s' d" T# ~) I
  10.     private MonsterState state; // Текущее состояние монстра
    % T" z# q! W0 ^8 d5 V/ R( U/ z
  11. 0 K: }# b1 E2 \/ t
  12.     // Конструктор монстра
    : P9 [# ?7 n: g* n. e" ?
  13.     public Monster(String name, double attackPower) {
    $ Y' f: N1 r9 \1 ^
  14.         this.name = name;  P0 J) ^7 @# k6 V8 _+ t
  15.         this.attackPower = attackPower;
    & P8 p- \+ L- B$ y/ k
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    6 Z4 g4 G" l' w8 W6 g+ F
  17.     }
    ) Q! {+ x' w4 J' M  l/ s4 y" q

  18. + ?& |* h# ~6 E
  19.     // Метод для смены состояния0 U0 x/ \3 W/ I, l- e( z
  20.     public void setState(MonsterState newState) {3 _0 _- o. R& y' ~5 f* ?$ _
  21.         this.state = newState;
    % c7 C. h- m" \( w8 `
  22.     }/ m2 J2 P7 c- t! }

  23. # @1 a* {: i7 L% c' [. b! n; o/ V6 D
  24.     // Выполнение действий на основе текущего состояния
    1 u+ d# x1 V2 Y, k/ n( m, A  W
  25.     public void executeState() {
    6 l+ I6 o. w0 J* ~& j; i! f* y
  26.         state.handleState(this);% N4 O3 V, e' G7 H1 j# D
  27.     }$ v# c& Z; N3 K% ^2 T1 J8 m

  28. / m( ]9 q9 l; a
  29.     // Геттеры и сеттеры
    * `1 U$ F3 f3 @1 e) \6 @
  30.     public String getName() {" U) Z! k3 {6 u4 V' M
  31.         return name;
    : B9 Z- s9 S" i) w  p& j
  32.     }8 T! p9 Q+ R, W: ?  `) x

  33. : i0 Z, M& Z& e: y% v" n
  34.     public double getAttackPower() {5 A9 q5 q% E. A9 r. G3 a
  35.         return attackPower;! a" W- Q2 i3 L9 r* g! C; d
  36.     }  G6 E: [  b% `
  37. - D  ^$ F0 H0 z, X
  38.     public void setAttackPower(double attackPower) {5 L$ i1 z/ X! H
  39.         this.attackPower = attackPower;
    * ]" `3 u$ R6 W& `- M
  40.     }) l9 \& e1 f9 H
  41. }& O, e3 m% _% M( p- j. P
Скопировать код
3 d( `, ?5 A) v4 W4 Z! |
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! ~+ j5 w% F6 Y1 _9 M0 T& W

# Q7 r2 t. V0 `2 m, x1 Z9 O9 v: F' N
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; q3 G. C; Y2 Q9 |! J
  2. package org.l2jmobius.gameserver.model.battle;! T# B2 \  y/ n3 R% l( ?2 h

  3. 5 O0 ^3 {2 N- w- u  K6 f0 j! B5 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;# C1 Z! y' e8 m, S& ?- ~
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! ~* _# W- O  A! e* j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    7 W7 U1 e* e: C/ |! N
  7. : J/ s8 i' J% B% G7 _5 H: I1 A# b, Z
  8. public class BattleSimulation {- w' U, w! @5 U3 g5 R. L
  9.     public static void main(String[] args) {
    ( u  }/ J$ V# O) {) o3 p! y
  10.         // Создаем монстра с начальной атакой2 ^8 \# u' J$ e+ w. o/ S
  11.         Monster monster = new Monster("Дракон", 100);% N/ n9 X3 u4 E
  12.   z* Y% E# \+ a. _7 O
  13.         // Начальная фаза
    % |) Z0 T2 Y, L- I! _
  14.         monster.executeState();( K2 ]5 t# K$ V3 Y$ C! l
  15. ! z" d# S8 J$ S0 p) q* z4 j; P& I
  16.         // Переход в агрессивную фазу
    2 T9 L9 l$ [0 x) U% f$ x8 B
  17.         monster.setState(new AggressiveState());
    9 p5 R9 ?9 _# }6 h2 u+ Y' ]( f' C
  18.         monster.executeState();& e+ e- X. ~/ O3 ~$ h
  19. 8 i% V# w0 t2 w% @5 u
  20.         // Финальная фаза
    ( C& J0 U! g6 E8 r, w/ Q; A
  21.         monster.setState(new FinalState());* x' T; e6 a% \9 ^1 \4 S- u
  22.         monster.executeState();6 i- c4 f$ ]3 x' l  e2 l$ a
  23.     }+ C& K0 u0 x# K7 {5 s% Q3 A- R* |
  24. }
    ' f1 w/ k5 U* X. A: Y$ z
Скопировать код

2 H8 p: m# t0 L9 M0 RКомментарии по структуре пакетов и классов:# V# M7 u( q4 H5 e% x: C
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.( _' ]/ \: A' _9 m4 \0 {
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! {3 t. o% R/ t8 c) d1 k/ nЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
7 w0 r& M, d5 \- o( w( V' }/ F  i/ m+ t& t. I
3 q- q0 J: S4 ^

7 ~4 Z% {! K6 L6 O/ G1 S
( I, K4 E/ E5 j) B
9 z. G7 w5 K" r* }
. a  J6 |6 Y8 l9 q5 E: i: z4 l- r- G6 K
. K  f8 n2 m# k1 |: z1 F1 |4 u
8 V6 B1 j& k" S' d
* N  u: \& w' @" y$ n

2 t  F+ d0 E9 N' u# H6 {" k/ n# I* n) C; Z* o; ~( x
9 r; b- h% \2 F+ P& ]3 m
# J" ?3 h1 S  i$ R1 L+ ]
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04; g3 O1 F: x+ R2 o6 y0 O+ r7 ~
Для управления сложными взаимодействиями, такими как  ...

6 z2 G% ?/ y, N1 J; `5 Z  DОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
  ^7 c9 m4 X! j; O. T  vОтличный подход! Использование шаблона "Состояние" де ...
- @; z! d2 C& j) n& r! p
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.9 @# e* D1 x, I0 k6 t: W* V; }

/ U/ g1 ]7 L; }" G* YШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
6 `, v, Y' j5 ]& r! p, m
( ^  H+ q* H! {$ L2 J2 T; G+ c, F
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . U7 t. T  `# Y& e% H- M
  2. package org.l2jmobius.gameserver.model.actor;
    6 K5 N# M$ \7 ^* V5 R+ h, n* R& y

  3. 4 [/ D& i  Y' `
  4. // Перечисление для типов атак9 G! ]5 |( d( f% F! s2 ^
  5. public enum AttackType {
    / c$ W9 P1 k3 B3 V8 ~9 e7 @
  6.     PHYSICAL, MAGICAL;+ ?+ ~# E  |* F% J: F) X/ h4 a
  7. }
    ( ~& B6 n2 {$ w+ M, U0 n7 |
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.7 k' h3 r: x! L  l7 b- ^" L; d/ ]
Обновленный класс для агрессивного состояния монстра:
' o/ `; o6 O1 ]( z/ t5 ~& S. q: E; I5 o5 G2 H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ m" P( I; }* P2 `4 }. w0 j- R8 O4 C
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 I9 h, e. R$ B0 R' m! ^

  3. / C  ]6 ^  {% Y) _- {
  4. import org.l2jmobius.gameserver.model.actor.Monster;: ~! l6 ^6 ]  y, y8 o, T
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    & s4 c4 g) b. c, }

  6. 3 ]6 }2 d7 I7 m% N6 g; U
  7. import java.util.Random;! ]/ M' S% j' L5 y& t. d

  8. ) [7 N2 c2 L- U- H
  9. public class AggressiveState implements MonsterState {
    3 e  k  m3 j5 N/ x
  10.     private Random random = new Random();: m" }' [0 {  r' y) P, k) u
  11. ! u) s; R* x7 T7 r' X6 y3 K. G/ q
  12.     @Override
      w* Y, @+ }: L) N# O( A9 |3 k
  13.     public void handleState(Monster monster) {: j# }& @  V( f" V3 J% g
  14.         // Выбираем случайный тип атаки: физическая или магическая
      f1 F( ]  M/ _. u& e/ m( g
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    $ a2 Q% t$ e; k7 w3 T* s, B
  16. : \' A0 L1 K8 A6 v
  17.         // Логика для агрессивной фазы боя, J& a5 Z" Y1 f
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ; q4 F* z6 s4 i+ f
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    0 p+ s' k8 V4 |8 S3 h6 L2 o6 ~+ z" p
  20.         
    " L4 z% K, t9 O. p! X
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    5 m/ f, L" q4 _' y/ c
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    . @; b: o1 a" d+ A1 }6 d( w! O+ s
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);7 Z2 f! v1 p9 R4 k) g0 ?2 |
  24.     }
    3 ~' r, u/ ^. A$ U  ?1 W
  25. }
    ) N6 n: A9 m7 C" Y2 C' m/ f9 Q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки7 ?: l8 w: G" B7 @: {! H
. X& o6 [6 z/ G1 A1 C7 T
  1. // Пакет org.l2jmobius.gameserver.model.actor
      R" ~6 t7 I; g: h6 Z$ P
  2. package org.l2jmobius.gameserver.model.actor;( T6 h) z3 J4 y' P

  3. 1 A" o" p6 H6 R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & E# C7 r0 z& Q; O' e
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;& Y- g( T) R% _$ j
  6. # r' S. [  `) i' H
  7. public class Monster extends Creature {
    ) W" x  P, ^; ]' I. V* c
  8.     private String name;
    ) H! m0 T& n7 ~8 d- Y: u
  9.     private double attackPower;
    # X( Y& y" n8 Y: w
  10.     private MonsterState state; // Текущее состояние монстра
    + n  }, j; l8 d# S7 A

  11. ( O) @. G, x7 g! K3 b- q
  12.     // Конструктор монстра  P" {; u% L$ R. x7 g9 r2 q4 o) V
  13.     public Monster(String name, double attackPower) {
    . ?! F+ m# n; ^+ G2 w
  14.         this.name = name;
    6 j& G4 L8 I) _  Z) b4 g3 X
  15.         this.attackPower = attackPower;
    ) I2 Q9 K$ d: q: c0 b+ ]! H; {
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    5 o* H. `2 G; J/ l
  17.     }
    0 H1 l$ q; X! A% y3 r

  18. ! O3 M' m6 d+ m% X; v: O) }: V
  19.     // Метод для смены состояния( |% H& U& O$ k/ @5 A
  20.     public void setState(MonsterState newState) {
      e) N8 Y# |" k
  21.         this.state = newState;
    5 f* U; x3 s% I
  22.     }
    ; Z* b+ `1 n) [* f) H
  23. " G8 x0 x3 E2 T+ [
  24.     // Выполнение действий на основе текущего состояния. e8 k, ^6 \7 J  l. b3 a
  25.     public void executeState() {
    7 N2 s. L2 M: V$ [! e, Q
  26.         state.handleState(this);7 Y6 ^8 z1 K& l% X0 A/ U1 d4 X
  27.     }
    4 s) a2 V! d0 i4 V  g9 l4 C, ~

  28. % I- o; M' r; y" l, p& {
  29.     // Геттеры и сеттеры
    # V- E1 P# i+ ^9 j: }# A2 E
  30.     public String getName() {% ~5 A) {: \* g2 H1 B: c# R
  31.         return name;" b( `4 R6 {, r1 e6 W. A5 G
  32.     }
    7 D# m: i8 l; ~
  33. * r$ ^: M+ }  E% O7 m2 d
  34.     public double getAttackPower() {
    1 O& n) p9 i$ |) w) O1 w
  35.         return attackPower;
    % r1 j9 f9 ~: u$ r" c& `
  36.     }
    , y6 b) V+ a' \( i: z- f# ?3 V/ L

  37. ; r& j0 F2 i2 m6 d2 `2 o
  38.     public void setAttackPower(double attackPower) {: i" R) K" B6 D: y6 S8 b1 F+ f; a: x
  39.         this.attackPower = attackPower;# |, x* O* c3 U+ u( O
  40.     }9 j$ |$ w% H$ p$ X9 Y8 F7 |
  41. }; M( T( Y) s! l+ @7 e
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
" l6 X# h6 q0 U2 e/ }0 r9 l" T$ w& J, w+ m$ E: F: n) P$ K
  1. // Пакет org.l2jmobius.gameserver.model.battle% E6 P* u4 _) f
  2. package org.l2jmobius.gameserver.model.battle;
    $ J1 b3 f% `) R9 K+ {5 ^

  3. 4 l/ m: @. p  {1 y4 k( Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;& L7 m. {" {, a! G6 p
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) A" m% S- Y( `

  6. # c. k& i! v" x; b; u) J
  7. public class BattleSimulation {2 I. E! B& w4 j3 j4 t- t
  8.     public static void main(String[] args) {$ V: W. E7 R1 S. Z* Y$ y: p, d4 ~
  9.         // Создаем монстра
    0 R8 e2 z4 l( u  o1 `& T
  10.         Monster monster = new Monster("Дракон", 100);
    . g5 E) S1 S* y0 S

  11. ) N/ @, t! s5 P; J% U: u
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак  a: ?2 R/ s8 M8 n
  13.         monster.setState(new AggressiveState());6 E; e3 r% h  _0 y8 ^0 n2 e9 f
  14.         monster.executeState();
    & z3 N: z3 U( e. x6 r
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 ^! o9 ?" s' M5 T0 c# E
  16.     }+ G- ~: R4 y5 D5 X! U) J) {8 Z
  17. }4 v, a- D5 Z) D0 i4 S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 c+ {' m9 l0 B+ h5 a+ ~: QЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!) m+ C; @$ b9 F; {2 C* L

+ Y( [, e5 ?9 ~) x" t- k/ X6 {
- s7 v( r0 F: H2 B/ ^* ~
. m5 |1 P1 T, D1 T; Y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

  • Выдающийся вклад

    Прилагайте постоянные усилия для процветания форума в течение длительного времени или много раз выдвигайте конструктивные предложения.
  • Авторитет сайта

    Участники, внесшие выдающийся вклад в работу форума

подписок0

подписчиков0

постов9

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.