Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!% |, i5 Q8 D0 S; U: y
8 }" m3 f) Y) z8 Z6 p- I, w4 O

0 M  @2 M4 M) K9 K( kЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.8 y3 Z& a3 R4 z/ K' _. `  w
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!; w+ @, C" @; Q+ ]0 ?
Астралия ?
* F4 }3 R; O; [3 |/ }1 ~) L. R7 d. X

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!1 R! r; ~; p7 ?. s
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
( @, z5 D  p3 W6 T0 l
; x" G) Y& D4 W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 0 a+ T4 b  c3 J
AlexCoder опубликовал в 2024-10-16 18:31& |& N9 u. \9 _' l
День добрый!# X1 d7 Q/ w- Q/ u9 k. ]. K" T) ?
В статье описано взаимодействие игрока с N ...
: [* @% W) l  o- G) O8 t
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ! V! i! F4 @) p; Q
( v- T; k% M! u' S# `7 p, K
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
1 ~2 P% [$ ?1 F  L# x* @, R4 Q; A7 E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 A$ q, }6 R0 Z* J* I5 c

) `$ _# I3 \/ j7 g
  1. <font color="Green">// Пакет для состояний монстра</font>
    7 g' O! Y) ]9 D. }. C6 _
  2. package org.l2jmobius.gameserver.model.actor.state;
    % q8 Q" ^  I  j5 k3 d
  3. <font color="Green">& n& v" f5 h: R3 J# v+ O! a
  4. // Интерфейс, представляющий состояния монстра</font>( X# D) L6 @+ r0 v
  5. public interface MonsterState {
    7 w3 V& A# ]  L+ P
  6.     void handleState(Monster monster);2 E/ Z* \0 o( `  w. g
  7. }% N. k1 X& h4 ?2 w
Скопировать код

0 P& w, o% @+ b' k! LШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) i9 D) f( z7 q9 J) F/ w+ C: r4 l, t
Класс для начального состояния монстра:( r  ?1 R9 p' N/ A$ R$ r
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>; n5 w0 I$ N1 h( U
  2. package org.l2jmobius.gameserver.model.actor.state;
    , u5 R! k: O1 A* U; t8 t

  3. : G! f. n, _/ l5 \4 x6 x* H3 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % z2 R  f' b/ j: e1 y
  5. 1 D9 j/ s, k  D# e2 D1 M
  6. public class InitialState implements MonsterState {
    $ d' v0 b  M3 j. a  L
  7.     @Override3 {" J6 a0 k- \* c. O
  8.     public void handleState(Monster monster) {& r; M+ b0 L& f4 I1 t" k
  9.         // Начальная фаза боя
    4 ~. ?, e  Y8 _4 G4 o* B
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 b& \& Z) `7 o2 A& f
  11.     }7 z/ `/ D; Z9 U; j) M" @
  12. }8 c3 h4 L$ E( l- D% z; J! Y7 V2 N
Скопировать код
" v) o/ E; C  D% A. q" p; B. S
7 y4 |3 L- J  w! h; X& l; r2 t0 S" Z! [

! v! G3 w' o3 i7 r1 W  d
8 `  u( j- p  C8 C( Z  d! i1 j- t, R/ g! I6 g% x0 }" Y
3 T/ ?# C5 n( i- n" p5 C

0 |" G- ~' C  {5 t, x9 B! l% F5 a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
) Y- f# p; c( s: R. G4 f- A3 _0 A- n4 I6 H+ Q1 a) F1 O" d- R$ u
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 B  F! D* }9 Q9 G8 G' W8 |5 z6 S# K' L* l4 m
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 |+ A8 n3 u4 D3 J# Z7 j" B
* O0 \7 [2 n. Z! x% ]. X& G) w
  1. // Пакет для состояний монстра$ K$ D" X! N! f$ u- f
  2. package org.l2jmobius.gameserver.model.actor.state;: j& t( N2 ^& P& t0 s& T

  3. * Q" v) ?& w- d1 S$ ]9 k
  4. // Интерфейс, представляющий состояния монстра/ Y+ i2 N6 e1 I8 Q( P) E2 J4 Y
  5. public interface MonsterState {# W7 B! w' x, ^" A0 G. M" J, }6 R4 v
  6.     void handleState(Monster monster);
    $ \$ [% I4 G. c. t$ I
  7. }
    6 o; `# s) |, x7 x
Скопировать код

' L: ^+ g# t6 V: `. Y# _Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 0 W; @: i. H1 S2 E0 j2 |
) z1 ~5 _- o! X
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; D  z2 g* G0 F9 G. _$ t
$ s! w  j: ], c  ^" W& c9 A! D
Класс для начального состояния монстра:5 j  o. w( ]% N; Q) k/ J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 }' d1 P& t8 K" c- W& j
  2. package org.l2jmobius.gameserver.model.actor.state;. _; F; X& E8 z) C

  3. , [3 ?  i- y( o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 g+ u1 O" `5 y
  5. ' x+ c7 I0 s3 u
  6. public class InitialState implements MonsterState {
      F0 n+ S' h9 z0 Z  L
  7.     @Override
    2 l4 v  v; M* U/ _1 E3 h/ _! F0 \
  8.     public void handleState(Monster monster) {
    1 Q) v4 F8 K, y7 L- {  B0 B/ K1 U! i
  9.         // Начальная фаза боя
    - W. E0 f( w# Y: \: @% a3 P
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 ]4 e3 Y# R6 p% R
  11.     }
    " C, {; [' f- i) s5 G
  12. }
    6 v4 ]" Y: Q: z  d- e; _
Скопировать код
Класс для агрессивного состояния монстра:  k( C9 Q5 K& H6 j
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ T" j- g/ A0 A& Q
  2. package org.l2jmobius.gameserver.model.actor.state;0 N! e5 T+ g* ~$ y  s. R

  3.   z% T; j4 K, O
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 I( F2 t/ \" @; u9 }

  5. ( ~, o( N  M; A- W8 o
  6. public class AggressiveState implements MonsterState {7 [& A2 q- `8 D
  7.     @Override
    - U1 P, J/ V  H+ ?
  8.     public void handleState(Monster monster) {
    , }4 ^0 z% `, f* |  R
  9.         // Агрессивная фаза боя
    + d; J0 n" ?+ n; J6 Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    7 W  ], q7 ~6 ?5 u) ~4 p
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" X% A% u- d; J8 j6 e% Q
  12.     }
    * c. z3 G, h# j* E, u4 J
  13. }+ z) Y: {- x; m: ?4 L+ o$ c
Скопировать код
Класс для финального состояния монстра:
3 B% G# `: a4 @' ]- W5 V. Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; l  W& M+ o" d4 ^1 u9 h6 p3 D
  2. package org.l2jmobius.gameserver.model.actor.state;* W* A8 W# i2 p+ I( N
  3. 2 n9 L( z1 ~2 t. e; O
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ s: ^8 l+ t4 N& [# R
  5. ) d" ~$ [9 P- J: `  Z
  6. public class FinalState implements MonsterState {$ v" R6 i. n4 ~1 h  C: ?$ ^
  7.     @Override
    # Y. V! U% r0 h0 J" _* A
  8.     public void handleState(Monster monster) {/ C# b8 w" s/ o$ V
  9.         // Финальная фаза боя4 d8 N# E* v! q/ M5 I
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");5 R( g5 c0 I2 v; B  l; m
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    / Y/ Q9 S. [) \$ `& Q) X
  12.     }
    2 |7 f6 h: a1 Y& i' L3 G& `! P
  13. }) |- D& p! G" d6 |# D8 S3 T7 L+ j
Скопировать код

6 z; i4 J  \" |: f- _% U0 HШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) G' f' G; \2 \. ?. P: G
  1. // Пакет org.l2jmobius.gameserver.model.actor$ F1 k- `4 @( F9 o( @4 v- i* Y
  2. package org.l2jmobius.gameserver.model.actor;5 }6 S, l- }+ ~: s7 U, B

  3. % s; j' ]5 M; `. J% S
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;) f: q6 S. d8 u+ K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;% C5 g* S7 @# Z" _' d9 L' i. |

  6.   p" Z; H& T4 p3 ~( }, s
  7. public class Monster extends Creature {; r  K! \* w* O6 g/ p
  8.     private String name;
    2 i6 \0 w! I# G" G* {  a6 W8 m
  9.     private double attackPower;2 X% o5 e+ u+ C' ]1 |) h  A6 r- w
  10.     private MonsterState state; // Текущее состояние монстра/ {) h2 A5 M3 l* J( k
  11. " \$ J% i: T, [' l7 q
  12.     // Конструктор монстра1 m0 U* L$ J* R2 C6 t0 r7 d% L
  13.     public Monster(String name, double attackPower) {8 v% S! I9 \! O& f' a% i
  14.         this.name = name;
    6 G* D: B& m7 A9 p' _. g7 r( ^' l
  15.         this.attackPower = attackPower;. \- b% U$ o, k( q% A" O
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние' g5 c0 _" K# v/ o: i9 C: Y# M
  17.     }' ~. q9 t2 ^+ M7 e+ a' m# H

  18. 4 [1 P+ F" b1 Y, x4 R0 q4 s
  19.     // Метод для смены состояния
    0 a, s- N! ^. R' F+ u9 \/ ]0 p' ^
  20.     public void setState(MonsterState newState) {
    ( W& V0 i. K, q& k0 o5 d" L
  21.         this.state = newState;# L- i. E, S4 u' E
  22.     }
    . A. f2 x" B0 M- A7 V

  23. 1 P* C. P. S9 e. V, ~' p
  24.     // Выполнение действий на основе текущего состояния
    , x/ ?4 t) c8 I# G
  25.     public void executeState() {
    1 M2 h, C- c$ ?$ n# J3 k  h+ Q0 T! q
  26.         state.handleState(this);  F# W/ W( V* p
  27.     }
    # S2 x0 e) R6 S' I2 R: W

  28. 7 l" b5 M' o: b
  29.     // Геттеры и сеттеры
    ' M$ q9 K4 d5 v5 r( [+ W1 I
  30.     public String getName() {* [- I& y4 d; A9 I$ P# c; k: Q
  31.         return name;" J9 a9 R8 o( @; q3 T$ n4 R
  32.     }
    9 J0 R& }% e" _/ y, p( W

  33. & z  I* R$ y4 p' k1 d  v
  34.     public double getAttackPower() {
    0 R3 M# y+ o2 G; K
  35.         return attackPower;
    5 [- ?" G" r2 [6 r
  36.     }! @4 a, n6 W  S/ j# F

  37. ; ^- i, H' i5 I! h  W$ m5 ~
  38.     public void setAttackPower(double attackPower) {
    " ^7 ]! e9 j9 o' d4 v: M+ f
  39.         this.attackPower = attackPower;
    5 c7 }. P$ r8 n
  40.     }" l) x  p% p) h( x* z: z
  41. }
    7 X* W* w0 F+ z! k
Скопировать код
- w4 H" o6 U& k. Y: {4 w8 i
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.7 Y  j3 {: t+ T, D/ p8 R6 N* f# N* e

" E4 z$ d6 \, m. T$ `3 B
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 \. D( ^6 Z, A
  2. package org.l2jmobius.gameserver.model.battle;
    - }5 X. S) o. q3 B. w" c
  3. & x- e. }- C7 m1 a: h: C3 Q$ U
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 u9 a( w! q4 Y9 ~8 Y7 y% B
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 K' }1 M* R1 E/ [9 J
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;' f5 O6 C& }- ~, f
  7. $ W- A) U7 I5 B2 a0 k' ^
  8. public class BattleSimulation {' P! i) w. H9 _4 r+ ]1 h! L9 c
  9.     public static void main(String[] args) {* l2 [1 s+ U% _. ^" v" H6 t
  10.         // Создаем монстра с начальной атакой3 D& r' _8 E& O$ e3 u; `
  11.         Monster monster = new Monster("Дракон", 100);
    0 O7 n- K8 O, M8 U
  12.   n* I: Y8 p( w) @% d' H1 S5 i. }
  13.         // Начальная фаза
    * S* p5 T+ m! [& s3 n
  14.         monster.executeState();4 ~4 `5 r$ R, v, b. ?& U

  15. . l  j5 u6 V' l: u
  16.         // Переход в агрессивную фазу
    8 p* y" R( N, E. l/ n
  17.         monster.setState(new AggressiveState());2 A$ e  C; J: S& k& q& E5 A3 R
  18.         monster.executeState();
    " x' Y! H4 [6 @

  19. ; V# q; E1 {  Y& {* d
  20.         // Финальная фаза/ Z) u' z' I* c5 P4 m/ A
  21.         monster.setState(new FinalState());
    * ~- w, ^6 q8 _+ z
  22.         monster.executeState();
    & \, P  i( M8 `6 l! {
  23.     }% K7 q3 @8 i( q: e2 s4 W
  24. }
    " C) w  B, K8 D$ @0 N. V
Скопировать код

& T6 V" k  n; ?  t. r- ]Комментарии по структуре пакетов и классов:
' u9 `" d$ W2 y* q: r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    $ S/ R) J- t/ Z1 W
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ ?' Z: P5 o$ w0 r
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 T$ `: U8 j1 L( [* f5 t" `5 r
& O. ^4 e0 o7 _1 p: a5 K6 N
- d$ m/ b: s4 t2 `
. f+ j- a. w  q  T
3 D( C% \  R, y, @+ A3 l' J# d: O

8 E/ {8 l4 A; h6 A) g3 t# V( n. y& V5 P
* C- S  ^8 v' W. r; Y4 |; A
- N6 ?" G, _* S( T6 z9 T
" s+ t' x3 {+ M' q9 E5 m- t4 o$ [

: N' f* J0 U- D8 g9 s1 g. @" B& G' h1 `! O- K8 [6 m! g
- s3 _" e' W& o1 y6 W  ^; p
# B% |/ v7 _( d" e" w1 T3 `' h6 l

3 b  ], \! J( l
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
- I& S/ Y* {* p: H, ]$ vДля управления сложными взаимодействиями, такими как  ...
2 T2 A! S* j. k5 I
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:218 p' Y: q7 J, G5 U' Y( r
Отличный подход! Использование шаблона "Состояние" де ...

1 W4 k3 a. t, w; l( R% NХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии." K) V' m1 h+ ?6 Y1 W* A
. j4 ^+ i4 m6 n9 r/ t# S
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.1 x/ [5 ?8 }$ G# K
: P5 T- |' @+ P$ ~; D, W3 h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 c- M& q  F  o% D
  2. package org.l2jmobius.gameserver.model.actor;  a; n8 w: s4 u; n, s( T
  3. ' t( ~7 K+ h, @' O$ d; D) ~; J
  4. // Перечисление для типов атак) N; G% P; v: a) {! I1 B9 f* i
  5. public enum AttackType {1 _9 Q; d' @* g% J% Q6 x! T/ ]
  6.     PHYSICAL, MAGICAL;
    5 h: E( p1 U, s' w5 q
  7. }* Y5 b# e2 \6 e: |
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.! r1 I4 d% N- M$ w, {, w/ ?0 V
Обновленный класс для агрессивного состояния монстра:
& N$ y/ q* Q" b
: U! ]% ?' {: _2 T2 X! _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 Z7 h6 A8 P' H! Q0 j! S
  2. package org.l2jmobius.gameserver.model.actor.state;
    . Y! w5 c% w% p7 w( W) F; g
  3. " r+ _) K4 l, n" L" L4 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;) m; `" V: ~$ M4 y: w3 O7 `
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ( {, V! C" i9 W4 F8 N. p9 @* L" F
  6. & A3 q# M! S1 i/ o2 l# G3 H
  7. import java.util.Random;
    8 w9 n. S* `  C3 ?" p) j) `# T
  8. ! ~# w8 `! H- \$ ]( T
  9. public class AggressiveState implements MonsterState {
    : ^) S9 `, w+ a' m* q0 N
  10.     private Random random = new Random();
    & Y) |1 P- t9 @' ?7 ^) f4 j

  11. 4 V+ V' P- x+ s4 M# ], q: i
  12.     @Override
    ' N6 k1 q: d) w3 x5 C
  13.     public void handleState(Monster monster) {  u9 o$ a, z! m1 w
  14.         // Выбираем случайный тип атаки: физическая или магическая5 T: N0 @! g! F$ x6 U% Q8 h
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- Y. ]$ k! `) X

  16. 6 |. K$ T+ V* o9 _3 k' @) m, h5 H
  17.         // Логика для агрессивной фазы боя. M' C; g7 I) l3 X1 N
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    4 ^: G) U8 \3 r5 ]& Q7 C/ Y
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");5 t9 y1 s! l6 e* I/ \
  20.         
    ; _) v7 S4 E( l0 N
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    4 T6 V% \. _3 Z% m7 D8 B- C
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;+ U# ]; o7 U! Q! L
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    + h  S" o7 i/ ~" H4 y, ]% V
  24.     }
    * k' I' b: m# z/ O+ d3 g$ Y
  25. }7 y( `+ P+ _# t8 ^. Z9 l
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки+ F4 s  b7 N9 l3 t: n; {0 z4 _: F( K
5 E  n' v+ a- Z' b- [+ \! J1 `5 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor3 ^: ]  ~* B& J$ k
  2. package org.l2jmobius.gameserver.model.actor;# }( b6 _* F6 |; r
  3. * _; C4 T1 X2 }" Z' x
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ E5 c/ O: ?5 \% d( S& f2 ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 [- {) [; y5 G6 l1 Z% S7 ?8 G

  6. 7 \( n; B% }( B) X$ r6 C9 p
  7. public class Monster extends Creature {* H. n) b) Z  C' G' f# m( }' R
  8.     private String name;/ ?: x3 R2 f& B. P
  9.     private double attackPower;, y. w# Y5 {! @4 a2 t9 A1 P
  10.     private MonsterState state; // Текущее состояние монстра
    2 n8 J1 G% {: H" p

  11. : o5 T& O8 L# R( S. a& y  U
  12.     // Конструктор монстра4 {. w+ C: s8 Z& q# j
  13.     public Monster(String name, double attackPower) {
    7 L4 \) E% j# q8 W3 e  U9 [# C* f
  14.         this.name = name;7 O9 r* t8 E; |- K9 r8 S4 a
  15.         this.attackPower = attackPower;
    7 G3 Z7 m1 m. {3 g- F, r
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ' L1 Q1 u, p* q$ }6 B/ |2 ]* ~/ f
  17.     }2 ?; ?, [" t7 s; h# ^

  18. + V' j5 l3 J! c& U
  19.     // Метод для смены состояния7 u5 R0 u5 q" B! a3 Z3 K% `9 y
  20.     public void setState(MonsterState newState) {
    ; i1 Z5 o1 Q1 T" O' p# c
  21.         this.state = newState;
    6 u2 b$ ~! J1 M4 _# ?; C& d2 P
  22.     }
      T( \" G. d$ Z6 t# _! U

  23. ) `8 a$ r1 t: w4 M! A4 S* H
  24.     // Выполнение действий на основе текущего состояния$ Q9 V: L) ]! g: l* ^) O
  25.     public void executeState() {. t0 D2 |3 S8 V; J% B6 K/ q- Q/ p
  26.         state.handleState(this);2 \, P: s  T  G1 j; T
  27.     }# t2 j" q) A" D

  28. ) b7 v& X, C9 n% D" T  d' c
  29.     // Геттеры и сеттеры! X0 y5 @- O: G, P* G
  30.     public String getName() {6 d9 y; K: f' ]- j" A' r
  31.         return name;
    ! f' Q- Y1 L; Z6 h1 {/ [$ Z9 u
  32.     }! p2 k" L8 o3 w4 S
  33. ' f/ V/ c+ [5 Y* `8 x
  34.     public double getAttackPower() {% o+ M! B# i+ k; k* q( A0 G2 m
  35.         return attackPower;
    : B3 A+ F; A1 E% v
  36.     }. j6 [, P) ~9 N$ s( I6 F
  37. ( M" M: C  r! e) z- c+ ]  v* ]$ G
  38.     public void setAttackPower(double attackPower) {* r4 X" l, x# v3 {& w' L. F
  39.         this.attackPower = attackPower;
    # T% m6 C8 ?2 ]1 N
  40.     }) A, L- C% F* n9 h( {
  41. }
    1 h6 J  o6 M$ {- v0 l2 i: y1 p/ u+ V
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе./ w5 ^, ?# |$ j: e

. B1 ?9 J9 Z7 k/ \/ V7 b# t. `
  1. // Пакет org.l2jmobius.gameserver.model.battle5 C! N0 N& Y1 q
  2. package org.l2jmobius.gameserver.model.battle;
      L) ~5 z. m0 |& y) Y0 ?/ A7 a
  3. 6 d! f5 `0 n4 z5 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 g  N- s# [* \; b( g9 A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 }% M; c+ c. u/ ~( C

  6. # c/ a  Y7 n. L8 O3 S
  7. public class BattleSimulation {
    1 S4 X3 G, ]1 d# I
  8.     public static void main(String[] args) {0 J3 Z8 U' C- N* s% ]3 T* F' i4 O
  9.         // Создаем монстра
    ! J* f, o  p" z+ O
  10.         Monster monster = new Monster("Дракон", 100);% T! D8 }8 q: Z8 p  N1 }
  11. , |9 l2 d# ~+ y
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак: {* Y" p; i4 E
  13.         monster.setState(new AggressiveState());2 r1 u! l6 i7 I& }, ^* p
  14.         monster.executeState();
      U9 M3 ^" v: L8 q# k# V1 `
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак% t5 c( U) c: _* c) a) N0 N" O
  16.     }! ]7 G$ ~! \3 e! w$ i# a
  17. }  S- W2 Q' G: s
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% [4 q& }+ Q- V% v2 w
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!* X9 O: {5 n1 u7 @
! L1 v3 C& j$ Z, f% B
9 ?, k/ D. m! G3 [+ y# D- g9 l  Y- g: C

' w0 a' C' i! @: |
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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