Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
! U3 q" ~6 [6 v, R, D5 R! l" `& N7 n" A  M) v" f; N3 {( y

& [. r6 j0 T3 ]& q' N% lЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
% I) a  J0 |* s+ |3 N' VЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 M* N. b! q, @5 s; D
Астралия ?
5 C3 n  I7 V: Z7 x# N3 }& i9 [
% e9 ^' f8 @4 K1 ?4 _# g

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!! |4 b0 ^3 ~8 Y% `
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
/ r9 {7 c) v9 w- b9 O: O# u/ ]; P. T7 |5 |
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
1 d- W) O) L# o% y/ }% g9 X
AlexCoder опубликовал в 2024-10-16 18:31
0 P' m$ N' ^& LДень добрый!
+ B! S5 _8 S, H8 S$ m. fВ статье описано взаимодействие игрока с N ...
, X3 i- Z' h0 {3 ?% G
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) ^$ }/ \  T( r1 Y
2 G0 E% ^1 \8 O4 N/ X: P5 `! u
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 J4 G9 M9 }4 N
& p: O4 |' s! q2 e9 a0 ^Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' f% j% e: d7 k2 |  ~4 f+ E+ T2 B, H- }# A+ e7 v8 h& r
  1. <font color="Green">// Пакет для состояний монстра</font>
    + A$ B  C! {+ i( l) R
  2. package org.l2jmobius.gameserver.model.actor.state;
    , C" z) N/ h/ G
  3. <font color="Green">7 h# G& K7 g; q) F* x* e
  4. // Интерфейс, представляющий состояния монстра</font>9 z+ c* L6 s* e6 k
  5. public interface MonsterState {
    & [4 H# I9 ]: F% S* t& f( `$ [
  6.     void handleState(Monster monster);
    ' \4 T2 s' i. H" F
  7. }! \# x1 B9 s# A
Скопировать код

9 Z7 ^1 i) i( M" F3 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: v2 X0 z- g0 A5 H
$ X# M" F& `2 a
Класс для начального состояния монстра:
4 ^7 C5 u1 ?+ J/ s0 \( S
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>6 j9 S. n) v8 Y6 c" ~+ ~
  2. package org.l2jmobius.gameserver.model.actor.state;5 L: Z* z: j: @) t# G7 Y

  3. $ b) n8 d% w4 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % ?, U5 {. ]' T3 b; z$ P' f

  5. 6 z0 G/ r8 c! }% W
  6. public class InitialState implements MonsterState {
    4 k% x$ d% w1 m) e* D
  7.     @Override3 Y- V6 ], _  f- |3 B' q* C
  8.     public void handleState(Monster monster) {
      ~1 g: B/ C, B1 m! l
  9.         // Начальная фаза боя& o) e! |2 Y0 A4 A" K$ t! D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    4 t) P7 k, `5 U) j2 k( s3 F
  11.     }
    ' k3 [. b. T( V* q$ w# ^
  12. }
    7 X: u) Z0 x; I+ K) v" Z& m
Скопировать код
% v; M! w# i' @/ ^! N* |" Z) H
% d* c- i0 _$ p' M

8 f9 }& f/ v# K5 S* J& t/ M
( m5 t- c. v& L0 u$ K5 @  g
6 X9 X9 K( M! z6 k* q  L' v0 t+ W5 P* l: H% s! i
+ }* `7 C7 p' W. }+ V
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* ]5 K. d/ U+ e) l6 K  }9 ~- n2 z+ ^
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) a3 J1 l. d7 a: \) I. u
$ s5 O$ E4 O6 k. b3 B, x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 w3 @% J; n8 d. P

# ~$ p" o6 {; C& f$ e, ]
  1. // Пакет для состояний монстра, J/ c, V3 H( d6 v- A& p
  2. package org.l2jmobius.gameserver.model.actor.state;; i( o1 s  i0 P9 o- a# B$ B

  3. 1 m" f% |" r3 B' a
  4. // Интерфейс, представляющий состояния монстра
    ' M2 J$ s( }+ n
  5. public interface MonsterState {
    : `2 C  I, Q. N9 Z
  6.     void handleState(Monster monster);
    2 Z/ A7 B. R! p! q+ z6 S" C
  7. }5 R; {* x: r: X; l4 G; ?7 R
Скопировать код

2 [" x* ]9 L4 t- IШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 V' R8 y  s) \, }

) U9 ^3 k) e$ l+ U5 Z" s& RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.2 u% t* t& Y( m
9 [% _9 \- ?# j/ O: ?
Класс для начального состояния монстра:
6 c( m, q% h: p1 I+ u) V! d. g% p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 ?; C- b0 w- }+ x. t
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 v# ~) q5 \, S+ c2 _" n

  3. " F) g$ d% D; J. D7 f3 q. Q: v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : d% r: V7 K  L; R& m4 i

  5. ( d# }& ?' ^6 Y2 k, }/ x
  6. public class InitialState implements MonsterState {0 y* |; J; m3 Q5 @5 l" m* T
  7.     @Override
    # C5 B) X" d& Y
  8.     public void handleState(Monster monster) {7 X2 R- z: W( S$ W
  9.         // Начальная фаза боя! U# q" |$ I+ Q8 J9 t5 L
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    / f5 N* x: Z6 W0 K
  11.     }
    / A0 e1 i0 H& q/ z
  12. }9 B9 s8 B' e$ U) u% R; p: h! _& Y
Скопировать код
Класс для агрессивного состояния монстра:
; y6 u1 e/ @% m% {8 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 z  ]6 ^+ {2 k
  2. package org.l2jmobius.gameserver.model.actor.state;( J$ E- B0 K+ s+ x3 K$ V

  3. # e& p" b7 P* Z2 V- O
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ Z. Z: O2 c6 I) M
  5. 0 ]* _4 X; m; y9 M! s; h! A
  6. public class AggressiveState implements MonsterState {; z2 ~7 y( g5 k7 s6 I9 \
  7.     @Override
    : c1 `9 X0 ?& Y5 O- E6 C+ V+ a* ^
  8.     public void handleState(Monster monster) {
    7 Z( V3 F2 |1 p  _1 L
  9.         // Агрессивная фаза боя' y: @# l$ e0 y8 H' t9 p+ ]9 B! j
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");8 f5 Q6 @# R, C& S
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; [# L8 l) i, _; ^
  12.     }
    & C8 A( p% [- c" H9 u
  13. }
    . H: M4 b" W1 K( n* G
Скопировать код
Класс для финального состояния монстра:  H% }% R0 }0 |( o# O) |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! n: I; N$ @' Z0 o: q! j6 h
  2. package org.l2jmobius.gameserver.model.actor.state;- p8 N# p6 ~8 J! C

  3. 6 V5 m2 H# B) p6 E$ Q; f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      f+ V/ O  x+ @! _7 J

  5. & D* N+ V; M2 _4 k, n) }2 p
  6. public class FinalState implements MonsterState {
    # W2 B& v, k- K% e0 \
  7.     @Override
    3 @) I9 ~+ h/ V0 n
  8.     public void handleState(Monster monster) {
    ) }" q, f4 N# h" `9 `( q, N
  9.         // Финальная фаза боя6 g! H9 v, F1 j+ H/ ^
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 \0 c+ ^; G, p* Z" x$ u( [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки6 C3 f2 M* c3 m7 T) @9 m8 S0 S
  12.     }2 v# r# F: g5 ~: p. i! T3 D4 z
  13. }5 U% z" {' E( b0 U1 [- s/ S+ t
Скопировать код

0 ?- W0 j3 a3 m4 F0 hШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 i& P1 m# a; n& ~
  1. // Пакет org.l2jmobius.gameserver.model.actor3 d' D( k) R: a/ n
  2. package org.l2jmobius.gameserver.model.actor;
      V; {5 P6 p8 F3 `$ T- b( K
  3.   ~! @; }  J1 c& S% N3 L& L
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;, L$ {/ x* C) c* P# ~$ }+ Z  h4 n( n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ' }: F$ e1 \1 ?8 @! U
  6. 0 a! I5 W  H+ z! r& W5 |2 C
  7. public class Monster extends Creature {. O$ V1 k, @9 f9 d# I
  8.     private String name;5 \: c2 B  v$ S( H$ ?! m4 i; H
  9.     private double attackPower;- X8 h+ ?; \/ S9 @4 c+ E  k
  10.     private MonsterState state; // Текущее состояние монстра& y4 y* W* ]3 j# g
  11. ; p: E+ @+ X" E% P& w7 |
  12.     // Конструктор монстра( ]5 J. U4 J7 [+ C, c$ \" [$ g
  13.     public Monster(String name, double attackPower) {
    * t) I( a, H7 z" N2 B. q
  14.         this.name = name;# W2 g1 @0 A& l! ~
  15.         this.attackPower = attackPower;
    7 ]5 d# _# I/ @7 I- R) Z, m
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    % v" K* a+ j9 n& a* P
  17.     }# m) M! A; Z0 v+ z  Z4 w6 V! z
  18. + A- ]! m* S$ N$ s* s
  19.     // Метод для смены состояния, O& s. i0 e( W7 C% T( r
  20.     public void setState(MonsterState newState) {& Q/ |" ?/ k# E% U
  21.         this.state = newState;
    + Z0 i! U) k% N$ f: F$ a0 K
  22.     }
    9 i+ F2 w% y/ M3 ~. L- X

  23. ( c) {: ]7 o2 l( X" `4 h
  24.     // Выполнение действий на основе текущего состояния
    % Q2 A& c: `/ s) B: f, S! T5 T& d
  25.     public void executeState() {
    1 ?" o3 ?8 g& ]5 q" F; e
  26.         state.handleState(this);5 O* r6 z# V/ V' x; `5 @5 Y2 z+ m
  27.     }5 y+ j; @$ H/ {# l  e' x9 q# N

  28. + w& d# O8 S) E. {
  29.     // Геттеры и сеттеры% l: \& L6 H1 H! h( k' ?  j
  30.     public String getName() {
    , D0 b0 I+ F# s) T2 T- Y! ~
  31.         return name;
    ) I. Q+ r) }! A3 ^6 n- b! h
  32.     }
    7 Y; t. m4 h) t( v' B
  33. 6 r2 Y9 l( Y2 g. \0 l
  34.     public double getAttackPower() {+ w& x0 r8 B+ ?- F. e$ E4 f. j
  35.         return attackPower;# Z5 s) P0 t: c" H! G, i
  36.     }
    ( V0 O/ ^! _) L$ D

  37. : v( \: ]( E8 @1 o5 y0 I
  38.     public void setAttackPower(double attackPower) {
    ) |) N4 d- K3 B1 {  D
  39.         this.attackPower = attackPower;1 L1 p- u5 s1 W2 H( y4 l4 O
  40.     }
    1 }. c! T' O" l
  41. }$ Y4 R  d) v7 `/ _5 A
Скопировать код
9 x0 ]* W. O  A6 X3 t4 F: T. [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.- ^# c3 V5 Z4 r8 w0 t& y
2 P3 e6 L# ]. k0 B0 P
  1. // Пакет org.l2jmobius.gameserver.model.battle" o, e$ }* t( }# _& n
  2. package org.l2jmobius.gameserver.model.battle;! |" L3 L$ f: M( M7 g  j

  3. 3 R& V1 |7 W1 H' ?6 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;# U! {& U/ e% ?$ b. X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;4 d1 b+ Y2 ]& ~
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ; g+ i9 B, R$ L% v, m

  7. - ^7 y; I  U' T: }3 Y" i
  8. public class BattleSimulation {* ^+ M" y  |9 S1 P9 r# N9 T
  9.     public static void main(String[] args) {: s. T4 B$ @/ m& Z9 U
  10.         // Создаем монстра с начальной атакой
    / v7 X3 ~( @; a/ Z2 d: O1 \+ B
  11.         Monster monster = new Monster("Дракон", 100);1 j$ @! f) e. A( _. @4 B
  12. & M* M4 H3 g7 E& C+ P
  13.         // Начальная фаза
    * J7 B" L9 y7 S) F6 s2 u' U
  14.         monster.executeState();
      q( Q( c$ i- q5 M; _! B5 z
  15. $ ~: \; k" j4 u; X, E8 {; d
  16.         // Переход в агрессивную фазу
    ( l3 t4 g6 \. p* m, ]: x/ M0 i
  17.         monster.setState(new AggressiveState());
    ; i: ~% r& h; X" |7 z5 {/ m) X
  18.         monster.executeState();
    7 K, X- D  n1 r
  19. : w/ r$ ~# i- M2 @1 h" @9 |9 x
  20.         // Финальная фаза
    ! A5 A( U0 V. `+ y& A$ ]
  21.         monster.setState(new FinalState());
    ) T7 V5 ^5 u# R& M3 C
  22.         monster.executeState();
    0 ^$ [# P# ?1 H* Y5 Z
  23.     }
    - w& C+ m5 M0 }/ q( N7 R  h
  24. }
    ; N$ [# S! r; C$ R& J$ f0 P
Скопировать код

1 b- {0 M: X( u2 S4 P2 BКомментарии по структуре пакетов и классов:
! y* c$ B( K3 K; `: o# M  W
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.7 }+ `2 X7 I5 H! k0 ?" P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ e( h7 q) ?% |1 KЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!' L7 a2 @6 c( R
  K+ Z% q& a0 z' n
/ S" m6 b! Z; f/ |# n9 f

+ X' H, T: n: C4 G, s7 x
' N5 A$ ]% N9 u& j1 q% |
$ P: M2 M+ Q+ L9 G& G
- ^3 W0 ?' v0 e6 T9 T* z5 [$ a. q( \# }) {
! c( B5 d1 U  n0 I9 [' M& v
7 T' D  x( q% `( F

6 D# }' r; L+ L. w; z. M& \0 w! y/ A# ?1 s8 x0 l

# V+ d$ s% ~$ R9 h2 C- E6 [9 T2 e
: R  S. O4 R& U; ]8 f/ E" e; U7 R# J$ v9 o- h5 V5 ?
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 I; H/ g6 h. j
Для управления сложными взаимодействиями, такими как  ...
' F  r/ N3 @( D  H5 J+ [. B0 t0 q
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21' I: R  W# l: Q$ p: O
Отличный подход! Использование шаблона "Состояние" де ...

1 x# [% ]/ i7 k9 O' a- t2 a# r8 JХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. }6 N+ ]' s7 ?. {4 Z  L
* C% s+ Z! U$ J' v3 A* \8 BШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
& i- `& f$ B: W' l: v7 N8 v, {
* s. z* K& [- _8 F
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 g5 G& V! r/ A2 z$ T
  2. package org.l2jmobius.gameserver.model.actor;/ q" }/ L: s  Z  Z/ V0 F

  3. 1 l& q/ {0 L5 C
  4. // Перечисление для типов атак
    # u" o3 g: _- o
  5. public enum AttackType {- \& a/ D+ D( k+ m9 e8 y" z
  6.     PHYSICAL, MAGICAL;
    # W% I5 p8 G) {6 M% H+ Z2 L
  7. }! o6 D2 ^& o+ E6 D3 C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
( b& P# ]+ O: `- BОбновленный класс для агрессивного состояния монстра:0 A+ f  e9 Y, E3 \" `$ y

, _5 \/ g# E5 c4 h* X9 z/ I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( ^' N9 @1 l% n, ]0 i; O
  2. package org.l2jmobius.gameserver.model.actor.state;5 z+ t1 Y. g* e6 |
  3. ) Q1 r& L  s3 k; c- Q+ Z- M; t8 F
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ Z8 O8 C6 F+ g% v  _! o
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    / S/ @/ X2 L3 d* F0 G) \: @

  6. / L) l- e3 ~* A. l
  7. import java.util.Random;
    . V8 _% r8 M4 z8 X  K' z
  8. / P5 w4 j5 O" D
  9. public class AggressiveState implements MonsterState {
    5 A6 z6 K. V. M( ], j% R
  10.     private Random random = new Random();% e+ o! g) o3 ~' o5 _2 P, `4 ~; ?

  11. 6 Y4 u! U, I# u/ G7 h. E
  12.     @Override! g9 ?1 T( n3 }6 Z
  13.     public void handleState(Monster monster) {! o# V8 g# b, m2 b
  14.         // Выбираем случайный тип атаки: физическая или магическая# c5 H) A  X* x& W; ~. c
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;. T$ X4 r& M. K5 L& T* Z# |0 b* o8 _

  16. 8 h# \3 m5 d( A( G+ O
  17.         // Логика для агрессивной фазы боя, I% D" H: D6 `6 p2 H8 S* D
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ) Z2 w7 V0 `$ Z' A' o
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");) Q* n6 V& ]( E6 b" m! n- m; V
  20.         , B: {6 T' J1 h# H: ^$ w9 ]: z
  21.         // Увеличиваем силу атаки в зависимости от типа атаки" ?# k2 u/ Q& Y' t
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;4 }! {8 x& U9 x& M3 ?) B% u7 u" e
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);$ T% p: @  ]0 X0 g
  24.     }
    9 q  u% U5 l0 I1 Q& T
  25. }
    1 N9 O2 C6 z/ D8 Z' N" q6 r" C
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки0 L5 p/ `$ C+ D7 i) A
7 V$ D) H& N/ T! |6 x
  1. // Пакет org.l2jmobius.gameserver.model.actor: s. Q+ S7 |4 W& i, u
  2. package org.l2jmobius.gameserver.model.actor;
    , b6 u. R) K+ P; T

  3. : x; ^5 U" R+ a3 b4 q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; K5 Y& w$ @# a- p# {& Q) X
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    4 T$ B6 X0 z% G  r

  6. 3 F' j9 J6 T8 E/ z* [+ i6 I# s+ N
  7. public class Monster extends Creature {$ D2 x$ T: {" H+ g0 q  y! x1 r4 O
  8.     private String name;
      K, p1 e, y( e) f) R
  9.     private double attackPower;
    8 Z8 I' N% J- S" M0 u4 S
  10.     private MonsterState state; // Текущее состояние монстра
    & p) I4 J! U& T) Z8 |5 D

  11. & D8 x6 c: i7 e: ~, B
  12.     // Конструктор монстра; ]; z- s( v, k! v6 y4 j
  13.     public Monster(String name, double attackPower) {2 l  l) x3 M1 @% `
  14.         this.name = name;
    6 ]( K0 t* P/ l' P# `, f
  15.         this.attackPower = attackPower;3 n! x: ^6 c* v  ^0 S
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию% N( b9 r& h+ v' t% G; D) O3 j- V
  17.     }% q5 r- l0 i0 }, u
  18. ! a/ ^0 q% S! l0 z8 T. [
  19.     // Метод для смены состояния" p3 V/ J  i' V) t9 R
  20.     public void setState(MonsterState newState) {
    6 x1 f! S, O& e0 G- F) V: b- U4 a
  21.         this.state = newState;. v' H. V' |. b* u
  22.     }
    5 }0 v7 d9 |$ G4 [* M' s' ?

  23. ; K$ R  U1 `! Y1 x9 D( N, ~$ K6 W  i
  24.     // Выполнение действий на основе текущего состояния9 {% a- g$ c* q2 E: f! `0 E2 S* z
  25.     public void executeState() {
    4 z, U; q9 y$ I% X3 J  z4 y
  26.         state.handleState(this);2 }0 C  t3 u( z5 g& p
  27.     }2 b+ X9 k% E0 O# J
  28. , B0 E* ~# v  K4 n  L
  29.     // Геттеры и сеттеры
    7 v. x$ u  S" ^' ?, [. O& [, @$ z
  30.     public String getName() {
    " ~# X% T& B% a! p# M
  31.         return name;
    5 }3 i* H3 W: `) ~
  32.     }
    1 f; z# G8 s' x
  33. 5 u, b" j4 m$ n% N; i2 p
  34.     public double getAttackPower() {1 _: {, @, n0 c- V8 Q
  35.         return attackPower;
    ' Q+ u5 k* T( j$ J# P. `1 |1 \
  36.     }
      X' I/ q- u  L) K1 t, y
  37. % e1 d, E$ l# P1 K. a2 U6 E
  38.     public void setAttackPower(double attackPower) {: W$ j& t* y$ B- g" Y, Y  ^
  39.         this.attackPower = attackPower;
    2 V1 x8 [  B  }7 r( {
  40.     }
    # j4 u9 D5 o- R& [  u" |; A
  41. }% K# o; r# F/ z
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: Y; [# ~  g; C6 b0 u' N0 i3 }

$ M; O" j, C1 E
  1. // Пакет org.l2jmobius.gameserver.model.battle
    * u& m% r' Z4 s9 q* n) r5 f: z# }
  2. package org.l2jmobius.gameserver.model.battle;
    , X5 R+ Z) m" k9 V% V9 Y8 k' p

  3. & e& ^- o! F, T; w0 c5 W
  4. import org.l2jmobius.gameserver.model.actor.Monster;) }6 p: {, K5 u2 P# `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    / l/ F* V) y8 B' O

  6. + P3 x* ?7 w6 W3 F- o. o
  7. public class BattleSimulation {
    ; {3 q5 _& n! R& S$ I; d0 {
  8.     public static void main(String[] args) {9 ^" w1 A( }( ~/ \5 ~
  9.         // Создаем монстра! I# |1 M! W2 J' n" p$ t9 H0 \
  10.         Monster monster = new Monster("Дракон", 100);! o4 p/ P* K0 ]* |  \. p% z# g% |
  11. 7 z# n, t6 E' K% B) B( U% X7 \
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    : e) P' T4 l3 F. P
  13.         monster.setState(new AggressiveState());
    / y- \- N" L7 z1 h: a
  14.         monster.executeState();
    " N1 _& m* c* ]. g7 Z6 j% |
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак; d3 |7 Z: {9 X
  16.     }
    ( N/ B" A7 J/ q1 I( ]6 j4 G6 W0 {
  17. }
    ; L: @9 F' B& C
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 z! ?1 n# ~- |: e  H* u+ i. n1 U& }Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
; D9 [2 S$ |9 q  a9 R5 ^$ `, v5 I  s, P8 T
/ J6 \1 o- H. ^

0 b' a4 ?4 G, V. U9 J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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