Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!" D- `. C4 Y6 o$ L/ H0 `

# ~5 L: u, h( a
- V4 X* Z; _+ C) _; k
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 z8 y! W5 Q. ^: F( E- B
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
( Y; w6 Z' b$ @0 c0 _3 @; }$ jАстралия ?
/ _8 w. Z' Y/ {
% |5 g# _" O" w9 T4 `8 C, n, M

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
1 ?& [5 }8 c3 @: l. O' D, \, kВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?  B) U, }. i; M% q

* L0 m8 E. B, u0 R
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ( Y( ~( v7 T0 {4 n4 @. b# K
AlexCoder опубликовал в 2024-10-16 18:31
" P3 [% W6 O9 W6 ]День добрый!1 Q! ?+ H; E' V& H" v
В статье описано взаимодействие игрока с N ...
( d1 `' r5 t- v! g
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 t9 d; @5 m) R' c  X/ t& |$ L( \) _1 p* n( _' m; a5 c1 }  x0 x! x
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) z# N$ j9 t9 O" E! i% h2 f# G2 ^9 W: {4 n# B; O
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- L1 Z: n# L& x9 z: q- L# X) R% V0 M% [
  1. <font color="Green">// Пакет для состояний монстра</font>; W1 W: ?) {7 ]; |
  2. package org.l2jmobius.gameserver.model.actor.state;3 B& V2 n& m; h
  3. <font color="Green">
    ; z% n  i0 z( D( }, p/ }+ y
  4. // Интерфейс, представляющий состояния монстра</font>. M5 S! o' I, a2 K- b: Y. d5 r
  5. public interface MonsterState {& J% h, N! A1 S; o) a- ^; O
  6.     void handleState(Monster monster);5 g( k+ X1 N+ l, ^' `2 q- Y4 P
  7. }9 l+ T1 I0 w2 t6 P' B
Скопировать код

7 W: Y9 a7 T2 e4 sШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ w( ^; T* f3 L* b2 U" Z; S) j
6 V% S& b* l; Q' }8 h$ X/ H3 b7 E
Класс для начального состояния монстра:
( g8 P" \1 T. T  x; |
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    7 U9 b% U1 w/ l6 U9 h* q& T, L
  2. package org.l2jmobius.gameserver.model.actor.state;
    / Q/ a4 M4 U$ `) {7 U
  3. & s+ K& f5 v6 b3 ?5 N! f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . r* Y* M" ~. M, E$ N3 Y

  5. ' v/ N; Q' e- c
  6. public class InitialState implements MonsterState {
    2 I) D. e/ L2 p* ~5 N; \7 p$ T' R
  7.     @Override
    2 J9 K0 O1 o: D$ y$ h
  8.     public void handleState(Monster monster) {- e# C( I8 V9 c, l5 _
  9.         // Начальная фаза боя
    & Y. b0 ?, r/ E; Y$ l6 x
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 @+ f3 h( @+ b! N
  11.     }
    : @! ^2 {! m! @0 Q
  12. }
    ! U8 i: u( t' p, ^9 n$ S) p
Скопировать код

" b0 _2 I7 ^1 q' c: J" f# L* Z7 w3 {1 W4 Q: t
, s" _$ ?7 a- ~3 m6 Q( P) H" F% K

) n, ^5 T0 d$ z& L4 |! |% Y
. k0 x6 ~- M. R
( {  H1 @: U7 c4 J8 k$ N* u1 I; G; z1 M$ I8 S. ]' d* I% \
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 H7 ]% S0 i( Y$ X) U1 S) f1 R

3 M4 A2 l" j( X$ ^2 CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' \$ N3 A. L2 F8 f. I# d0 K+ T
! V0 q" y4 S$ ^  k6 H/ [Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 k/ z0 R% f5 H2 u! O; l
  C" N, Q3 D, `0 m( U
  1. // Пакет для состояний монстра; P* l; }- m3 X) D( g) C. o
  2. package org.l2jmobius.gameserver.model.actor.state;% A# D; m" N) @- d. o0 |

  3. ! X3 `+ x" w/ g$ o
  4. // Интерфейс, представляющий состояния монстра
    6 z6 X" P5 n" |% n& A, Q. `
  5. public interface MonsterState {
    ; N+ \1 p" U) n+ O) ~
  6.     void handleState(Monster monster);
    8 h" u; w4 A) r
  7. }2 b7 ~$ H# C2 e5 r1 A% o$ W- _
Скопировать код

$ ^, h4 m- b/ b9 Z% x1 EШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 L" w; d- i; Z( ^. k: O

5 D. L3 B9 m, m$ a- dЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% h; |' Z/ \; k% b1 `6 u& s* p; p; E! P' R
Класс для начального состояния монстра:
  Y& i7 d, t: R1 v$ `( ?' R$ n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " ?& f0 y0 Q2 x! O
  2. package org.l2jmobius.gameserver.model.actor.state;
    / r+ ~5 f2 m7 ]

  3. , |8 J% i/ Q7 |6 z+ h9 ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 {& [$ E9 N- F" A  ~% N4 i; z' t
  5.   G1 ?/ @) x  f% Q# ~
  6. public class InitialState implements MonsterState {
    # U/ M; G, F4 S0 R7 u- R" J+ ^
  7.     @Override5 d& u& f) b5 j- M! Z0 O- {5 h. y
  8.     public void handleState(Monster monster) {
    : H2 v) ]$ `! y4 T+ k2 t
  9.         // Начальная фаза боя
    / k7 G& b9 b* D0 m# ?  o- @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " m" N; K) g" y; g0 _
  11.     }
    5 {0 I- L& l( D$ u# D
  12. }) ~' z) T& e! E7 b2 T8 z) W* x. ]) J
Скопировать код
Класс для агрессивного состояния монстра:' N" o" [1 A5 S" I1 s3 }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 `- G3 v; N& i! B
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ K3 v% ^2 c1 e, q; h7 j
  3. ( Z/ z/ R8 C: F
  4. import org.l2jmobius.gameserver.model.actor.Monster;# G8 H2 {  C: s
  5. + T, @; A1 F0 a9 o, L4 X8 ^8 g
  6. public class AggressiveState implements MonsterState {4 C- f& K- o( b5 M( e! t
  7.     @Override8 e: _# f; e' s/ Q
  8.     public void handleState(Monster monster) {- O5 `8 Y) @5 ?8 z
  9.         // Агрессивная фаза боя" R5 \) E  d9 p8 c  \5 F
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* B( l+ O4 B, M2 J, @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ( D. g0 c3 L' d. s3 [& S0 [
  12.     }) I9 l/ I" t8 ^- l/ u
  13. }" L2 O3 G3 h3 @0 f% o5 X; L
Скопировать код
Класс для финального состояния монстра:
+ \  A5 o* _, r/ A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; O4 T+ X; I: y8 t
  2. package org.l2jmobius.gameserver.model.actor.state;" ^$ b: ~5 a7 v0 ^- H0 C
  3. 7 \2 c  O" @3 u  z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " g8 b9 j  o8 p; {" s

  5. ) u8 d6 |1 ~* l5 g- B/ `/ a
  6. public class FinalState implements MonsterState {0 g4 |% N1 G$ i3 G9 c
  7.     @Override
    + j2 o2 @5 O" b8 A: z# |% H; f
  8.     public void handleState(Monster monster) {: q9 Y3 E. D+ s
  9.         // Финальная фаза боя$ Y* n) \6 j5 K
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    % E, Z) q* b0 D( e6 v
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ Q' ?3 r+ k; V# t9 H8 ^( E0 _
  12.     }3 N/ L" V& O8 b* k
  13. }
    3 t6 n7 P! E. l: m2 N
Скопировать код
$ g! G; u0 R3 ?: M9 ^) J
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 x- k7 ^" O7 t9 \5 C
  1. // Пакет org.l2jmobius.gameserver.model.actor  b/ g* j4 A- u( k' c- F- L
  2. package org.l2jmobius.gameserver.model.actor;9 G8 ?$ V% l2 G+ N# J( L$ u

  3. - S! C) g, j) G: C
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ) B; v" C4 S8 v9 N& \2 N/ A) O
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 g1 G- v7 @: D1 |# W; s) n

  6. , P0 u8 p; r1 k: K6 J
  7. public class Monster extends Creature {4 v% A4 N! z7 X" K* w% x. ~
  8.     private String name;
    , P  [' k+ S) o
  9.     private double attackPower;
    6 x' |$ }( I  {4 y" Y9 ~3 T+ p
  10.     private MonsterState state; // Текущее состояние монстра4 [$ }0 ]" @# z1 U* v

  11. 4 b' e4 W3 A5 i, X! Z$ m% V; K" h
  12.     // Конструктор монстра
    % d6 C# n1 q: Z8 j6 D
  13.     public Monster(String name, double attackPower) {
    " J; M. }4 j" o( v) z0 b
  14.         this.name = name;
    : @  s8 t) H& E1 B6 s$ l# m  K
  15.         this.attackPower = attackPower;
    8 z/ g: [# @4 b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    4 _5 ?  m9 i1 d9 k) c! N: H+ L& P
  17.     }
    2 N" Z4 s3 y- r6 M
  18. 1 W3 o4 |/ V/ a, t  d* `
  19.     // Метод для смены состояния$ b; W  E: S  s1 g+ C
  20.     public void setState(MonsterState newState) {
    " A* l1 _6 J* a+ e
  21.         this.state = newState;
    ; D+ \8 t3 {: r) P8 P( _4 X" N
  22.     }2 h6 h5 g# `6 y  w! z' Q. }
  23. ' f8 x7 E/ o* `7 h1 q
  24.     // Выполнение действий на основе текущего состояния. e+ ]! V3 Q7 P7 N
  25.     public void executeState() {
    ) ^. I% `& `# G1 F
  26.         state.handleState(this);1 c/ B+ X6 x+ _1 f; P: `8 x  [
  27.     }
    & K& w0 T5 d7 d

  28. 5 Z4 v/ u' k. }- i3 K9 I
  29.     // Геттеры и сеттеры$ ~4 b4 w$ _' L# d! x$ o) g
  30.     public String getName() {
    ( x, O2 R- B" ?: S! o
  31.         return name;
    ! F4 l1 c/ Q1 m3 |8 _
  32.     }) Y/ W% {- d+ _; n/ L( w
  33. . P/ x8 S) d! v1 I" Y  g) R
  34.     public double getAttackPower() {
    8 u% d/ [1 R" \3 k1 M+ u$ a; w' x
  35.         return attackPower;
    0 ]$ O& q( P& `+ R: L* v
  36.     }& z, i+ r6 J+ r% i* f
  37. 0 R% |5 T% L* w6 s
  38.     public void setAttackPower(double attackPower) {
    ! d4 b) P6 i- G- L3 J# m, V( n5 D
  39.         this.attackPower = attackPower;# n4 A$ Q) L1 v; `/ `& O
  40.     }
    ; _! V( H; C6 Q  _8 Y* ~$ o
  41. }
    9 d/ \0 [: K- `5 R: h
Скопировать код

; B8 O' Z9 i3 h! h% ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: s0 \! T+ d- _% X; P3 m

, j# n! J9 `/ q
  1. // Пакет org.l2jmobius.gameserver.model.battle. ~9 d" @1 H& ~- J2 j: D: B7 Q
  2. package org.l2jmobius.gameserver.model.battle;
    3 l5 N% i5 _. M5 s* Y% ?% E5 G

  3. 4 `4 W) H: i8 h- q) @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + J/ j! _* Y# y- ?0 D( G  w8 [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 [6 r6 _7 P* m6 @) _1 ?) B) e
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    . I0 {5 i: E9 O# r

  7. 4 g6 [& [" D4 M" [' i, ~
  8. public class BattleSimulation {% Q6 {( p) {6 Q
  9.     public static void main(String[] args) {. h' o% ?2 t, M2 j
  10.         // Создаем монстра с начальной атакой  @% V8 A+ P$ {7 S, n
  11.         Monster monster = new Monster("Дракон", 100);
    8 h4 V, h7 Q$ }5 _1 F

  12. ' L" d  K3 U' p$ C
  13.         // Начальная фаза
    7 Q1 X# d0 D9 B* E9 r- Y
  14.         monster.executeState();" \% @0 m2 r, `6 K+ W- ?
  15. & j& m2 H* N4 F$ U" k- d& I$ ?
  16.         // Переход в агрессивную фазу  c" F8 R% d; f5 C# I
  17.         monster.setState(new AggressiveState());# s* Y% v# @6 h' x
  18.         monster.executeState();' P, z; B0 z: \. ~' ~+ x# v

  19.   b/ A3 {, @$ ?9 L  V
  20.         // Финальная фаза
    - u# j3 Y: _; |
  21.         monster.setState(new FinalState());
    7 ?7 B0 e, A% |0 J) q
  22.         monster.executeState();0 e' c2 w2 [# c5 u
  23.     }
    : D& B; A1 E' Q# K( k5 J* j/ q
  24. }
    9 O) j; t% M8 q2 U& X# z
Скопировать код
2 P' Z; L9 Z7 t
Комментарии по структуре пакетов и классов:
; M% B. o- t  ^8 e1 o: F: x
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ D: d5 c1 t8 ^' q" k& N* k
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 b2 ?0 _, O& X& f* W
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ s, d* `. n- m+ h% K' l" @

7 ~: f. n9 V5 k/ n% Y% N  t8 J5 _6 r, ?$ P1 `) D
; m3 P" |3 m1 y$ Q4 h

+ Y. a; q( d. n" B8 O7 l* H' h5 r% \2 K  A" A& \: K7 f6 x
6 D% ?! s% }, u+ D/ a
, ^% Q2 D' Y# ]- {, {! E$ R# Z( a/ c) Y
, I6 {5 ~3 I; H( F
8 w) M. m. H) ~4 w" y. F4 L
5 R3 c( _+ x# U3 i4 b

# \4 v7 n$ n3 K: i+ O3 R/ L
& S# W/ T$ K- U8 _6 r- \: V3 N% {8 T/ b- y9 D8 q( z. h
6 N- N! G4 V- C) j' C. I  E
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:043 _( ^3 r. s7 m1 l
Для управления сложными взаимодействиями, такими как  ...
7 g) ?4 }% D1 f% H3 n; F
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:218 w! V$ [$ N; U' |
Отличный подход! Использование шаблона "Состояние" де ...

2 j  ^7 I5 w; A+ Q. S0 nХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии." X( {" Z6 c( R

0 {9 f8 {4 W% g( SШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
  ~3 r: }! m. a0 J3 g# O3 r; P* S" u3 `" r: m  B
  1. // Пакет org.l2jmobius.gameserver.model.actor+ s4 W% F5 I4 W% G8 _5 J
  2. package org.l2jmobius.gameserver.model.actor;# d. l: n1 q3 r6 o

  3. + O/ F/ ^9 ~2 X5 z# u# [" V( q. D
  4. // Перечисление для типов атак
    $ k1 |6 ]0 E& L1 a# D5 c3 q- \
  5. public enum AttackType {
    , T% N1 L% a; f$ ]' r9 r
  6.     PHYSICAL, MAGICAL;
    ; f# M) L  |+ d( R( D
  7. }6 F- s/ Q, R+ Q) _2 O% C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.7 z: j1 r$ _4 C9 Q  B
Обновленный класс для агрессивного состояния монстра:
) s& Y. X( N" H2 |/ b7 {
: C* Z! L' q; h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 i. z( ]& R) l. ~
  2. package org.l2jmobius.gameserver.model.actor.state;- N7 k# X/ a3 V5 R$ q8 j

  3. 9 d7 n2 ^& B4 c0 ?/ C, D5 ?2 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;  p9 R5 s, m6 a! w# N
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ! e1 @' j7 \+ h8 W2 z

  6. & N* Q0 c( B' \" Q
  7. import java.util.Random;
    " t' k% H& `' `& l. u" m; ?4 s8 b0 Z
  8. $ {8 r6 G# D# m- i6 X
  9. public class AggressiveState implements MonsterState {% c  g  f8 p0 Q
  10.     private Random random = new Random();# {" ^' I2 [5 ^2 C" X. m

  11. 8 D) |% p& D: R+ T2 X
  12.     @Override
    - d2 U) i' r) s( Z4 ?
  13.     public void handleState(Monster monster) {
    / L9 ~# E6 ]  s: B5 e
  14.         // Выбираем случайный тип атаки: физическая или магическая% h1 t% `- ^+ J% {, u# e4 |$ W
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    . l, N* S, b, F: I
  16. $ e( h7 Y7 l6 l: n7 w
  17.         // Логика для агрессивной фазы боя
    ( f# b" Q' _5 u0 M$ ?
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " : A  r$ F$ n3 [% C
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! x1 n' `1 I5 O& s- ^
  20.         
    0 K' y1 V; e& ]( Z" |- X
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ) l0 ^1 d6 p3 B: @: J
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;1 N+ J) ~" l6 M2 U! t7 ?6 s6 P
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);  D. O/ @( k* z: `
  24.     }, R7 X! Y8 }0 W0 P/ `) `
  25. }4 j3 a) V- ~% q# `0 C' {' H/ K
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
0 [' r6 x' Q& G: H# t! d7 f! o$ e- ~- x! i8 T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 Q6 y8 m, t4 h7 v
  2. package org.l2jmobius.gameserver.model.actor;  ^- G& W6 l5 g

  3.   K" V/ K9 n' V; |
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ k% G, w# T' \6 n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;5 _4 \2 q9 y. I0 v; n2 ^

  6. ' s* L! Y: H* G9 ~
  7. public class Monster extends Creature {5 q( W$ K$ {/ |; n) o
  8.     private String name;
    ) _& r" F3 }. M& G: _' X6 E$ z; `' w
  9.     private double attackPower;
    % R. P$ t$ I- j$ {
  10.     private MonsterState state; // Текущее состояние монстра$ l  [* c: I5 O& _  j$ x% _" Y

  11. ; U6 D2 Z" `. B6 U1 e
  12.     // Конструктор монстра
    3 n" U& o% h  M/ o/ m5 @" f. L
  13.     public Monster(String name, double attackPower) {
    : p- f9 B. [5 v6 M" C6 e3 }6 ?
  14.         this.name = name;
    * x; w! X: R% r( [6 u
  15.         this.attackPower = attackPower;
    " Z3 d/ V7 ?  y$ a
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию  T" C* j% ?- ~
  17.     }
    0 w9 y4 _" ?3 r. q2 Y
  18. ) l1 s  H( }+ f/ e3 \
  19.     // Метод для смены состояния
    3 g9 W1 J0 {. J4 z3 ?0 w- ^6 m7 P
  20.     public void setState(MonsterState newState) {
    1 [! y+ v! u" x8 G  X" X9 G
  21.         this.state = newState;8 b3 _( F! ]: V" x
  22.     }
    - s1 J& }: x5 c( Y* i! t) \

  23. . y+ Q9 v' t7 H+ q2 q
  24.     // Выполнение действий на основе текущего состояния7 m+ W' Z$ s! B2 Z% I. e
  25.     public void executeState() {( }+ s) |: d! Y' s" H2 h
  26.         state.handleState(this);
    3 D8 y. P5 f# w" ^* }
  27.     }
    3 }% k% O. D6 v

  28. ( p4 `' c; ]7 R: z/ z5 R
  29.     // Геттеры и сеттеры5 v" |! g1 U- O' K% G8 Q, Z
  30.     public String getName() {3 m! k" ~2 N! @: V$ Y# ?
  31.         return name;
    ( s. T% M8 G# `; V
  32.     }0 s+ r# u1 b8 {, V
  33. : ~6 P% [% g/ i
  34.     public double getAttackPower() {* P9 X0 _: e" [' y0 m5 X7 v: n+ T, L
  35.         return attackPower;
    / G) A' k$ M) |4 G* y% J
  36.     }
    4 V5 e7 s! `3 r+ B+ M( J
  37. $ s  B, L' N  `4 N( v
  38.     public void setAttackPower(double attackPower) {/ S  ?; E$ _2 H! Q2 x# M/ I& T
  39.         this.attackPower = attackPower;
    & w- M7 j' m. I7 }4 y( p7 M8 Y
  40.     }
    - ], }, Y) @5 K& ~, H# s: _& Q- Y
  41. }
    7 F0 f% f) C4 K! o6 N8 a
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
1 p+ W4 b# A1 @7 n0 V3 n- h
* H% n; R/ o7 I
  1. // Пакет org.l2jmobius.gameserver.model.battle3 E  p; w+ _9 ^* P+ y+ y
  2. package org.l2jmobius.gameserver.model.battle;# h# d) q" G! d. |0 a: c# e
  3. $ g4 R2 E9 t( Q( P# H
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 L; E) T5 G0 \0 Y3 G9 {' [' k
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    9 s  D& c  x: T$ ^
  6. ( b* X1 W8 U6 \% k, V6 }
  7. public class BattleSimulation {+ O" `% b) ]5 Y+ h
  8.     public static void main(String[] args) {
    1 R1 C% v5 u& P5 a- O- n, M+ a
  9.         // Создаем монстра
    . z$ C' |. O9 `
  10.         Monster monster = new Monster("Дракон", 100);
    ' Y8 x: S: @9 V4 i" j0 o, |

  11. ! A/ {9 g. D1 N( H2 g2 O- s( I
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 u: _. K0 S2 L0 I8 C8 p
  13.         monster.setState(new AggressiveState());3 d4 e. F6 j& \  T  G. N: t
  14.         monster.executeState();
    8 U$ l/ [! H9 B# Q8 x
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & h; X7 W" f2 @/ }5 ]' U9 a8 ^
  16.     }
    * V. I! ^8 b  ~
  17. }
    ( g& l4 a6 }. T8 J$ I/ l# V/ j* _
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 T8 \3 r) }2 W6 D1 S) w
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
" ^3 \% `6 j- C# c$ Z0 Y. l6 v) W; e5 Y3 t. ]4 n
4 [" u& L1 W4 ^, X% H2 {5 N) C6 b, @8 X

, K3 ]2 M# Y& ~( E* C" K# ?" Z& x
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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