Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!; z( x5 B1 {* g$ m& R8 `! ^. O) w/ Y

# F7 w$ L# w8 M0 K$ e

( ~4 Z3 D' i" p+ l- iЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.4 C0 g; s4 _, {/ q) L
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!5 I0 w  G- n4 j7 w
Астралия ?
* w3 R, u- g+ ~/ j% E8 b) X
+ @3 Q+ W( Q% ^0 C

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!  f5 f6 v1 F1 m1 c9 ?& I- v& i
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
1 r' B. f* G. q3 h( ^7 t% ]" a2 M2 R& Q5 k. |2 j7 Q8 O0 U8 \
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 % `8 _( E; y8 x& i  X' S% M: f
AlexCoder опубликовал в 2024-10-16 18:316 u! L: \" L& o4 {
День добрый!0 S" j7 F9 P9 e5 I6 Y
В статье описано взаимодействие игрока с N ...

! `0 c% Q6 S1 K  u: H/ PДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. A1 Y9 S: s) t* I7 \3 B% v: \, d0 Q7 E8 Z, B# C$ |- R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 Z- ^. z7 `, P5 I
% F6 w) `! A0 o$ A& {. MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 j0 m5 `" R; q. l9 |

+ y6 i' u, t5 e: J
  1. <font color="Green">// Пакет для состояний монстра</font>; ~4 p  }6 v0 y- ?  {2 X1 K' v" ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 ?- T' L. \6 _0 `1 x2 X
  3. <font color="Green">
    # `, |% c, C2 [
  4. // Интерфейс, представляющий состояния монстра</font>
    7 L* @. y% ^) u$ c" Y2 F, W
  5. public interface MonsterState {% Z8 D" y, c8 @% K
  6.     void handleState(Monster monster);
    , t$ l; }! O$ }3 x  B) @: W' `9 O
  7. }& \2 I+ [* d: G, l3 z3 u
Скопировать код
0 {4 r+ p/ c7 B8 X/ V2 R
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 G# \6 q" O0 h1 u& Q% H9 P( w* a# V5 R% s' f8 F; K! r( ?- O
Класс для начального состояния монстра:  j5 X  j" P2 ^* l9 G$ C5 ]
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>2 j& a. ~/ |" Q; b% w2 J) _  |5 a4 P
  2. package org.l2jmobius.gameserver.model.actor.state;
    * e; g4 F6 m' f( |- ?* e  {- p

  3. 6 [- _- g: X6 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " `& @8 E( J& p5 g! W( X
  5. $ I. m  u0 w+ d
  6. public class InitialState implements MonsterState {
    / o' i; N3 g* ~* M* Q
  7.     @Override
    8 I4 M# Z( J5 L2 T$ i- D/ c
  8.     public void handleState(Monster monster) {" N7 r- E0 M$ U) C( x+ q) M
  9.         // Начальная фаза боя
    6 z) p/ N# Q; c
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 W* K# g7 ]( Q
  11.     }
    ' V- `9 [1 m  K, ?
  12. }( v5 z4 Q) j; F- T! d
Скопировать код
9 ~$ G, _/ Q" [5 a) q

# Z- W1 x# c* r3 z  O* l) d
* H. Y0 J2 X/ C3 F/ s% m
- F$ p2 Y* K$ A6 ~6 s$ O; k8 n; I$ J: @) F0 K) V
! a: u2 Q0 x2 V9 O

) H2 l! [# J% `, ~' I- b3 n
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
0 j9 s6 |1 ^. V4 C5 L2 s) x
( _+ v  U4 b) G0 ]. o& oЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 Y/ G4 `' c4 F$ x: K, ]/ Q) M0 a2 X, ?2 @& e3 e( p. a
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& j) c! n, `' W$ `
  K( |2 l( ^# y! F$ j
  1. // Пакет для состояний монстра
    8 o* L7 d/ r4 O5 ?- _( S* [
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 \# W* |" Y# n1 b! _- u. J* _8 @
  3. 9 d4 N( t& |/ ]; f8 p
  4. // Интерфейс, представляющий состояния монстра
    ' i, Z7 I3 k/ }$ o: ]& M  j( P. Q' \
  5. public interface MonsterState {$ x6 A& G( F! T8 n( Z2 J& X
  6.     void handleState(Monster monster);1 ^  m& }7 W# I+ W! `) M
  7. }
    & \& F( S, j9 M9 _! i
Скопировать код
2 a' _3 j" S) A0 m% x- m) x4 c5 }
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , u4 Y, {$ V/ K; d) l
$ g" e& h8 P7 f$ n! D
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  V! A7 D: i+ W! I
  Y' r2 [6 e( P& H* u. A# VКласс для начального состояния монстра:0 K0 `, G9 N6 J" N* m# A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      W2 |) J: v* N9 S6 n- S! |! \
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 b( u- r2 l" J

  3. 3 T2 r5 U7 Y/ @+ c% g
  4. import org.l2jmobius.gameserver.model.actor.Monster;" Z9 v! }; p/ W$ g% h) W

  5. ! r' d  x6 p' `( G. o
  6. public class InitialState implements MonsterState {
    4 Y3 D3 n+ w0 V6 X# c3 w4 U$ l
  7.     @Override2 e# k# j, M; i
  8.     public void handleState(Monster monster) {; a0 b' W# p3 K
  9.         // Начальная фаза боя$ g0 |) K  o. G9 G
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    6 v& D5 `2 J$ T$ }8 |9 _
  11.     }
    : G  M$ I1 j* M6 T
  12. }% ]3 i) y" T4 c1 N9 G* m7 n
Скопировать код
Класс для агрессивного состояния монстра:
- M+ q0 a6 o8 C* ?# ]4 x1 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 A8 S2 t. p3 V8 @9 E7 m  ?: K
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 j* x- b$ c9 U  I; f  g

  3. 9 D& h$ f6 l* z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * o" r; N" P  o) ?" j. Q7 d

  5. : w: x+ a2 N3 V2 F/ f0 P0 R. Z
  6. public class AggressiveState implements MonsterState {/ Q- x' r8 Y2 R% W! I8 P9 [* k
  7.     @Override$ E  d4 D- f  J7 L9 c
  8.     public void handleState(Monster monster) {; v; `8 ?  n( X1 n& j. b& `7 A
  9.         // Агрессивная фаза боя- j3 i9 V. z4 T6 c. E9 F8 s6 w
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ; N6 {4 b" ~& o* _: z: y( f7 g  Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 `" ], R* R" ~7 ]! H8 j% Y
  12.     }) O" Z3 `# a1 F
  13. }8 X& X+ _' N$ M3 \" k
Скопировать код
Класс для финального состояния монстра:: _- \% O8 N" b4 |' C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 p8 C: p7 y$ i2 ?* @2 r1 C
  2. package org.l2jmobius.gameserver.model.actor.state;7 G' q* W* X, x2 O. T0 T
  3. 7 E, B% u6 Y9 S3 i
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 K; A3 F% `' H( \
  5. , p/ y% ?, y7 v( k6 O5 S  r2 \
  6. public class FinalState implements MonsterState {
    - I0 b* z& O& F1 \% ]
  7.     @Override
    8 Q* _9 t/ s. h$ Q9 z
  8.     public void handleState(Monster monster) {
    $ e, u5 y" }3 h) u# B' J" k* N
  9.         // Финальная фаза боя  x1 G8 j) M* q6 f) L
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");  x! |4 P6 n+ u
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ e6 i  n; T) I8 _% C7 a, ~# `
  12.     }3 [0 y& ]' C- f
  13. }, H4 F" O9 C- {# ]
Скопировать код

. h. K' B7 T3 c; O) W$ sШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 n4 D) E$ h" ~* ]* P1 L! ^
  1. // Пакет org.l2jmobius.gameserver.model.actor: \* l9 m6 N* I
  2. package org.l2jmobius.gameserver.model.actor;5 ?5 q9 A2 @3 W2 P
  3. 5 z3 X1 g8 t8 m$ B  B
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 d2 Z% m- h( @6 ?7 q0 ~- M8 W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 v! Y1 y" I! J/ C% O. i

  6. - L- i) M4 }5 l7 D# l
  7. public class Monster extends Creature {3 b8 T# n0 P5 K% p8 K
  8.     private String name;
    0 B8 h$ [' ~. c# x6 V
  9.     private double attackPower;
    ) ^1 i& M1 N1 l  P
  10.     private MonsterState state; // Текущее состояние монстра, _8 Y9 a7 C4 @8 a! P! Y. Q
  11. . v6 r2 o. x$ E4 z
  12.     // Конструктор монстра9 x& f$ N2 Y. o, ~$ o. o
  13.     public Monster(String name, double attackPower) {
    9 g+ S% H$ a+ D3 c' P3 l
  14.         this.name = name;: Y9 O$ s1 V1 E: ]( j
  15.         this.attackPower = attackPower;& s7 W3 m: Z& }0 S; o
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    5 r( J# S! @1 \! n! j5 M+ w
  17.     }
    * u' x- g& s! x2 ], p' |0 p
  18. . F  L+ c7 l- p) H& D
  19.     // Метод для смены состояния
    : {  e+ Z1 m4 |6 e
  20.     public void setState(MonsterState newState) {
    5 b+ A' _! v. i/ U) E7 l
  21.         this.state = newState;
    ! U! {; U, @# e; G
  22.     }
    + C+ I% @4 s* `1 P0 {2 b/ `' I

  23. ! V/ L* V8 p9 w) G
  24.     // Выполнение действий на основе текущего состояния
    2 `: g" r7 N5 q% Z# Y) ?2 x% q
  25.     public void executeState() {
    $ M/ q- U/ ~# I: n
  26.         state.handleState(this);! ^( j/ p5 |0 K7 i" e
  27.     }  J+ B0 e! k$ t7 T. p- U( a' }
  28. . B+ w8 p  J/ l+ g9 O( ^( b
  29.     // Геттеры и сеттеры9 _0 `- ^5 {9 d
  30.     public String getName() {0 A# x5 M- k" {+ M" n
  31.         return name;
    + f7 N- ?0 U2 n9 \5 r  |; T
  32.     }
    5 {: B# k% }' j  C+ c6 }: S
  33. + E" @' q6 n3 ?* \8 D0 _
  34.     public double getAttackPower() {
    + |' L$ b5 Q( K; ^8 M3 y5 X
  35.         return attackPower;
    + D& v, t4 t8 l$ y4 r* F
  36.     }
    ( E) [8 F, T: k* G/ l1 Q

  37. $ x% T$ G& ^  s8 D7 E
  38.     public void setAttackPower(double attackPower) {
    . j  ^+ k9 U3 j& \- y
  39.         this.attackPower = attackPower;+ L5 R. [1 f7 Y. O2 `5 @
  40.     }- T$ C' _* p! `6 M  i7 u0 Z6 Z
  41. }
    7 R0 C) j. J9 G8 r- g6 l
Скопировать код
: c: t. U% }4 w) i  t
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
2 b& `% [4 n4 i) B2 I# m; `0 n5 D) u
  1. // Пакет org.l2jmobius.gameserver.model.battle& o% g' K3 P4 Y2 v) J) x; w0 z; m" e5 E- d, x
  2. package org.l2jmobius.gameserver.model.battle;* ?6 p$ \( \, W* h
  3. : h9 I, J: r9 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;  \3 s) ~) `( |8 K& W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 i1 l; k& X5 s, q
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    9 z/ y2 |4 I: m& L1 r
  7. 2 \$ Z# E8 q' g: Z2 `2 X
  8. public class BattleSimulation {
    8 Q. q' |* C# P$ Q
  9.     public static void main(String[] args) {/ U* a( F/ k- B$ u8 s8 q7 u9 N/ h
  10.         // Создаем монстра с начальной атакой! a" G& D- @4 N9 K( E" j
  11.         Monster monster = new Monster("Дракон", 100);
    2 g8 A' r" O5 n+ }2 }0 E

  12. # n0 k) z3 ]$ E. j/ H
  13.         // Начальная фаза
    # g7 I2 v; H3 p5 t
  14.         monster.executeState();
    ; U0 p" `: {' }/ f' G7 t6 z
  15. 4 v8 h6 P' A! i7 C! ]
  16.         // Переход в агрессивную фазу+ H, [; e2 d. Y7 Z# w$ v. U2 a2 J# B
  17.         monster.setState(new AggressiveState());
    0 |: y+ _  Q% B2 Z. O6 K
  18.         monster.executeState();% g' F' a. N5 o3 q# e) o* H) @& S7 i
  19. ; ^; E- C  z; q, H; H$ k
  20.         // Финальная фаза
    8 Y0 c( H& n) p# b& Y* N/ D( N
  21.         monster.setState(new FinalState());# E; ?9 s: }' T& h
  22.         monster.executeState();* J$ E9 x' {$ ~; M1 A+ ~, b
  23.     }
    6 {- \2 P+ ^, j$ p0 d6 h
  24. }$ P. }# g0 z% U# H9 B  d
Скопировать код
+ u$ `: j8 t9 q
Комментарии по структуре пакетов и классов:  `& I" z, ~' w! n+ I
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев./ H9 D0 Q+ M( c3 ]' N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# e6 `! {) R& \- `) qЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. f4 x( K* l) S7 ?6 m

4 _: ^2 c9 Z, V8 Z7 L
0 C3 Z% s1 p# }+ g8 p5 C" k# X% M. J- A7 ~1 L1 T

" v1 f3 G' p  l( ?7 d1 {7 m
: a6 P, N. R- A7 h% T
9 u" i$ U2 ^! x4 E# \( k: u' Q- A2 E: i) h  E$ Z

2 F- [  l$ I! t& K+ ]3 |/ P8 a, c! m7 s

) L; w! Y9 [( }' f
+ O# @% p2 }# N" i/ k1 a% ]* D( k/ f7 j( B, ?0 v
4 |7 |/ B4 x: y: m1 E  @

) T7 ^4 n" w  v2 A% {( G
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
7 l) q; {1 V( A( BДля управления сложными взаимодействиями, такими как  ...

0 n7 K; V$ i& S; P2 S5 B5 a% WОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
: u  g$ ]4 C! YОтличный подход! Использование шаблона "Состояние" де ...

) \8 j% M$ L2 e9 W. u' [3 nХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
+ Z1 v* x6 R: f! O$ d' S* R+ y9 k: n% C6 X; F
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.  _5 O2 X9 y- v6 x$ M. N

7 I% `* i$ ~& O3 j$ J! d: s
  1. // Пакет org.l2jmobius.gameserver.model.actor& ]9 D2 t2 T( Y0 _) s
  2. package org.l2jmobius.gameserver.model.actor;
    6 j& r5 `" D0 w" N* H. U- T

  3. 8 N$ m) Q; W6 C+ t2 w5 S
  4. // Перечисление для типов атак
    9 B, W# |+ E$ p* E; Q
  5. public enum AttackType {
    8 t, j. m5 F# G4 _0 i
  6.     PHYSICAL, MAGICAL;0 c$ h2 r7 @8 x( O" q$ O
  7. }! A* J7 G  Q$ x( `
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
0 _( ~' C8 Z  G) {- vОбновленный класс для агрессивного состояния монстра:
- j* [- [/ t: {9 I8 e/ d5 R
+ Z7 v: ?2 B0 n5 M3 h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; n$ w4 u! u( R
  2. package org.l2jmobius.gameserver.model.actor.state;1 r6 v3 Q9 W8 h8 s! T
  3. / O# V& e" \9 m# p: V$ W0 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ r3 e8 p; i/ P5 x
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    : q8 Y2 J- n# B. M1 k
  6. 6 V* \+ U; p9 c8 m
  7. import java.util.Random;  Z, m7 c9 Y% C3 r; i( O
  8. 5 X; t. @1 u- c) G( E* @9 d8 A4 `
  9. public class AggressiveState implements MonsterState {! ~8 [! q1 j, a7 ~& ]3 y! W
  10.     private Random random = new Random();
    0 g( f- w: L: H1 b5 \- M$ S$ D
  11. 8 Q& `7 U2 j- R  U4 r" a
  12.     @Override
    5 T( E% d+ X4 U4 n& |7 r2 `+ Z
  13.     public void handleState(Monster monster) {
    : k9 D4 t3 j2 w, u0 G$ k5 P
  14.         // Выбираем случайный тип атаки: физическая или магическая
      N) S8 Q# h$ K( E# I* ]) i
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    7 P( d- T3 G- C; V( J+ c3 G
  16. 7 E" z; G* [- ?7 r6 O5 U
  17.         // Логика для агрессивной фазы боя% Y( U7 f  t  Y4 A$ N" A8 y& z+ Q
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " , A0 ^0 f* J# u& p$ n( [5 g
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    - i% T9 s& E' [- f, |/ E# m$ p
  20.         
    ) M, d) }4 Y# a9 g7 v; l( a  c
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    3 X+ o$ s9 c: Z+ q
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, {; B! g( d" X" w- N' o
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);% ^+ A" k0 G3 b9 {# Z* J
  24.     }
    " _/ x7 d2 z) y
  25. }
    + e- ~8 Y. A# }! I! e6 O7 v5 q/ Y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки, F( J+ K! D, z' ^0 s" \8 i$ g

5 k$ m  @* I- c  n9 ?( e. T6 g
  1. // Пакет org.l2jmobius.gameserver.model.actor0 v' V; g6 p9 H" f
  2. package org.l2jmobius.gameserver.model.actor;
    4 w* z/ a& a$ y

  3. 9 d" {5 `" l" N( e  m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- F3 @4 U& }. j  t& h9 C% N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- G- X. o5 m0 O) y% u2 r
  6. 1 F: N( ]. ~( l
  7. public class Monster extends Creature {8 ~0 D$ h% D7 p5 u% S. w
  8.     private String name;# K5 |  r1 U4 `0 @: G5 a/ u2 X
  9.     private double attackPower;% E- F: l( ^5 V" }
  10.     private MonsterState state; // Текущее состояние монстра" n, R) i6 A; D" ?% X* ?' v0 U

  11. " G# Y3 E. G' y$ Y
  12.     // Конструктор монстра
    ; H+ s& o4 S! A# y# ?
  13.     public Monster(String name, double attackPower) {; c9 ]+ P* S, ~9 f7 R# p- \
  14.         this.name = name;
    - s. Y3 n/ S0 |
  15.         this.attackPower = attackPower;, d" t# @2 B' y0 S! T2 {! b$ S
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию; H3 N  T  W7 ?9 C. |
  17.     }$ s) O4 j" }6 Y3 ~$ f
  18. 1 P# W9 r2 }8 K7 c; X
  19.     // Метод для смены состояния
    0 K2 F, O, u% n' G+ f8 n5 V: i
  20.     public void setState(MonsterState newState) {
    & w/ o. g% j1 e5 _1 C
  21.         this.state = newState;( b: l" R; C! R* c( N
  22.     }
    5 z: U+ ]5 q+ ]$ q3 Q
  23. 3 F  r& \6 z9 d) [7 Y
  24.     // Выполнение действий на основе текущего состояния8 w3 V4 o& q6 o, c  U% P2 x# _
  25.     public void executeState() {7 v% y( ]) u$ H) u
  26.         state.handleState(this);
    ) T  b( |  V+ m: C* T- A8 l
  27.     }% p- O( d4 {8 v% t* u

  28.   ]3 I9 O! o( T$ A: G$ A! {% ?
  29.     // Геттеры и сеттеры
    5 U* P2 q, D; Q) h
  30.     public String getName() {
    ; _: H" G% ]0 W5 l1 N. W
  31.         return name;
    + w0 w: p/ l/ i( g5 w/ V
  32.     }( _4 w- q4 B$ f
  33. ' s9 a% a$ W3 E+ I; z& T* O
  34.     public double getAttackPower() {
    6 b+ j/ A8 f) f7 |" \0 Q
  35.         return attackPower;
    - N4 X; P) x: R5 D( D
  36.     }) s: l1 d9 ~% W. n9 w* ~- @
  37. 1 ]. S+ D6 B: m. T( [. F* P" \
  38.     public void setAttackPower(double attackPower) {* S; p9 U$ [  ]' A% w( `
  39.         this.attackPower = attackPower;  x# Z7 l' g) v! ^) ?& r
  40.     }; C' s5 m. C6 I) A6 n* O& F* s% w
  41. }
    # T/ @6 C- v$ Y1 `
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.; D) ]9 ^$ _1 Z3 s' v
$ ~9 F7 \/ I# {
  1. // Пакет org.l2jmobius.gameserver.model.battle
    5 K  _4 J$ C* s( C$ x! ^
  2. package org.l2jmobius.gameserver.model.battle;
    ' \+ T' g  |: q3 ^; {5 D5 b

  3. 4 O4 e' L  v# e* x% f5 y5 ]: L8 s' ?# W
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 n& @& F0 S& P) G. @% u! x- o
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) r4 A& n4 c- ^* j# H- X! E
  6. ' S. `6 _  y5 u: t# E  K5 t
  7. public class BattleSimulation {  \" P6 F8 P& A
  8.     public static void main(String[] args) {& s! p5 X# H, K* q# T+ x; ?
  9.         // Создаем монстра3 g) S0 x' r" Y' l
  10.         Monster monster = new Monster("Дракон", 100);9 R' P* {+ f5 @3 m- S

  11.   k, w1 I9 R3 e5 s+ B
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак! h- \, W3 Y# Y( F- y5 y3 \
  13.         monster.setState(new AggressiveState());3 h+ R( n  ^' V# w3 T( u1 e
  14.         monster.executeState();1 o7 W' b* ~7 f7 z4 i1 Y" r" e
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 J- ^0 _3 |7 w* h; f
  16.     }) ?3 Y  O- s' _: I3 l; S
  17. }
    + [: L5 ]' T* ^0 }; E# K
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.- S$ {: v. J: l0 ?4 ^. ?$ q' R
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. s8 r4 |8 I* j) P4 p, Z
) X7 O3 J' a: I& p; h% ]) w7 h

( p( o" M1 [1 [$ Y+ w' V' U4 I
% X+ a4 M7 J, j& G" l8 \
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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