Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
3 q% ?1 b: r4 Q& I7 p9 |8 u1 z' o, A/ B
5 O* W# r9 t5 u8 a8 u& |& d' e
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.4 @5 H8 D( R3 I- B
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!7 p. K5 @) `; I, U; f) R
Астралия ?
% T6 p  k$ I- y+ Q! u1 N
/ \$ R& ^; X$ |4 G& l

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
- V2 v3 g, M6 w* X* x# _В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 u2 m# X2 I: _! w: ?; C
# T, [) m2 L; Z
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
2 o7 w+ T* S6 U' ~
AlexCoder опубликовал в 2024-10-16 18:31
* ^( n, M3 ~2 HДень добрый!
' F8 \4 o% ?' ?5 P* NВ статье описано взаимодействие игрока с N ...

$ r# p6 F# e/ o0 AДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & S) f4 P( E: Y' i3 k2 L: Q1 b

! r# _+ [; C3 T7 Y; Q7 e7 o4 H/ nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ E8 y% e* j( L8 H3 b: \
* ?* E! u& i5 a4 u# D/ FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 X: g$ v% @" Z2 m) O$ H1 n# _1 w) t' }
  1. <font color="Green">// Пакет для состояний монстра</font>& ~! B( H0 n3 c& p+ {
  2. package org.l2jmobius.gameserver.model.actor.state;( ?$ j! d! [9 h; P; X0 {
  3. <font color="Green">
    + j+ Y- j( |  }- S: h
  4. // Интерфейс, представляющий состояния монстра</font>
    " {" N# H1 D+ K# a
  5. public interface MonsterState {
    8 A( ]6 E) s1 S; h# b
  6.     void handleState(Monster monster);
    ! `2 B* o) o& }
  7. }% W$ e8 a% `* d2 p3 F( U9 A2 _
Скопировать код

0 a0 @- [" M2 B# p! cШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( R4 ~" k# e* W

; v; b" [3 C9 Z$ ~0 j7 K' R5 K! iКласс для начального состояния монстра:
% _) y, K7 a5 M/ @3 Q- F) O
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    & J% c5 G0 {4 ~; j  E* c/ D
  2. package org.l2jmobius.gameserver.model.actor.state;0 O, o2 q- l/ x& J: J7 a
  3. 9 F5 z' T" ~, W4 b# K# B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      Y: U* l( J8 \* F

  5. 5 e3 F; J& f9 s. `
  6. public class InitialState implements MonsterState {
    4 F$ r- h# a, O; {2 `
  7.     @Override4 H& W  k% n+ E; K  V
  8.     public void handleState(Monster monster) {5 j4 F3 o: v; M" @
  9.         // Начальная фаза боя7 o! |: s+ I" D2 ^( w0 t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % S! n; R- \( X& u% i
  11.     }
      A9 v  i, v) X, R7 Z
  12. }
    9 E$ ?' k/ x0 [8 v9 O  Y
Скопировать код

& p0 t6 _% _9 x8 S. \" g
- R$ f+ s8 Q  o2 x
( C: `' g( F1 v9 A2 Q/ B4 j/ ]$ S# B( \1 a
! q* H3 ?  q; Q, B4 A
# t% d" S4 C* W; Q6 \$ w

6 j& H; {3 s" R; e
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 }2 {. ]! [  L5 t- |) M
% o3 z3 x" \. K3 L( \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: Q' a; P! z/ H% u5 T, R. x* }
5 _- }1 v" i: \, m) c5 |
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" w2 T  d9 }7 X9 N0 {$ U8 `. V7 E! P, d6 Q
  1. // Пакет для состояний монстра
    ! _5 U7 R% t- o4 U/ p+ A
  2. package org.l2jmobius.gameserver.model.actor.state;! u" B. G  c# L- z0 V
  3. / @9 n2 q  S9 |& \  n$ m; ~
  4. // Интерфейс, представляющий состояния монстра
    # {( c# Z' z$ z3 c9 |7 o
  5. public interface MonsterState {
    9 Z' L7 c5 v0 Y, n% @% }2 u: L
  6.     void handleState(Monster monster);& @9 ~8 N, X3 M/ k
  7. }+ |& S0 L4 ]  l& K: Y1 _
Скопировать код

, `+ h4 d9 W  m6 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 W/ _0 c6 W' l) N1 S2 H" D$ f$ r+ w& O1 A% w$ P9 C, P9 _, c. Z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ t" V* @4 F" P! y0 ^

8 c( u/ }( h5 h; P$ BКласс для начального состояния монстра:: D2 M3 }, W7 A9 `6 P1 \' N0 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 X( F9 @0 c) u5 P. A& x# b0 y
  2. package org.l2jmobius.gameserver.model.actor.state;( ?' V' H# A7 D6 h  J* x$ k
  3. 4 P( a* `: g) _- h1 s
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 q( f& p) h6 o% w% c8 ~
  5. ) v- ^, y6 y$ f3 O; m# o9 ?$ h0 }
  6. public class InitialState implements MonsterState {
    + |; _6 T5 f2 t/ h8 _/ T. y: J
  7.     @Override
    6 B: C, ?4 d5 F$ Z/ D; n) z$ ]2 A
  8.     public void handleState(Monster monster) {3 @7 X& s0 n6 U. D
  9.         // Начальная фаза боя
    1 K: n  ?$ L% W1 b& ]6 k
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, W3 e- r9 b4 Z
  11.     }
    + N, x; b/ e3 [0 l. a) o
  12. }
    4 ?) E+ f: f: j) X
Скопировать код
Класс для агрессивного состояния монстра:
% D6 K; u0 J" a- H& V, ^2 H9 Y6 Q5 F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 O5 d. n8 @, q( ?8 ~# Z
  2. package org.l2jmobius.gameserver.model.actor.state;% k5 {3 B' z  U' p
  3. 8 {" Y* w5 X8 a; L( f
  4. import org.l2jmobius.gameserver.model.actor.Monster;" _6 z: n4 [0 _: {  p' H7 F
  5. : E9 L# f: ]' H* n* G
  6. public class AggressiveState implements MonsterState {9 r; b( z6 A8 F) K& @
  7.     @Override
    7 g. n6 ^. i* K1 A
  8.     public void handleState(Monster monster) {# ^1 q" b0 }: j4 j
  9.         // Агрессивная фаза боя
    ; U& A  V7 R6 _, u1 Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");4 _& w: ?0 @" q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки/ J: R9 B7 s% ?7 N
  12.     }
    2 @( o8 Q) [6 J
  13. }
    # ~: A% F: u6 s" M8 ~, _( W
Скопировать код
Класс для финального состояния монстра:
" z; J( W5 u  G3 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ G' p* G; \% V( D! V- U
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 h5 u$ M0 @9 Y4 ^
  3. ' D2 t' ~1 I+ f2 i$ D! d  w6 ^4 e" o
  4. import org.l2jmobius.gameserver.model.actor.Monster;; m7 h+ d3 w/ ~& ?1 P
  5. ' f* W# c! H5 w1 L
  6. public class FinalState implements MonsterState {
    ! c5 |, ?1 S( {) J5 `4 e
  7.     @Override% \  I9 Z8 J0 D; O4 [
  8.     public void handleState(Monster monster) {+ r: C( E' R' Z0 e3 L* `7 n
  9.         // Финальная фаза боя8 J( ?4 D! D6 y3 v" H
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ( g! ]. k& x4 s  C
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% `/ |! E5 P$ s& P3 c& w: i7 t
  12.     }
    & @, a3 [! c- x% A# m! g+ f5 x* w4 c& r
  13. }$ O0 L5 M* Y. w& ?
Скопировать код

" s8 C0 d( h4 v" U! mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, K; [; ?" g4 K  d. B& T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + z0 E$ [" X7 t9 ]6 J5 t
  2. package org.l2jmobius.gameserver.model.actor;
    % C! ]: L- v" w# `* q

  3. , L* w" f! o4 |3 I% O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 @, I, ]6 E2 U+ G; E, m9 e
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 |* V- Q: P8 N, c6 y8 J; {

  6. 3 q$ U  L4 a; L1 G0 w7 m0 w! I2 g
  7. public class Monster extends Creature {
    ( v. z7 P* D# S" Y
  8.     private String name;/ y, b7 @+ u" X5 N* I# C
  9.     private double attackPower;" C8 l9 L: D! I+ n% k1 w
  10.     private MonsterState state; // Текущее состояние монстра, N( _/ M' y: Q! L/ M2 j
  11. ) P2 e5 X* F& F2 S, p
  12.     // Конструктор монстра
    ( x! [$ b. {- O7 K
  13.     public Monster(String name, double attackPower) {3 R/ e! [- W6 c* F( I5 j& K
  14.         this.name = name;
    # `9 B. |1 Q/ X6 B7 \
  15.         this.attackPower = attackPower;! f' i* c9 y/ D" t( V. o9 r3 i4 I
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние* N9 K# c% T. p8 e+ _: T
  17.     }
    : d$ q1 x2 p9 o% ?- G
  18. 6 `# I3 v! B! }$ A7 a
  19.     // Метод для смены состояния
    * I. S+ ]+ L7 t. U- W5 ~
  20.     public void setState(MonsterState newState) {* V3 N8 x/ |* d2 K8 X6 Q8 u0 G
  21.         this.state = newState;* D8 @! c7 N! g; |) f
  22.     }
    & n4 S( h% s6 ?- u. d
  23. ; D$ q0 h/ ^- M" B7 A/ B
  24.     // Выполнение действий на основе текущего состояния+ r. q" _" x/ G+ Q
  25.     public void executeState() {
    3 T& E' s$ A6 P1 u+ _  |
  26.         state.handleState(this);
    ( e2 j! f) g/ Z: R
  27.     }
    5 i) \" X  c+ r. k) J

  28. ; ]" p% h" k! g  I
  29.     // Геттеры и сеттеры
    8 X2 ?9 L# O0 I- E% D$ g8 u2 F7 j
  30.     public String getName() {
    1 O1 C; N7 }! k. `8 ^/ u' r4 x  w
  31.         return name;- V3 k, s! K2 w% e5 `# F# X
  32.     }
    * K7 c% ~" t) L& Q, J2 o' ?0 o9 x
  33. 4 E# ?) q" Q9 l! e; ?' f, i
  34.     public double getAttackPower() {
    ' L+ n/ s; g9 O
  35.         return attackPower;: U7 x! X, A( |' W0 f" g
  36.     }
    ) K2 D- {  m; b
  37. . g2 v& H4 L8 ]7 y# H% O
  38.     public void setAttackPower(double attackPower) {
      ~; k* d2 G. W. ?
  39.         this.attackPower = attackPower;7 G0 T$ p" v7 g. e& d
  40.     }3 V# ^1 R' H" C# T+ W! c; e- u
  41. }; c1 U$ c' D5 _/ w2 Z$ Z
Скопировать код

  ~3 i% y$ q; o8 q" ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.; t5 K5 G6 D9 H- g; J

" b% q* v8 M) l5 G" S
  1. // Пакет org.l2jmobius.gameserver.model.battle8 |3 T' c! O/ o3 x$ i
  2. package org.l2jmobius.gameserver.model.battle;- B4 D5 E4 [: f5 c
  3. ; o6 d1 I- _0 c  ~" p
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ j4 k% N' \% H1 B% G" F8 V+ @
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 F* _1 ?  q1 Z& u. {0 v% ^
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;" `; A# \# c. c9 C+ z
  7. 4 b' P+ n" A4 Q; P& ~
  8. public class BattleSimulation {; [* j% a3 ^' J& X
  9.     public static void main(String[] args) {0 e& }; w4 c# @; T' m
  10.         // Создаем монстра с начальной атакой8 a, ]4 T- t) u/ [8 q: X7 E
  11.         Monster monster = new Monster("Дракон", 100);
    ) g' z3 I5 V9 `0 G
  12. , s3 S- D' |+ x* ^
  13.         // Начальная фаза
    7 S$ d+ n. U) u1 n
  14.         monster.executeState();7 D5 N. v' W0 P8 b( u8 I
  15. ! j, f' ]4 m  n4 `
  16.         // Переход в агрессивную фазу
    & }( O- K9 d' w6 k
  17.         monster.setState(new AggressiveState());
    ! v  m) u# c) b; b
  18.         monster.executeState();; u2 y5 G0 O: Q. [9 H, t8 R4 G" c8 p

  19. * _  F: ^7 G. ^) F+ i; ~5 J) F
  20.         // Финальная фаза
    # U+ X7 {" F+ Q. p! F0 @0 D
  21.         monster.setState(new FinalState());
    7 S  v, l* I+ j; y+ a4 p* C2 C1 H8 ?
  22.         monster.executeState();5 y1 h9 @  a4 G
  23.     }$ @- v& h4 {4 i( V3 q
  24. }5 ?+ X6 }! [8 J0 Y4 U  Q
Скопировать код

6 x% \0 R5 L6 iКомментарии по структуре пакетов и классов:
+ h3 H3 }& e: j- B# B
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 c0 l" \( m$ X/ @, l+ o& P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. T# T* _! }" T' k) V" ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ e( i( c0 L* c) W# P
$ _( K6 }; y, d& P5 ~- S
+ U+ j' N( b) Z1 d5 F

3 g# i! ?: |5 ~. D# x. a. _" J! I* {% u3 U! B& F

6 ?" ~! S( U) \5 L
0 X# E0 {# v8 X8 B
& y) X7 G; _$ c8 n: p3 e) A% [, p# H
: R) _, u( L" o# p# O0 \& l
2 V* M- e! ~7 R$ w  R6 ?
1 t6 L- {$ m# D! f0 Z  ~. u* d
) ^2 J3 ]0 Y  M# b) i# Q/ ~$ g0 w: |5 s# m
5 N* e' L+ Z( B# P6 y) c% c
$ U# x4 t$ q/ X0 @* p; W4 a
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
- E3 ^: D1 G/ ]. c8 I, K! }Для управления сложными взаимодействиями, такими как  ...
! E7 F; W8 p* T; H2 \
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:218 @) J6 y9 n! Z/ w9 I$ U
Отличный подход! Использование шаблона "Состояние" де ...

4 X7 r) O) c4 X1 R; CХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
2 n5 S/ K1 i) C7 ]' e0 d; S
5 l2 S0 I6 W8 H8 h5 E5 n6 ~Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.2 h4 n7 `& S, _

) o2 g) }$ d2 h! g1 L0 P
  1. // Пакет org.l2jmobius.gameserver.model.actor' o: u3 e! G/ H! |0 _
  2. package org.l2jmobius.gameserver.model.actor;
    . H  a( X% k! c+ C( Q2 o' m8 C- M
  3. 4 I. _" x9 f! A- p3 q
  4. // Перечисление для типов атак
    5 l: A. [& W5 q4 m
  5. public enum AttackType {" a( r' |& A( Q
  6.     PHYSICAL, MAGICAL;4 w9 ?9 d" E2 \9 m0 Z7 f& E$ k  G0 M; H
  7. }+ z, L) S, I# H4 y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.! J1 W6 S$ P$ F% q: t' `5 R
Обновленный класс для агрессивного состояния монстра:
9 r4 t( q. y- {0 |. v% u7 [; m4 N0 F: [( s& E! n" @4 L; @, u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      [( M2 `& P" \6 i0 ^0 m
  2. package org.l2jmobius.gameserver.model.actor.state;# X6 f: k7 p, q" Z! s$ V2 \
  3. % s; S# Q6 W! H3 h/ P5 f  J8 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;& U+ L' c) i) [! A: D, {
  5. import org.l2jmobius.gameserver.model.actor.AttackType;4 @- b5 o6 y( G& U; I

  6. , L2 |; I0 ^+ |" y7 v/ p0 z. D1 f3 D
  7. import java.util.Random;6 _8 \5 V$ D0 |$ @7 p

  8. ! h0 O! R% |, K; `9 ?5 u) O
  9. public class AggressiveState implements MonsterState {% `* O' C' d, C+ K3 s
  10.     private Random random = new Random();  J8 p- E& m* _4 s" d

  11. * J* p$ _! ~* D, [
  12.     @Override
    ; F% Q, d( S6 K0 m- ^$ [8 h( G: s
  13.     public void handleState(Monster monster) {
    4 m4 t, a% q: \1 q2 p3 }
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 [, K2 W( l1 V
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;8 r' b6 ~3 e0 i- z

  16. + @; J3 O2 [% E  X5 D, r2 s3 ]( V% R
  17.         // Логика для агрессивной фазы боя8 s+ E/ {9 `# o+ F
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
      v0 e; X/ [; b% {( c* L
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    + O' Z! O) q) N$ a% I
  20.         : p1 [7 T, U3 z; V% T
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    2 O1 t' {2 K! k( A
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;2 J& b% `) v2 i) b
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    + R; E# c4 N! E- u  B+ s
  24.     }, \, L9 \0 _/ P. Y
  25. }
    4 b- ?7 Y" K" E% v: ^
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
, {) L1 O; z8 i" I9 m7 ^, g  |: ]/ t" r3 a7 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 _" v  E; A# f: o* E# h
  2. package org.l2jmobius.gameserver.model.actor;
    - I: G1 k" c4 y4 u

  3. $ W2 ]/ B, e  r( a6 M2 `2 b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . O1 V4 s) X6 o
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( H5 |8 v, b, o4 N" e- y* w; s
  6. 4 w4 d( o7 T" D# M: F0 Y: |
  7. public class Monster extends Creature {
    2 d: j* _% u& B9 N5 p
  8.     private String name;
    : u% N9 n! Z, e" V' }- \
  9.     private double attackPower;
    ! \! a% u$ g! \0 c. K; q7 \
  10.     private MonsterState state; // Текущее состояние монстра0 L* w; {  w& v* ]& q  c2 F& `6 S

  11. 9 ^" ]. W+ V& _7 O# f
  12.     // Конструктор монстра- u+ q; J; Y% ~4 g" {7 q7 V
  13.     public Monster(String name, double attackPower) {
    * u" a7 x& ?. B' k# Y& u
  14.         this.name = name;8 R* d3 [7 q$ l6 u% i
  15.         this.attackPower = attackPower;
    ( O3 j) Q1 [* ]
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 m- X; x0 _8 t1 ~! B* ]4 e
  17.     }- D5 W1 s- G' |* n' W' \2 M0 X

  18. 6 y# a0 v3 e$ C7 B' {8 G
  19.     // Метод для смены состояния
    3 u9 L4 Q: ]* _6 k$ J4 ^  D
  20.     public void setState(MonsterState newState) {
    ( o/ m3 p$ m. p! d9 i3 t9 _
  21.         this.state = newState;
    ; z1 U0 B6 \8 ?4 N- U
  22.     }3 B( I( R7 u: r2 f) R7 K6 X
  23. 0 g. b1 L) D! w' P, A: |
  24.     // Выполнение действий на основе текущего состояния- H* H/ l. F( `4 S  A) z4 O
  25.     public void executeState() {
    ' b* ^9 l2 s/ q5 ^1 b: x
  26.         state.handleState(this);
    " q4 t+ S, c4 x% ~' U& ?
  27.     }
    3 s3 N# x5 z4 p4 c) O$ ]1 ~) F% E
  28. 6 L: _8 M. B$ T" B, a, J% X
  29.     // Геттеры и сеттеры" l# ~0 u6 O* G% k
  30.     public String getName() {7 Q# e" L/ t3 e9 j
  31.         return name;
    2 V% ^1 P" O  t9 S6 k! y5 v
  32.     }4 ~( y& {; s9 N; n" J

  33. 1 j' n# a3 \, ?$ ]! W; y
  34.     public double getAttackPower() {- l+ a% b" p' k0 [" \
  35.         return attackPower;
    5 x1 [/ S) C* }2 p7 H2 [3 G8 W
  36.     }/ x2 {3 A( l+ R& p- k2 l0 X5 k& s

  37. : Z, G3 Z- m4 x. \% t! H' H
  38.     public void setAttackPower(double attackPower) {
    6 @. }1 \. y" s7 P. J
  39.         this.attackPower = attackPower;2 r# K) {7 X9 G7 v. U% x
  40.     }* w* \2 l9 ]  c. K
  41. }
    4 n& w9 K$ h& Z. q" a2 E  x
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.+ ?5 f' L' [  m6 g$ E- R

. q9 h4 p$ X' w: Z7 G) p$ {
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - _" M4 @& X8 A1 |
  2. package org.l2jmobius.gameserver.model.battle;& O: p6 a+ R% j
  3. 1 ~/ T1 m7 l" N2 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + ?  x9 |0 @  p* A( s, n7 m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 y2 S1 }7 U- i$ h. J9 r- @1 m, D
  6. , L; `: n7 f/ ^1 P. w
  7. public class BattleSimulation {
    ! |+ j7 v; u3 V
  8.     public static void main(String[] args) {! q+ ]' Y/ {( R# l3 _
  9.         // Создаем монстра2 `7 x' N! b; s/ U
  10.         Monster monster = new Monster("Дракон", 100);) }1 u& i: x5 v/ [

  11. - [) d* _9 ~7 t+ \+ l" S5 z. G. l7 H
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    9 E, L3 n% N. h. v$ D  ]
  13.         monster.setState(new AggressiveState());- L, E: @' P1 y* e. u: v
  14.         monster.executeState();
    3 O. A  I; D0 V9 A2 H1 P
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    8 }. {6 z) X* a0 |/ {* ^& r& m9 g
  16.     }
    . x5 I2 |; ~4 r9 T3 f0 ^
  17. }# K2 f3 x& a& H7 \
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.: Z0 o- ]3 i# Q9 z' K9 e
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
+ v& U2 I" d% z# C# H1 z3 _; ]; }
" q% _# }  Q+ T5 E: p8 M2 `  s+ @) n  k8 K& ?# R/ l

& S7 P( H& Z0 J9 O& U- p
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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