Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 V5 @) c; g4 e. ?5 Z

0 L2 ^4 M* c4 Z8 H' I5 ?1 r# l
: c4 S2 A: V; R9 o
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.3 `: ~5 v0 \/ N# l, Q8 ~
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) Y) o& H$ ~& O; d( W2 dАстралия 🌟% i/ P. A* M9 _1 }
7 x/ H' t8 s& a7 }: u

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
) f  n- }9 H: \( C: g0 ^3 rВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?6 O, N  k5 p: F

3 S" b7 z* Q, q' Z+ \
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ) G4 _& x9 C. e
AlexCoder опубликовал в 2024-10-16 18:31
3 x& o$ p, X! D8 F% oДень добрый!
' {! }1 L& I: Q! g5 S# GВ статье описано взаимодействие игрока с N ...

4 c  u3 @: |% n8 UДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 6 B6 B9 g; v+ J

/ i. A+ M1 j: O9 JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% t; d, K- a" F
* g* p# o* k6 u) ?  }, Y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' `) @. h- q$ t6 d* Q! ]. L: X; }- |

4 A: C& S5 g* h( J5 z
  1. <font color="Green">// Пакет для состояний монстра</font>1 e6 W3 b; u  I6 ]$ v. C4 D( p1 ^, P- L
  2. package org.l2jmobius.gameserver.model.actor.state;
    : b' I' {7 V3 P$ M0 b0 @. X
  3. <font color="Green">
    # H1 h. \; q+ F' @: m* }
  4. // Интерфейс, представляющий состояния монстра</font>
    . ^$ v% m2 q' W
  5. public interface MonsterState {) s" m# h5 u: k/ U4 }
  6.     void handleState(Monster monster);
    2 P$ c* G* x& b3 X; W% e4 d% S
  7. }
    * o- Y; M6 e6 K! Y! V8 j
Скопировать код
1 s( R3 l/ @2 L% X7 B
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.& j+ d) e3 w9 c( s/ ^- g
, Z3 {3 v7 i" ^+ W3 O; T$ P- r
Класс для начального состояния монстра:
- e# I- |' a" k& B4 v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>% a1 A3 j, F6 W& g3 c
  2. package org.l2jmobius.gameserver.model.actor.state;3 m  Q. ~% _; U# s% Q; h
  3. ' `5 t3 a7 w. j6 h( h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; z# e% M( l! J/ Q2 I" `

  5. 1 I/ N/ i4 C6 }& \4 l4 o
  6. public class InitialState implements MonsterState {
    7 F! n( V- t2 Q# n& i5 w+ \
  7.     @Override
    * S/ x) l4 |4 K) P* a, Z9 T
  8.     public void handleState(Monster monster) {
    $ w' c7 Z" q" H  d/ S
  9.         // Начальная фаза боя" n4 U, s' D* [; l2 o
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 A) C1 G4 m) a5 d' [0 E2 X
  11.     }
    & \4 g* j5 I$ R1 F4 |% g
  12. }
    % J8 ?0 l$ s9 F- ?4 `) ?# |
Скопировать код

5 n4 l3 R- m3 ~9 u
* w% t; e  J7 |/ c8 e" G2 m* t6 u0 C0 a5 E4 u  u
2 ^, w6 L4 b/ D9 K
; W0 v, L- E, x! k3 N# a3 x- q

0 J* @5 v7 ?0 N8 X! I" c; i- k1 i# K( Z1 x& r, [
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ N, k- E. T7 ~9 W) {
; C2 v+ m( D8 S3 R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 v  Y/ s& ]! s! I0 w3 M

3 a" n& U- _- r7 xШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% [( q: Q) G$ M2 r, J7 u

0 V3 k3 a; m: K: I5 S4 p
  1. // Пакет для состояний монстра
    8 w* e8 m0 @1 ]& n0 S6 j
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ g' `7 ?- S- O

  3. ! K' o6 y, B  v( \" Y
  4. // Интерфейс, представляющий состояния монстра2 f1 b0 ?3 `% l2 F$ c
  5. public interface MonsterState {7 t" K5 {; r8 x0 q# W
  6.     void handleState(Monster monster);
    " ~, |( u" E+ t. W2 B6 U( I, I
  7. }
    # X4 S$ s: M6 |0 C9 c- ?/ x& G9 O
Скопировать код
0 q$ E7 u7 j# M' W) C/ ~8 o1 o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ( U& E, W+ ~. \6 g, T

1 Q' ^% o: u! A; t6 V) O1 zЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 Q" y4 L& P/ \; j/ _

7 V. g, W5 O. ?' r, ]Класс для начального состояния монстра:5 g! W4 M# r  j7 M1 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 h1 S; a& f$ _5 r. P
  2. package org.l2jmobius.gameserver.model.actor.state;% j% P# {  M& T: E- q2 n$ e
  3. ( P5 o$ r% A, ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 P" r8 H  O4 E) n& y0 Q

  5. " ~. B0 i  @3 b. {8 p9 X
  6. public class InitialState implements MonsterState {
    # P) }! x2 k0 a
  7.     @Override! K' O& z8 P& q& o: A
  8.     public void handleState(Monster monster) {
    ) u% l1 |+ ]( R1 D+ }+ l+ _* p& D
  9.         // Начальная фаза боя+ N0 f  [1 j4 R2 v
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 h$ z# M5 X' U# O) B
  11.     }9 }; B& b2 U+ w% x' a. d! @: ^$ I
  12. }0 v7 V4 W! J9 m9 T' Y1 u8 @
Скопировать код
Класс для агрессивного состояния монстра:1 n; F* n  M, g7 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : g( K% h8 m6 V! x
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 B; v' T8 q* [
  3. ) F; E) v9 c* J5 @7 u" ]3 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 U4 l% [5 w1 i. P  w* r

  5. 7 Y8 ^" q) J% h% Q; v8 ]3 {
  6. public class AggressiveState implements MonsterState {
    & s  e: {" Y$ y% K0 I. |
  7.     @Override# K# O: d; p' N: i3 D  `% S
  8.     public void handleState(Monster monster) {
    4 U0 C2 ?1 d5 e$ [- A
  9.         // Агрессивная фаза боя/ m( J2 P4 d0 k5 l9 M" g9 d
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; S/ Z2 x8 ^3 h& F
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки: e: _! Q/ @- {" y5 \* t
  12.     }
    . A9 V/ f. S' h8 _' h! j. l
  13. }
    5 n, P, V( S1 t* D4 \
Скопировать код
Класс для финального состояния монстра:
9 W! @) S* r5 J0 w0 l+ ]8 g, f# Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 V0 r: I! V: C3 Y0 i6 B
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( U, W, Y/ v& _! ~- K1 D& ^7 c. [

  3. , E6 ~! T! ^4 v1 ~  D) ]$ q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! p! F2 N+ R, `
  5. . ~- A( }- k7 y6 h3 M& P1 R9 q: M
  6. public class FinalState implements MonsterState {
    0 _* e/ d3 q0 Y# P5 M" p
  7.     @Override
    6 P# ^& f  e0 E! [" c$ @. o
  8.     public void handleState(Monster monster) {6 O5 [$ q3 N* K9 e2 n
  9.         // Финальная фаза боя9 T, p! a" t9 u( K
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ; L6 }% M9 O0 D& x  D4 z0 {5 S+ x
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ B$ a5 D( }+ t" ~. |: a* V
  12.     }
    9 ?1 K+ a" A' s0 k/ d; |
  13. }
    ( P0 L, v7 e7 y7 U
Скопировать код
. E8 n4 l: S( b  ~5 l3 v) _9 _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.& J% p' b- C; i
  1. // Пакет org.l2jmobius.gameserver.model.actor
    & T5 j& n- u/ x$ ?2 a# W" \6 g
  2. package org.l2jmobius.gameserver.model.actor;' `. @6 `5 N( R

  3. ( d8 ?( q$ Y) ?3 h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    3 Y  F/ U3 q2 Z/ K% u
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;+ U1 P: z3 R8 |8 V  v" v0 W
  6. % D2 H( h/ O  N+ F- Y& Z! h% \
  7. public class Monster extends Creature {) m% `! s- A1 k. x# P% |: U
  8.     private String name;
    . ^2 w. P* _. b5 Z- U, J  ~3 J( d
  9.     private double attackPower;4 p1 \" g( }/ z( d/ D, N
  10.     private MonsterState state; // Текущее состояние монстра
    7 a) e/ t+ F8 Y$ [/ v

  11. 9 s% P* A1 J, \4 Z4 s* e6 I) c
  12.     // Конструктор монстра
    ; _5 [7 Q, ?2 a( p
  13.     public Monster(String name, double attackPower) {
    , h8 c8 E5 D0 g9 @4 i: E
  14.         this.name = name;7 V' Q; }. {" K0 {+ b9 J* \
  15.         this.attackPower = attackPower;
    1 [8 O8 C$ @. t- B" b% H" F
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    / }* O* p4 A# Z+ s! s  o9 z
  17.     }
    $ _: R) Q; J$ w: f
  18. * b3 _4 k4 |" T
  19.     // Метод для смены состояния8 q4 i2 E# B1 v/ O- w
  20.     public void setState(MonsterState newState) {' S0 K, j: r+ h$ S/ d& z
  21.         this.state = newState;1 A* _6 p2 J: q+ c, S' k, m% b7 u' {, {
  22.     }5 X) X- s9 g% [2 c% f, c

  23. / t- y+ x" M' `  R- b9 @
  24.     // Выполнение действий на основе текущего состояния
    $ T' p2 W- |5 E0 F# B6 s
  25.     public void executeState() {
    % R4 U- s$ ]' r0 ?  [" B- X
  26.         state.handleState(this);6 o& o% a2 c- k# w( d  m9 F
  27.     }' i8 W) J% K. O% g
  28. ! T! A$ A7 ?( Q; T& ~9 p
  29.     // Геттеры и сеттеры! X. J# p4 O  C5 k7 h
  30.     public String getName() {+ r7 s- T! Z+ V8 M0 a1 Z( x
  31.         return name;
    : R  X8 \" F/ P# a
  32.     }
    3 ?3 F% k  _3 a: F: L
  33. + n' U: I* |# \0 {2 M7 @7 P! ~# F
  34.     public double getAttackPower() {. l' W) w4 @& S/ v4 V
  35.         return attackPower;
    ! M4 U$ l& j  ]3 p1 Y
  36.     }9 D9 B+ P8 z+ n1 Y/ Q/ x( B7 V* x

  37. 5 T- `3 ?  k! @+ A0 Z7 \
  38.     public void setAttackPower(double attackPower) {( G0 _3 F$ w% W
  39.         this.attackPower = attackPower;
    , @! M: I7 _" M
  40.     }. b- s1 ~! n% d/ u# t/ C; e
  41. }
    6 f: @' s* ?5 d
Скопировать код

; @2 D- v3 |. S; JШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.2 Z8 M2 P" F; h" E. x. b% t1 Y
0 f- Q' L) c2 m( x$ v  `0 i
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 I0 u+ Q0 {( y. ~/ U' A5 D! P
  2. package org.l2jmobius.gameserver.model.battle;9 @5 }: y' d" m0 @- |7 K. P
  3. ( H8 g1 ]- x& b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ P0 ~) W* o" q9 ~9 m6 M
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) _" G4 U" s' t9 d' F* _! {
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    2 h# K9 L4 j, d# S! Z7 P
  7. : z4 u: F. E" t: ~) E
  8. public class BattleSimulation {% Q+ J% [; j' x3 f' c
  9.     public static void main(String[] args) {
    8 B7 e3 {5 u, c
  10.         // Создаем монстра с начальной атакой
    8 _/ {3 m( B& r6 H& _0 {
  11.         Monster monster = new Monster("Дракон", 100);" W* ~. ]# M; d" g! S, g' Q

  12. 8 Q: G0 O; E! m8 y
  13.         // Начальная фаза8 w* Q0 S' B% M+ e% F
  14.         monster.executeState();" U, ~' [4 V! G7 Q# u$ c
  15. & V  b- m' Y7 v# c2 x0 d, V
  16.         // Переход в агрессивную фазу1 U2 {( _1 e, f/ O6 l" q$ |
  17.         monster.setState(new AggressiveState());
    ! N* E  u! M/ {9 v& {# W% s4 I
  18.         monster.executeState();
    1 z* ?) W. w3 ~  a

  19. & H  |, F1 W2 ]
  20.         // Финальная фаза0 j; c! Y+ X1 A7 f/ q* u5 j$ F
  21.         monster.setState(new FinalState());
    * e1 Y  S# l1 A/ V+ a- m) `
  22.         monster.executeState();, ^% e' B. ~7 U+ L2 c
  23.     }1 t' M4 d6 Q) Z" v
  24. }
    . r) q4 {4 o7 v9 _0 F9 d
Скопировать код

; ]# _& _6 j! G0 K* Y7 DКомментарии по структуре пакетов и классов:
' |; t5 s' p5 u+ I) t
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    6 y" L4 D" S# {$ E, ?$ K
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ P* e3 P9 C8 h+ l
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: M( E' P4 L9 T( @; }  X

$ t. F6 k" Y1 q. @4 X& u: v4 N$ r! t4 x
$ `/ W8 C4 [! q6 D$ u! [3 [

0 `& [( b3 ~4 D4 a0 V5 @3 ?! S& r+ a, `! L, e2 }4 r/ Y
% f' f2 q# j4 l7 a' N  p

( \$ s& s) F1 U3 V- \/ C  h3 F1 N+ ~7 v) e. L7 i5 H* f( Y
5 d' M0 V, L! Z4 k; S2 _  ^

  Z5 s/ ]( @1 R% S' m3 i/ W' w2 j- l+ i
" e- A+ n/ n7 [5 J7 C- {
8 u* J, Q, d& l7 U0 v  k1 w

! z5 l& n, D9 Y; |4 n. p
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:045 s' ^+ U$ D# H0 s8 u
Для управления сложными взаимодействиями, такими как  ...

- ]' d5 ~- V0 o8 fОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21; b4 `3 @; c) ^+ E5 ?' F
Отличный подход! Использование шаблона "Состояние" де ...
( E4 G% P) j2 _" q0 W
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии., h2 Z) g* L% K2 |7 ~! y& D; d

3 B' k% H- Z) P  P; p' t" h. \Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
, |( f  r) C2 r
3 h1 r% n9 r# [( ]8 q
  1. // Пакет org.l2jmobius.gameserver.model.actor, A" v0 }/ L3 H7 [: `! v/ T: V
  2. package org.l2jmobius.gameserver.model.actor;
    1 \! ?0 p, y+ z: j, u
  3. . A. j$ u  B% U
  4. // Перечисление для типов атак9 \& {0 a! F" f4 c
  5. public enum AttackType {; e5 A; N/ S7 J1 A/ h, K4 Q
  6.     PHYSICAL, MAGICAL;
    9 L& Z; a* \+ Z& ]3 L5 j
  7. }# g7 M) c2 G# D6 ^" d
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
! \' j4 y/ c8 `2 s+ S# rОбновленный класс для агрессивного состояния монстра:& L* A- ^$ A* p1 g( x# {

' L% o0 P/ W4 [4 g6 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * l0 q5 W' V( C) f& c. P! ~+ T
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! k" w4 j5 [. K: X8 x* b, Y2 m# Q8 j$ |4 ^  @

  3. ! Y- I( V4 y$ v. b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / e8 t& w, y2 ]0 g* f4 Q- \
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    1 N3 Y6 G. `6 r$ }' s6 j. Z/ A

  6. 9 _/ i* l5 A2 ^4 W+ T* V3 d
  7. import java.util.Random;2 f; [3 O% h- y& a* `. L; E
  8. $ l! `; G- t/ v4 S* Z  j
  9. public class AggressiveState implements MonsterState {& q3 A3 _  X) Z7 p! Z
  10.     private Random random = new Random();
    , k8 {7 ~9 j! B, b3 f$ l5 R

  11. 0 c+ Y- F2 c6 t
  12.     @Override: v& J0 g# L, I6 {1 r/ q
  13.     public void handleState(Monster monster) {. v7 M5 s+ V: P0 F2 d& O0 u
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ) v  b$ `5 ]! s
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;& P/ ?. Q+ p9 b. {0 A0 ~2 ^

  16. : S$ V) N" W, b. }3 {
  17.         // Логика для агрессивной фазы боя. B5 ?2 `4 L1 c
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " & |* G- S  _- ~0 K4 v/ j1 x
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    / j: W6 @5 ]7 ?4 h
  20.         6 q6 W0 s! u/ Y: R/ Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  }+ S  X$ U5 f8 h0 M( f6 C$ V
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ! L, K! x$ p- i
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    4 ?! N- V' v0 e; h7 j" |: D- ~! L
  24.     }
    ( p" Y2 X5 V' Q* u  p
  25. }6 S  |* H+ {$ H4 Y4 O
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки/ p# h. _0 b/ X7 N+ Z3 H: x  o
+ |: q8 q  f3 E+ Q2 ^4 F& @/ _+ y2 }
  1. // Пакет org.l2jmobius.gameserver.model.actor, `+ ?1 v% R5 ]- j  `& W* A- b  M8 d$ T
  2. package org.l2jmobius.gameserver.model.actor;  N4 b! V. H$ U2 x2 p* N
  3. * H$ e0 c8 [2 ]7 v$ d1 ~7 V- \) P
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" M) N! Z( A5 O& B9 U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 J& R1 G4 q6 ~" N

  6. % E4 W! S" a; b1 @
  7. public class Monster extends Creature {- S& \, c1 K3 i0 O& j* s
  8.     private String name;3 f' A% N$ M+ F- `7 S$ v; h5 p) p+ \
  9.     private double attackPower;
    ( k6 i% |/ ~& O  x6 r5 b
  10.     private MonsterState state; // Текущее состояние монстра
    8 j% X4 P2 Z/ K2 J& p
  11. 7 z) u3 {. h4 o% d
  12.     // Конструктор монстра( M7 b' y6 j5 g, w
  13.     public Monster(String name, double attackPower) {
    : d+ h3 _$ L9 w2 i' f
  14.         this.name = name;+ G8 I$ w/ y4 X! ]
  15.         this.attackPower = attackPower;
    3 D+ h3 N2 }. `! x+ D5 s* z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию# L1 Z# b) V/ M0 \# U
  17.     }
    7 B/ ]% @: t' {

  18. + N6 r$ B# R" _: \
  19.     // Метод для смены состояния
    6 y! F# Q% z1 [& {
  20.     public void setState(MonsterState newState) {
    3 t' t- Y* B" q
  21.         this.state = newState;
    , n" {) l* L; M8 n! s6 c
  22.     }
    , }6 ~2 X8 o1 D/ T+ L

  23. ' {. z- r) I& }: D& X: z
  24.     // Выполнение действий на основе текущего состояния
    , }2 O2 t$ d: T5 k) t4 O1 B
  25.     public void executeState() {
    # \: @% `! q# L# Y' l# k
  26.         state.handleState(this);* R& k) F, V& y/ f. u
  27.     }
    * U- O0 V: j) s% r" O1 f
  28. 3 J+ k0 k  E5 C: Y8 z
  29.     // Геттеры и сеттеры6 e: f, B2 _. H! U; T/ d& k
  30.     public String getName() {
    ! W) H; o( n& E. b
  31.         return name;5 |# I$ n: W$ b4 o9 {: J
  32.     }
    2 t0 ]& g6 D2 M% i& s2 D

  33. . F7 q5 L- v1 q/ e; e
  34.     public double getAttackPower() {$ t- j2 f  o* w# Z% q$ w) z1 h
  35.         return attackPower;) y. O! C. C4 Y4 W; @
  36.     }) O) P! Y/ a4 N' B
  37. ' O4 \) G7 q* {1 D" A  K2 c
  38.     public void setAttackPower(double attackPower) {9 o% q* P* x' @! h/ d2 ^& x
  39.         this.attackPower = attackPower;
    ( Q" i6 {" u& x+ I% G
  40.     }: d) v& E$ ?# A$ @
  41. }
    * ]5 r8 v1 Y- }4 b
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.3 e8 L6 Z. d0 y
9 R1 }6 j% g7 Q5 n( |& p  v3 E2 r
  1. // Пакет org.l2jmobius.gameserver.model.battle, N7 |! o9 F5 N( G2 c1 T
  2. package org.l2jmobius.gameserver.model.battle;
    + G- p4 i* v! {) x" E

  3. 1 I% O3 I& t- n- b- t# g# ?* X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " t7 f7 l- Y- M/ l- p1 K+ {# }
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;. F2 P5 w* M8 m

  6. # ^' v/ D6 T5 A: z2 n& S
  7. public class BattleSimulation {6 q( F2 T2 r; w$ I6 u" b0 I3 \% O- A$ n
  8.     public static void main(String[] args) {+ |3 o: S- a+ [1 E4 M
  9.         // Создаем монстра
    / L' E  Q1 _  b
  10.         Monster monster = new Monster("Дракон", 100);$ s# ^! e" F: |( @& C
  11. 8 D3 F: ?8 F# k
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    - Z3 k; `4 n, G1 F5 M6 t3 P' i
  13.         monster.setState(new AggressiveState());
      h# Y4 w  ]7 V
  14.         monster.executeState();$ o8 T  |% F2 i0 {; a. A2 \" A* B% Y
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    : L5 d& J: |5 s) N
  16.     }
    4 ]# X) F5 h  ?' s
  17. }
    ( x9 K! q) h7 D; S# u7 ]
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 E& r. S3 ^+ K# T$ l3 B/ S2 Y# FЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& k) j4 |3 I' _4 @) n2 `  E) h$ p

; e2 J# c2 |6 R$ E7 V! [6 Q  }4 n3 b3 S. u$ b
3 Y; N- R4 R6 D" K; ^
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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