Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
4 P# F5 ^; z3 U" }9 E7 {; t* K5 r) _7 T# _& ^" {6 D
! U- F9 z& ~7 O# b7 t
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.( J. I- d2 {, `, w. K. D! p
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!4 R* ^6 L! r9 A2 s% g7 `
Астралия ?
& x+ [5 K- f0 M+ v) n7 I. p( v+ H5 K; X. P4 L' v/ Z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
* H' b; J( i" O% {- R! V4 uВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?* I4 D2 D( y. @$ C
) p# E* x& L! T! z" K
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
; d# d; A0 S$ T% ~, j2 r/ S6 x
AlexCoder опубликовал в 2024-10-16 18:31
# d! j, p* u4 V" CДень добрый!8 t- h' L. S& H) G
В статье описано взаимодействие игрока с N ...
# s; U# k7 G* c. ~# z4 d7 n: W
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 J4 W7 k: Y# F4 Q, K3 S

& v2 L3 c8 Z+ K* W  {( Y5 EЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.* N; |9 u$ w2 Q3 i6 ^! O; F

; h* Y5 ?$ V0 TШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. G9 k1 _# [* {  p: v8 p

5 F/ B( T* A& H! o1 V
  1. <font color="Green">// Пакет для состояний монстра</font>
    * ?' A, ]3 F( B/ I
  2. package org.l2jmobius.gameserver.model.actor.state;" N5 n4 j  E6 a# [$ M
  3. <font color="Green">
    + p& x* P6 K4 W0 O  g( c
  4. // Интерфейс, представляющий состояния монстра</font>' `* o, B$ `( m# Y$ {- ]4 w- C: Y
  5. public interface MonsterState {
    % }4 Z$ J& ~6 s
  6.     void handleState(Monster monster);. M% D3 Q- Y. v6 j8 e5 z+ W2 {3 X
  7. }
    " \" N7 B2 @* q2 M# Z, }
Скопировать код
. D$ C  Q9 j6 L+ x: |
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 T7 x* J+ w1 c; T2 b
. a3 i: d0 {+ IКласс для начального состояния монстра:
& M: a2 R' u; N, M: o
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    - W  L" e: m* k
  2. package org.l2jmobius.gameserver.model.actor.state;1 Z  b) ^* w4 e* {' ~8 {

  3. * W6 n& B0 z" O: ^" S
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & e+ k0 X1 s# J6 x) X

  5. 7 ~) `8 r, e8 n8 X& g
  6. public class InitialState implements MonsterState {) g+ ~4 T. B5 Q$ f/ S) O
  7.     @Override$ z8 c7 }9 k  A, U
  8.     public void handleState(Monster monster) {7 d3 ~9 \. r" ]/ N8 v$ u8 Q: H
  9.         // Начальная фаза боя
    8 O* R* m. y, ]. g8 @, q, V
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    . V' K0 t+ Y$ _
  11.     }
    1 x  [+ K) v$ k7 `6 f# `. z
  12. }
    0 T$ U: Z3 @, r; ]
Скопировать код

" g" }/ ?8 n) h' }$ B  n' G. J5 w. T5 z9 I( K
8 E$ n- `* E, P1 \( V# g
: _& ]/ d, F! z0 v. q" W
  T0 I+ J( V. b2 |- k

' R* p2 i0 A9 _3 f! u, c: a+ m- E6 ^# x0 s# Q  P3 j  J( o8 ^
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
; i- H9 t* {! C$ R
3 \1 y- W! N- C3 G* B* f2 X0 YЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
0 s; K$ m  p: O$ E$ D2 F
) x( q5 ~& Z8 l0 c' DШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 J' O% c' t* R9 `/ m
  u# F+ e$ P0 F6 p  v8 j
  1. // Пакет для состояний монстра
    . z4 n8 f1 o- L$ o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! Q  k* q( j- b- y
  3. 4 P) T$ C1 f! w: W3 h# h1 j" z
  4. // Интерфейс, представляющий состояния монстра
    & w  v$ l$ m4 Q( |2 t5 ?+ ^* e0 X
  5. public interface MonsterState {% J( A% r( F0 q6 Q
  6.     void handleState(Monster monster);9 P% J+ i  l0 @2 p
  7. }* m, q! z, V2 z: M& E" T
Скопировать код

6 U! j: P9 R! c$ C$ qШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 }) v* w2 u) T& R- C- o( w

$ a# p# x- t8 F4 DЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# ~/ ?' B  ~; E9 i* T% F' h

: j# a+ C% g0 a# GКласс для начального состояния монстра:3 U% D6 a8 ?4 }. p4 O0 h! F! O- p$ v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / A+ |8 D9 I' U  j1 e
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 M/ s, W0 I- ?

  3. 9 }. {3 {. P% |( y- t) `* X
  4. import org.l2jmobius.gameserver.model.actor.Monster;' K/ ]. M8 @5 u: B  |+ I$ P; n
  5. 5 f7 V2 [' M9 i  g
  6. public class InitialState implements MonsterState {
    3 T6 e) i) U- ~- i
  7.     @Override# L7 z; A% F4 }
  8.     public void handleState(Monster monster) {! d- G# [! `' A$ \  d& I% Q$ |; G
  9.         // Начальная фаза боя
    ; O- e  S# F6 m" F- f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 p% a3 H6 x! `( ]" ~7 T
  11.     }
    1 g; y/ r( P" S2 s, V' \3 F
  12. }
      e; Z3 @* Q$ ^$ h
Скопировать код
Класс для агрессивного состояния монстра:! J4 ]5 U- Y, W3 r) G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( z$ B; M3 l0 K  U& h) f% K
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 @9 l) |5 H" E5 P
  3. ( n8 t+ ]) D, g2 D: @6 W1 h! k
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 {* `8 t7 d0 S# J% ^
  5. / B: @+ j; b5 b1 w9 Q8 s7 c: S
  6. public class AggressiveState implements MonsterState {2 Y& U, P6 p* q' ?3 D) t, w7 ^' O1 K
  7.     @Override
    : @" l+ f5 K' C: H1 H! j7 g& H
  8.     public void handleState(Monster monster) {
    . l3 o. ^% q! l! L9 d7 t9 D9 s
  9.         // Агрессивная фаза боя
    5 L; z% M) I0 W* K) i, Q. _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    0 T: ~% G; P: c; f& j! N% S$ }: Z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& R4 L- c. ]- k, ?/ x' K: g1 _7 Y
  12.     }
    ( |; r& H% i5 R& g
  13. }  R% L: \1 D  ~& t& W
Скопировать код
Класс для финального состояния монстра:+ b0 ?% @% a* w3 U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 \: f2 ^; h3 b
  2. package org.l2jmobius.gameserver.model.actor.state;
    / X3 Q0 Z/ R" x- }+ O( @  S2 j
  3. + {+ i. P& m' j, S9 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 e. h( Z6 W4 {5 A5 U) b

  5. / o# `4 G% {5 M8 k% I- y, V. X# i
  6. public class FinalState implements MonsterState {
    # h, B# m/ O' W  x# a
  7.     @Override" g' h  [# n. z7 [' Q
  8.     public void handleState(Monster monster) {- M' O2 l$ d( o! a) n! `% E' a
  9.         // Финальная фаза боя" J' a% S$ f* _) q* M) M6 {
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    . a" L6 i+ j8 p
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : K$ S3 i, k9 _5 X
  12.     }
    3 h, P# G( w2 u/ \
  13. }
    $ C* ]3 N9 h% B, l/ r) c$ _4 B6 y
Скопировать код

/ v' Y8 f5 O4 |5 vШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., a3 Z! V3 Y3 ?$ l1 {, M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 z9 k1 s, t* n, T
  2. package org.l2jmobius.gameserver.model.actor;
    " ~+ {  \) s: J3 y2 ^. ^2 x

  3. 6 v2 Q# W8 @+ Y( D. ]8 \3 A" v
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;4 X. r9 F# r! T) Z" k% @
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' d( P* z- ?/ V" j

  6. % r+ I# f& f: Q1 X  o7 D4 ~$ O# @
  7. public class Monster extends Creature {( c9 \, _- ]4 D6 y4 p! Q8 R+ t, t$ l
  8.     private String name;
    % z4 S2 T1 j* O: r7 W0 M5 c3 {3 ?
  9.     private double attackPower;' ~. ]! G7 p7 ]5 ^) f$ C9 n
  10.     private MonsterState state; // Текущее состояние монстра' @( u% `. Y; t# g, u
  11. # \# _2 u0 h' n8 n) D; g$ t6 v: y, U
  12.     // Конструктор монстра1 h: t! t& `+ K% _7 n7 |
  13.     public Monster(String name, double attackPower) {$ l7 ]; o1 f( V1 d1 C3 N
  14.         this.name = name;/ F  ~  J2 ], _# k4 o) r. u7 b# U
  15.         this.attackPower = attackPower;
    ( c/ {" z1 I. |- R2 k3 G4 n9 r
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    + k. d9 A9 F5 q+ A' [2 z
  17.     }- G' M1 J, ^3 A# u& |) k9 S. s- U1 K

  18.   j# D1 C1 h/ M9 F
  19.     // Метод для смены состояния
    * q! t  E% H# n* x. ^
  20.     public void setState(MonsterState newState) {
      }4 F9 I) f: m9 c
  21.         this.state = newState;" c6 Q4 R/ u$ W; J$ }+ B
  22.     }
    1 }. W4 a. V1 f  A% K, n% @* W

  23. $ i; }2 J/ i3 g4 {+ Y  K
  24.     // Выполнение действий на основе текущего состояния2 ]  |; v7 ~& W  x2 i# e. n
  25.     public void executeState() {
    ( a+ ~; Y9 i7 j
  26.         state.handleState(this);
    + J+ h- c- r! Q& z9 i' Y# E
  27.     }8 }7 ~$ e# `2 g* @* m
  28. - @/ q% k( a) J/ @; i, C' O: N
  29.     // Геттеры и сеттеры+ M; l6 R7 r) l! j
  30.     public String getName() {' c1 M, m& K4 s# w
  31.         return name;1 J7 d; b  a3 S$ o) c8 s
  32.     }( \+ v1 C6 ]. T9 W

  33. $ o9 b. v: ^" F! F: h0 H' }
  34.     public double getAttackPower() {
    7 P8 j# n) l$ M3 s
  35.         return attackPower;
    0 |1 M. [" |. s
  36.     }
    ( |! @- \! \: [7 B
  37. + m. l7 ?5 h) q  V; ^4 @% l
  38.     public void setAttackPower(double attackPower) {9 N7 A# W7 G" ]$ J  V
  39.         this.attackPower = attackPower;
    # }3 p# @$ R* w: b/ v4 u3 {: r; @
  40.     }
    / P- T4 V/ p$ F2 \
  41. }8 R/ N7 a  _. a, \( l: ^
Скопировать код
% i0 S5 G# A+ {! g  [& ]
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 S7 C5 G7 m' |, ^/ M1 \

% K0 }; {" r7 ~) N
  1. // Пакет org.l2jmobius.gameserver.model.battle
    * p& C' `% M+ s7 B, P3 m$ t
  2. package org.l2jmobius.gameserver.model.battle;
    & R# X& b1 h, U# L% V5 d* U
  3. ; h/ E4 y! |9 P( ?$ {
  4. import org.l2jmobius.gameserver.model.actor.Monster;) W$ b" {9 _; A+ U: Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' g0 S! Q* y$ Q: s$ }
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    & T! C$ T( ]  H

  7. 2 Z* f" N) d" A7 b
  8. public class BattleSimulation {
    * v( w6 @, @! E1 y. f! G; Z
  9.     public static void main(String[] args) {4 k- w6 p+ B& Q4 o, E6 s- y5 P! Z8 D
  10.         // Создаем монстра с начальной атакой1 d. |) f+ n$ `. g2 U$ H, D/ [$ @
  11.         Monster monster = new Monster("Дракон", 100);8 U3 b6 ^$ I$ Y2 B  H

  12. + t- _7 ~4 i% I' Q3 c0 I
  13.         // Начальная фаза
    4 s" M: [/ f1 @3 ^2 T
  14.         monster.executeState();
    0 X0 r- v" Y& ]* F+ u: I/ \. N7 H. V

  15. - o; ~3 h" Z% M# P2 P
  16.         // Переход в агрессивную фазу
    6 ?! u" m3 ~, ^$ ]7 _, G
  17.         monster.setState(new AggressiveState());
    5 g3 u2 j) G( S% @
  18.         monster.executeState();3 u) {6 Q7 T' g8 P  e6 P
  19. : Y1 L+ h! B- l' |
  20.         // Финальная фаза8 j* m: A, F1 d0 f# ?' m$ @; _
  21.         monster.setState(new FinalState());/ l' k$ f5 g# a. m+ I( P
  22.         monster.executeState();- m' W0 X* l6 I7 `# h
  23.     }6 C& i. L! i0 |6 o, X, u
  24. }
    , _; e/ [$ u5 B6 E, z
Скопировать код

! @6 ~6 ^( \8 Q( [) {0 LКомментарии по структуре пакетов и классов:' G6 ^# q% L3 [6 }7 W' s' k
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' n, S% O9 S) x9 x; i' K/ X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ \7 C: G+ P3 D5 _' UЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!& T2 v5 I' I' V: |
4 v  w6 T* m( g& u! M- ?
0 r- u2 z; N& P' b! ]

/ h7 b" p  Q3 y5 @3 w
) c" y) e7 @2 r% R) X5 ?3 G) c  d$ r6 a7 Q
+ k  K3 S! s2 e% {0 W) P
  }0 ?- m- [5 F+ S" X" }# Q
2 B8 X: E5 w  m! L3 y) b, F
+ H, i1 a. I% s$ o. k6 l1 K* u

7 ^" G) K  ]' Y6 T, n" n! [# F7 r' C; w2 \+ e$ b
1 R. `8 F: G3 }6 T' K; ]+ B
! L& L7 a0 S9 V8 e% F+ P

0 z9 J4 P! k! q. V
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
8 [5 B/ F$ J- V8 h5 nДля управления сложными взаимодействиями, такими как  ...
7 T9 L; R+ v; \* e* k
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
2 \' z* X  |6 Y. Q; `; [  {: ]6 jОтличный подход! Использование шаблона "Состояние" де ...

7 ^* Q: K4 f. G* a, R9 |Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.; z8 I8 w) ^3 _' l1 n
) S0 r* B: h+ |! h" J4 v
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
  r5 g, k1 p$ `. [" I
5 T) E# M6 y- N6 J- u8 }& Q0 e
  1. // Пакет org.l2jmobius.gameserver.model.actor  d" a1 }* y% N% s9 U, j
  2. package org.l2jmobius.gameserver.model.actor;$ l/ G. @7 c" ]3 V9 \& S. C  H

  3. 4 l, t6 t2 ?$ \+ }: A4 P7 U9 l
  4. // Перечисление для типов атак  M# E  x' x. Z* g- n6 s
  5. public enum AttackType {
    9 e0 w* S' m1 [; `
  6.     PHYSICAL, MAGICAL;' K! M: \" N) L7 _0 R
  7. }
    1 ~( H  K; S4 q) U2 p# M/ X
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.6 U' F2 L5 z& n, i/ o
Обновленный класс для агрессивного состояния монстра:
- I: U% `" x. t! x9 W" J0 i
; D; V9 |5 x! t, N( }* u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + O: P" `; I3 s. O5 h
  2. package org.l2jmobius.gameserver.model.actor.state;- r4 M  @2 r- i( i. a  V
  3. 1 y+ y$ G  c7 V3 Q- c: p
  4. import org.l2jmobius.gameserver.model.actor.Monster;- ^! H! b1 [* F" ?
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    9 i9 `4 d0 S% L. F: `
  6. - L9 E. q& w: |6 m; E1 m
  7. import java.util.Random;
    8 X4 G, Z# u$ b" J( x0 g
  8. 6 \" ^% a8 n5 F1 }3 e' |% m3 B' p
  9. public class AggressiveState implements MonsterState {
    6 }' c) q+ q0 I. B
  10.     private Random random = new Random();
    : s5 Z2 a6 u& e  t/ T- d

  11. + v- z. u9 {$ C7 s
  12.     @Override3 h5 k* ^' u: q( X; @6 G
  13.     public void handleState(Monster monster) {
    & X* Q) j" Q" g. L4 c5 o3 z/ p
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ! r+ ~9 a4 r6 h9 [9 s
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ' F7 S; c- |5 [8 r
  16. / x# C$ `- G3 ^  z6 |0 o
  17.         // Логика для агрессивной фазы боя; R+ y9 Z4 k+ U, i
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    / e* p% N: g6 e0 N
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & @* W4 p; D6 a
  20.         4 |: f1 L9 W* _' _. o6 q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! S7 l& F7 F+ u* T0 I* h
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    2 R! w' P+ [! o! _( o$ N
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);! l9 l& w4 k; W6 Y6 o
  24.     }
    " d6 |) I4 r. S+ _  H$ y
  25. }4 c1 `: w7 B( T# Z: a
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки$ W8 l' T0 e: p5 d% e: b
9 {, `  R: z3 @) ]& P  r5 z
  1. // Пакет org.l2jmobius.gameserver.model.actor4 J0 f0 m0 D; B$ G/ M: N
  2. package org.l2jmobius.gameserver.model.actor;
    1 M8 s( z* X4 I
  3. 1 q& P  z+ X2 ]( {
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; Y' c0 c* F9 u4 {3 D
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;3 }) _. [: B5 P* Z9 f2 ?

  6.   b( H9 |8 X5 E' i) f& {; U' C" S
  7. public class Monster extends Creature {  j6 G0 [0 N# |! c
  8.     private String name;
    , K6 o% J$ \2 K. u
  9.     private double attackPower;
    ; p4 \, [5 w# T. b0 a& b
  10.     private MonsterState state; // Текущее состояние монстра/ x9 ?) v8 @$ f  ]2 d5 |* m/ F) Z
  11. + @- W+ }$ z2 T, E3 v! z/ b
  12.     // Конструктор монстра2 b2 A+ s* a- {6 n/ }0 l
  13.     public Monster(String name, double attackPower) {
    ; V# N+ ^& r0 O5 S) B7 X7 O6 P' x
  14.         this.name = name;
    ( j7 q& w' q: x2 w; t7 W
  15.         this.attackPower = attackPower;: w4 k" ?) W" N, I# `% g5 J  Y
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & ?% Y% H7 G) S4 ~$ p+ R7 }
  17.     }1 w) {) I8 w7 k; A8 R
  18. 5 w1 ~6 w6 _- ~. x2 G: c0 K2 @
  19.     // Метод для смены состояния
    6 a6 i2 o4 @' L( M3 s6 G
  20.     public void setState(MonsterState newState) {
    # o/ M2 L* T" Y
  21.         this.state = newState;
    4 S. ^1 w. E% f
  22.     }. {" A9 A( M+ c5 v
  23. 8 H5 c7 Y' r0 q
  24.     // Выполнение действий на основе текущего состояния
    # `5 A) [% E- m  H
  25.     public void executeState() {
    + ^0 b# B, k9 i1 P
  26.         state.handleState(this);- V" M* e6 p% }. _( W  ~8 t
  27.     }
    # H! p& m* G- J9 K& x1 @, I# S7 U8 c! T
  28. 0 T* N' s4 k. a5 a
  29.     // Геттеры и сеттеры
    # }( i' |7 G# B" A8 M
  30.     public String getName() {
    & g3 B7 ^+ D! g  K$ ~0 Y' P( Q
  31.         return name;# c' ]( ~* v" I" i+ r; `
  32.     }
    2 _8 o# s/ m2 b  @2 S& O2 [

  33.   }' a+ ^3 @' [) e
  34.     public double getAttackPower() {
    ( F, p  }  ]6 M% g' f9 C
  35.         return attackPower;, n/ n8 R. N8 U" O. g
  36.     }; u# C9 t3 F, _, [6 Z

  37. 0 N3 R0 O$ ?" {- Y( y5 d$ M
  38.     public void setAttackPower(double attackPower) {: p! j( y" D* p1 i
  39.         this.attackPower = attackPower;
    3 D6 ~  X, e9 i, h
  40.     }
    8 y0 r+ i+ n% N3 F. H; ^
  41. }7 c! J% y5 A. u
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! D. o) q( H' J: p0 t) V' m, p4 `8 m- Y: j
  1. // Пакет org.l2jmobius.gameserver.model.battle" k9 E9 w: i7 `9 y3 s+ T1 X
  2. package org.l2jmobius.gameserver.model.battle;+ v8 Z- L0 Z4 I: u/ C$ R  G
  3. / K# t& x  m9 K- p, P, z) ]+ S* X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 J4 }% o9 }8 l) [- P% c% F$ j
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 N( m# Z7 o+ B

  6. + \. t- Q4 }) D/ ]4 Q
  7. public class BattleSimulation {
    - j4 A" k9 H' r& V9 j& T$ O
  8.     public static void main(String[] args) {- F: g2 }0 x& M
  9.         // Создаем монстра
    5 u# I+ C) S! `" z  M
  10.         Monster monster = new Monster("Дракон", 100);3 K- H" V$ p( x  t5 T9 h  x  c" k
  11. 6 V4 q7 X0 `- l( b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    4 Q$ {6 g, e6 A2 D
  13.         monster.setState(new AggressiveState());& n/ _# f" v9 |. N7 Q
  14.         monster.executeState();. d  _! T2 _0 B! b5 Z, L( o" C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак- n9 [* |8 c, I8 P0 @% z; t: C% Q
  16.     }
    8 S' [, T$ f. h, D
  17. }
    9 s9 h; h" ]1 ?$ I) v6 J4 G9 ]
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
! p0 [; W0 ]$ O$ W7 a" N; q3 NЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!% }0 F* d/ z5 D! ^
4 b7 h2 K+ a; Y! h- R
0 g0 }; M" ~% T" p  d! g2 |% j
7 t3 t, i+ J9 S) }. C% x) l, M
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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