Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 R# e' [; ?7 c$ {( ]  D9 B
, M1 X: r6 j, b1 \) @
+ l* Y; N7 {. ~  F3 p8 l/ _
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 |5 K, x: U8 r* C4 x1 b! ?
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!' V) f) ^+ ^1 s2 A+ @: I; L
Астралия ?
; X4 `; s7 T$ ^1 N
, a- j; J/ i9 |9 [1 D  a9 U

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
& w% O; ^4 P& |8 bВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, R, ^, Y# l  v
/ k: u& u4 ?/ k- V
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
6 V* }/ S2 H; I  L/ u4 U. K2 U( M
AlexCoder опубликовал в 2024-10-16 18:31; }% ~' ]5 Z2 ^; i$ {
День добрый!
; F! y; h! j6 L  iВ статье описано взаимодействие игрока с N ...

8 D( e7 k$ |! p. [+ w1 gДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 e- b; r$ `  L4 E# U6 H+ i
$ h  V, }) O: s1 f" D: t! [4 I
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
1 A+ X4 @7 r2 g! Y& ?9 ^  j/ i" \. a2 o0 r8 B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% h) m' r9 e8 k! F! m
. O3 f' f$ j+ V% H) q
  1. <font color="Green">// Пакет для состояний монстра</font>
    . l, I; q. o: ]
  2. package org.l2jmobius.gameserver.model.actor.state;3 A/ P7 }% O3 S4 d! _, J* F5 q
  3. <font color="Green">
    7 o6 O0 j' B2 g" Q: A. C
  4. // Интерфейс, представляющий состояния монстра</font>0 ^- }, L0 `1 {- H, C# G2 g8 {% I
  5. public interface MonsterState {
    . z+ V) ]* O2 l
  6.     void handleState(Monster monster);
    7 |( p% H% u* l+ L8 Q
  7. }. Y+ a. T$ _+ Z9 p' e1 J6 @. o
Скопировать код

" x; n- b5 Q4 ?' W7 e; ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ O. P* h9 o& x* Z) e1 a9 \4 P9 A* G# q$ H3 _
Класс для начального состояния монстра:
% P4 o+ Q6 q- r: D
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>% C' v/ S, c4 w6 E
  2. package org.l2jmobius.gameserver.model.actor.state;) T% o+ d% S# Y$ B
  3. 9 o1 o& [$ y# N9 ^3 N& R6 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 |; h6 i/ b/ M2 D) ~6 J
  5. % b* C8 z& b6 u0 W# F2 e6 t& h" I
  6. public class InitialState implements MonsterState {. i; ?: T/ Z! `+ M! L" y
  7.     @Override
    # S6 `/ m, y! X
  8.     public void handleState(Monster monster) {
    . {: q& p7 ]8 \' o7 A6 n# {, S
  9.         // Начальная фаза боя2 P0 ~3 x+ _- q9 _; k/ I
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( h3 C  Z$ R# \; M( ]
  11.     }
    1 ^# a, N' P% b( T. a
  12. }
    $ }, r# g  Z; b  y! h9 f
Скопировать код

. N5 w  F5 T* ^1 x3 x
) U, J* m. V3 {8 B* k/ X% g% _9 x% {9 g. h! L

% ?. C' [1 L  h4 e, X" r* t/ f3 [: e/ u! N0 t
2 T' e' ^: e/ o+ O
2 x: \  P6 ^! W
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ s. |7 @, E$ }8 O4 {8 C/ j7 w0 F4 ~8 T6 W  C& t8 j2 I
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. k4 |' R% u4 `1 \
* Y$ t. e( w$ Q! K' l7 MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" K* A% ?3 o6 Q, z: |1 }/ g3 g" a( ?8 c# R8 t/ O
  1. // Пакет для состояний монстра) d: ^6 ], y2 B! w$ ~
  2. package org.l2jmobius.gameserver.model.actor.state;7 h. e. d' o! l

  3. . _" k+ k/ y& I% p" T
  4. // Интерфейс, представляющий состояния монстра; G$ _* H( x8 ], X0 V
  5. public interface MonsterState {
    ' v  H3 K  c9 Q, e. Z8 v0 I3 e
  6.     void handleState(Monster monster);+ `" o% y: p$ Y2 p9 g' y
  7. }+ M7 Z' H. B7 I  }/ [
Скопировать код
6 C" z3 O, D7 E* U& L2 [  d4 v
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 o) L( k; a9 Q7 i
3 S; m: s. w* ?: K2 h' P1 V# P, z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 M: @3 C/ _$ S& L, [- ]3 M3 O6 ?- X0 l: M* b1 Z, y
Класс для начального состояния монстра:
2 y  D, m. S8 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 S) L8 n, y6 g6 _
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 A! D" Q1 _% A: _( T7 X6 d

  3. 2 Z( a" T1 W6 f; @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( v1 p# R% O+ a  Z( ]
  5. ; R- E5 r* E3 _& ^
  6. public class InitialState implements MonsterState {: U& H, S% j; m1 c
  7.     @Override) M3 }% P& W$ P, H* o) Q9 t7 e
  8.     public void handleState(Monster monster) {0 \  q. ?$ _8 ^; T
  9.         // Начальная фаза боя
    ) ~9 f, g5 L$ F
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ) `" o/ H6 Y5 l7 E6 I
  11.     }
    3 }( [% g$ N4 s6 l' s  S
  12. }
    3 c& f7 T! K! q4 _7 q2 k( `
Скопировать код
Класс для агрессивного состояния монстра:! U2 u4 ?$ D3 t  k& p. B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state4 V) G: ^! g- H) \
  2. package org.l2jmobius.gameserver.model.actor.state;( O' Z3 j; x% E9 A+ w
  3. 7 y- Y+ P& a4 l$ K# B
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 Z! ?% h, \$ @* e6 s" T/ B
  5. ( v# S% }+ K; N: N4 |7 Y8 [
  6. public class AggressiveState implements MonsterState {1 ^% b8 U6 ]6 o# x- Z5 S
  7.     @Override' R' _$ h* H) `4 I
  8.     public void handleState(Monster monster) {( T) v  k) {' `
  9.         // Агрессивная фаза боя3 `: i& \8 W' U( z. w
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    2 h) I* ^/ {, B; w, B
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 ^, k8 Y8 r7 ^1 E! d% x
  12.     }
    & Y4 v: q! p1 E2 L
  13. }& }& Q+ a/ J9 w
Скопировать код
Класс для финального состояния монстра:5 w" r) K! B- @6 G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' O+ q- F1 b+ L0 f* D
  2. package org.l2jmobius.gameserver.model.actor.state;
    " J9 i! K% _7 F% \  O

  3. & n% U! A" p. x* K) Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 P1 z* Y+ g  V3 X
  5. 1 K+ H. I: [8 |( c
  6. public class FinalState implements MonsterState {
    5 G- T) E0 c; p; S/ @; }1 P0 e
  7.     @Override6 q" z0 L" o' [6 u& p
  8.     public void handleState(Monster monster) {; L5 p8 l- W2 A1 T0 n
  9.         // Финальная фаза боя
    , a3 \( Y+ A) y# E0 z2 E' }7 i4 Z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ( S. a6 t4 d& N4 ]. [7 v
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    2 y# l+ p9 ^( y* K9 N
  12.     }/ }0 v; O4 C+ C: h
  13. }1 c% G  V7 y4 x, }9 P
Скопировать код
/ W3 g5 O( G9 n  h
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ u" x5 V) ]; Z1 S" }& E5 g
  1. // Пакет org.l2jmobius.gameserver.model.actor$ I% a4 v1 J/ @# e+ R
  2. package org.l2jmobius.gameserver.model.actor;
    0 ]$ v3 E, [8 Y! O+ ]5 s

  3. 9 s$ l% p$ S0 S% R$ M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" D% F0 n* q8 }9 r
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    2 W. Q. C5 R) c
  6. 9 z# J% `' M* [0 p0 ?  ]2 ]9 `
  7. public class Monster extends Creature {8 t# l8 E( c" M! a: Z. {* S
  8.     private String name;, z2 u/ [: d' l+ p4 H
  9.     private double attackPower;2 A: S2 M! n  V0 D& e
  10.     private MonsterState state; // Текущее состояние монстра
    9 Z7 @! }0 @* T2 |# o

  11. 9 O: u- m) K6 Z  U+ k/ m$ Y7 Q, l
  12.     // Конструктор монстра& w; u, e" D! W) }" K8 C0 @
  13.     public Monster(String name, double attackPower) {. v% q: L7 Z4 C& f6 [- K
  14.         this.name = name;
    - L0 x# Z( p1 l8 i0 u8 B
  15.         this.attackPower = attackPower;
    9 e" v6 O' r% }4 X4 D  T8 }+ B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние$ E5 @+ t% I! u3 r; `0 q
  17.     }
    3 Q) `& O, p6 H$ j/ O( R+ n( C

  18. " m3 S. k1 L/ N6 [1 z0 u
  19.     // Метод для смены состояния
    4 g' l2 x& y: V. |
  20.     public void setState(MonsterState newState) {
    ! C/ k6 `7 ~6 q) C# g, U
  21.         this.state = newState;
    ( Z1 \8 V9 e" V6 H2 z
  22.     }4 ]) T  V- v: O6 h& I$ e6 }
  23. ) O' }+ t/ \3 K9 H! i0 D2 G' ~
  24.     // Выполнение действий на основе текущего состояния/ j: ]( G6 E, k( h; ?' a
  25.     public void executeState() {
    7 i( g: P7 d" u( o/ W
  26.         state.handleState(this);
    ) y0 I" r6 j/ U$ [; i$ k, @
  27.     }" Q" t4 b% J2 h8 T" a( h
  28. ' d8 `, X3 ~3 Y9 J, F
  29.     // Геттеры и сеттеры
    * Z- q; E& f. [2 S8 F
  30.     public String getName() {" L' T3 {1 R, f% o" T, i" F7 @2 i
  31.         return name;
    - z9 G/ d! n! W( ]' |+ h& {- h
  32.     }
    4 I4 o+ z9 s3 h4 X( y$ E  f4 h2 Y% q

  33. 3 g1 o+ H' ]3 Q9 G3 ~8 D0 I- w
  34.     public double getAttackPower() {
    / e5 l1 C7 K+ ~1 K' d
  35.         return attackPower;
    $ r2 k1 g% s% \2 P/ b: K8 m5 f5 C& [
  36.     }
    $ p8 ?3 v" T; i( N( p4 R' G
  37.   S$ o" H1 I  Z" N2 u. H
  38.     public void setAttackPower(double attackPower) {' P7 A  O. W; I6 a, Q6 k* u% F" L
  39.         this.attackPower = attackPower;/ S/ {' g4 w8 P3 B. a* F  M
  40.     }
    2 ^) V+ f, N6 t- F; m
  41. }, l5 a4 |3 |9 l1 t6 q" X0 _3 Z/ d
Скопировать код

5 X6 H) f. G) k1 P2 B8 ?5 MШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
5 F' y' z0 o+ k0 ^# m& j) X  c4 Q: G- A, g( w) p7 E: Y+ m
  1. // Пакет org.l2jmobius.gameserver.model.battle+ N! w/ T! @$ E& g  Q  ]
  2. package org.l2jmobius.gameserver.model.battle;3 ^0 s( J' Q+ z+ u' u
  3. 0 t1 ^8 W1 v7 d: M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 l9 x, z8 K5 k# X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! X5 E' Q1 z6 y2 A) Q4 U
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    - u/ J! R( n; s( s/ O, Q, L
  7. % x3 d7 k$ Y) v: o  L
  8. public class BattleSimulation {; B7 c  ~" [( F1 P
  9.     public static void main(String[] args) {. X, v7 H! {6 J/ J( D  {
  10.         // Создаем монстра с начальной атакой
    4 v/ R! E0 i" _3 p- ]# \5 J- e) V
  11.         Monster monster = new Monster("Дракон", 100);( `! E$ q" a) x& ]# i, {' }! L2 t; A
  12. ( E' |8 }1 b! f5 |$ p1 e, `
  13.         // Начальная фаза* i& o% z. o: i
  14.         monster.executeState();
    & Z! {9 o, W  h+ e% ^9 J1 B# R3 t4 L

  15. * U0 f' s8 y3 B  E8 n
  16.         // Переход в агрессивную фазу
    - R4 Y* [; v7 [6 W* ]+ ^# ]) n9 M
  17.         monster.setState(new AggressiveState());
    ) s" _: ?* f- G$ Y( Q
  18.         monster.executeState();
    ; t, O8 f1 t6 ]
  19. 2 f" z" r# k- ?3 J# c$ a
  20.         // Финальная фаза
    1 g. Z8 \! h# f( X: K0 ^& K
  21.         monster.setState(new FinalState());
    - w  S' x$ E  k
  22.         monster.executeState();/ f9 a$ [1 [/ Q+ C
  23.     }
    ! q/ t$ b4 W$ J# P- O+ I
  24. }2 u% J! b! L) y2 D+ T; |
Скопировать код
9 @4 ]- X5 E- T: ?* e9 m
Комментарии по структуре пакетов и классов:
9 B, C" c4 m% ^. [/ F7 A7 {3 W
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 _+ D9 z  r. a2 v8 t' U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! Z$ j' T6 V$ u$ IЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ r5 x* L: ]; o: {5 A- b( r; p5 V7 a
' l  F) O1 W+ v
0 F2 U* \3 P' C8 V1 J
- O8 z* @; |; f8 R- C: K4 W4 A

2 V$ M, t# c& E% G/ O1 {3 j* `8 r/ g+ ^6 F. a% j! `* p
4 x# K& q! i# X! ^3 m

5 V! e  d' P# N/ [1 c) I7 J, U& `( n6 L
: m8 r9 _5 v5 G6 t, i. Y! s3 p

4 Z$ a. h, ^3 a2 L
9 P: ]  A, `1 o1 J' W$ n% T, J) a: C
! Z/ `3 z. e/ U, z9 \5 J
9 z5 d2 U0 k+ k2 B, [
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
. ?# u  z, {3 CДля управления сложными взаимодействиями, такими как  ...

$ h  [- P9 b, s+ PОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ G; U# p+ X4 V7 ?9 F2 v* cОтличный подход! Использование шаблона "Состояние" де ...

! s! g/ e, U8 R. H/ y/ qХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
7 L) `/ H8 E# W5 o- \  A% w, @' n) k
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.3 x8 D( F/ a: d  ^3 `/ M
0 H& G5 f( B9 r
  1. // Пакет org.l2jmobius.gameserver.model.actor& T* _2 |6 r6 o7 ~% v
  2. package org.l2jmobius.gameserver.model.actor;9 r& h- p6 Y3 I9 g. u% s
  3. ; y4 R# o* h7 H2 _
  4. // Перечисление для типов атак
    ; \% U4 J. z* B4 s+ K+ ?
  5. public enum AttackType {
    9 g3 L$ q- ^; E+ S; H& h5 J
  6.     PHYSICAL, MAGICAL;6 M9 z# B. Y" W' l6 s
  7. }1 G( T; \; t3 q* }8 V
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
5 ?! B0 Z- m( M7 {Обновленный класс для агрессивного состояния монстра:& w9 e: L8 p  V4 Q* T& x6 c# ]
# c% j9 U# i, I! M' @& H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 }1 k6 p) e; N
  2. package org.l2jmobius.gameserver.model.actor.state;
    * y% k* p. n" t: ]
  3. % V; T1 o% k9 Z/ i9 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 d3 H$ d0 }  Z$ o
  5. import org.l2jmobius.gameserver.model.actor.AttackType;. J9 X) O" t& V+ F  [) X3 G
  6. ) l+ y: x0 w  i  a
  7. import java.util.Random;
    % a* u! H, D5 L, s! l" v
  8. 5 K( J1 _" Z0 e; G( O( I. |$ ~9 z) h
  9. public class AggressiveState implements MonsterState {
    . D  ^$ U) `6 V/ K  Q0 b
  10.     private Random random = new Random();
    # L$ Z# Y2 `% X& t1 A. X/ n+ L

  11. ) ?: Y0 C9 S, @8 V# |9 t+ ^. I
  12.     @Override
    4 e! e% ~: V( C# H6 n% K+ {* W
  13.     public void handleState(Monster monster) {5 M# W  Q$ i2 U0 u
  14.         // Выбираем случайный тип атаки: физическая или магическая, ?0 ]: e, B7 ^; Q1 l% z6 f( I
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;1 Y9 L8 P/ ~& @' }# y

  16. 7 Y0 {" x- y% i4 @2 ^* d, [- v( v+ p
  17.         // Логика для агрессивной фазы боя( m& C- v; ^8 _. Z
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ! s' ^* Q% u1 T. J) Y  q! ?
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    * G- Y$ z  J8 P  K
  20.         ' I2 K- h9 |# |. p8 J( M
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  @0 `3 u  i2 m- n2 v' g
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    / J% d' i: N& c, g) L, n6 O- S3 D. [$ C
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);1 M0 G, |0 z1 B7 N' ^
  24.     }
    , x# L7 @7 d1 R1 H! X4 @' I+ N
  25. }
    * r/ C9 E( M! I: P, Z: ?7 t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
  y- `+ }+ W* h' [2 f% R9 @) ~6 [# R8 A3 E7 Q: V/ m
  1. // Пакет org.l2jmobius.gameserver.model.actor, i9 b" d2 E8 F. p# r+ ?, q6 i: i
  2. package org.l2jmobius.gameserver.model.actor;- [* Z# ?/ Z! @; F7 r

  3. ; d/ |, U0 X4 v, g
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    - n# n0 ~& g2 k6 H1 N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % m7 r3 P' \) y8 e( ?: G
  6. ) P5 o, V6 J. ~" I) L, n5 }
  7. public class Monster extends Creature {
    9 G6 c7 I; b9 q
  8.     private String name;5 l# A' V1 W( J+ n/ E
  9.     private double attackPower;
    5 p" B4 q$ C! A$ S) S/ ?2 H+ E
  10.     private MonsterState state; // Текущее состояние монстра2 K, {# E/ b8 x% A

  11. * m9 I8 p" P/ \5 r5 }
  12.     // Конструктор монстра; i% t. S* B2 V5 A: B7 ]
  13.     public Monster(String name, double attackPower) {
    , H( u. e8 k6 j$ A  i
  14.         this.name = name;) R1 n" c# n+ f; ?( w' P4 @
  15.         this.attackPower = attackPower;, i' D$ r) c$ [* P3 U5 I, Q' ^
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    , |! B6 |1 y) d" k0 o8 u
  17.     }2 _( F; A8 t, y8 p' M

  18. . y  w" [1 D# K" n
  19.     // Метод для смены состояния
    , g3 ]! F+ Z2 M* J4 E
  20.     public void setState(MonsterState newState) {
    3 C7 G: K8 Q* V2 T8 I
  21.         this.state = newState;7 M6 y5 R+ X0 @' n
  22.     }3 W) T- `/ e8 N: S$ B( r4 U& p6 V

  23. - k) |% n- \0 @: V# h! R# s. \: j. j5 b  z2 ^
  24.     // Выполнение действий на основе текущего состояния7 J1 d' t0 `3 X+ Y4 R6 w
  25.     public void executeState() {
    2 l! F6 K% u5 p+ V
  26.         state.handleState(this);. J; p0 d9 R" i  P/ }5 t3 F1 s
  27.     }
    - D- E9 ^' K! s- Q: j" o/ z1 j

  28. # D7 S# B9 p/ q
  29.     // Геттеры и сеттеры9 U& R  ?& U9 `4 o% m! C
  30.     public String getName() {/ L) i9 W4 Y4 x
  31.         return name;* b3 f% ]+ ?! `6 w
  32.     }" P/ [/ x' B$ u2 F& e+ B
  33. - o/ t2 X. w0 \5 t4 d$ N6 E
  34.     public double getAttackPower() {) L; N! w8 u' U
  35.         return attackPower;
    ( U/ g9 i5 `1 f- _
  36.     }# n  D1 ?( Q" ~8 u' M; ^

  37. . P5 k# z  o# _* T# @" Z
  38.     public void setAttackPower(double attackPower) {/ Z5 R4 @6 b# j, P& g: a0 z
  39.         this.attackPower = attackPower;3 I/ h; A* ~8 N* L! x  N- o& [5 y% N
  40.     }
    4 z9 P5 d0 a4 f; y' J; b. j
  41. }
    : R# w1 P. m) F
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
6 D9 `0 z7 p: X2 T8 Q6 |6 Z/ H) T
2 B4 b& f1 d, Q% ], O4 B
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 y! A% p. T. Z& }6 q& E( R
  2. package org.l2jmobius.gameserver.model.battle;. W8 S. }! l( C9 N% t6 D; S

  3. & p" A$ l0 {2 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ ^! t! |! ~! D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    & ?$ {$ ^7 N2 [. [9 O
  6. : w2 w4 s" a/ c8 s9 q+ u/ e
  7. public class BattleSimulation {0 y3 \; U* f4 p4 Z! N& s
  8.     public static void main(String[] args) {! _( [) o4 a& L( l9 _
  9.         // Создаем монстра2 B, @9 ~: E. l& q: Y6 H- v- n
  10.         Monster monster = new Monster("Дракон", 100);
    & U& U6 T) m8 N% X6 G0 _
  11. ; S6 M# W1 N: ]6 H4 _. a+ a7 o& q2 T
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак; k$ e! e4 R- H& h' T1 r! G5 j
  13.         monster.setState(new AggressiveState());& ^/ h+ H2 ?/ n
  14.         monster.executeState();% v/ T, I' n0 u8 S! R
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 j. D; j2 y. a
  16.     }
    , M. D2 L" e' q& H& x
  17. }' f/ ^7 q. q& J3 Y9 I
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
) j! G' z4 g& F) G+ bЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!  m1 V, j' }! {' J$ r- r
9 J8 m0 P7 c9 o8 A1 ?  [, E
9 F2 V; X: ~. M* Q# Z) Y3 v

. Y1 Z4 h; G2 L4 H
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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