Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
$ f5 o1 v  f! w
- d$ ^$ t  q  d) E7 E+ s5 D

8 W5 d) B2 G9 f% u0 C- t4 {Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.) @4 d$ _; A4 S8 ~+ w  n+ u
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!/ M# W" X& x; \
Астралия ?
4 u4 B+ g9 {) q  q
. ]% O8 |4 |" L) J* F. w: H- a

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
. w- B$ P" ^! K3 K- T6 [В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?2 Y% i, G8 p# w* B
% L* Y3 i) _) s+ D$ Z' [( C
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ! s* w5 @: l2 w* ]! l2 D
AlexCoder опубликовал в 2024-10-16 18:31
% T7 R: |4 `  U1 j+ Y" U- sДень добрый!* t: m  \) v1 p
В статье описано взаимодействие игрока с N ...
& V0 S; B% n; m; ~8 d# U, [7 x# S
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
7 V0 H% x3 |/ }0 {- Q; Z: X/ z& E' X0 `: ^  L% u
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
+ f$ M' @- ^( m8 Y1 [- _. A2 y- w6 h9 m" _/ v8 d  E+ G( m
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- N/ `0 Z: }. n

3 i6 t, w  p- N) Q
  1. <font color="Green">// Пакет для состояний монстра</font>/ o: w& y3 h0 p9 w7 t8 [7 k, d2 R2 t
  2. package org.l2jmobius.gameserver.model.actor.state;1 p$ E+ o3 q# m+ I4 S4 z% `( w
  3. <font color="Green">
    & ^+ D8 e) I% W# T( a  Z  }( c! B4 w6 a0 ?
  4. // Интерфейс, представляющий состояния монстра</font>
    - N8 S  b3 v7 }% |  G6 P3 I, ]
  5. public interface MonsterState {
    , j) @; E+ q6 ^- C: h9 _
  6.     void handleState(Monster monster);
    ! p6 ?1 H# Y. W3 i; A) S& ~0 X
  7. }
    : v' E  `3 Z& k4 J5 x
Скопировать код
7 x& I# x5 a7 j  N7 y
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. |) P6 ?: r- G! Z) G/ p) |, }

: H$ u. [& n$ r  S* y7 AКласс для начального состояния монстра:
5 F" |9 J6 K' I5 r; u( Z
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>0 c$ v! i: F3 ]: U, ]0 v' J. I
  2. package org.l2jmobius.gameserver.model.actor.state;. W5 n" @9 U- Y

  3. / h/ x- G) {" }, g' s8 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ `( |7 m! V6 c! x$ b

  5. & s, {# y& t# H
  6. public class InitialState implements MonsterState {
    & x& L+ G+ S9 ?, \' J2 m
  7.     @Override# U  p" I6 W- ?2 N# v' K
  8.     public void handleState(Monster monster) {# t% ^$ J) J# e
  9.         // Начальная фаза боя
    ' a+ t$ k9 g0 f7 O4 L
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( ?8 X: Q1 l9 N' L2 ^
  11.     }
    * N; S! S5 u  d) C5 m" N! e7 F. Q
  12. }) H) y2 H" C' G9 ^# o
Скопировать код
7 G) ^8 o7 E+ c8 ~( ^/ O
7 E/ \+ h, S0 v/ a8 F. V# F
0 z+ g+ W* |: i

3 \3 B$ g7 U5 L5 c
+ }* G& d- D3 \& X% ~* |# F/ n: \2 T4 f
# m' f% A3 x$ k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 A: k7 A" a$ E5 h! Q, ^* u( `8 R) r8 o) z& X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ k+ C+ f) e' Q' c
) f( Z% Z0 K  f- p/ r' r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
9 L# ~5 K% S  K7 d8 d6 w6 j- B% _7 q/ p. O% _
  1. // Пакет для состояний монстра
    + E4 L9 d' W3 T3 k" [
  2. package org.l2jmobius.gameserver.model.actor.state;2 W3 H4 ^0 A/ i' ~& A, W" g, L6 K
  3. 4 f  r) Q. ^/ n/ A5 b
  4. // Интерфейс, представляющий состояния монстра% ]6 W% ?6 z6 T) [
  5. public interface MonsterState {5 P, s- b! ~% i
  6.     void handleState(Monster monster);4 d( L$ c. N5 _3 n# o" z/ l# P
  7. }" e1 _/ k7 ]' D: ?; J; a
Скопировать код

$ F$ p! `% T1 E5 c# H) y3 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; Y7 g" C( e7 t) X+ k$ n

6 |# Q' B* A! P) d5 p& \Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 t& r/ H& E. K4 c

, ~/ b0 k8 e2 q! g8 `. xКласс для начального состояния монстра:* ]! W1 g/ O( F) `* I9 V3 v) r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  k$ U: F7 g8 o5 S& Y3 {
  2. package org.l2jmobius.gameserver.model.actor.state;
    # z. @% r1 M8 D
  3. / |/ o; Y- L; _* l! |" r  U5 ^, P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / @" ^9 f1 J5 W1 H3 G
  5. ( S- u9 \% I& o1 C# F; K
  6. public class InitialState implements MonsterState {
    4 e4 {- k* A, B5 y
  7.     @Override
    , ^# u5 b% ^# h5 B
  8.     public void handleState(Monster monster) {( T) U0 d' P0 X- B4 y  w) h* @+ d
  9.         // Начальная фаза боя
    6 @3 p) r- R0 V5 L1 S5 {
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # s. A0 s$ }; h
  11.     }. P) H) I' q3 [5 E* z$ s$ A" ]
  12. }
    , Q. T8 @6 @' b, @5 T* `
Скопировать код
Класс для агрессивного состояния монстра:- F  `8 G  b  w) B2 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / E7 s, q1 y3 ?1 X# e. X% d7 U
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 K3 \- [: p5 Y) c# f
  3. ' V6 P& |' p3 ?3 o, @3 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;# J6 s7 S9 Y9 {; W8 V

  5. ' Z! |  p: M, ]( ^" C9 Y
  6. public class AggressiveState implements MonsterState {+ g" {) P7 H& u0 h" ]
  7.     @Override$ j+ ?, E/ [- W- \. |! x
  8.     public void handleState(Monster monster) {
    . ~% _7 ~9 p0 m0 u, f$ B( X" h
  9.         // Агрессивная фаза боя
    0 Z; Z, i' M: Z" t& c# D1 ^5 x, l
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; E, S5 [% H0 K; M
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ' \- @& \5 [; t% F" v) y0 {4 z+ y
  12.     }' A& Q6 C, f/ v# o& ?2 k6 z% `1 Z- e
  13. }- n4 t8 ]# i3 K0 }
Скопировать код
Класс для финального состояния монстра:* r2 m7 v  l: N4 s4 R5 R% t! W8 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( q* D4 u+ t. W; d2 H- {2 k
  2. package org.l2jmobius.gameserver.model.actor.state;3 W0 i7 z2 K7 W7 {4 T

  3. * N/ J) J4 n4 ~. ]. a
  4. import org.l2jmobius.gameserver.model.actor.Monster;; ]3 Y" Z6 L5 a# d0 u3 C' \0 B
  5. 2 }4 _1 A2 T* E: t
  6. public class FinalState implements MonsterState {  U- }! p6 C" G* z' M
  7.     @Override
    / F% _3 L. _% ?- s  A
  8.     public void handleState(Monster monster) {
    , O8 ?, D/ H1 C
  9.         // Финальная фаза боя
    * c. a/ N5 [: n# L) U6 ?. m$ y; Z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");( C! b0 v# Z- h8 {3 N' x1 t" O
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 @( _2 r6 G9 M  J' M
  12.     }& i& `9 w  `$ c; N! O
  13. }
    , Q* G9 P; I. Q- G% N! {
Скопировать код

9 @. H- m  j7 f- pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.$ n$ ]/ s# `6 H( f
  1. // Пакет org.l2jmobius.gameserver.model.actor4 A. O2 u( j3 s; S8 z4 {: r
  2. package org.l2jmobius.gameserver.model.actor;
    * X$ `6 C5 L6 ~: i
  3. 5 c/ B8 n/ u: G( B3 m% x
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 i6 e* F6 X" ]; _  P
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + m4 _, w  O  o4 ]' P0 k# i. c# G

  6. 5 Y. D  {$ v5 X1 x* h) X2 {8 g
  7. public class Monster extends Creature {
    4 B, h+ p: u; I$ Y: g! r7 t" c) M
  8.     private String name;
    , _: ~8 y. p) _5 `8 Q
  9.     private double attackPower;4 G* e) X6 L! a9 ^; F, A  L
  10.     private MonsterState state; // Текущее состояние монстра
    / H5 m+ v7 j* i/ k' n  l
  11. # P& u$ @- M7 z) M
  12.     // Конструктор монстра
      U! e4 c1 X2 D) X
  13.     public Monster(String name, double attackPower) {* e  ~% M' g0 o8 u8 y2 I! K
  14.         this.name = name;7 H( {. w! ^7 u3 a
  15.         this.attackPower = attackPower;6 l# w4 t- R4 |# z- y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние6 F! k" P6 e- {. {% I
  17.     }
    ) E, G9 m, R9 E
  18. + \1 @( i6 M$ N' m8 |" r. Z
  19.     // Метод для смены состояния& U( b+ h5 J( N  P; t) R4 p, O
  20.     public void setState(MonsterState newState) {
    ' \( P( M7 T8 N' v% b3 i- b
  21.         this.state = newState;
    , S! z& y* Q3 s$ ]
  22.     }8 q; R% m* u# Z# O5 z8 S3 M5 B
  23. ! j" {( r4 |6 L6 s
  24.     // Выполнение действий на основе текущего состояния
    : a# }+ h, I4 l1 U# V
  25.     public void executeState() {/ c7 L9 `6 A: @
  26.         state.handleState(this);; Q/ z/ n' P" D+ |
  27.     }
    * r, J) Q3 @7 G7 F8 e5 z
  28. 2 p) \; u" `( i# s& {+ y% A5 h
  29.     // Геттеры и сеттеры) h1 S8 \$ C6 \7 |! W
  30.     public String getName() {" P% }4 i4 \8 G$ q. \- i
  31.         return name;" E* I. m, _) Y9 c; O7 g
  32.     }1 ?4 U: I- d2 I6 |6 }5 O! K: W: d$ z
  33. # s/ ]! Q1 [8 ]6 z
  34.     public double getAttackPower() {! R. c& x" d8 v- g
  35.         return attackPower;9 A4 T2 g+ A; t) o8 n9 S$ ?
  36.     }
    $ t- T  R  b" B

  37. " l6 U; |8 f, n- O: r3 f1 F
  38.     public void setAttackPower(double attackPower) {3 n: O3 v, H" v5 s! S
  39.         this.attackPower = attackPower;- R. m9 O, t0 r$ x+ v) b0 |$ }
  40.     }
    9 b2 I* Y3 R/ s! T+ ?9 k
  41. }0 N5 ]* F- `8 k7 o" z
Скопировать код

8 S% [. w- t/ X; E) dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.5 N5 V- i- O+ U

; c2 [% l' U- m
  1. // Пакет org.l2jmobius.gameserver.model.battle! T* H/ z. n4 `1 P0 Z2 `5 R0 r- T
  2. package org.l2jmobius.gameserver.model.battle;
    + e! f  d2 b! w8 c+ W
  3. / T3 n" d9 B& O* I
  4. import org.l2jmobius.gameserver.model.actor.Monster;- A$ x: g( U( {. u' y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      O$ {4 H% p1 h" _% I
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    + T. P. ~& e% w, d4 T; n4 \: o& w
  7. ) }5 q2 m8 Q) \; \/ N. X) T
  8. public class BattleSimulation {
    ( }4 [6 O4 C$ f3 Q
  9.     public static void main(String[] args) {
    & v" l% K4 W. F3 u) q/ D
  10.         // Создаем монстра с начальной атакой
    ; w  F4 u  d" V
  11.         Monster monster = new Monster("Дракон", 100);
    % W/ U! L1 E! e# S- \
  12. & o( R6 V! H; Q! J2 g' q4 o/ i
  13.         // Начальная фаза" a' i" f( J  {$ e- j4 M: K# w
  14.         monster.executeState();" d5 ?; ?3 R+ {4 g( ^& H

  15.   ^  f6 t/ ]2 l. g8 w4 p
  16.         // Переход в агрессивную фазу
      p3 A* I, \" o$ W: A1 q! [4 l0 y" ]; W
  17.         monster.setState(new AggressiveState());
    , W+ D0 y1 u$ T3 A5 u+ I: D
  18.         monster.executeState();2 ]' p) x( y- {/ ^6 j; M( f2 ?) a
  19. ) C' P7 @7 L* |4 V
  20.         // Финальная фаза
    / j6 n8 `. }* C6 O. \2 c* p! f
  21.         monster.setState(new FinalState());4 _/ I( a+ s& |' R( b# J6 q
  22.         monster.executeState();
    7 u8 \0 e$ f$ N
  23.     }
    - ?6 v3 A# U- b
  24. }9 Y0 C% |2 t( N0 Y& C- Q
Скопировать код

+ d7 B& z" [; l5 O( O  P# v+ F# yКомментарии по структуре пакетов и классов:$ t- p( B1 V' |* U+ c  ?1 J7 X  S
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.& c/ W2 j: r$ z
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 C1 M* g& b$ @! y* b6 lЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
9 s( }( d  _/ f) w1 U
6 K' D) a. x# I/ d7 D: @5 o( i& T6 L% n

. X. X  L" G6 D3 B# f+ Y3 _, o$ w' t8 u! d1 s/ p5 v1 t7 e8 L5 [
  f; c, i4 u" `! O2 I+ e
* X& i+ V: F# n! K" b3 `% T

2 U3 z4 B. m. M6 B, b) c+ L. J
4 X7 t/ L" d" q6 G/ ]* c: Y- [
" A9 ?- a  @/ b3 K0 f+ h. y! k: Q# S6 m% o+ B6 k- ^9 ~  f9 e: x
* W2 o" c8 B8 F! v9 m" p
4 ~1 ^; p2 ^; U& i. J
+ g1 X) Q$ {: y1 ?9 C
3 L7 O1 b* W: O1 B5 X. ^: B, w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:040 T' |- }- [. a# E* K+ L. _
Для управления сложными взаимодействиями, такими как  ...

4 Q  f; r7 a, A3 R7 w/ p! \Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:213 D; |+ s* N, s7 k
Отличный подход! Использование шаблона "Состояние" де ...

' U6 n  B1 ]: L4 k+ K+ c( oХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
1 M1 C& I7 w( `  R. s* n7 J6 D& b
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
6 E& T0 D0 `0 K* s: L
, N) e$ G- x, ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( M) D- H  t' {& V* C
  2. package org.l2jmobius.gameserver.model.actor;! J8 _) l: `7 J
  3. / d3 v; q5 R* a7 v
  4. // Перечисление для типов атак
    9 o2 m. n9 Y+ H- [) F; K
  5. public enum AttackType {
    " ?6 F4 s# }7 b! ]/ e2 ~3 I2 l. o1 }
  6.     PHYSICAL, MAGICAL;
    - X( |4 j3 T/ ~. J: d) [, j. N
  7. }
    ) j% K  S5 {3 A. A9 m& e
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
' O7 P  w  G' o0 I7 d# mОбновленный класс для агрессивного состояния монстра:& T& I: z/ D: v+ I
4 \7 j$ A2 Z& u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ y  [* u6 ~$ O+ \- \- d- ?# Q
  2. package org.l2jmobius.gameserver.model.actor.state;# P' w. s' S; I. g; E$ |  g  m: W
  3. 5 p+ b8 M# F5 |% B$ f, M
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 N8 h  s7 S$ ~" O0 q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;$ H4 r1 G: r+ c7 R6 y  y: k; G
  6. 7 ]; N4 q* `/ v
  7. import java.util.Random;
    - z) C3 y1 C- w4 X

  8. / b0 I5 v8 ?0 M/ x* t
  9. public class AggressiveState implements MonsterState {
    + |8 h* m) N6 a* a
  10.     private Random random = new Random();
    ) k" D9 F3 G6 g: B
  11. * I: }. I$ E6 X$ L4 U
  12.     @Override
    ( J9 `% {# Z) A- c6 b6 s! y
  13.     public void handleState(Monster monster) {
    6 v7 Q3 Q. S+ k- b! h& t
  14.         // Выбираем случайный тип атаки: физическая или магическая7 i" i' B/ ~! a: s% v
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    0 M  f9 h' G2 e) a5 f

  16. % m' Q$ X) C1 M4 C: |( S
  17.         // Логика для агрессивной фазы боя5 ~6 q2 X. l; y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    - w( ]" P) J2 z, o7 {2 X3 E$ g
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    9 J  n0 {( r# k) [/ l  [( q
  20.         * g1 b8 P, x& R) M6 U# v
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , y- \7 j* B6 l. [/ L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;% y  T/ k: V; l7 P, y$ q+ [+ U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / G" _3 H  S* ^( A0 I
  24.     }
    4 K' I* ]; V/ c1 q  F$ L# ?
  25. }
    # S* q' w! h$ e+ _
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 W% x" r4 E2 \  g

7 E4 a4 e" f5 b, K. v
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " m. `7 y$ g3 y# h" @7 W! c
  2. package org.l2jmobius.gameserver.model.actor;
    ' \2 s: N& z) i" b
  3. ' M. u7 A4 B4 Q% D# a) v7 N8 [5 h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , I6 {, n9 K/ V, V
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' _7 m2 J# J, n& F8 E6 x
  6. # H  Q- F6 n# ?9 `  ]
  7. public class Monster extends Creature {
    - o& X' V; g' W, p; |' s
  8.     private String name;+ ]6 w- L6 t) l2 c9 O
  9.     private double attackPower;: a3 z7 w# r7 x' a
  10.     private MonsterState state; // Текущее состояние монстра
    8 a  o# f! ]9 F  s6 w% \( x8 m, q/ V
  11. 2 b6 [) ~5 b2 x. L' P+ x. L4 O
  12.     // Конструктор монстра
    2 E$ J8 ~$ \  y  I+ ?
  13.     public Monster(String name, double attackPower) {
    ! ?  W' O+ m# ^0 _, Q5 ~  |, j
  14.         this.name = name;
    . O. L4 _7 P4 \# \! ~( j
  15.         this.attackPower = attackPower;
    & a  e, i. e) A* b4 `3 T
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию( Y& ]  w5 K" w0 L& P' j
  17.     }; H2 G2 A7 f3 z8 J; u

  18. $ o$ ~; o4 t4 z; _8 H. l" C
  19.     // Метод для смены состояния' y* o& r* B! \# v9 l: i( h
  20.     public void setState(MonsterState newState) {
    ( \9 r9 F2 I) J$ p1 T
  21.         this.state = newState;
    ' A  g# I$ }5 F# K
  22.     }( p  }6 v" E- k& F

  23. 9 F, ^2 P- ~: `) }
  24.     // Выполнение действий на основе текущего состояния
    ' s; E, B; Q7 p! k4 S5 O: |6 ]6 P
  25.     public void executeState() {+ R$ x/ o7 V& O2 ?
  26.         state.handleState(this);% p) q$ j& |- a& O8 a4 }
  27.     }- ~) M8 L1 k8 w; v* e
  28. . `) u# |+ }2 `1 j) O- v, T, l
  29.     // Геттеры и сеттеры5 W5 I  z4 v% \( t. \! e
  30.     public String getName() {
    5 ~* F( S  c8 B/ Q% h4 P
  31.         return name;
    + p6 y6 d6 t3 u0 n: M) W) r
  32.     }; @" ~, x, l% J0 z, [

  33. 9 D+ e( _$ `+ u3 D' }9 z& o
  34.     public double getAttackPower() {, E; |( w! C) O* _
  35.         return attackPower;
    $ z+ O: d& n! ^" f( g
  36.     }
      i4 E. G4 E, l$ i2 I

  37. . A+ @" i& ~7 D) A" W* q1 w4 _
  38.     public void setAttackPower(double attackPower) {
    ; c4 ?6 W3 E( e  R3 U$ P* k7 T
  39.         this.attackPower = attackPower;# d* e) D& f# j8 ~6 Q0 L2 k
  40.     }9 t3 z; E9 c' F( ]1 a7 z) ?
  41. }
    8 {& _/ p- M/ k$ O4 c# f3 c2 N6 s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
7 u4 ~' }. O  |6 A3 ]  _' Q& ~6 D4 k
  1. // Пакет org.l2jmobius.gameserver.model.battle# h( @$ u2 w% X% U
  2. package org.l2jmobius.gameserver.model.battle;
    8 F4 C( K; Y2 i6 i# J

  3. ) z( N& A( J( d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : Y$ C8 J+ q$ r% Y% N. Z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  j5 G( _  s: `) f8 N
  6. ! y& }% F$ F1 S) \7 M8 _
  7. public class BattleSimulation {# J- E( E) v' u  h! ^# u0 I
  8.     public static void main(String[] args) {3 A6 v& H8 e+ i
  9.         // Создаем монстра
    ! t5 k6 [3 F2 d; f2 Y, m" H
  10.         Monster monster = new Monster("Дракон", 100);
    & A7 o( d( \2 J' N1 @5 z+ M" v: [
  11. / ~; D5 o3 L3 `/ }
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак% E" g/ d0 ~- H5 ]6 b# F- b7 Y, @$ O
  13.         monster.setState(new AggressiveState());
    % W7 k" _  Z) J, F, i* R1 K
  14.         monster.executeState();/ R9 {4 u9 a# N3 c
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак( z4 z# j. o! {% _
  16.     }  y% |# c3 ]0 e( P8 t$ G: h
  17. }" m/ c/ P& Y7 o- A& X5 A' a' E& v
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, J/ m. o# S* E" {2 z2 K  r1 G; wЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
  w4 I6 V5 F" i2 }" Z, x
) v* u* q" z6 l' o( Q
3 L5 ?  j# ]" [; O) X: g8 {! R% Z0 ~) I2 u% Q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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