Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# V  M: M# A. ]2 s2 J6 c' q3 I) u$ Z% w  ^8 K2 f( O

. P  I; g2 D# d- `0 R! YЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
# g; s6 a2 ^6 l, H  v1 o  U, O4 t  QЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!1 ^; V2 s5 |! t+ D" o6 e9 ^& j9 E% L
Астралия ?* E2 J) A' f. Z  Y7 r

8 [  H( k5 S- o2 X) x' _' C. N! U6 U

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!. [! A0 S8 z! w  t7 J7 \
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?$ c8 {6 G' w. J* ~; H- J4 p
5 M3 \( t+ E6 C" G5 i+ @
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ; B3 k/ ~' i2 ?1 {
AlexCoder опубликовал в 2024-10-16 18:315 S; O8 o1 S+ j, |% K  S" X8 V2 G% N
День добрый!
" a/ w; P- Q$ ?; Z( [3 kВ статье описано взаимодействие игрока с N ...

- u2 R, M/ m) |' v4 t9 ]6 HДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 y( X& Q4 R3 c/ J" z) d

# o( V( F4 p) i8 ]Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 W9 Q) F( W, V8 Y: ]

$ c* o1 n% x8 b' Z, d0 KШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 @3 P$ x" B1 r6 W% s/ i7 ]# T
* H" F; T  ~3 ~: R, T
  1. <font color="Green">// Пакет для состояний монстра</font>+ `3 u5 ?$ h% B$ A
  2. package org.l2jmobius.gameserver.model.actor.state;3 g4 R5 v' {- ^: t' U
  3. <font color="Green">
    / o# g8 s3 _2 X' x0 f% I& W. e
  4. // Интерфейс, представляющий состояния монстра</font>" ?# E; ^" P+ `% G; }8 {! w/ A; U
  5. public interface MonsterState {
    3 h, j8 n8 x; Q
  6.     void handleState(Monster monster);
    $ o9 ^* V& }% T! D! [
  7. }
    4 c: r- Y$ k) P
Скопировать код
. C: x% J$ ^) `7 t6 n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ |/ t$ T. T8 W

, C+ N$ ?6 E8 I# m9 I9 t' L1 \Класс для начального состояния монстра:3 S8 }# T3 N, n" k7 q' l  u6 ?
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font># L  ^3 ~$ d7 Z9 e. m4 k
  2. package org.l2jmobius.gameserver.model.actor.state;, M2 o  v/ `. B5 j1 @$ F% f+ z  S
  3.   n. D! H9 }9 k" s
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ W8 L! X0 G* I; n, D0 t

  5. ! k1 }3 E9 u* X, q2 r5 i+ z
  6. public class InitialState implements MonsterState {
    2 u2 P# }" W& D4 ?+ ^- U
  7.     @Override& [+ i3 ^# a& k
  8.     public void handleState(Monster monster) {
    ! k) `3 H6 N! t2 _+ S" y/ A. y
  9.         // Начальная фаза боя- O6 U; h, Y; F' F8 _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % ~- w, B9 f4 k2 k, Y3 m
  11.     }
    8 \7 D/ ~, u9 y/ ?/ [; N
  12. }
    # r% i: G4 K  Q9 z
Скопировать код
) I, K, T- X  y
5 B" u- o' N  R* |  B- x8 M* [' s4 ^

; G, S5 S' @1 H1 F. E% B
+ D  O0 n$ _# K5 B8 k
) {% w1 G) ^' }$ `
; w0 T1 z  x3 a; v6 h9 ~: _! n' L. v& S
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
# f9 Q5 a8 m. A" p
6 T: g1 a( ^; t5 t) q% Q- y& E7 b, L" @Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 I) ?* u- P9 _( r" b

5 H* j- S2 b0 R. t+ e% lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' G6 c" U2 L8 ?* O
: [2 _9 D5 B) F
  1. // Пакет для состояний монстра' b2 ]+ z8 @3 t2 I& N' d
  2. package org.l2jmobius.gameserver.model.actor.state;
    / Z, V+ ^1 z* a6 O

  3.   J, \6 l. X0 l
  4. // Интерфейс, представляющий состояния монстра7 V$ ~1 I0 @" F
  5. public interface MonsterState {- H; x7 A5 x  r
  6.     void handleState(Monster monster);% R5 ^9 X; v+ d- c9 W: o1 ?8 A
  7. }) u  R& J0 G9 u" n0 ~2 o
Скопировать код
% q, G% w! }5 |) q# k) i3 ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 E4 {- i3 U3 Q( n- s- r2 F
  ~/ D0 e2 y4 l- u9 D9 sЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 T% v' F0 L1 {  C
7 X6 m0 ~0 e* t8 |! x2 {! C: s
Класс для начального состояния монстра:  ]2 G9 r8 t& l' O- @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- X- _& ~: S. F3 R3 u4 |
  2. package org.l2jmobius.gameserver.model.actor.state;* h) U3 f9 @& t" t
  3.   ^4 _  C. `6 y5 A6 s
  4. import org.l2jmobius.gameserver.model.actor.Monster;  P: N! l4 ]! M8 z
  5. % a; [; j6 e* z: P" C' ^3 A
  6. public class InitialState implements MonsterState {- r. a0 Z0 H3 H3 J# P
  7.     @Override: |1 W3 S: [0 U  ^5 c
  8.     public void handleState(Monster monster) {
    5 d4 A$ l/ ]8 m8 E
  9.         // Начальная фаза боя
    , m8 _9 U) f; ?  c( E; u5 O  K
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 j2 h6 S* x, W# M8 {
  11.     }
    & z+ S( _+ z& q9 {; R8 r
  12. }3 [* ~/ t; S* G' G
Скопировать код
Класс для агрессивного состояния монстра:, g- k% y1 |% v7 ~, ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 r9 T1 l: k2 R
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) m7 t/ R6 V5 D3 |$ G4 y3 c% j

  3. 3 X0 |, r' z& f& e" X6 _& G: g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      Z4 B( D- j" d1 t9 ]/ c5 R7 b

  5. , I6 W: d8 I7 S6 u. w2 w+ ~
  6. public class AggressiveState implements MonsterState {
    + H8 N4 n9 S9 k! |
  7.     @Override5 o8 @+ G2 J; {0 O0 l4 a/ I
  8.     public void handleState(Monster monster) {
    " b& @! F) J1 E/ @) `) B- w
  9.         // Агрессивная фаза боя
    6 H& o( R) U" b# P) C7 _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");) m+ K0 A9 G0 t) J" I, M* E9 n
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    $ m7 C! ~8 ]( O8 [
  12.     }
    3 U, a+ K& B8 V( A; T3 Z
  13. }
    0 o0 [# ^+ W2 ^
Скопировать код
Класс для финального состояния монстра:
: H: v- P3 ^. k) U  X. q# q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; `( |0 i6 O. F( V0 g
  2. package org.l2jmobius.gameserver.model.actor.state;- n. Z- k7 W8 d) F( b- s
  3. 3 |2 |9 [$ u# P  H, i' ]& g, H6 M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 E- h- t4 o, H5 o& r  q' I9 o

  5. " f! _7 K* r% n/ B
  6. public class FinalState implements MonsterState {
    & G8 O# b! a: `* q. g1 n5 G
  7.     @Override
    6 k6 ~1 |2 x: }' I" d- @
  8.     public void handleState(Monster monster) {
    0 b. U, |& {# m. X1 v
  9.         // Финальная фаза боя/ Q+ q, C; }0 N& G5 e9 I
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    4 O3 C( Y1 g! o* m) v4 q4 `
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! Y5 G$ h6 `, `5 {9 U( i4 j& ?6 w. ?
  12.     }
    6 h" w9 I' C) L
  13. }
    ' J/ P1 u& x7 `6 X9 G
Скопировать код
2 d& }/ t. M) s3 i/ @4 S
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.. e% q% E% r6 \5 \+ G# D( X$ M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ J& P1 u& r  K7 D3 c
  2. package org.l2jmobius.gameserver.model.actor;$ w2 ?: S0 {! W. @7 @$ G  T

  3. ) y  D* r$ f7 v5 J) O3 X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ ~7 N1 d, R+ ^, b. _' P
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: j: X5 F: ~2 R# s0 ~; W4 G2 [

  6. 0 {$ D2 G4 X+ z( |3 k: I" F
  7. public class Monster extends Creature {* A' a: s' @0 O& w4 D  ^
  8.     private String name;0 F" w6 ~& M' f. p" B" E. U
  9.     private double attackPower;- ?5 C& C: l6 b. K, k' _
  10.     private MonsterState state; // Текущее состояние монстра
    9 w4 N1 I. b2 }  t$ I# Y

  11. 0 L" V6 S( L% N7 s: Y
  12.     // Конструктор монстра
    ' n7 p# _* W, k. d0 \% e9 i
  13.     public Monster(String name, double attackPower) {0 b4 x* c0 z4 m* _! j
  14.         this.name = name;
    2 Z& v6 s4 n1 R3 r. I  I3 m
  15.         this.attackPower = attackPower;0 y$ t! l: \7 t% W) G! e
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние6 A* X" b% p' h9 p' a6 G
  17.     }
    " ~; `( m$ g/ H  N

  18. 6 t& \8 v0 G& R; q7 \( N" r. l$ x
  19.     // Метод для смены состояния
    + i2 R* ~5 T5 s# ?/ p
  20.     public void setState(MonsterState newState) {6 K7 }# l8 e, l2 T; c
  21.         this.state = newState;2 h" m- @' [1 h4 m
  22.     }" h) U' A2 T, I' @$ _
  23. ' V! y4 j; A3 J% _& l
  24.     // Выполнение действий на основе текущего состояния! N+ b2 i$ W1 \: h8 r0 O
  25.     public void executeState() {
    ! [+ C7 J8 ^+ m1 ?( l
  26.         state.handleState(this);
    " O! N5 T' J- G% _- G
  27.     }, K2 `9 C/ u) C% e( ?

  28. / i5 R2 g0 ~; B# B' b3 O2 N/ G
  29.     // Геттеры и сеттеры7 K" i. f+ S& _- u: l# _& m
  30.     public String getName() {
    # t  ?0 n1 y" }5 M+ I
  31.         return name;/ |4 O9 D5 j7 e: b. h2 M  v
  32.     }  m1 S5 X- v: Z6 f/ I7 ^& \
  33. / a$ O9 _1 y/ ~8 e5 X% T) j
  34.     public double getAttackPower() {
    8 k4 ]! U$ \' I6 e; J) v
  35.         return attackPower;
    # @; r: J2 ]2 Y' L8 e+ A
  36.     }
    7 f& i  E1 m+ K% A$ Z, s. N6 l

  37. 9 u& x9 J3 B7 M
  38.     public void setAttackPower(double attackPower) {
    0 J; o' |! f# n, Z$ e
  39.         this.attackPower = attackPower;
    ) E8 y5 p- L0 r1 |0 N0 F
  40.     }$ |6 w7 U9 ~# j0 o: L3 J9 m
  41. }
    9 H7 Y; B* r4 o5 b5 |; f, `' _
Скопировать код
- E( y! B* D5 e, F( P7 Z  J0 o/ J8 j
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра., {/ e, Q4 F. {# k1 u7 r

6 a6 S7 u" b+ h, l9 x1 i$ B8 g
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : u0 P4 x8 F/ S; m& ]& X4 s5 j2 `8 I
  2. package org.l2jmobius.gameserver.model.battle;
    - @& [" H4 B, S0 C, x. b

  3. ) i" G  S5 I2 U+ l2 f( o4 h  T* g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 e0 ?+ ^2 j9 Q/ y. {7 I! b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& G( w6 J7 f" x
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 q; J( U0 _9 N

  7. $ k/ Q7 z9 b# U% a
  8. public class BattleSimulation {9 g% ]& l# {0 |/ P- }7 N3 I
  9.     public static void main(String[] args) {
    # L: d: O4 c* y5 g& ]
  10.         // Создаем монстра с начальной атакой
    - O/ @' H( [/ f0 M
  11.         Monster monster = new Monster("Дракон", 100);" S) l$ }7 d3 `% q3 b! l
  12. 4 w7 H* L' R- Z
  13.         // Начальная фаза
    2 e% y( r3 X* l5 M
  14.         monster.executeState();
    , n& U  k+ Z6 j. V0 p3 ]& }" Z, ]
  15. , T1 ~7 R- j& J# g) U
  16.         // Переход в агрессивную фазу+ s2 w3 V& i5 Z
  17.         monster.setState(new AggressiveState());
    6 j  M/ J+ u, l9 L- t; X
  18.         monster.executeState();
    . @$ e! i" n) J$ c, a6 u6 U+ |
  19. / c. _8 [4 o+ |9 j" T
  20.         // Финальная фаза
    8 ~: F& k" A- ^% O+ Z
  21.         monster.setState(new FinalState());
    0 O5 A! J% y/ ~0 I; }8 U/ y
  22.         monster.executeState();
    7 z+ Q0 I% E9 _# X, A; ~+ }
  23.     }
    / A/ w! u& g$ e6 Q. Y
  24. }
    / B9 T. T1 O. n# Y, Y$ |( O6 g
Скопировать код
1 }: ~, i" a/ v
Комментарии по структуре пакетов и классов:
% \+ w6 J& O2 f' q6 q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ( Q+ f7 d- c1 ^# _+ f# u9 {
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& g* X2 ?% h' D4 u( AЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# o2 g1 }4 D2 f" r) m, A7 Z: i; g1 d- y. W7 {7 P

! p' l# d( V5 l+ u- r7 M- t" ?% X7 P4 k; l
' R- A0 U7 ?" W* l
, x* n7 o. u) y" B" H9 D+ d
' f; h" h) F5 Z, F9 ?9 L* s/ ?
7 n/ ?, P1 h1 R6 j/ T+ n  {' e; a& l8 B
: s% f/ A9 ~2 h7 s; x9 \  F2 o+ g, |

- g& m: W" R1 F* E1 R, |. F" Q  F- J$ g9 j7 o, ?( s
/ V# |0 Q: l  ^6 @: n9 W9 H9 O
8 ~7 r% t1 A( V3 I0 h3 R& J" \

4 e( R7 H6 s8 x* q+ @7 N1 G1 C
& O# h7 Y; o4 ]0 x
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04* K, x( ?% c4 w8 h  \
Для управления сложными взаимодействиями, такими как  ...

: x% k  n! l9 i, C# MОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21% Z- S5 F* k6 b7 i4 J$ z2 X
Отличный подход! Использование шаблона "Состояние" де ...

7 p8 |+ P5 u! `% M0 M0 QХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.* g" E6 _: Z9 A6 @

1 d/ k* b* f0 z; U+ u7 _Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
* Q: V0 s6 ]$ ^+ H# t- `! t, F6 |% V: V6 m" v2 y
  1. // Пакет org.l2jmobius.gameserver.model.actor, ^8 x3 t$ T" d, `, Z8 P" C
  2. package org.l2jmobius.gameserver.model.actor;- i8 o, ~% E; A. `+ ^. ^' }
  3. # }; [1 J& ]& m' X: l4 H
  4. // Перечисление для типов атак1 o$ c! a- |# F5 z: }( p
  5. public enum AttackType {% k9 V) g, u) ?7 p4 O7 W
  6.     PHYSICAL, MAGICAL;
    6 B. S7 _. Y% ]* o9 J
  7. }8 N* F, n+ u8 Y; C  _, H5 e
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.+ }. p0 @- B7 v( J& u, w: h
Обновленный класс для агрессивного состояния монстра:
2 d' Y( K1 E+ M7 @" w$ }& c9 v
0 @; x% M6 a) e3 L( U. W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) ]& C4 B* {) d) o% D
  2. package org.l2jmobius.gameserver.model.actor.state;
    : s* }. k( G7 t* W2 M

  3. 4 N" p2 c- _. q  F  n# C; Z. K4 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;% m% g; Y# a7 T3 [8 b
  5. import org.l2jmobius.gameserver.model.actor.AttackType;; I$ _# R/ Y2 v5 }! P8 c0 q+ @

  6. , j8 h: N0 t8 Q! S2 n% K7 c0 h
  7. import java.util.Random;
      e% K) `. B2 F5 P+ K$ F* R

  8. . I4 H6 n' S, Y5 V1 |; \* i
  9. public class AggressiveState implements MonsterState {
    5 k8 {" Y. w1 j$ M: v# a6 U: L5 ^
  10.     private Random random = new Random();
    ! w4 {" `% `, d
  11. - B+ u& [) B. D- |# |1 V% k* A
  12.     @Override
    # k$ N" ]' F) @4 e1 d/ U+ k
  13.     public void handleState(Monster monster) {- k% g( Z0 i) r, L
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ! q+ o8 O) m& I3 Y0 N& A; t
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
      \) @( f* `0 \! \9 N0 x5 I

  16. 0 c" B# V5 {1 C
  17.         // Логика для агрессивной фазы боя
    ( V9 s8 t1 \; H: W1 e
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : I$ q, A; }1 W  }
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    3 n$ l; j3 _1 Y) }& Z  D" Y
  20.         
    4 l) @& |! M6 H$ O0 F! f$ Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки4 q2 m; Y% F% {5 C" w6 {. ]4 E
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    $ m8 j. z/ k  ^2 e2 B
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , c. Y1 M0 W$ R3 Q7 T1 T
  24.     }( S, h/ `8 f5 k/ m% W7 t8 `
  25. }- x2 D+ y1 E$ ^, x9 e' r
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
% ^% h, y4 |" s% w5 V( r2 _" F4 `
0 l/ D7 P, ]' L$ l# c
  1. // Пакет org.l2jmobius.gameserver.model.actor
      Q7 _6 ^8 e" C. |% M) f
  2. package org.l2jmobius.gameserver.model.actor;1 m7 x2 x. i) c3 h0 z

  3. " N( P3 X8 n  L$ B# i( [1 I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 G0 J/ B$ n7 o% V
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- a/ [- _! Y2 `: S
  6. ; m/ X0 N9 K3 b' J' C
  7. public class Monster extends Creature {
    # t: {3 d8 \1 D; X- U9 e" x
  8.     private String name;! m1 E. F  a1 h$ b
  9.     private double attackPower;( g$ j$ ]7 \6 W. h( D# i" l* i8 f
  10.     private MonsterState state; // Текущее состояние монстра8 E" T' m( w+ j

  11. 2 c9 o) d5 W# v
  12.     // Конструктор монстра* E3 C2 s+ g9 e2 n& z1 }  ~8 y
  13.     public Monster(String name, double attackPower) {% b( `, V$ ~, L0 K1 f4 K
  14.         this.name = name;
    8 ~7 C8 V7 b. W2 n/ g
  15.         this.attackPower = attackPower;& q$ k2 d+ e  X& X! y
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    8 @9 L* z/ ~1 Z/ w: W! w- s
  17.     }
    : n" a: y" }% L: M" W

  18. / @, w3 B2 u" E& K# l9 e+ @& n6 U2 y
  19.     // Метод для смены состояния2 W: ~1 i+ V0 x. E# ?
  20.     public void setState(MonsterState newState) {
    6 M9 n  \5 [( Z3 Z, x% ]9 J
  21.         this.state = newState;
    # K! u. g7 d8 q7 o; J0 Y
  22.     }. H) v# r4 B. x' u9 ], z
  23. 3 O3 J9 ^+ s# k% f! U" O
  24.     // Выполнение действий на основе текущего состояния
    7 _3 x7 m( H7 ~7 s+ ~
  25.     public void executeState() {
    $ ~: o$ s4 N7 v9 p* Y
  26.         state.handleState(this);; C) ^/ Q+ l6 o  u
  27.     }
    , L3 g& W, l  }( |  N
  28. 7 d3 a4 [4 x$ |; n( g
  29.     // Геттеры и сеттеры
    # p  s. p  r  j
  30.     public String getName() {! i( S( Q# G8 u3 v; v3 k7 h3 u* _
  31.         return name;
    2 J; X( g6 X2 Q1 `0 j' [
  32.     }
    " n1 \" \& X8 |- m5 ~) b
  33. * I8 Q& a& v2 ~
  34.     public double getAttackPower() {
    / y- p7 P3 k4 }) u& @. k' ?6 \* ]
  35.         return attackPower;) i# o1 [* d$ i2 {
  36.     }: ~3 b+ |& X" |# U" w
  37. ! Q' j' D3 w6 m: E$ x9 q
  38.     public void setAttackPower(double attackPower) {# ?1 v/ g) |+ m
  39.         this.attackPower = attackPower;
    ; u. j9 V, O/ _) X  |
  40.     }2 N8 o1 ~  ?" }
  41. }
    6 I% S0 ~2 v: k/ D- a
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
5 w  x) ?+ g' w# }) D/ H" d; R: L! F+ A( N4 C
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 P& V! Z& v" }) U2 p: o- j% A! R
  2. package org.l2jmobius.gameserver.model.battle;
    - o  H1 M3 I$ w! j
  3. " g% |+ S( d% s" O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 I' C( S" l5 k4 \! f8 P& m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 P- A$ ?7 }$ C, L" W; ~$ [5 I: k: D
  6. % p! I0 k" w5 V* v9 y
  7. public class BattleSimulation {
    * C1 I/ a- X0 \# [: J0 U
  8.     public static void main(String[] args) {
    ; z" {3 ^$ k8 M& m  g
  9.         // Создаем монстра
    # l2 n, N& D7 U) V/ ?2 q
  10.         Monster monster = new Monster("Дракон", 100);
    / p& w, Y* B9 U" |" Q8 T. d

  11. - h; g, u& e* u
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак* A( j6 `- c( C
  13.         monster.setState(new AggressiveState());6 Y+ b2 l% H) d- x
  14.         monster.executeState();
    5 f+ W- t9 r3 h& g$ o
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак. ~7 l: y% B( e- q+ {7 c
  16.     }
    ' G7 N; C( n- D# F7 I" G
  17. }
    8 g+ Z# }6 Y6 s  G
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.; V  f: f% g  r9 {6 v2 r" Z9 W
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
9 ~# ]2 ^5 R" z! T- Y7 v6 I4 n
! v* ]+ y8 N1 h2 {; t, u; j# ]* ]8 V( t& X9 C

8 g1 A, G+ m0 N; I. }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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