Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
! @1 G6 e- S0 I& Y! F2 J' y+ m; X. j+ I7 F7 }
/ ^% W9 f6 t) ?. H. P
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.% b) v' i0 I3 g( D
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
$ {2 ?* r9 K- P6 h8 tАстралия ?, j) X) p- d6 Z! G
- l# ]' A' U/ |! _6 t1 C! Z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* e2 D+ u) q( I6 i' n
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?& }% w* ^. t, C( h8 ?4 m- s4 N  X

; X+ W- L  S# P) T2 D" u$ B
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: h# Z& I. h, o# O. }$ e6 f
AlexCoder опубликовал в 2024-10-16 18:31
- S! e) r5 A, K4 pДень добрый!* O* L" A1 v5 k) K/ _8 [: V1 X! K
В статье описано взаимодействие игрока с N ...
; E' Z  t7 B( D2 z
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
7 i& x4 d% l. _7 b4 q9 ^0 D
+ x+ q  E5 s# t5 K1 m3 L- FЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ q* a& [3 J; j6 q4 W8 H  k

5 V, ]' A6 [( |+ o* Q9 V0 Z0 pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 W4 M$ E) ~) w5 ~+ J& t
; A  j8 ^% P+ g. f9 j( i# z
  1. <font color="Green">// Пакет для состояний монстра</font>
    / H2 r! v% R. N' S3 e- }$ ?
  2. package org.l2jmobius.gameserver.model.actor.state;& U% N$ \& i* w7 w* J" Q
  3. <font color="Green">
    ( y% A6 j, r" I: V$ a6 b' l( X
  4. // Интерфейс, представляющий состояния монстра</font>
    $ S6 `+ v1 j2 M4 R, A5 V' ~9 d( y
  5. public interface MonsterState {* o" l0 S- R9 k# t
  6.     void handleState(Monster monster);2 u! Q8 [: ?7 P7 u+ c1 r
  7. }! U6 z6 @8 [- J( G
Скопировать код

4 p5 R/ T  u/ a3 \' cШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  D1 ^) X. y7 f& S/ }

1 Y$ O6 y5 w! ~% ?) Y+ {, z7 uКласс для начального состояния монстра:
- |3 Y5 T4 O: K, j% N2 C. ~
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- R! B$ e( F! }, a& B
  2. package org.l2jmobius.gameserver.model.actor.state;4 k- V! q, z' D/ B6 E3 w) a0 {& z" y
  3. ' ^# a# f: S8 B# C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; I: H; m; N4 Z2 ]

  5. * h4 V( e: l% @; y4 a, r
  6. public class InitialState implements MonsterState {
    / V; o1 {7 r- _+ }* N
  7.     @Override
    ! ?) e+ I: m3 g1 l) ?
  8.     public void handleState(Monster monster) {
    ( `, n- Z& w2 f) k
  9.         // Начальная фаза боя
    ' k3 N& G8 ~/ @# @! @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& y. x% M  A6 s' K& @$ j0 r
  11.     }9 R( l/ H7 s; B6 O  \# N
  12. }
    + t! y# U5 g9 {+ G! _* o7 {% X
Скопировать код
- W; `# a  w" E' X  W
+ x; ~  c- b" Z1 V, }" {/ Q
/ P8 ~2 S9 a5 |* c5 I

+ Q2 p# a: d. e4 H. {, \
/ J3 C$ j" ~; G% J" B& }
; b& ?& l7 G4 |; i
- \- F" C9 H1 j4 @
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 l; c" Y' t( m" b1 X0 V: Y& c3 l/ f2 h, Q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  ?5 J) x; i! A0 u" E! P: g! Y6 q* ^$ p( t: g0 ?1 ^
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; V8 q9 F8 h1 ^# }# H9 [/ [+ s
4 {$ n' R8 k3 P: `: m2 O3 c
  1. // Пакет для состояний монстра4 o, B) s0 y: W3 L/ I% P( L. q
  2. package org.l2jmobius.gameserver.model.actor.state;7 @9 _. u" A% D
  3. 2 x) {, E$ x9 \$ H% y4 w4 h
  4. // Интерфейс, представляющий состояния монстра) H! S' i( G" C8 F9 R2 n/ U
  5. public interface MonsterState {! e# H- T* y" L  ?5 h- n9 @
  6.     void handleState(Monster monster);; C. s/ @5 v! w9 M; ~( [8 J( ]: ~
  7. }1 y, E+ L# H5 H( `2 l: W
Скопировать код
* X6 @% e3 T) o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & Z/ R3 ]: u5 x2 n# W
, K0 R8 w* [# s1 L
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  H4 S4 p+ x4 ~& g3 O
2 s8 v2 k& i8 ^* b$ J  z& q
Класс для начального состояния монстра:4 {* |2 K+ S( D8 y! J9 R/ K/ v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % m9 P- g7 C' u+ v+ x) ~/ A& ~
  2. package org.l2jmobius.gameserver.model.actor.state;- n! l1 R) d; g* Z0 B  d
  3. 1 |$ A, ?% @2 ^1 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ d+ R  `+ x. t+ u/ ~2 S8 E
  5.   a4 o) h. W2 Q" h' ^( ]
  6. public class InitialState implements MonsterState {. C8 t* R# d9 I# U+ M; o
  7.     @Override( c" X7 M" d* M; y
  8.     public void handleState(Monster monster) {  G2 K) L+ U* q+ ~% `
  9.         // Начальная фаза боя
    ( W7 z, X8 s$ {
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & C7 i6 ]" h: d) }& l- f; L
  11.     }
    6 V6 ?# f. V5 Z. T% c9 H0 R
  12. }% J# r4 x! `4 d0 x- D
Скопировать код
Класс для агрессивного состояния монстра:( s" n" u- V3 R: Z3 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' q" k  I" S6 |$ @2 O7 c6 w
  2. package org.l2jmobius.gameserver.model.actor.state;* V6 J7 \- k: M1 R% X

  3. % Y  x- D; a& k( m2 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 ]# Z  c! Q4 ^6 [! y; j/ Y3 \

  5. 0 U' n5 G3 r7 Y; l
  6. public class AggressiveState implements MonsterState {
    + f; Q" K' [( i9 |
  7.     @Override* ^9 V4 a8 C1 ^2 ?0 C7 S
  8.     public void handleState(Monster monster) {; O* t. t) z* s/ c9 @
  9.         // Агрессивная фаза боя
    ( ?& P6 v5 |! z
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 x3 ~( E# C% H6 b! P9 x
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    / n) V* q0 t; }2 Y
  12.     }5 x  N4 |* E  Z/ C
  13. }
    % F/ y$ r* }. x( r8 ^
Скопировать код
Класс для финального состояния монстра:
& b& `* w. V" W% g# J, `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 Q+ o( E2 L2 h; h3 S9 A; g
  2. package org.l2jmobius.gameserver.model.actor.state;) i( @/ }3 F+ M: U" Y

  3. ! i7 \7 O* B4 n& _" |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # e. C+ }* T- f& I. Q6 D
  5. 5 G1 L6 e, @$ k% e$ h2 o
  6. public class FinalState implements MonsterState {
    8 y+ z9 `8 k$ I3 b7 b/ o6 |( |* h
  7.     @Override9 [5 F, g% j: N0 t  \. ]: j. X
  8.     public void handleState(Monster monster) {
    ! F) x" R( V9 E! t
  9.         // Финальная фаза боя" k* ?* |. B# s  v% C, b: m
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");( B. V& Q& O. B% u; F' W+ Q
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    * D5 a1 z4 ~2 e) m, F  I' k
  12.     }
    ' t/ o3 G- q4 s" w, T
  13. }
    % B8 Y  h' g! E/ K7 F+ L" A1 }* o9 o
Скопировать код

; O* z5 }3 }1 p3 `: ^7 eШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
6 R* g" x7 a- u& k7 ?8 L, y2 b  h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : U( F- y6 m: ?. v+ g
  2. package org.l2jmobius.gameserver.model.actor;* K# V# N+ a3 K" W& Z

  3.   m( L! }% G5 P4 _- J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* l! p* \! C" ^$ W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 a* l) a, o4 b) f# _* Q  \4 B
  6. $ l; k" Q& P' \. O6 t5 J4 \8 G
  7. public class Monster extends Creature {
    4 L) K! X1 p9 _3 \
  8.     private String name;
    4 v3 q7 N; i. ]. H, m3 [7 X
  9.     private double attackPower;
    3 O( R* m% D: R" O7 V
  10.     private MonsterState state; // Текущее состояние монстра3 k' t! L  n, j) q+ N
  11. * L( k$ @9 e( |0 `, e
  12.     // Конструктор монстра' C: F7 E# U, r( Q6 x- i% i
  13.     public Monster(String name, double attackPower) {0 T8 @. n' k4 x9 }0 ]
  14.         this.name = name;
    5 _! k0 j& {9 ^  K$ B) [3 c
  15.         this.attackPower = attackPower;
    " A6 Y) a9 L- M  ]
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние! D& u& g7 y/ b* h& o" a+ K
  17.     }1 J/ Y6 j! ]. u& z2 \! E2 C) `; z

  18. ; F& `- o0 r/ f# |7 p! X
  19.     // Метод для смены состояния5 R* o) e0 F5 n
  20.     public void setState(MonsterState newState) {
    4 K, Z/ C6 l4 B. X% o% [3 R. {
  21.         this.state = newState;0 N: Q( m1 s8 ]( T# a
  22.     }0 B. N0 K1 b8 _! U, R

  23. + f5 U& @$ R! p$ F2 [9 r7 j
  24.     // Выполнение действий на основе текущего состояния8 j0 }3 n  g4 n. y0 a3 J" M9 o+ ^
  25.     public void executeState() {, a' h5 _- l9 [0 e# q8 q
  26.         state.handleState(this);$ z& y3 X( d; e
  27.     }  _& x3 T2 s3 I) s* t  J3 j

  28. * I1 X! N( K! ]1 H
  29.     // Геттеры и сеттеры7 \  f2 S1 t6 q5 `
  30.     public String getName() {' l; d' ^2 e8 C
  31.         return name;8 K0 P8 B& [' O* i& i8 [7 t
  32.     }
    - e3 o0 }) [# [; `' Z

  33. - S! F) x. Z8 f& t& \
  34.     public double getAttackPower() {: m1 p: s6 h; q$ V* `
  35.         return attackPower;
    9 t6 {' H4 D; G- _8 Z
  36.     }
    # f0 i# c1 Z" x3 z$ x$ z( d7 C/ Z1 t8 b
  37. , U! N$ n0 f) J' h: r; J
  38.     public void setAttackPower(double attackPower) {7 M( V* T0 k& B# p0 G5 d
  39.         this.attackPower = attackPower;* r' |! a4 A7 _% s4 z/ u
  40.     }, e3 b6 w, d6 }; @
  41. }
    . o% B7 g/ q: k. r
Скопировать код
: W2 `( A( t$ ~+ O' r
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.& q& F7 ^3 }1 q

) S1 O$ h7 A! v# v
  1. // Пакет org.l2jmobius.gameserver.model.battle# b# K. P( w% @5 L8 T# U0 c$ V
  2. package org.l2jmobius.gameserver.model.battle;
    ( ?+ |! ^0 e, Z9 \, r6 |

  3. ' K* o% Q5 h5 s" W0 Q" S
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      U5 D4 M, H0 A; C- L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 h1 O5 P' g* X8 ~( z( n
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    , T5 j+ b7 d! U6 U
  7.   E/ o* g" T% `" ~$ e% Z
  8. public class BattleSimulation {7 o- K5 |+ r" @' h# s
  9.     public static void main(String[] args) {' |! i( x/ e5 F* f0 u
  10.         // Создаем монстра с начальной атакой7 e3 J% }& I  t; V) Z
  11.         Monster monster = new Monster("Дракон", 100);
    ) G0 k! c5 r; ?0 m9 ~0 _! e
  12. & c, a9 ~: B( ?( U
  13.         // Начальная фаза6 [$ J4 ]0 ]  E0 |
  14.         monster.executeState();
    0 y6 X# g7 O: G9 i* h1 ~

  15. 8 z& Y* R7 w! }3 j( A
  16.         // Переход в агрессивную фазу% h) @6 c; g- o+ Z% q
  17.         monster.setState(new AggressiveState());
    5 f8 E2 a& D. Q
  18.         monster.executeState();
    ! _/ G0 K0 T& Z/ L. p

  19. 4 s8 |. x" M* m* h$ S+ r6 k
  20.         // Финальная фаза' b* e) c: F- o
  21.         monster.setState(new FinalState());3 u9 P! g. Z9 M3 t
  22.         monster.executeState();
    ) `. f$ _. S" T! z  X3 ?3 L, e6 i! Q
  23.     }  ~7 C2 ]" c5 d- l  y$ C
  24. }" L: {) f0 D( R+ g  f- `
Скопировать код
9 U. \* L4 z! i1 I9 h6 L. J
Комментарии по структуре пакетов и классов:" o) h3 U) ^" B0 Q; L1 V" R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 c- f( _7 c2 v* ^7 ]! {2 n
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ \) J1 k0 D; ^* M3 t/ eЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 E2 O' y7 U* x% M, h" C6 e

+ V; g' H- ]  O: A2 H
$ ~# f& ~2 g6 j; Z7 j& B2 L5 q* O! V% x. x5 O& j8 _( L

6 k# {0 n5 P: @: g9 N
2 v8 Q2 O: z, m: u( C/ ^+ u8 @: D! G
& b6 k6 {" O* Y7 \( P$ A
& E4 M7 U& x: }6 a5 p& f3 _

+ O, x; T5 L( z) i4 B
# Y+ J7 e  F- k/ b2 A3 r0 u
8 O5 j) N+ _' I% V5 c
- Y; \+ M  ]6 |( D$ U' q" B, z, ^2 `0 N  S

5 g8 D9 a% O/ X* i0 H# ^
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04% O! ?6 X& l- k- c! C" Z
Для управления сложными взаимодействиями, такими как  ...
: @0 l$ O# }- J9 ^7 f* G; G% U" Y
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21' \4 R( q; t! n
Отличный подход! Использование шаблона "Состояние" де ...

& m# _, c; B# y$ v# Y4 fХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.& F/ K. N( J' I) d- ^/ o6 [- ?
! V5 o' h8 l/ S* M5 f7 n
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; F4 O0 T" D; ~- x# Q! H, D; N3 ^

4 D2 @( f# ^) P0 i: f  Y8 G( ^' @
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - B' k( i1 H3 C; `) s
  2. package org.l2jmobius.gameserver.model.actor;
    9 U% o4 l- S& r. l. U+ }& s9 N2 w; v
  3. ' r2 h; K2 v, V, @0 f
  4. // Перечисление для типов атак
    1 n- \1 w) h" _, l9 }
  5. public enum AttackType {6 G6 E& g8 x0 s* J2 N5 k9 ]
  6.     PHYSICAL, MAGICAL;: [, g0 q9 V: b" c. \! U' \: |4 B
  7. }
    2 |1 L6 z, X6 f* i* J) C. B
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
8 S; |" R1 ]" S7 q( yОбновленный класс для агрессивного состояния монстра:
& t3 X' B, i7 u* ~/ b9 I/ x* y8 y( F0 x1 X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; b" f8 S* A$ w# O; `( y+ A
  2. package org.l2jmobius.gameserver.model.actor.state;
    & u! x5 j8 A( D# ]" q, \
  3. " F/ {( U6 `$ J8 B1 I- j! U  e# l
  4. import org.l2jmobius.gameserver.model.actor.Monster;, `4 Z9 M5 h- I: G
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      E7 v" G; p  U  D
  6. 9 Q5 Y* T' d: U4 x
  7. import java.util.Random;
    ! T9 z& X8 T/ U

  8. " X, L+ x7 U' C" e1 \- S* _
  9. public class AggressiveState implements MonsterState {
    + p8 Z' C/ S- y7 \! m
  10.     private Random random = new Random();6 g" Q/ e% H# e
  11. 8 d5 k" f/ C$ }. b( r2 {7 b  T! b
  12.     @Override
    : r( [* h& b$ O. @; i' j& A" y
  13.     public void handleState(Monster monster) {8 Z* j6 N( B' ^# r% \( N
  14.         // Выбираем случайный тип атаки: физическая или магическая
    6 _+ h# o: Y* C: d/ ?1 A
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    $ a# _. ?. ?) ~; ?; q
  16. 3 h! s: J+ m  _& ?( g, k' b  D8 y
  17.         // Логика для агрессивной фазы боя* r& j/ n- |' m
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    6 k! }( `! q8 ^3 U" j
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    . b) N3 ~$ {" h, v6 x; {# r
  20.         
    3 g: K0 T( U0 {- {7 a" Q, N$ Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки: Z, u6 ]4 f% x! |' {+ Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;! d6 Y9 H/ g3 Y/ o: h
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);: H, I6 e' @" S! S) V0 b# Y, n$ r
  24.     }
    % B  r( w5 d2 @" n5 W6 k* h, N
  25. }
    % N" O5 }+ e  E- |1 P1 |
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
, k8 K; E* ?# c, z0 F: A3 ?! M5 n  @3 A" W2 `
  1. // Пакет org.l2jmobius.gameserver.model.actor
      h, c7 n3 E+ D, C- U
  2. package org.l2jmobius.gameserver.model.actor;
    5 b9 k- z7 ?) V/ O- e4 a; K8 A' X: M
  3. ) o6 h9 N3 Z% w* P% N; R6 u5 p, t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    + X* v4 i8 J, `  {6 J* Q) ?
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 m) r. T' \! \' X" q: q! @! D

  6. 1 Y. {+ K1 ^( `9 l( i" z/ p
  7. public class Monster extends Creature {( e2 ~9 n2 |3 u" b9 Q
  8.     private String name;
    6 Z  C2 o+ J6 |4 }
  9.     private double attackPower;
    ( r2 A, K: V5 \& M
  10.     private MonsterState state; // Текущее состояние монстра0 j1 K' d' M5 f% p2 i2 S

  11. * v3 |' P3 Y( ^7 f% o
  12.     // Конструктор монстра
    / Y1 J6 B3 D" a" Z: _1 R
  13.     public Monster(String name, double attackPower) {, J7 S* s, V6 |9 t
  14.         this.name = name;
    - a' @# }7 K  o
  15.         this.attackPower = attackPower;
    - c9 I, b" c% |' V" n( @
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    / d$ E" d  d. D+ R( X- G
  17.     }
    2 `/ `$ j1 h& M$ k, e2 m" `  H6 `
  18. 9 f( L3 F4 b0 A* d: A
  19.     // Метод для смены состояния  k5 L" y( g9 L- }1 H7 s9 R+ p
  20.     public void setState(MonsterState newState) {7 b+ n4 B! N$ D
  21.         this.state = newState;
    8 V8 R; N/ R  W1 b: \
  22.     }
    ( {; _0 O: t2 G# |* i3 K( q
  23. % N8 E$ t% |7 T/ v% L- G6 c2 g
  24.     // Выполнение действий на основе текущего состояния* L+ d: o* Q9 Q  e- g
  25.     public void executeState() {: q3 ]6 |9 ^% R- A9 O+ Q# ?: o& G
  26.         state.handleState(this);
    # u0 j) Y9 v- _0 H
  27.     }% L& r- f7 j0 d/ v

  28. 4 w& I5 |, M, e# i: _0 z
  29.     // Геттеры и сеттеры
    3 }+ \' l' |  E+ O* R  h
  30.     public String getName() {! G/ g- j; ?3 T2 ^1 W. C) m4 Y
  31.         return name;) T# p  f! q8 C* @' V/ }
  32.     }
    " u- q2 P0 l5 {- V6 G1 ?1 w

  33. , x4 M, I* b  c3 W: ~
  34.     public double getAttackPower() {8 i" f8 T3 r7 i+ g* Q6 Q% ?
  35.         return attackPower;$ W' s. [0 a* W' M6 R0 T
  36.     }. A9 I0 T  n/ y) y; q2 p
  37. - [, W& d$ @. m$ o; b
  38.     public void setAttackPower(double attackPower) {
    7 l  _4 C: l3 N3 h' m' }$ K
  39.         this.attackPower = attackPower;
    9 J+ o# m5 j3 X( D* J3 v* A0 o
  40.     }
    % y) b5 |1 y: J% `
  41. }
    4 t* h$ H4 Z8 i6 n
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.9 \  u+ u4 R, V4 K# ~! u

: ]5 U1 H: V# S# \& x% I( R
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 f2 ^) U* Y8 c$ i* @
  2. package org.l2jmobius.gameserver.model.battle;
    % e" i: C9 }7 J& [* H! p$ X

  3. 0 F% C- ^' P+ Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;, W  F* i" ~( u4 y* l9 H
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    - K: Y  a( d/ p; A

  6. # }- u/ f/ C+ ~
  7. public class BattleSimulation {
    ; N# T- {7 C  s- k" ^& |9 V
  8.     public static void main(String[] args) {
    : \% C  n* Q' i  h4 ]& {
  9.         // Создаем монстра" h1 l2 L8 |; ~  U
  10.         Monster monster = new Monster("Дракон", 100);& W; n3 J" k1 R/ e0 n" v, g

  11. % l7 a: F3 N( \) ^
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    . T( `- k  T$ Z, @! s' b; i
  13.         monster.setState(new AggressiveState());
    " Y& Q( }) Z7 G' {3 C2 f# k' R
  14.         monster.executeState();
    ( }" v* ?$ [' q4 u
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 ^4 d$ ^9 x! {, ]7 P+ z& z1 d
  16.     }8 S! P3 y: k- s6 B* t0 |% W
  17. }  m7 k0 G( ~5 v* g
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 ?  k% p0 T4 x: `/ ]Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
, T( z9 n$ p9 P+ R1 ]% U( k3 ?9 I7 |" n4 H. n) Y0 J1 r

, C% x# _6 a4 G/ A+ h7 I
! t5 e$ `; {7 e9 t  g. y$ K* k
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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