Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
5 S) L0 P! Q( M( \- H' r5 b, J0 y
- m, ~* k) t0 s9 \

: U9 A/ k0 U7 o1 FЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
3 o- u6 M/ T# uЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
& v0 @; x+ E5 j& vАстралия ?
1 {  T3 U/ X6 K+ s
8 n0 j  `3 f  O" a4 h

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!- U+ M7 ~+ [! s) s- M
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
; Y. {. E" _/ C  X0 s2 V$ e+ z) J. _  \' m; }9 q
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ; [7 T: F0 Z- {: ^
AlexCoder опубликовал в 2024-10-16 18:31
; M  Q5 s& i& Y1 }" SДень добрый!
0 I# C" c. x1 m! ?В статье описано взаимодействие игрока с N ...

) r2 N7 z3 U# u  A( ~Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / T0 I: v7 Q5 V$ H
) t( m! O" O8 T# c6 P) x% [7 h
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. |% @8 ^. u+ f3 X) E

' c" E6 B  V% Q7 ]Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! O. \1 ^& ^' H7 M
( \' r! M/ I3 [
  1. <font color="Green">// Пакет для состояний монстра</font>5 X+ ~: [: L, P2 s2 J% f# E1 V5 S
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! \4 i5 a3 g+ k
  3. <font color="Green">) @7 X3 J8 {& d# m) [; H& m( f
  4. // Интерфейс, представляющий состояния монстра</font>
    5 E% v' \# k* L  [1 e. T
  5. public interface MonsterState {
      o. j3 }. P; B. J
  6.     void handleState(Monster monster);; r9 @7 n( L0 q% c9 \
  7. }) t8 k2 ^& l; K8 a& B
Скопировать код

8 B6 U, |8 v7 Y1 l$ [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
! s  G  y1 E+ d+ _: X8 B7 E, }$ T1 d
Класс для начального состояния монстра:
' ~+ Z- _0 {5 E. w+ M# g
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    # f- y8 ~5 H  A2 n/ }* K4 I
  2. package org.l2jmobius.gameserver.model.actor.state;. O- W) ^4 J0 |' A7 H

  3. + n. K$ i* D4 S; K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : M8 Z& b% v& b7 ]4 |
  5. 3 s$ p1 G7 t; x0 O; v4 E
  6. public class InitialState implements MonsterState {
    # w# k0 m* x# T1 E4 a% h/ J
  7.     @Override
    / ]% M& r8 |0 ]' K% I7 \% m) g
  8.     public void handleState(Monster monster) {) l& \5 k& E  E" G! D* K1 _1 r
  9.         // Начальная фаза боя
    + u0 |  T% I4 h0 D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");. s% I/ r9 C& P9 x. e: s
  11.     }
    : ~1 M- |- c, j5 q) X: d
  12. }8 n6 X2 r9 m9 I5 ~
Скопировать код

& ]( V8 m% y+ [6 v0 {9 C3 V3 K6 }
+ }' M! r5 x# Q/ J1 v, N

. J0 o$ ]. D4 {. a+ C- M# [  t) _* e5 o, b' G

# v" J8 b. L! G6 u! o% T& [/ u& b3 l. V) n
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) `) F( o+ V& x

. [# _# j  N% O' H6 \  CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' Q! p; r- x8 E6 Z* T6 q% z( M8 ^" O- E; v! Q6 [, o  T' f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 t6 w1 }; g. g8 T7 V' R4 e- ]' f/ k4 y2 e6 F, B
  1. // Пакет для состояний монстра
    8 U8 Z# f. T; {2 |9 r, ?8 e9 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
      E) j. w4 N) v2 w. s! @) E' \
  3. # @! ^' o! l7 h( f- e1 @) m0 F
  4. // Интерфейс, представляющий состояния монстра% V" M3 X+ |+ g! ]; \+ h
  5. public interface MonsterState {$ t- |* _2 o( m9 Y, f
  6.     void handleState(Monster monster);
    , n( c" O8 D- T: G
  7. }+ ^6 c' f3 A& F; y- y
Скопировать код

4 b! K# @; |' ^& w1 x! e5 ^2 ]$ hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ) \% f. B6 k4 Z' K# y

6 q5 z- ?9 }. N' wЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; g- a) v2 r* z$ Y) I3 y" \3 V- B; Y* V2 s( O1 ]
Класс для начального состояния монстра:. E; V" G! O( w% f9 {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " B2 e! I$ ^% v- ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 i" M6 Q5 \: y9 g3 j) S

  3. 0 ~) I) a7 _5 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 ?! ?# I' C# ~$ B6 |' S% c" k
  5. ; P( X8 N/ m0 D6 f
  6. public class InitialState implements MonsterState {9 B. e, o6 w7 Z3 ~, z" S6 q5 ]* P; e
  7.     @Override" u5 Y0 t" S  H& H  W2 r" p* P; F) a
  8.     public void handleState(Monster monster) {
    ! _  R6 R) v9 u: c0 V
  9.         // Начальная фаза боя
    + s7 |8 A7 W: q* j9 G
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  ?; A+ s' C) T+ U9 _% R0 J
  11.     }3 x9 O& B+ Z$ ?* ~$ Y2 o
  12. }
    ( x( _$ E: ^: E- m5 C
Скопировать код
Класс для агрессивного состояния монстра:
+ u4 ]( ~* C8 F- @) Q% C; s8 D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state4 l3 @' D9 U/ A0 `/ o7 p# o
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ Z4 P) s0 @0 W' T

  3. 9 {, E' c( P, t
  4. import org.l2jmobius.gameserver.model.actor.Monster;. B/ N, w' a) Q# q6 a7 ^! @$ B
  5. + ~8 X" W8 ]0 u0 M* M8 j* r6 p
  6. public class AggressiveState implements MonsterState {* r9 z' l2 C1 m+ O. I4 c3 R: e
  7.     @Override( R" N5 ]4 t7 X$ S% w
  8.     public void handleState(Monster monster) {
    6 J0 ^2 f5 A. f! n8 a
  9.         // Агрессивная фаза боя
    4 O+ S" r8 G/ A
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ( _0 h( k9 i7 z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки( M7 b3 @/ p  L
  12.     }: g" U+ N3 j2 p5 X. \
  13. }
    % m* K% V" [$ Y% [
Скопировать код
Класс для финального состояния монстра:% c1 d' m$ k; J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # G, X  a& f8 \8 a! f  ?& s1 I! [0 `
  2. package org.l2jmobius.gameserver.model.actor.state;3 q2 D$ k: d* D+ _$ f
  3. 6 B/ p) O0 u3 o" e7 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ ~- c: D0 P* p
  5. ! @! }; K  u0 n" A* C
  6. public class FinalState implements MonsterState {3 c8 U6 h: \  z) u: z( v3 w9 ?
  7.     @Override
    # Z: [. s4 _( `* f, V
  8.     public void handleState(Monster monster) {" J2 W; |7 O( B1 g4 k
  9.         // Финальная фаза боя
    3 I" b7 U0 g* G1 O( A
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    $ z8 e! U' K; t% F2 I6 ~
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    / Q3 E) f! s+ e* C; ~1 i/ G1 q
  12.     }9 V. f# m( S" m, D
  13. }$ o1 N% S2 ~- O& q; _, y3 a: W% B
Скопировать код
) x% Z+ D4 l$ L+ c2 Z+ K# _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
$ P2 b* C, I2 M  A3 I
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 O  s- O6 n) O! G& u3 E
  2. package org.l2jmobius.gameserver.model.actor;) f5 ]  U; b: f! m# O2 K! o
  3. - Z0 H% w$ q/ _6 c' B2 \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    7 n' ]$ p% K2 x0 v" e
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 O) v9 _# a& p

  6. - `; q# C' }2 g; C7 ~$ U0 ?
  7. public class Monster extends Creature {* v  `9 [& S# ?2 |' T5 Y: @: n: s
  8.     private String name;
    7 v  W- ]4 i7 b6 P
  9.     private double attackPower;0 s3 s3 s+ k" R; j% Y/ O
  10.     private MonsterState state; // Текущее состояние монстра$ d6 t: _9 F) |; s
  11. * v! h5 G, b- J. t: Y, \
  12.     // Конструктор монстра
    ' v' u, S' L5 B7 v" J$ i% f9 K3 _4 @
  13.     public Monster(String name, double attackPower) {
    $ |; v6 b7 w; L0 E, h) [
  14.         this.name = name;
    ) W. m: _. n$ k6 t1 z
  15.         this.attackPower = attackPower;
    - _7 ?; z9 Z, M( j- M
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    $ s1 {+ G  ?* w3 E! s1 D
  17.     }
    : S/ Q/ s2 |. I( S: z! L: I/ F
  18. ( e2 e: J) E* E6 J, S* i
  19.     // Метод для смены состояния) ?- N* \" T7 g( d
  20.     public void setState(MonsterState newState) {2 M4 _% @" [9 B
  21.         this.state = newState;+ \0 g- R7 A) h7 t4 b5 s6 I! r
  22.     }9 h* A  |2 ?: {3 V9 A4 f

  23. $ S3 r: ^) a5 S3 l3 O) Y* m8 L
  24.     // Выполнение действий на основе текущего состояния, v! a4 T( d9 q# Q: j
  25.     public void executeState() {
    : y; w  O2 P0 P* R' c' z
  26.         state.handleState(this);
    4 R3 n3 K; L2 o/ @2 c5 W
  27.     }& T: E. U& \3 G6 `
  28. ; @, A4 U" e& f) r* o
  29.     // Геттеры и сеттеры0 t% e! w( j, O% o
  30.     public String getName() {, a8 A1 P: c; `- r
  31.         return name;
    * i. D$ O2 w4 b' ~2 q
  32.     }
    + h$ t/ U  }) o  N* L/ K/ f, B, n

  33. % Q3 o4 o! u, [3 n1 A. `
  34.     public double getAttackPower() {$ J$ Z- e5 T  r9 g% E: ~  K. t$ t
  35.         return attackPower;
    3 i" a2 [6 P! |. ]
  36.     }
    ' d5 \! `% `& n7 s. Q" g7 K

  37. ) W" N, R4 Y) ^" ^+ S; H4 o
  38.     public void setAttackPower(double attackPower) {7 s3 V4 O! C" j5 S' ]
  39.         this.attackPower = attackPower;# Y7 q+ [& p0 Z
  40.     }
    ; j$ S3 w6 M  ?! _
  41. }# q$ U# y1 M- Z  k, e% ?& b* k
Скопировать код
' }/ b( J* w$ \, |3 _0 N0 _
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.# F0 R* v/ x. s
, g0 ?$ w. S# @! o# U, `
  1. // Пакет org.l2jmobius.gameserver.model.battle- i9 U9 O0 D* c9 l
  2. package org.l2jmobius.gameserver.model.battle;
    ( O  ?! |6 O* F2 j+ a8 ~

  3. 6 B: c% t) C5 Z9 l3 j  K% I
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 {! w2 O& W* u- J) [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , w/ t$ |  B2 u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;+ }, a) r" h/ m. G# y1 S: A, p" W

  7. & ]4 r2 O+ `# {" ]  o$ f+ V
  8. public class BattleSimulation {2 x, ~4 e7 _1 j( ]
  9.     public static void main(String[] args) {' m/ A; n  |1 w" I+ O! ?% @
  10.         // Создаем монстра с начальной атакой' q( ?* h0 S1 H
  11.         Monster monster = new Monster("Дракон", 100);
    0 b3 u- X- p. I9 x8 t
  12.   w7 k, K6 o) e$ z. h
  13.         // Начальная фаза
    7 d' w% e8 {0 B# ]: j( F, l( H
  14.         monster.executeState();
    " n% J5 O2 S( b) X8 M' I' j+ H
  15. 4 W8 `! A& |3 x# M3 B/ }
  16.         // Переход в агрессивную фазу
    1 v! u: b% b( t6 a* K' o+ Y7 q% `
  17.         monster.setState(new AggressiveState());, p0 F8 p/ `8 \3 }  o
  18.         monster.executeState();( n% i- D: f" ^1 o0 A9 K* I3 {- l

  19. $ P. @* ~- f- H# }, l
  20.         // Финальная фаза
    , {0 d* z5 {+ S5 U% J# \* @
  21.         monster.setState(new FinalState());
    ; C' }6 h2 _" I" C  o
  22.         monster.executeState();# ?1 ]/ C: d( t, f# c
  23.     }
    . @7 P4 U, u) Z: _1 [( f
  24. }
    . F3 Q( Y1 ~- \! _% X6 o1 \
Скопировать код

0 b0 j; J/ h8 I9 jКомментарии по структуре пакетов и классов:
7 P1 Q& k0 ^3 M5 ^7 x
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.1 o) D% A5 G% S( t" h
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# u, R0 Q% U2 \) E5 _/ W# _6 p$ [Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 C6 y, t- E% {0 ~* N) F
0 |/ P; G2 F  w4 T* {, `9 O# K# V! Y5 R
/ x9 ?4 \1 s- J, G
4 `! E1 n0 P' T% ~! u- n

5 G+ F5 l1 M7 D
* ^* I5 d" z+ A; s
6 x; ^- c! |9 a% @& D& U; c& A& c9 ~  m7 T+ D

9 C8 ~8 ?+ O+ t  p
8 h' Z% e. n2 p
; X# |0 u% V: }& V) o, ]' L* G' l' n; m2 `
/ s  C- k% ?7 V- }. w" r

1 `0 t' K4 E2 M2 w) l
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:044 C7 o) Z4 M! A
Для управления сложными взаимодействиями, такими как  ...
- y, e2 `8 l2 A" j4 V) w' |! v# q) E
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21. s7 ~' F. R! r6 M$ V5 q3 z4 i
Отличный подход! Использование шаблона "Состояние" де ...

9 D* s( F+ e' R  D! B5 D7 h: ^Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.  X: B) @. D: w
" d# L3 \* w4 g" C" N% E
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; x; ]9 s4 ?# [+ t
8 r! S8 h( W$ }- {  n
  1. // Пакет org.l2jmobius.gameserver.model.actor0 n! u% m+ C& }
  2. package org.l2jmobius.gameserver.model.actor;. ?& ~  `3 t# O% B/ J5 Z, l
  3. 7 o" {* Y# c$ q  p
  4. // Перечисление для типов атак
    ( S; e4 p9 K; N8 g. P
  5. public enum AttackType {1 j- x- }. C7 w; J1 w/ ]
  6.     PHYSICAL, MAGICAL;
    . i5 `9 m4 g8 ]' V% X& m3 [
  7. }' E7 V. @! i4 n0 S8 m3 ^2 @% x
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
8 ?$ G* U: I+ MОбновленный класс для агрессивного состояния монстра:
# l% b4 d" h  m( e% ?6 k" A
. f/ i; P4 U6 c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 N' i6 v4 g2 K7 x5 b6 Z
  2. package org.l2jmobius.gameserver.model.actor.state;* c) [1 J. Y/ H9 \! k1 q
  3. , M& C7 r: R  D0 P+ V3 K& V5 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 H3 g- `+ r" k: r0 a/ h
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    & l! Q2 w, {: d# a$ H2 O

  6. 1 Q% r# @7 w2 x$ B2 q" z; X
  7. import java.util.Random;( `% o. B9 q$ s/ _% {. F4 U

  8. 0 Z; n- w/ C- P6 @0 A8 i/ q1 H
  9. public class AggressiveState implements MonsterState {, L3 k/ E# G* k; n# X
  10.     private Random random = new Random();: H7 b$ d0 J8 p

  11. % }, J/ h4 t! [' {
  12.     @Override
    ' ^1 {3 }/ t, |! @4 d
  13.     public void handleState(Monster monster) {
    / A! l' g/ o& w# _' ]
  14.         // Выбираем случайный тип атаки: физическая или магическая
    5 h$ |9 w, U/ Q6 m" _0 {) @7 b
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;$ a! u5 O8 O$ o& Q3 b7 O
  16. 5 `) o) O0 N, V. j8 C. D
  17.         // Логика для агрессивной фазы боя
    $ B, y& h  H( T# m2 g
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " . s1 U% v( {2 z7 I: o3 i$ s. J6 n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");$ |5 T0 X- H% j" b  m9 j+ X
  20.         
    " `! q& z* W4 U+ E
  21.         // Увеличиваем силу атаки в зависимости от типа атаки+ ~9 L, w$ \$ i3 }2 p5 N2 j
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    + g- I3 o* J  h& w, E; k  A
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);5 [$ V, Z" y, j( T! @3 u
  24.     }6 i4 v6 K! h# C. U0 `0 C' T) n
  25. }7 y, h, g  I  e/ T& g+ f
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
! Z# N5 N$ X, J& X+ Y0 r' a; c2 m2 a) b1 z  q6 G, n' r( A
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / ]6 t. C7 z" e" \. L$ N+ Y
  2. package org.l2jmobius.gameserver.model.actor;+ p$ Q& r: G0 u. {/ W
  3. / Q0 J2 T3 b8 ?; q2 @" v' y, C! _
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& ]" z3 Z1 i( c: t6 {, y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * ^# Y; J- [' L! j8 H7 i7 y5 K

  6. " @) L+ o; b; ?, Z2 Y& i
  7. public class Monster extends Creature {
    4 @( M% |( k( n* m; l4 ?
  8.     private String name;) g0 A" v/ G# l1 L& ]: n) l* M
  9.     private double attackPower;; Y3 T1 E) l. O. {/ p
  10.     private MonsterState state; // Текущее состояние монстра
    . x, ?" g% [. w
  11. ; `; L+ i0 f9 J, f4 n) k4 o! F& {- Y9 x
  12.     // Конструктор монстра5 o/ t" K& J) y6 z: e( o# v
  13.     public Monster(String name, double attackPower) {1 [3 w/ t$ Q* K8 {" n
  14.         this.name = name;5 O3 _) P0 `$ {# l3 w* A$ b
  15.         this.attackPower = attackPower;
    $ E7 p! y" w8 d8 E) T2 N
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию, o# q2 A9 M3 w. K4 S
  17.     }
    9 E2 i) X' z7 ]) {, F: B+ u0 q0 |
  18. % Q' s2 w8 }, B0 a
  19.     // Метод для смены состояния
    : N. t1 F& [. n& s* V" h3 q% g
  20.     public void setState(MonsterState newState) {
    * Y# o4 ~* Y9 f
  21.         this.state = newState;
    ) v  B9 T$ o$ q' k
  22.     }; F1 J+ i- z# r$ H3 I1 d6 n

  23.   `- p! E  p% }0 ~: n+ J! i4 h5 h1 l; c
  24.     // Выполнение действий на основе текущего состояния
    " y" d. t" e. f, E* F  Q9 p* N& l
  25.     public void executeState() {
    * R6 c) u  S# R& D4 ~
  26.         state.handleState(this);1 `8 T) m* e6 I$ u
  27.     }6 m( R3 P  c1 U8 I

  28. - z2 n/ h1 `: \2 Y) F4 U2 b. z9 a5 h& d
  29.     // Геттеры и сеттеры" r9 M) D7 f3 `, J1 Y3 b5 l6 z
  30.     public String getName() {$ j( S( w- H& p* D( ]. Q
  31.         return name;
    ( a! L$ N4 ^/ O
  32.     }2 w- M7 t7 t* }  Z0 z
  33. % z- @: P5 y# b" c) {
  34.     public double getAttackPower() {
    4 m; s4 S& l( o5 v6 b- D
  35.         return attackPower;
    5 X+ _& G8 Y/ ?9 z; @  X
  36.     }
    , e0 {5 ]( @, ^' H! [; C

  37. 6 D" f* [, a) q- I, M! v3 Z) b+ f
  38.     public void setAttackPower(double attackPower) {
    * F, k0 F, g2 p3 f4 Z0 _
  39.         this.attackPower = attackPower;
    " S8 M# R1 {% T. F) m
  40.     }
    ( Z2 |* f: T  d3 N# K9 f
  41. }
    . V  r: x0 [. A! |2 M5 q9 P
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.% T% ^6 @8 t- L8 u8 O# D
$ j/ c$ W5 O. Q; R2 Z" a
  1. // Пакет org.l2jmobius.gameserver.model.battle8 R! E2 W: Z; {$ q
  2. package org.l2jmobius.gameserver.model.battle;4 ^! n7 v' N6 N$ j( ~. Z( \
  3. & I) O+ o5 A& ^; y
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 _& r/ `/ \- h2 \2 q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! l! F+ c3 P( e- m

  6. ; I1 p2 W: Z- p# y0 ?
  7. public class BattleSimulation {
    2 c- w# `7 @9 [0 ^+ v
  8.     public static void main(String[] args) {
    # O- n7 u) D7 }% d# c
  9.         // Создаем монстра+ X& j6 c4 {$ B  X, S* e
  10.         Monster monster = new Monster("Дракон", 100);
    ' A$ D5 \2 Y" z! x

  11. " R7 K# V5 [: F4 p& j% b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    7 d+ b8 O$ B) y# B
  13.         monster.setState(new AggressiveState());) u+ d" e7 y8 C$ P0 `6 N5 A  I( ^
  14.         monster.executeState();2 N; U5 `! B( t3 Q+ j5 u9 u
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак. j4 c' @4 n6 T7 N
  16.     }
    4 ^/ S' C, L6 ?1 N. a- J1 d: Z. T
  17. }
    ; n. z% y2 Q6 Q& X: k# B2 l
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
9 ~- Y! c. U$ t# b/ aЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!( h: m# K/ w; \/ F+ L. L

9 ^( q7 {# v4 R( r+ m3 b3 s9 I2 i. V: a+ F  Z- }' e

* D3 q% }# ~2 a' ~# I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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