Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!: z" A" e  _( q* v
0 @+ B+ I* x5 H
1 j5 _& @) |. D3 @- W+ o0 f
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.# r5 h4 ]) t+ Q' z9 @
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
0 Y# \' d; w2 C  WАстралия ?- x5 w+ T8 S7 b9 q5 _

) ?6 m* f; [+ ]3 {

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!1 O6 T& \5 G* `: `( U8 q8 p& M. E  `
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, s" b4 i8 [# R0 m: b1 y6 ~9 d) J$ b
8 t/ m' n% m! [  t4 D
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 2 q/ ^6 \& N* t3 ?
AlexCoder опубликовал в 2024-10-16 18:31
6 C% S) U* a- |9 F% d* Q7 [# qДень добрый!
5 ]) E- c1 `% iВ статье описано взаимодействие игрока с N ...
- g3 q' v9 s( q8 `0 V9 e$ z
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. k9 n8 B3 ]4 w* ^5 S2 ^& ?
2 ~  o( i7 C4 SЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ S; {5 u/ b) N; h) W& h4 R
3 G" l' l* V6 CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 ~  w4 J0 k0 F. P! Y1 M
9 B! c; D% }" v5 }. s
  1. <font color="Green">// Пакет для состояний монстра</font>' z) D! |0 @8 a# ?
  2. package org.l2jmobius.gameserver.model.actor.state;% S2 {& S7 ^( y
  3. <font color="Green">4 w- k' N) u5 D9 u
  4. // Интерфейс, представляющий состояния монстра</font>
    & H4 P' y. Z. P* ~$ }& M7 W1 \! B
  5. public interface MonsterState {7 I9 w6 A( j8 }' A
  6.     void handleState(Monster monster);
    ! {9 t1 b3 h. Z: K6 g$ \8 y
  7. }
    . _5 a! y% L6 `9 M) g, o" p, `
Скопировать код

' K7 T: ^. k% J- KШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  ~$ F+ e+ G! T3 X: T5 n! K! t) t9 B3 ~0 }' `1 m5 d5 j
Класс для начального состояния монстра:
5 w$ M- K/ I. l
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ; l' w, b* |; C) V3 `; i
  2. package org.l2jmobius.gameserver.model.actor.state;5 q+ d, i2 h9 i

  3. 9 d! Q$ T6 l7 d1 w% p9 k
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 U& [9 _& @* a; e+ `
  5.   i- T/ [1 F' p7 R
  6. public class InitialState implements MonsterState {4 J: o+ g6 n) q$ M" ?
  7.     @Override( j; y2 O0 f" P* n6 Z
  8.     public void handleState(Monster monster) {
      A, M8 ~- c+ _; \% L5 B
  9.         // Начальная фаза боя
    1 \. y+ y, h% j& P& y( Z5 a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    . i2 N( y/ _4 b3 E
  11.     }2 A4 y5 W: r$ b
  12. }
    ; T  N7 ]( `9 m1 d$ O) Y' g
Скопировать код

4 j+ N! P! q0 N- V$ F! J
& ]; V4 h6 l* i# i8 s& u8 G/ d. @( o+ n- V

7 ~  g* i% |5 w" z7 x- j, D2 N4 q- n4 X# y

- O& W; y9 y6 p1 V7 G6 ^' Q/ }$ l  ~3 t/ L1 e# h; b
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 f( [% v6 S3 [" ?5 m  B2 @) E
! v' O, q0 [* Q4 m# Z7 e  B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 G. L2 b1 p4 I, T! @* p2 b0 `( i6 v2 ]& x! Y. ?) W& [" c
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ q) ~6 D! T/ `3 S5 T3 o- P
( T7 D9 W, K+ K! @5 C+ g1 S0 t7 n
  1. // Пакет для состояний монстра1 F' I+ o, ?9 \; y- `( D8 b
  2. package org.l2jmobius.gameserver.model.actor.state;0 g: `4 Z4 E$ @- x" h2 D
  3. 9 |3 O# r: |1 M; |( Q
  4. // Интерфейс, представляющий состояния монстра! y; O$ M# j: b1 ]& j
  5. public interface MonsterState {( H+ D  d3 I/ A! F4 R. Q; J& F
  6.     void handleState(Monster monster);
    % l% j9 u" L) K6 ^8 u% _
  7. }
    1 W! r4 V9 V  `) {2 Q1 E
Скопировать код

6 m: L" Q) t( q) f& q  _Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + ?! f9 k2 n, ~; u- B# y

/ s- |- k! o9 ^8 L6 k  NЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  k9 _! R, g6 c3 F2 X( a* c
( _; t4 n9 E* y- }+ Z. h) l/ X) P' KКласс для начального состояния монстра:/ N& J7 P# b1 }2 @3 K/ B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 ]+ k5 V/ n  x! R# E
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! N  Z; T& h. F8 ]1 f+ ~
  3. 5 l+ q" I0 X2 @7 S! n# p; X8 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;. p$ u  d* S& s2 C0 O
  5. % a( b4 G& h% v% Z5 R% o8 q$ b
  6. public class InitialState implements MonsterState {
    0 Q1 q% f, Z5 \- |9 V. R$ J, a" Y
  7.     @Override9 s$ o1 i, s" \* @
  8.     public void handleState(Monster monster) {7 H1 Y% M, k6 R( |
  9.         // Начальная фаза боя
    6 @. ^9 U  L3 b. ?" @  i
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");' M( v; Y5 Z4 K
  11.     }
    : m$ w9 j9 t. |/ G
  12. }  t1 m% v9 U# ~7 H  L3 c
Скопировать код
Класс для агрессивного состояния монстра:9 \: l1 m1 z9 w* g5 R. b5 a2 d. ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    8 m. @4 K6 _& V
  2. package org.l2jmobius.gameserver.model.actor.state;7 f' [& T% K  u, t# c& b7 \; d
  3. " T" W9 k' f; a6 b: p# h1 i) A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + h$ g" P: q5 Y& u3 |- }

  5. % S, R0 q8 y6 J, ?2 g/ ]
  6. public class AggressiveState implements MonsterState {4 ~( N- Q' ]5 `& Y* a3 U6 _
  7.     @Override# X9 C* m- z( R" p! F6 n
  8.     public void handleState(Monster monster) {8 T' Z" ^# v! h( q! j, {: H+ d
  9.         // Агрессивная фаза боя) _5 M: N  w2 M# F# x' b3 H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 u' E/ l5 g# ~0 N% d; \+ g* c" U5 @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    . N! B& \3 `7 b
  12.     }
    : _2 e  @$ x1 N$ M
  13. }
    ! d/ C2 a0 T* o; c4 ^8 m  Y) q" d
Скопировать код
Класс для финального состояния монстра:  i! j9 V1 b$ ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 [# P6 R9 s) E/ ?! o! d
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 \9 i' E& m% ?* L3 a: u

  3. 0 R- N) _+ C. k" t" h2 A1 n# J0 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ y% l0 H0 z/ z% S) l
  5. ) ?% v& V% O* O. ~" S4 y
  6. public class FinalState implements MonsterState {
    + `! s8 q; ?" f: z; n
  7.     @Override
    ! ~. v# r+ f. f
  8.     public void handleState(Monster monster) {
    0 e7 j1 q! e& _6 A
  9.         // Финальная фаза боя
    : D: u  e: t" u/ ?/ J' G
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");) r& Y2 N1 v( |' g% M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* a; x, u$ x1 u, _/ @6 w  o
  12.     }
    4 J" A# X! k7 Y
  13. }
    - ^0 }8 b- Q0 h
Скопировать код
6 J- `) r0 P, i( U/ u& E' e
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
6 a) J' S  p  r
  1. // Пакет org.l2jmobius.gameserver.model.actor7 A; R. c6 e) k( |4 w, Z" F
  2. package org.l2jmobius.gameserver.model.actor;5 _, i& A0 u' c  F5 ?) P
  3. 4 f6 f" t$ I% [7 {
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 {" Q2 w2 v9 f% }! n1 {
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * v7 d0 P4 `+ n' {4 i
  6. ( b# ^; b6 h) ?- w
  7. public class Monster extends Creature {. H8 e2 P+ l5 H1 L4 R
  8.     private String name;
    / R+ |6 g  W9 K# R5 n( L; }& S
  9.     private double attackPower;
    7 W0 L0 R- o+ V+ ?
  10.     private MonsterState state; // Текущее состояние монстра
    ; G1 t+ p+ _1 ^6 E' M/ I7 g: A, R
  11. # F; H7 u" f8 E. P$ r" t
  12.     // Конструктор монстра( V  h7 O7 [& H* s) d
  13.     public Monster(String name, double attackPower) {
    ) A7 e/ y( M& k
  14.         this.name = name;* i! d$ q. l& _! V, e7 g( e1 ^) ^
  15.         this.attackPower = attackPower;. n+ R3 j. R0 y+ T9 R" o4 A
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние3 F8 B! R- a( j
  17.     }4 @+ U$ _. u5 z' D. Y

  18. ) l& H+ u& n" }$ R9 c. i: @
  19.     // Метод для смены состояния" n* \  g" i( }6 q% q7 d1 g) q
  20.     public void setState(MonsterState newState) {% f1 H% T4 ]6 C3 f
  21.         this.state = newState;
    " {! i/ R' v9 H1 x( g. `% w! Q5 F
  22.     }
    ! G6 S9 [1 U1 r4 ~' U7 S

  23. 4 }% q) g' H$ A$ T5 V  [  ~  E
  24.     // Выполнение действий на основе текущего состояния
    2 n# k. I  [$ H  k6 o9 q/ J, N- @3 n
  25.     public void executeState() {& _" O' G8 d0 b, M+ q$ B
  26.         state.handleState(this);
    * }4 p" A" m: M
  27.     }
    $ Z- |6 [. X% b5 s. V
  28. $ J% T5 m* S3 r
  29.     // Геттеры и сеттеры
    2 B# p) X' C( {% }! s
  30.     public String getName() {4 _, k5 V! `" b0 x! z  f3 _2 u
  31.         return name;
    * k- O+ \  o+ }) L: }
  32.     }
    ! V) {/ ~+ q6 ~& r) t

  33. , j. ?* g' `- j& ?
  34.     public double getAttackPower() {; o; x8 D, D: y) `! w
  35.         return attackPower;
    1 {* I7 x+ S# x" f3 \
  36.     }
    ; e) ~* j: }& r+ }/ S" b: U9 ]* G: @9 o- O

  37. ) ?* Y( t' I; f, E2 l
  38.     public void setAttackPower(double attackPower) {) h: [, ^9 {8 w6 r7 w, h- _9 n
  39.         this.attackPower = attackPower;! ^) s, [* q7 v" R3 ]; H6 ]; ~& B1 {
  40.     }. e4 j1 D" H: N6 y' w: K1 ~$ t+ ]
  41. }1 {6 u4 _" R) ^0 f0 ~: F: ^, A
Скопировать код
; b) U  ~) r. f3 k* l3 g
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
( A8 _5 C! L7 r6 |$ z9 A* M
0 n* R/ Y5 f4 j# m- w3 R
  1. // Пакет org.l2jmobius.gameserver.model.battle
      P3 T8 [7 v/ n, B! z
  2. package org.l2jmobius.gameserver.model.battle;  U) x) c# q+ _; y+ o
  3. " k9 V( J& M6 }2 k& a
  4. import org.l2jmobius.gameserver.model.actor.Monster;* y+ B2 H* i' z. z& h% q$ @. X0 g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ' D, C+ A6 k5 C  R: v
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;  _  `+ U6 P# H$ q# k- ^
  7. % ^0 N( d5 B! z) K9 z/ o9 |$ t
  8. public class BattleSimulation {/ w$ R& R4 M- I! p+ ^
  9.     public static void main(String[] args) {9 G' `1 |0 J6 T6 B% H- t7 w
  10.         // Создаем монстра с начальной атакой
    ( B/ V4 K; L! C+ O, K
  11.         Monster monster = new Monster("Дракон", 100);+ W; b3 ~$ j/ C* M  {
  12. 6 W# `$ _; B! V9 ^% z7 N
  13.         // Начальная фаза
    / F, p: S* c6 y9 ]  m9 g/ Q( i
  14.         monster.executeState();- c7 K7 X' z: }9 u$ D

  15. 6 v! i7 j6 w0 \6 J6 A; N
  16.         // Переход в агрессивную фазу. l1 |- D6 y) ^7 ]) H  \
  17.         monster.setState(new AggressiveState());2 p; X. S( H- J  Z* ^
  18.         monster.executeState();
    3 W$ h6 y; g. b0 k

  19. - b% U! `8 P7 N
  20.         // Финальная фаза
    / f2 n0 T7 h; P9 D
  21.         monster.setState(new FinalState());
    ' v' d3 ~6 ~+ j' \/ {
  22.         monster.executeState();9 r% S4 D% G& d% Y
  23.     }. [6 a2 j  I+ Y0 o; c! w) Y3 C+ V+ F
  24. }) p$ L% E( D& X& u. l. U
Скопировать код

, X3 l8 L5 ^; L, b, R% _9 C& qКомментарии по структуре пакетов и классов:
2 u, K( e5 @" K+ Y0 d! e4 G9 d" G: G
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: x4 F) R& D* C) e. f  r
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
3 ]: D! a" ~$ P. j# CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- c+ X6 G9 a9 m5 O" @  O8 U/ C7 N) h9 u, |- j' g
: ]% F9 @5 F3 {  M( \# {0 G. j

) M3 N2 k# R2 y" i+ F7 c( L0 W- x, z! v/ K$ @5 v

' e- G* a$ O1 R, a; Q. ~: W8 k1 F
1 X! U, T; n0 G1 O- i' D9 ~3 W$ L7 S% |  z% E( r) |

) k3 ~+ Q' K% U; Q4 P. M: o% u
6 e" k& r& {( p; N

  a3 |4 Q1 d! Z* z  M
) m0 @. W  l4 F  R( R* S5 r* h. X+ p# ^0 z/ q! E6 ]/ T  d

% @1 Q" o. u8 a& k' f
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04( h% K3 f, T9 ~( x6 L
Для управления сложными взаимодействиями, такими как  ...
& g: }- W6 B$ a; g
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
3 g: n9 }# w- p4 V0 p% LОтличный подход! Использование шаблона "Состояние" де ...

4 |; o  }. _! n# N9 b& mХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% J/ Q2 J) x% S
1 h, J3 b* r9 pШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
0 o( k% W1 M: y) J7 c1 {* y3 S* R% \2 R. `
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 x, V- n+ {, a& l& z/ q7 C& M
  2. package org.l2jmobius.gameserver.model.actor;' h/ l, r& C, B- i6 p

  3. , k9 Y1 x' y$ C* g5 {; u0 \
  4. // Перечисление для типов атак9 E  b0 I" t" {$ F
  5. public enum AttackType {. k9 E! y1 K& J, S& K* g/ I
  6.     PHYSICAL, MAGICAL;
    & K3 D6 n2 O3 R- |4 Z
  7. }
    ; j# ~) E, f$ Q- I6 m& h0 ^) a) t9 Z3 n
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак." ~. `) M# k0 H/ ?
Обновленный класс для агрессивного состояния монстра:
( w) z  [  B7 t" }/ }, h. n6 P
+ u" f; {/ z. ^/ ~7 V; ^3 n( M9 s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & K. e% T/ r5 }, s# p+ L# r+ g4 f
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 q: F& A0 B- i, S+ {, l& S6 ^
  3. 3 {5 L0 Z5 Q$ j  b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) `# v& Q. F* `7 f8 N
  5. import org.l2jmobius.gameserver.model.actor.AttackType;! }! F' h) ?  l

  6. 1 V5 G5 Y# z" w+ D
  7. import java.util.Random;; \6 c1 @' Z* A0 n* h1 Z( a
  8. ! \# P. t# L. P, O' J# H
  9. public class AggressiveState implements MonsterState {
    6 Q& O$ q: O" i: R; u; n; n0 f7 Z. G7 a
  10.     private Random random = new Random();; n  E* V$ X* N- R# I( F

  11. & L6 t  ~4 D6 p- I0 Y% a( t5 o# t& }
  12.     @Override, E$ U$ [3 K  L! r
  13.     public void handleState(Monster monster) {
    2 G  y6 z2 w1 F8 ]" {
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ( I! g  m% k% R; |
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    * J; l- @9 `& e3 E6 m
  16. ( T# k7 @3 U& E8 G
  17.         // Логика для агрессивной фазы боя1 D' w6 z2 ?; e; k$ {& ]. a
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    5 R$ s2 K* l, y2 q' A
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
      z5 U0 P2 Z$ P( b' j) n
  20.         & s0 l- r. C% {/ \9 O
  21.         // Увеличиваем силу атаки в зависимости от типа атаки' {! f1 v) D' k) r
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;1 l0 q0 a: w* z( J% o, d& ~3 @0 h( p: {
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);4 a3 S) `+ Q& O
  24.     }2 j3 }7 {5 z2 V! S
  25. }) @/ z. e; B7 t( A% f
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки% B3 g) W4 B5 O4 s2 J3 ?+ h) t; f
) g% k4 k- ~% V2 M6 l% A
  1. // Пакет org.l2jmobius.gameserver.model.actor3 W! l) F  f  T/ Y) X: g. }3 R
  2. package org.l2jmobius.gameserver.model.actor;
    ' k  i1 @" y0 {" Q% g

  3.   J9 t; }+ z# d9 b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . o$ q3 {$ G+ V7 L) e1 D9 W: Z( a8 F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;# O9 m; C9 [4 b- @$ p

  6.   m( ?. J+ ?* G6 j% H% I1 }2 {
  7. public class Monster extends Creature {. I; X/ ~9 {: s0 z6 \
  8.     private String name;
      K1 V" P0 I8 v) t- U' q( T% L/ y
  9.     private double attackPower;
    7 R! c9 x* m9 K, `' t" X
  10.     private MonsterState state; // Текущее состояние монстра2 j; A- _* n+ a! \: m. W2 B" ^

  11. + o) z' W+ W/ V: `6 K# a* P
  12.     // Конструктор монстра' d- t3 i1 u4 V" L$ O5 S3 ]/ }
  13.     public Monster(String name, double attackPower) {; p/ {* q( g% j# m
  14.         this.name = name;
    4 ^' e1 A6 `/ S! D
  15.         this.attackPower = attackPower;; m1 Z; B" L; [9 S5 h3 b
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ' W* `0 c! I& U% A* J6 V6 Z
  17.     }
    8 U: r/ t9 v4 h3 |& T
  18. ' J1 _: L; e' i
  19.     // Метод для смены состояния$ K7 z" p3 e& ]) p1 t( k, P3 p, B! t* L
  20.     public void setState(MonsterState newState) {5 b, Y' U9 [2 l2 F; r! ^- t  i
  21.         this.state = newState;3 B1 B- O0 ~/ b1 D3 f5 Z0 D
  22.     }/ L8 `' T4 K1 D0 @5 ]# ~) j* m+ s
  23. . ]0 o% v% B6 ^/ W7 g, T! c
  24.     // Выполнение действий на основе текущего состояния
    ' f* g) V! J% Z6 v
  25.     public void executeState() {- l* X( H) e  \' ?
  26.         state.handleState(this);3 Q( Z6 y7 H- k3 \) j. t2 @. T" f4 ]
  27.     }
    / z6 _! N2 U+ \# A4 u: K. j# x
  28. ( v, T# B/ O+ S3 E
  29.     // Геттеры и сеттеры
    $ @/ t( I; i$ f9 E1 k
  30.     public String getName() {
    ! q& H. W2 x4 {6 F0 t
  31.         return name;5 S  g; k0 s( r! l: D* O
  32.     }6 S' |& R( P9 `, m  A

  33. ! `0 x: h8 d% k0 x
  34.     public double getAttackPower() {
    4 J; g$ p* M$ C
  35.         return attackPower;3 ?7 O: W# m0 M" r! e
  36.     }# c4 s! R0 t6 ?2 V! U* B$ ~) u

  37. / L& ?# D$ H8 G+ d
  38.     public void setAttackPower(double attackPower) {. r) R  n1 `2 l
  39.         this.attackPower = attackPower;
    . t8 h" K8 c9 V. _! |# S4 x$ ]
  40.     }
    : w) y7 X$ p5 ~6 d* G3 f( {
  41. }, A6 B' w6 x5 k& S& [8 \+ H" I
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
5 Y( |& k  }( k8 c+ U/ d0 M; l2 a) C2 f2 I6 Y# L4 _) D
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # W6 O" w: a: y7 u% ]1 V. p
  2. package org.l2jmobius.gameserver.model.battle;( b, r% ~( P# `' m: J

  3. . ?6 C7 \7 u4 U& Z8 N+ |3 g% \3 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 @9 t# `" R" @' L/ A: `- x
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;4 ]* |' q. S7 v6 m2 V! E9 k
  6. $ ?7 }% ]- ]; T/ s# J" X! F; d
  7. public class BattleSimulation {
    3 f. e& o- y* D- a* r( i
  8.     public static void main(String[] args) {
    3 s+ {% \/ V  Z6 F" w' M* w
  9.         // Создаем монстра, m; r5 j9 h1 L
  10.         Monster monster = new Monster("Дракон", 100);
    ' {+ ?' X! A2 @9 A3 r2 T/ i# [

  11. 0 i2 K  ?+ E6 `! L. O' L0 N
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    5 \& ~& N9 ?! c0 B6 F
  13.         monster.setState(new AggressiveState());# h9 P' [, P; y) K) M' \
  14.         monster.executeState();0 F6 v. ]% c% [: K. |) a
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 r( J2 \7 X1 ?" f) T1 U4 S# a
  16.     }
    # _" P' e; O$ X4 R
  17. }" j# g" a& G+ w! y. x) x
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.8 K) f( Z4 h6 ?% B7 {1 J; K5 `6 ~
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!% g+ u* u6 z% D, ?  m

6 l/ Y4 _/ n- g+ J
; c" _8 @4 o2 \. D
0 ^7 f# a8 e0 e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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