Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
. F$ p; f6 e8 l  B' p0 f, F$ K% C( T& C6 x( G- J

# h7 D# k6 O! w  y4 h& MЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.; [! j9 U; ]& b; C* k
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!* T% w2 ?  B6 i6 }
Астралия ?! G) H, l  s7 O  l3 x
* ~; D7 j5 E# g- {! d5 |, J9 ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
# z1 E  H( Q, R1 ?3 M; `) e9 lВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 l, [2 f% X; J* F+ G3 D  z/ Y% s' U+ u
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
5 b- Y6 ^% q6 D# o
AlexCoder опубликовал в 2024-10-16 18:31
- q/ d5 s8 y) R% WДень добрый!, P0 V0 g% @* d) O
В статье описано взаимодействие игрока с N ...

5 \2 J# A! c& q% r9 |# J' i8 {Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" n% v- o* {- \/ y+ z. ^+ R# o. P) B5 F0 B% q1 B1 D
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 E, u$ ?/ g! r
5 P8 k. S8 h! E) vШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 [# U. Z( ^% B8 W3 b7 l8 D) K
" {$ ~0 ?* ?/ p: V5 \  n1 h, |
  1. <font color="Green">// Пакет для состояний монстра</font>
    . B/ X  ~- d9 n! E7 |5 F
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 {7 g! [  H  \  \/ j
  3. <font color="Green">
    % R8 v# ?( f6 Q
  4. // Интерфейс, представляющий состояния монстра</font>1 Y/ O6 m! m! z3 l* ^( r; O8 b
  5. public interface MonsterState {
    ( R6 A$ c! H0 K6 P: k/ T5 ]9 P) M
  6.     void handleState(Monster monster);2 [3 a0 E$ Z8 j" R* v- Q1 _
  7. }4 R4 F8 n# l( @& f) q* U; O5 D# E
Скопировать код
5 w, ^( M1 G0 |" s, k& W4 f3 x
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ M1 J3 v' w1 m' I; z' ]! i/ }7 I8 v+ [
Класс для начального состояния монстра:( o( \0 K8 Y! H9 e# S
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    2 B0 s' p8 h+ J) r. h8 L5 b
  2. package org.l2jmobius.gameserver.model.actor.state;5 x  q; N4 p& |' h8 o1 ]* Q$ _

  3. 6 Z' P, G2 Q0 Y0 P2 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      w4 v, o5 l- i) N. O3 Q  e

  5. - M/ Z# f9 u7 ]3 ~! F
  6. public class InitialState implements MonsterState {. s* \  X5 s2 E! W2 _
  7.     @Override8 B* r* z0 J# _( v' M6 F
  8.     public void handleState(Monster monster) {
    " s+ B4 c6 L" n- s
  9.         // Начальная фаза боя
    " A: \' ?* m8 I" \+ q1 f/ [2 m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ |" `" @4 H& R1 l) U; _7 Z6 m
  11.     }
    - f) m8 R" r  O
  12. }; l8 G+ c- c2 J0 J
Скопировать код

# l# ~' u0 C" Z9 k6 ]& l  |/ x- W# |  O( x, j7 e5 |' T

+ n5 n7 B/ U6 ^( {9 j; `# a: b" |+ n4 v4 K9 \
! x( j7 P( |2 Y1 \' k$ L- ^

: t+ Y9 v7 |/ v% W$ i* E, ^" f6 t- N+ `; K+ h6 b; X6 {
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 Y( m. g& ?8 j3 m8 X- f
# U% s: C' b$ BЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ S- K2 u/ f/ t# O- L

# q  {6 ?: }% dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
3 l( L2 F9 f' K6 l8 j; Y7 I6 k  f$ ]5 `5 u+ A2 r) n# Q
  1. // Пакет для состояний монстра  n/ n+ G7 H& Y% Z5 `
  2. package org.l2jmobius.gameserver.model.actor.state;  W. S5 W% P6 }

  3. 8 ?3 M9 u6 P6 E* X. Z$ e9 s5 V. j
  4. // Интерфейс, представляющий состояния монстра
    1 Y( r' w( ~5 o& z( a" M
  5. public interface MonsterState {$ ~; X; ~7 a# Y# ~+ ]
  6.     void handleState(Monster monster);
    7 [$ t) h; |  r0 S
  7. }! q) J8 U/ p  A7 T( Q' m- v+ I
Скопировать код

, I) @8 N9 X5 l1 z. A) u3 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 |9 p  }5 u! A' z  c
! u2 i- `3 p2 h' @0 e9 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 n8 Y+ C$ n; W0 ?$ Q8 t; }2 V" P5 k* f2 l, h9 D6 {, D3 d7 L
Класс для начального состояния монстра:, R" t  h1 e2 u8 q8 q& D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* D- w! J" z! `4 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    - _. V" \% H8 L$ ^8 S' N7 I& t9 f

  3. 6 K* L8 V4 F2 L. p9 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;* O1 L2 r, y" Z/ D# r; q( d+ U' A% v
  5. 0 v$ o) l4 u7 s9 ~) S
  6. public class InitialState implements MonsterState {5 |" X4 P' ~9 Q' `5 x
  7.     @Override. G' B# v1 a: s. D' ?, k
  8.     public void handleState(Monster monster) {2 B4 k  A# s  R# Q' }6 K1 M
  9.         // Начальная фаза боя3 F8 Q6 r3 P4 r0 B+ s) x
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ) F- P$ u  s) r* x0 y* Y2 W
  11.     }
    / ^1 V- c  ?9 n% G5 Z% ]: q* K
  12. }
    0 k. b2 T% Y* W  M
Скопировать код
Класс для агрессивного состояния монстра:' A6 {# m" I2 n9 ?8 j
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, f( e7 L+ p4 T1 W
  2. package org.l2jmobius.gameserver.model.actor.state;
    * E  ~# F) A+ k* d) q7 @
  3. ; u6 N5 I, w: b( d- \2 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;% L. {8 R* B: Q0 }8 V9 b
  5. 7 _* `! i8 P' c: G0 l  E& m
  6. public class AggressiveState implements MonsterState {
    8 s: L6 V; l1 b1 Q% m2 z. k* L. f
  7.     @Override) ]) \/ a' |* T
  8.     public void handleState(Monster monster) {. \8 ]1 I- |, m
  9.         // Агрессивная фаза боя
    1 q/ f- \% W7 P+ |$ [
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ( G3 \: w) N8 a
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* A# o/ Q% b% k
  12.     }4 [# f+ D  E# l* K0 M
  13. }: A5 a5 o' y/ Z
Скопировать код
Класс для финального состояния монстра:6 f0 r( ^8 O& W/ s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * B' |6 x0 k% j9 E
  2. package org.l2jmobius.gameserver.model.actor.state;, n1 P" E5 z; A  T% ]
  3. 6 b, G( Y' O- n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 Y/ h9 A) S- m+ W: T* o! \
  5.   e& F3 ^# W6 ~' [
  6. public class FinalState implements MonsterState {2 H1 h6 l# G" z6 T3 _5 i+ _; [
  7.     @Override
    1 o7 H/ k, H; {* C! H9 h  m
  8.     public void handleState(Monster monster) {
    9 f, ?/ @9 {1 E5 N8 S
  9.         // Финальная фаза боя
    / v7 i& D" ~2 l4 D4 X8 A
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    " Y1 Q  h  O( ^$ W" ~
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    $ A+ H0 k5 ~: n. M; y& A  m) U7 g
  12.     }6 T; _  _( b* i# V+ Q4 ^# s5 Y( v
  13. }5 B+ C: U# q- M/ h. W+ x
Скопировать код

% ?$ V3 M, v  b* pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
! p. J+ K/ k& E, o. \
  1. // Пакет org.l2jmobius.gameserver.model.actor$ T/ a. g9 @: a5 D7 z
  2. package org.l2jmobius.gameserver.model.actor;9 h6 Y( Y0 ^1 x; x! G- w

  3. $ h- E2 r0 C8 W6 Z, n+ l
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' y! R9 Q( S0 y. v. K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;+ ~2 k: ^3 Z9 f3 O4 c: G

  6. 8 ~- u( O$ U  Q& v
  7. public class Monster extends Creature {
    ) u& N3 x/ d" J+ X+ X
  8.     private String name;
    9 i, y% D4 C4 R7 p$ Y" H7 z5 I
  9.     private double attackPower;
    ! K" Y" z* m# h$ l8 d" Y0 l- p
  10.     private MonsterState state; // Текущее состояние монстра
      Y, ], w' g( U; ?3 C& X3 O

  11. 0 d+ b& B, Z9 C* L
  12.     // Конструктор монстра) ]1 T7 D6 U* y+ |+ v$ }0 f
  13.     public Monster(String name, double attackPower) {
    8 {% _% q! t, c+ z' T! [
  14.         this.name = name;2 P0 m, l5 p1 K3 F
  15.         this.attackPower = attackPower;
    - F) ~8 A0 w3 Y/ b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    " ~* Q% }; @& e% {" o+ z5 A
  17.     }9 Y/ C$ s! r0 T" ]
  18. 2 l& S+ F9 w( D& I  d9 `8 o& E
  19.     // Метод для смены состояния
    / h  I, X" E% z
  20.     public void setState(MonsterState newState) {' z9 J3 o+ k# C2 v+ l9 _( M
  21.         this.state = newState;
    0 V8 r7 A" W( _$ ]! \1 x4 T2 c- V( ^
  22.     }. W/ c# n1 x8 A! [# H3 r3 t( P
  23. 3 b8 y0 @  @7 h0 }8 ^
  24.     // Выполнение действий на основе текущего состояния
    % |  W' x  f# {: a) |& I1 H2 ~6 L7 z
  25.     public void executeState() {1 S6 q. z& f, w  Q: _9 y6 Y6 ~
  26.         state.handleState(this);& I  ?: j+ {; {* t
  27.     }3 g/ s3 E# @, i- _. O5 ~! {$ _
  28. % W& Y6 e- W3 U% ^/ l
  29.     // Геттеры и сеттеры
    % S8 g* d0 N+ [3 J" N2 m8 Y* q
  30.     public String getName() {
    ' }* [5 I/ i3 n; }; b2 W
  31.         return name;$ P8 d( A% R- E4 @+ Y. K: d
  32.     }
    0 u( g8 f+ v0 I- @: f2 i' m' u" \

  33. - ?5 j* E% n# M
  34.     public double getAttackPower() {
    $ a  k4 b2 o7 Q* x/ B9 }; T
  35.         return attackPower;
    ( J4 d; ?% E/ c. }# e% c
  36.     }1 M; [# I% z& G% W! `1 ^4 R
  37. $ K, f, \* L0 e5 B2 D+ z4 X
  38.     public void setAttackPower(double attackPower) {
    : O( [5 p4 X5 Q# l) B. m* |/ p& f
  39.         this.attackPower = attackPower;
    5 q; R7 H5 b+ z, a: q+ _/ N+ ^
  40.     }" h6 {& ?4 ~6 \4 z& @5 e, J
  41. }
    * q7 b1 k# ~- F/ U
Скопировать код
" V4 T; J& f3 V9 F8 Z# {! C) {3 ?( l
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* A5 z7 r6 G9 F1 v9 m4 P
6 o: P2 Y# B; L! U1 R- r
  1. // Пакет org.l2jmobius.gameserver.model.battle$ V$ a, S9 Q( y: r2 y4 j" S
  2. package org.l2jmobius.gameserver.model.battle;3 d5 a. m- T1 p
  3. 7 U2 ?& s5 ~" @6 f* A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 K) K6 Z# _5 A. ?; V8 ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* a2 E1 f" F9 u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;) z6 S4 f! L( z

  7. % {; E/ Z6 `( R4 o5 G9 M
  8. public class BattleSimulation {
    3 H" n& k$ i- _- Z; h3 C
  9.     public static void main(String[] args) {. ~; Q% t" l, Z, l0 k
  10.         // Создаем монстра с начальной атакой
      u7 N/ `  ]! R, q1 C! ^
  11.         Monster monster = new Monster("Дракон", 100);
    ' S- F; H( ?- o. q0 H
  12. + J4 t7 Z4 y4 _8 ?
  13.         // Начальная фаза
    ) }( ^9 |8 H; v
  14.         monster.executeState();
    & p6 p2 a/ }) b( `$ i/ j
  15. & P. V1 g8 d: U# `5 o
  16.         // Переход в агрессивную фазу
    " [2 b' s  Z7 D
  17.         monster.setState(new AggressiveState());( `( ?8 W3 O' ~, v0 P9 a' U
  18.         monster.executeState();
    ! a. m2 C/ g/ p
  19. 5 j* V  Q- [4 Z) X
  20.         // Финальная фаза7 Q4 u" l& i) Z, T5 u+ }( d  U
  21.         monster.setState(new FinalState());1 H. d% D. J  L* e9 `% m
  22.         monster.executeState();
    2 n* w6 e4 U6 {1 j$ x
  23.     }: G4 q" x, |. B
  24. }7 V3 n6 {$ v8 f! g1 q. M" S% ~& m
Скопировать код

6 I2 P7 w/ F( ^Комментарии по структуре пакетов и классов:
$ n# ^- Q' L4 e9 ]) O
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    / y8 q! |2 T7 L# X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
8 c6 ~5 B- A1 S) _$ S: W: B! {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. J2 M; m! G/ O2 _/ q5 h* s/ h* q8 y! t7 u* L6 B
/ ^% U9 o6 P- Y9 [* J

; T- G3 [: V3 `5 X6 I( m! t6 G$ K9 ~. D% ~
0 |( r% K; k6 T0 `3 t% J' E

" g% v% Z/ f  M6 U
- q$ r3 ^$ F; b0 R2 m
0 t; X, w2 N4 m5 i; }9 l$ E% |1 x+ J3 O: u& Y3 b
& c& y8 Z+ ]+ A7 }& b( U

- r" I/ |) P$ M3 |9 H; I4 r' g$ s* i

: k" c9 t( l6 Q8 a: [# x; L
( x& r) c- B) @* D2 g
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
3 }7 U7 a! S% h9 kДля управления сложными взаимодействиями, такими как  ...
- z+ u/ C6 b7 I' \# i5 U
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) [- z0 _) p" J$ F6 M& X3 ^
Отличный подход! Использование шаблона "Состояние" де ...

7 U. ?; j9 k) f- d0 l. bХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии., Q; Q: S# M  G% |

# L& T: ~) s& k1 b0 j0 CШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.3 M7 J  c5 d  N% @
7 g  a# c6 j* X* u* t1 b/ J  V9 U
  1. // Пакет org.l2jmobius.gameserver.model.actor1 V2 @( K) K9 L# V: ]
  2. package org.l2jmobius.gameserver.model.actor;; ?) K" E7 Q/ U

  3. % U! Z; H- k* k  p$ i
  4. // Перечисление для типов атак$ x. |1 N& D! V! o
  5. public enum AttackType {6 u& D; I+ P; p8 z
  6.     PHYSICAL, MAGICAL;5 }6 C& |. T, R6 _5 u# K
  7. }
    6 U) J5 |$ n( s
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.8 ]: V+ Q0 m7 {
Обновленный класс для агрессивного состояния монстра:
0 Z" C0 @) U% \+ _6 |& Y* \& [4 R: z! F& ~: z  w" a6 P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / d/ ~  K1 ]' L' L2 m
  2. package org.l2jmobius.gameserver.model.actor.state;& {' j7 m. F4 }7 y9 g0 }
  3. 7 E1 g" ~, B2 N1 h3 i! J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - Z* p+ h' @4 B4 B, R# ~
  5. import org.l2jmobius.gameserver.model.actor.AttackType;7 n3 w0 V+ E% [& O6 B$ {2 _

  6. 8 t: o! \/ G8 T
  7. import java.util.Random;
    + x. I+ i* h7 ~' E- i2 R: W3 T1 B  o
  8. 5 \; t) W: j4 C& D: c1 P
  9. public class AggressiveState implements MonsterState {9 D( ?0 E  F; |: Y
  10.     private Random random = new Random();
    7 o( j* r5 ]5 n) P! q
  11. + z: K* w) S* Y" Q0 n
  12.     @Override
    ! l+ n  Q& {1 L
  13.     public void handleState(Monster monster) {2 E# I, S- _8 i0 a; W3 u
  14.         // Выбираем случайный тип атаки: физическая или магическая
    1 y8 F; T+ `0 J. }
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
      \! O! ?0 A' ^/ L5 n# O

  16. & f+ M2 ?0 W  m5 r! r0 d
  17.         // Логика для агрессивной фазы боя! M' i/ A* n, j) I& @' v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ! P0 r* |7 W0 d  L
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    / K0 P) ?7 F% O+ O& {
  20.         6 N+ m0 Z$ M! n) w! _1 y" U: J+ @
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    : h! j" e6 \" \' O; K# L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ! P% O+ _( d- W# R
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    1 }0 A3 F' L# S- }; T# _( Q
  24.     }
    5 R' _6 w0 |6 v/ W) J) ~/ c7 R" a
  25. }/ [  N' C: u# ~* I) |+ L" ^5 X! V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
8 H6 ~: k0 f8 ~4 O
: @( Z( {% P7 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - x6 S5 v; R- Y0 \7 V, e0 b
  2. package org.l2jmobius.gameserver.model.actor;! h6 Q  @0 h2 Y; o) C$ K; W8 J

  3. : x/ A- L2 i+ D4 t- M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 H# C4 G& O4 c$ _+ w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + r0 Q) n( ^4 e5 B# q& }

  6. ( E( W: A0 h% ]4 a* n/ O8 l
  7. public class Monster extends Creature {
    % q4 m& V3 j+ _9 W  X. }  H
  8.     private String name;
    + Z/ @* q* q# h8 m
  9.     private double attackPower;3 W1 ^' y9 E! E, _& }' F% G& H5 k: K
  10.     private MonsterState state; // Текущее состояние монстра
    $ g& H+ o' N+ Z

  11. 5 g+ M& W; o) Y% ~$ n$ ]. m: {3 X; }% t
  12.     // Конструктор монстра
    $ V( ?% K8 T9 I: O# M- t% w2 j
  13.     public Monster(String name, double attackPower) {
    0 T8 x9 A! l1 D- g3 f
  14.         this.name = name;/ B: |$ f' Q; m1 ^6 m0 _0 _
  15.         this.attackPower = attackPower;
    # c# h2 `, J% n
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    6 N2 c1 H: c2 d6 j$ i" \8 z- X) U
  17.     }  [* G1 z2 i' k2 L* }

  18. ; E+ `1 m2 D3 p- t$ q9 j0 F) I7 o
  19.     // Метод для смены состояния; T9 b/ \. c" a+ k/ b6 n
  20.     public void setState(MonsterState newState) {" g5 X5 L, B! _- v9 g% ^
  21.         this.state = newState;
    6 y  H$ L' q/ N5 g/ F8 f1 _7 N
  22.     }
    * p" }! ~( `' i% k2 {1 J! [
  23. 1 r" h6 _' E  E& p, H+ x
  24.     // Выполнение действий на основе текущего состояния
    9 _- l. h& R1 o6 S; M, G
  25.     public void executeState() {
    ( c6 V9 I1 m0 I5 u
  26.         state.handleState(this);7 k+ K; v* P: k. u; t, q
  27.     }& H: @, I' z$ U1 K  o  W' h2 T
  28. " K& n# e# N! i5 E0 R% ?. V: a
  29.     // Геттеры и сеттеры
    0 h! J* ?# e; ~, N$ M% y
  30.     public String getName() {. {; W: h! ^' Z- B, y* |
  31.         return name;) ]( W" ]$ G) c0 ~( y
  32.     }4 J5 \" k! o; q- D% @9 |

  33. 0 M, g! Z0 ]$ J+ d
  34.     public double getAttackPower() {, M% ~: r! Q9 @0 @3 L! h/ F3 d
  35.         return attackPower;
    8 L. C8 s, w  v# C& c
  36.     }
    ) n. y* M# \" d5 K7 M

  37. 4 J0 j  J$ C8 d+ j3 E
  38.     public void setAttackPower(double attackPower) {
    3 d0 i+ ~1 \. s, ?8 Q5 X- E
  39.         this.attackPower = attackPower;
    - A" j  g0 w* J2 o
  40.     }
    / @: \+ z+ A3 X+ q' X  t# ^% o  ^
  41. }* t5 x  w# s9 Y" U+ t
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
3 z; W5 g; G' b: i$ p& q- B& y* k; ^" N- t: j4 N- n
  1. // Пакет org.l2jmobius.gameserver.model.battle
    6 z! \, Q* c: k6 k
  2. package org.l2jmobius.gameserver.model.battle;8 g5 Z+ ]0 L( f* x: d/ M6 f* O" v
  3. ) D: ]& R" t# e6 E% {
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 ~1 g) [$ j7 |, q4 {( }6 T! m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : l; ]4 o2 E# y9 r
  6. 3 A0 O0 `1 H5 @4 m5 D; T
  7. public class BattleSimulation {
    - X& W- b: G5 ^$ n; c" S' N& W
  8.     public static void main(String[] args) {
    ; n. r& U/ c. W$ t4 z
  9.         // Создаем монстра
    % ]8 }+ B- r- o; j
  10.         Monster monster = new Monster("Дракон", 100);$ ~4 u, t8 q* V7 ~% j

  11. 6 [1 n, [9 |' i) n
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ( L( u# W$ h; F9 q) K3 w# ?7 t
  13.         monster.setState(new AggressiveState());
    # y* k; `) s) b/ j* i5 Y
  14.         monster.executeState();( F, [! c6 ^* [& S
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак1 \. z4 [* U+ E2 h; f) Q" z& w
  16.     }
    6 a# l8 d& b4 k) @
  17. }4 y: s1 l$ L: W1 j+ a% q' a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, [3 C5 j! V& F4 b( C2 DЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!6 t. J- ^( N5 S* `; i1 f

) u  r# a6 O  ]- a2 d+ ]2 k3 X- a( @

$ k9 N$ w' ?- X& Q! P, P, ]2 j0 m% V+ K
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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