Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!% s  c$ ^4 f! D2 L8 k: D* B. p* V
9 J  u! f2 z2 G) H% t% U
7 Z4 k% {) u" ?0 H
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
. f; l! b& t4 i3 n$ O# \0 i0 q- KЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
; V4 {4 N7 z3 o1 tАстралия ?
8 F6 M+ ^. Q2 w3 Q  S* A! P
; _. I. q7 `7 {# ]& c, E# U9 c  T; z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ I1 R2 N1 `+ y0 p* n/ NВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
' n, j& z- c; g) D; U$ R" Y* g  p% x. u2 f8 ~% J0 f
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 2 |+ Z/ H! k2 K4 z* [
AlexCoder опубликовал в 2024-10-16 18:311 X+ d3 h3 ~+ K" O4 D7 b8 d6 C# M0 Q
День добрый!
# e* `5 v- {$ X+ g' c3 vВ статье описано взаимодействие игрока с N ...

# L* Q9 _" J* ^% V: U& f3 UДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
+ v: Q4 A6 t4 Q5 l7 ]  w1 \
( J1 h0 p8 ~- ~1 ^, uЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 ~( B( g- W5 ^9 O5 `

: {' J0 Y- [6 j% [) Z: [( w" c7 g" BШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 x2 F. F* d5 x# ]) w8 }( Z( M: n/ I" ]3 m& g
  1. <font color="Green">// Пакет для состояний монстра</font>: y: K, D3 u5 ^4 M
  2. package org.l2jmobius.gameserver.model.actor.state;
    * y' q7 Q' \3 k7 p
  3. <font color="Green">
    $ H0 L5 D+ J! O) g3 s2 }8 C
  4. // Интерфейс, представляющий состояния монстра</font>
    7 x" X3 {% B# @% H! F
  5. public interface MonsterState {/ a$ `; }2 l% Y6 t! s
  6.     void handleState(Monster monster);
    9 {$ N+ \$ d  ~
  7. }# w. ~! i' R6 N' g  h% h7 `  x
Скопировать код
: [, n6 d$ z; Q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.6 S& L" F' ?# A# d
8 G# q% ?7 {) b- _9 i$ `- U
Класс для начального состояния монстра:6 w8 C' I9 d. i! C4 [1 q
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>& d. g/ D9 m9 s0 K+ Z3 R
  2. package org.l2jmobius.gameserver.model.actor.state;9 I+ q4 w& `$ D+ y3 Z
  3. 7 D1 Y( _5 Q0 }
  4. import org.l2jmobius.gameserver.model.actor.Monster;* }6 W, L# v; ?6 ?7 S
  5. . H8 X! c9 l9 v# V. o' y4 f& w
  6. public class InitialState implements MonsterState {; Q8 ~4 f: P& r! b  L
  7.     @Override
    $ M" n8 a7 z! s$ o% s
  8.     public void handleState(Monster monster) {
    ) a6 |" o8 j/ ?0 r' K/ _
  9.         // Начальная фаза боя1 z7 h9 B0 @0 s* B1 U
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" f2 e7 w! w( I. P% \6 b& c+ }" x
  11.     }
    : T+ d) m0 r9 G. o8 w; d! [
  12. }
    9 R1 A# [1 T" n1 h2 Q/ v
Скопировать код
+ N# C. \6 m) }8 ^+ I
* s5 k" g' Y4 z" s' C

: y( f2 a/ y( T0 y/ E! k" m
$ s8 [5 `; l  w% ^- e( A7 |
# G9 h( I1 O7 U- i; }- u" F" H+ E3 h. O9 a5 r
( K  Y4 {3 E% m2 a6 d/ j7 m0 E
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& ]! f/ m) c$ G- c4 i6 I5 T: z
. S! u3 v) m/ ?* p1 b. PЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 r  X) a; z. E# z% u" v
* ^/ O9 `; V% g0 ], o3 EШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: N% Y4 t+ |3 K
  q. C" U: d* M" \! y
  1. // Пакет для состояний монстра
    ) M% z. Q$ p5 h: T- {2 u
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; _  e- |( n8 _  x+ ~& B7 X* u5 ~

  3. 3 Q9 R" y8 B7 ?3 V2 ~; o8 O
  4. // Интерфейс, представляющий состояния монстра
    8 t2 T# Z! m7 T  u; _0 C2 n* ^
  5. public interface MonsterState {1 ?% ]  Y6 K" ~* b5 b: l0 i
  6.     void handleState(Monster monster);7 k# z9 i: Z0 w
  7. }
    + u) e5 ?% @- W% {
Скопировать код
* {. v  s9 ~5 ~! }
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 l8 s( A5 A1 P* l; x
3 ]0 a' y1 U0 y1 V* r" nЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" G, Z/ L/ D3 d  n7 d0 E, I, f" T0 N4 S/ g( c( R. N/ T
Класс для начального состояния монстра:; ^$ u3 [% f9 w2 C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 `# b  r# J1 r% u
  2. package org.l2jmobius.gameserver.model.actor.state;0 G- b2 {0 a1 {8 ?) u

  3. 6 O% w# u  |* @7 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 F# z9 a4 F* u7 m! A( c& U& J

  5. ' _+ R: Y0 d" V$ x' r, o8 V
  6. public class InitialState implements MonsterState {1 n) P# P& f3 G3 Y. E1 X3 E
  7.     @Override
    0 _+ e! I! ?, O& F
  8.     public void handleState(Monster monster) {# I7 W: c0 X- J, C; X* e" n( L" n
  9.         // Начальная фаза боя6 k4 V" e; R  L1 _3 K1 {; D" o
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 E3 i# n5 T9 P) x2 T0 i( S6 h
  11.     }4 X) `" A2 [& D4 P3 a: R
  12. }; s4 J/ d  a( `3 V8 k6 _6 r7 C) x9 q
Скопировать код
Класс для агрессивного состояния монстра:
0 N- Q$ X0 t, ^5 h* c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. s+ v, g* U4 v
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 I! `  h& }# H0 t; k5 _* y
  3. ( U) X0 g7 K. n  a" e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) x- R8 t5 J- W2 F
  5. / o; v: c1 ~  D& a6 g& `* c
  6. public class AggressiveState implements MonsterState {
    7 W, J$ x4 P" _4 y6 J* _
  7.     @Override+ z" z4 G2 @: g8 H, f
  8.     public void handleState(Monster monster) {# }& O( ^" V3 Y' m# W2 G2 G/ O1 P' a
  9.         // Агрессивная фаза боя
    / p' P& R# j- O- D; ^) s1 ^
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    # S# g9 S! q0 K! d
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    9 q! I, g' j6 K0 z
  12.     }
    & B0 g2 H5 {5 i! e& _
  13. }
    4 f4 |, I) {3 e) Q9 e6 d
Скопировать код
Класс для финального состояния монстра:1 L, d" k; S. A! S0 \# b( N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 A9 O8 W. p9 O
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! Z. O- `3 x  l' Y% d1 J! y

  3. 9 c& q2 A7 X1 K6 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 B5 i, |  e: q. B4 @5 h
  5. 3 t% W& X4 S9 L- n% b+ y' G3 D' C
  6. public class FinalState implements MonsterState {
    : E& s' Q3 a# Q! U. t! F1 k
  7.     @Override
    + m( s( @8 }8 x1 D0 l, i( x" d
  8.     public void handleState(Monster monster) {
    1 c* O& A) s3 @
  9.         // Финальная фаза боя
    6 O/ I9 t* e4 R
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    1 k9 C+ U% M+ y/ [6 ]+ G  [, L) k: _7 m
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки; Z8 `( Q% G! C1 w
  12.     }: F6 `4 ^  G+ Y4 W% ]5 y" n
  13. }
    ! s! W9 X- A+ R$ j: `( |
Скопировать код
, z6 _3 ]" F) f( x8 `+ @, D
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.( H8 x: ]  V; ]  M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) o( D& i9 H+ M# |7 v& {
  2. package org.l2jmobius.gameserver.model.actor;
    4 Q0 V" a6 v/ Z+ Y7 I2 N
  3. 0 X7 H" e4 a) [, z6 H
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % d0 m1 s# Z- m2 _
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ G! P0 q! x) Z% X0 c

  6. ! D+ K, u5 r* {2 V& m$ z
  7. public class Monster extends Creature {  P# O# G/ F9 i( k2 c" c. n
  8.     private String name;' o. }. C' [5 b
  9.     private double attackPower;$ z$ g& q$ h- D0 K, E1 w3 n0 H, Y
  10.     private MonsterState state; // Текущее состояние монстра  }3 O+ v9 {8 v6 A0 U

  11. 5 r+ M9 A$ M9 U$ _2 b8 e3 ?3 R
  12.     // Конструктор монстра" x# G$ ~6 x$ `( Q
  13.     public Monster(String name, double attackPower) {
    / W; C& r9 q# o! d; f& s0 p; t) O2 u
  14.         this.name = name;6 I5 j  A% ^6 K8 }- H
  15.         this.attackPower = attackPower;2 @% ^1 L6 D- L( ~
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние4 k4 z4 h; Q/ p# c2 _& ^6 \
  17.     }
    / _: u  f5 {# M  m' D* A) ?
  18. 2 h# l1 s% \5 a4 `0 e
  19.     // Метод для смены состояния5 B9 G$ @/ d. Y$ R: }4 I) V9 v$ p
  20.     public void setState(MonsterState newState) {
    # Z: Q  F1 a" |" c5 ~6 H
  21.         this.state = newState;4 b/ w1 Y0 C$ _, o9 d6 a+ `
  22.     }
    : D: s/ G! x: n0 R7 Q) m+ m3 V

  23. : @  Q0 l7 b! [' z
  24.     // Выполнение действий на основе текущего состояния, {7 ^* V9 C* V" A6 p: o
  25.     public void executeState() {
    4 b8 g0 x4 S% K4 Y2 `# h" n
  26.         state.handleState(this);
    & C9 A/ r) H+ l1 J8 c" u
  27.     }- h% B0 X6 O, P5 j+ e* P8 u

  28. / q+ I' K( s# N4 w
  29.     // Геттеры и сеттеры2 z" y7 k- a4 R" l
  30.     public String getName() {
    $ \4 T( B6 G. r
  31.         return name;
    ; X  K8 `. N$ F* C
  32.     }
    + x! v# W7 C8 G6 J; c5 X

  33. 8 X4 d) @& `  i; ~2 t: d; U. a% D3 v
  34.     public double getAttackPower() {
    9 \* {4 W8 G. M& n2 W  e
  35.         return attackPower;# p7 i; p2 G- a
  36.     }3 K5 v2 L  ]9 |+ s

  37. , f7 i- ?  l' n5 w% ^- w
  38.     public void setAttackPower(double attackPower) {
    & m6 S& k8 v; Q; d; x) X7 v
  39.         this.attackPower = attackPower;9 B& y0 o6 \  W+ g6 j
  40.     }
    $ o" z0 g' z9 V. f% {5 L, b
  41. }
    , j/ X" I: f. c# v- o1 w
Скопировать код

& A) l5 z9 Q! j. C9 lШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.7 A+ j1 i3 }( k0 G/ a! O7 g

! \* l! I$ c8 O( \0 ?
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ' c$ l9 P6 W! S. t" L: X! e
  2. package org.l2jmobius.gameserver.model.battle;
    % x, y# E  @  i6 k1 }" \

  3. / J  X" A4 D$ j" P3 b- v; G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ s8 o! d0 g( B, n. W, J: B1 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ P0 B  o' X1 s+ b: c, D
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    # a! Z  g& }: k
  7. " [3 J; y- G1 i& ~* B
  8. public class BattleSimulation {
    % W6 {" H4 B6 O( U7 }; z$ h
  9.     public static void main(String[] args) {
    6 \% r+ n, u3 N5 \
  10.         // Создаем монстра с начальной атакой# v9 R. F3 E' x
  11.         Monster monster = new Monster("Дракон", 100);
    % e- d2 I7 I, `; n5 n9 ]# a4 \

  12. ' F% X3 F# ^4 L
  13.         // Начальная фаза0 s/ ^. _+ V7 z! g5 A
  14.         monster.executeState();
    ) x; R" `1 D* e, d. X

  15. . r- H; O) s% j* m% ~  Y
  16.         // Переход в агрессивную фазу
    ' a# w+ M5 b9 X! u# ~& o6 x
  17.         monster.setState(new AggressiveState());
    + ~. @, p5 m3 n; l. S
  18.         monster.executeState();9 X; r$ O# i/ p/ I1 w8 k* c

  19. 1 H! g7 W4 k" }
  20.         // Финальная фаза
    ( Z& v* p3 j2 T; f/ D8 ?
  21.         monster.setState(new FinalState());
    ; O# u' x, I5 B7 A
  22.         monster.executeState();
    1 d, [. j6 K7 Q3 S
  23.     }# i7 E+ b1 C; |$ S+ R8 L
  24. }" C. v( [7 f# |( I
Скопировать код
) C. ?5 R$ D# n8 C0 e5 j9 H
Комментарии по структуре пакетов и классов:7 t$ D/ S* F0 _3 \" o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.; y; E  Y; H) v$ s9 o  [  z8 s5 ^. A. ~
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 e8 W1 m' z- X0 DЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 y" A4 ~5 r5 J6 W+ K

% k! N  o) a: U: Q
: c, e& ~9 y; ]: [; ^1 @- g5 S* B& n  M) N6 B

- e: n( [# m+ ]8 f1 p/ {+ o; f- K  n- A. n6 ~1 J3 C; h4 a1 Y
0 w2 i; Z2 d! K1 q0 r( _
7 S$ o7 z( n% y3 ]' k! f  A
6 W* `$ v3 l/ b7 D' A
% N1 m. y$ r' Z" G5 ~

3 |4 l& x* r9 D4 m- K5 s% ?# x0 J8 Z6 h9 Z5 [+ \
5 z6 d' Q9 R0 U7 x
- M4 N4 C+ Q% @
; q: ?% B* L- B4 f* e
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04  w. Z2 M3 o. `6 T2 ~9 q
Для управления сложными взаимодействиями, такими как  ...

( ?: i) h" S4 @/ N# O2 M+ @; PОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
# H5 B: M1 {0 F5 @) ~Отличный подход! Использование шаблона "Состояние" де ...
! `& }6 w4 a% O6 w
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.& L0 G# l0 F8 k: M

8 p8 {+ i3 h2 T1 S! V7 y% j) MШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
1 y" P" I. \! U7 Z& p
0 O  H5 J! j( o( r
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ u  H; {. r! |. Z( a
  2. package org.l2jmobius.gameserver.model.actor;
    1 D8 ~* `' T5 i( l3 B) Z# O

  3. / r& g9 Q7 P0 ^* G
  4. // Перечисление для типов атак
    " Z# I- K7 r  h' h0 X7 }
  5. public enum AttackType {
    3 t0 p* J- K& E/ w5 s& |
  6.     PHYSICAL, MAGICAL;3 [+ K# q% c- ]4 @5 I9 Q% }
  7. }
    / [5 r' I4 @' R
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
5 c3 d" T8 V, F0 |Обновленный класс для агрессивного состояния монстра:
; B$ t# P$ r  U& q0 V. X. E+ w
3 b* Y1 Z) k9 U  V) y/ F6 k0 \; P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % r) L2 _( j, I) \  p7 [$ p% u
  2. package org.l2jmobius.gameserver.model.actor.state;4 c7 c& v8 x( q! @" N9 C& \! H

  3. 1 K5 ~) C) j/ z5 x: X& a9 h' Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * |3 w! m9 I8 p9 C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    # Y1 Y" Q" f2 [$ \3 o
  6. 1 Q" w  o6 E6 H+ i
  7. import java.util.Random;4 B2 Z  p# b3 J
  8. ! m8 I6 V. z+ J5 D1 ~$ Z2 ]
  9. public class AggressiveState implements MonsterState {
    8 L* Z4 T6 e8 v: s! _1 |
  10.     private Random random = new Random();
    1 t0 q0 a' s# f* `& y

  11. ' u7 ]8 u- J' R; F) A5 i9 o
  12.     @Override% M( \+ l2 C6 H7 F8 \3 A8 j
  13.     public void handleState(Monster monster) {
    1 S9 N- a9 X4 U4 G* x
  14.         // Выбираем случайный тип атаки: физическая или магическая; D$ h6 E1 x+ J* t, O5 r& }
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; J5 w7 A5 B$ Q& |# c' L: [
  16. - ~  N# b, Q' k) g. a& O
  17.         // Логика для агрессивной фазы боя
    6 ?  Q- g  i; F2 p$ m
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ( j* \. k/ j5 C9 Z% x& f# a
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");) i, f0 q! `2 \3 B+ ]% ~
  20.         8 m% _+ I& {5 \, L, L
  21.         // Увеличиваем силу атаки в зависимости от типа атаки7 x4 k" ?, c$ @. Q
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    * V1 s5 E$ w- c- m/ U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , }' k+ J, k4 x$ [% @& p
  24.     }
    / U" M8 D, Y  Z6 J% R
  25. }% f, X* [* z6 F0 N6 e
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
& q( W& k( r. b$ ?0 I/ M, e) ^5 W+ n6 }& C8 X$ h
  1. // Пакет org.l2jmobius.gameserver.model.actor4 ^2 F3 |( ^" `
  2. package org.l2jmobius.gameserver.model.actor;/ f, O8 e, [$ c* b, [
  3. 1 b2 g# f7 }/ J. M& j, t- _5 j$ A
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 M" z) e* i7 V2 W/ J0 b2 b& L, g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : r7 K4 k6 p7 y2 q3 R5 [
  6. ( M8 u6 C  U. n" `1 Y# P
  7. public class Monster extends Creature {
    ! V8 z7 T/ ^* ~+ l
  8.     private String name;
    % p: X' |% c! \; K" G
  9.     private double attackPower;3 E+ X; `3 R, m6 S0 Y+ c
  10.     private MonsterState state; // Текущее состояние монстра
    : {# P2 B+ F4 M# I  j; {

  11. / o+ n6 d1 b) r4 t& ^  D8 P
  12.     // Конструктор монстра" J2 L! J: w+ j$ r
  13.     public Monster(String name, double attackPower) {+ V1 y" G) Y( Q0 `  c0 ^$ ]  N# n, b
  14.         this.name = name;& B7 s/ [1 L; A4 R0 V8 X" k* t) P
  15.         this.attackPower = attackPower;, I& X* U8 q' y6 N& \' ~
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ( L* j# Z- x$ w
  17.     }7 Y! `" V; V* l4 B- [& p7 `
  18. 7 H2 j5 ]% H0 w: @6 ?" _
  19.     // Метод для смены состояния6 X: F- o! s/ G* o
  20.     public void setState(MonsterState newState) {
    ) R  n5 Q: \+ D4 \9 A! t6 t, T
  21.         this.state = newState;& T5 f! v, q* s% n; `( y
  22.     }8 E* |1 t* e  K- C. V

  23. 5 w# ]( i5 E4 y! `+ y3 C, I5 y% X
  24.     // Выполнение действий на основе текущего состояния1 Z3 f3 k* T( N! E+ X- Q
  25.     public void executeState() {+ v) M2 j7 ~+ t8 Z6 }1 a% f( w
  26.         state.handleState(this);( j5 E/ i! N: f  p3 j# p1 u
  27.     }+ x1 B/ Q( ?, h: O1 _4 C

  28. : P+ |2 X/ u! a* e. q
  29.     // Геттеры и сеттеры
    : |/ Q5 h' _1 o: N+ K. |( _: q: X1 G9 W
  30.     public String getName() {
    ( K. \$ R. C0 v/ q) }
  31.         return name;) Z4 ?  ~' O/ p: c" g3 M& w
  32.     }) V0 z8 C* b" n0 I# C
  33. & q! }, W, p4 V- z5 J' \1 o
  34.     public double getAttackPower() {
    8 N+ C6 u" Z* b( D
  35.         return attackPower;: `" H) O( M5 i0 f, N1 b. ^
  36.     }
    ' G  Y5 J9 c2 I) r# Z0 O4 L4 y

  37. " x( p3 C1 x. X; f; r  Q3 }
  38.     public void setAttackPower(double attackPower) {3 ~8 l7 \+ m; d1 }
  39.         this.attackPower = attackPower;" y0 U6 r: L% ?8 o7 g8 `. g8 o# E
  40.     }
      e0 v7 i4 u  a
  41. }
    3 Y) U' C! _% }. _: N7 O; @$ R4 c
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
+ K9 r/ P' W) J: t+ O) U/ W, Y' k, t& E, _& i+ O
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - |7 P! ^! j* R) ?' H
  2. package org.l2jmobius.gameserver.model.battle;7 t5 o9 H, S: e. W4 q& o! R8 [( z

  3. 7 I2 L+ m4 Q: S" j7 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 H( v% O/ ^! }4 w% z* e9 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      ?! J( J+ c6 Z# Y2 c

  6. ! ~1 M6 L, Q1 L8 M# b" ]+ b
  7. public class BattleSimulation {
    ' Y& x/ u* l& M; I; N9 v2 |9 Y
  8.     public static void main(String[] args) {
    % M- }0 |- Y. b. U
  9.         // Создаем монстра$ q2 x: @  k: G/ D& Y( W  [6 h
  10.         Monster monster = new Monster("Дракон", 100);
    * g* P' R  A/ S/ K; ~2 o
  11. ; O  H( W$ P1 B; }; V3 K
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак" p9 z/ V' y- M
  13.         monster.setState(new AggressiveState());! x* n; I# }& Z  H. Y
  14.         monster.executeState();
    ! D6 V/ D3 j  w( N; d
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    4 q! R2 Z9 ]" ^& P
  16.     }& k. _! t: o% q, g- X
  17. }/ z& {3 a" P0 u7 z
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.$ J) ~: e" f7 ~
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!4 I; I! F' R" X9 l. P: U

; j# R! r/ ^" j* a7 s& F3 V* r" X
  k- b  H# a/ x3 K1 w# j) V
7 W) u' X7 E0 u+ m3 M, T& d
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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