Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!& T/ A& I$ l9 `+ p
& E  j3 Q: e1 d3 X1 p
2 U" e2 \8 i3 i# P5 m9 _7 T! P5 Z/ f
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
# t4 t) v* m& _) o2 O$ g& y- {Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
7 |0 V9 V/ R7 Q2 m! v: xАстралия ?- \; j7 b8 E8 ?& J  n$ V
7 {% E/ H! {$ T' G

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
0 ~4 Y; l8 |: e# O+ O+ Z$ bВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ X0 b8 ]& W' V% n! l( A/ ]

3 H# \* a; U& l( y: Y/ v- N% G
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 7 e0 A: E) O% H' x
AlexCoder опубликовал в 2024-10-16 18:31
. }  w. v& J0 O' v" Z7 I; GДень добрый!- X) R. ]2 Y3 q9 a2 e
В статье описано взаимодействие игрока с N ...

5 D5 M7 M" F8 D( DДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 ?# O' K& C8 u4 o
6 m1 G0 }" O! Z3 l, [3 I+ W
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* Q9 a! \- O9 ?9 {( ]$ E4 R4 u9 X( }  }
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 {, z; P5 t+ f5 X! w$ |

( K7 f. x5 r+ ^
  1. <font color="Green">// Пакет для состояний монстра</font>
    ; n5 _4 R! t3 y! A  N0 X# p
  2. package org.l2jmobius.gameserver.model.actor.state;1 p, s+ Y# q1 P0 Z, |
  3. <font color="Green">
      v* G" V- h! I8 l' i4 b# x
  4. // Интерфейс, представляющий состояния монстра</font>
      m. s% l) c# Y1 J( k7 ~- Z
  5. public interface MonsterState {
    + }" c. o5 u; v- r6 `
  6.     void handleState(Monster monster);( P: M: j4 M$ \/ W/ j  z9 j
  7. }4 H% b  c$ N8 B2 f
Скопировать код

2 v2 Y4 |/ u/ V$ W9 q& FШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.9 ^& W( s1 w& o1 |' N
0 e9 M3 L! R/ `; ~9 C2 c( g
Класс для начального состояния монстра:/ W3 D, _( x  c. \: l
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    + M& O. u: v7 X% h) Y3 _) Q8 q
  2. package org.l2jmobius.gameserver.model.actor.state;3 a; o: a2 E4 X" ]
  3. " d) P, O$ R$ c1 @! I$ [
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 ]2 D0 Y! k) n0 t1 T* B
  5. ! w8 p6 Z/ P4 {
  6. public class InitialState implements MonsterState {
    + \8 y3 H+ Y# N2 x' r" T2 y
  7.     @Override3 U! p0 L0 P* x7 |  F
  8.     public void handleState(Monster monster) {2 D# n/ }% e# o8 u
  9.         // Начальная фаза боя
    1 V1 L/ @  S; h; O- ~
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 d7 G: c6 i4 k0 j5 \
  11.     }, K/ H; `& O. Z  A
  12. }
    ( a9 V1 S1 ^' A/ b: c  M
Скопировать код
/ C# ]4 [# ]( v
* h6 E$ g: [  t5 \$ v# F$ _
, r+ X' L2 k4 ?, b  N

9 U/ Q( v4 C: \- ~4 N5 I/ d! p; W
' u+ ?. ^; {4 ~) f8 R% S4 B8 |6 O' H& ?- }2 D. J, y5 z9 o" q
  @! h3 P' ~& x% \" o
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " {+ i; Q# x! l: O1 e1 A) a+ o7 |
# I- p+ c7 A$ B/ V4 E7 R' i: r
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 \( T0 t) G% [0 B- K7 I
& ?/ L! ]3 F! H0 p9 {Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 z! [. X4 {# A3 s- `* m/ a+ p

. g5 A8 z% |: c/ k* D
  1. // Пакет для состояний монстра
    7 w5 s- t. N, t( k2 ^7 _
  2. package org.l2jmobius.gameserver.model.actor.state;: ?0 T. H( I/ B# F

  3. * Z; l) R/ y0 u0 g1 K7 a5 e
  4. // Интерфейс, представляющий состояния монстра
    9 e( _) f, F$ E* X+ E4 W
  5. public interface MonsterState {
      Z2 A# _/ ^; w% i- I
  6.     void handleState(Monster monster);
    7 l) D, x/ G* l4 N
  7. }
    " K1 C& N5 D* E1 {# b: p* ]
Скопировать код

4 K0 b* Y* U* [4 Q& }. uШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" E; D# C; u# P$ Q  Q7 s7 n8 N7 I1 O* x( E$ i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: ^2 u  b& E! @
, `+ o! r/ U  s3 a) g: P/ v% F2 y
Класс для начального состояния монстра:5 w; N7 r- S) l2 j, {) B7 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 D- |; _  T* t: j: S
  2. package org.l2jmobius.gameserver.model.actor.state;) |2 I4 S% `0 D: j: k

  3. " e# I' s3 d" d3 T0 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 P" a& s/ w+ i$ D! k. U

  5. : o- K% b4 ^  H, S
  6. public class InitialState implements MonsterState {% t. x+ J: ^  G7 ^
  7.     @Override4 ~* F. F+ c, i0 s( n
  8.     public void handleState(Monster monster) {
    4 d5 \& k; ~+ {
  9.         // Начальная фаза боя4 ^8 w2 w3 J$ V% L" M6 p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 U/ h9 R- H. |; n
  11.     }$ `9 O# h5 y% }0 X7 A! i
  12. }
    1 F3 j9 y# e5 g: A
Скопировать код
Класс для агрессивного состояния монстра:
" W( j1 |: t9 d  v) _! d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 @% k: V+ z" l5 T* l+ \
  2. package org.l2jmobius.gameserver.model.actor.state;* _0 J7 Y# [4 e: s( z4 x

  3. 3 H5 }. Y* ]- H+ J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 n4 L: g7 Y0 Y8 X: O/ S' v
  5. 0 I# d# s  z1 X& A% q" k4 K. Y! x
  6. public class AggressiveState implements MonsterState {
    " k2 M+ h' A& O- `- H
  7.     @Override
    2 O& J5 u$ O. G7 t& e* e1 V
  8.     public void handleState(Monster monster) {* U; l. r2 [+ t2 c
  9.         // Агрессивная фаза боя+ k( `0 `- p: F
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' O! O6 J* p; Q. x2 m6 p  h5 Q8 G8 v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    6 r0 v+ U# h2 r7 q/ s
  12.     }
    , E" q; R# {$ E4 e- P9 s$ Z  f2 H  m
  13. }% o3 E* E3 o) ]
Скопировать код
Класс для финального состояния монстра:
! }% W: O0 N; k  q" p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' C6 S- ^8 D; I8 r
  2. package org.l2jmobius.gameserver.model.actor.state;3 O2 [# ~+ C; D6 G& _3 w  l

  3. ) R: L6 r# g' N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      c* _; f% Z* ~$ l+ d

  5. & e- H5 Q* V$ S; ?3 h* s% ?. d
  6. public class FinalState implements MonsterState {  @3 q0 p1 ^: r* Z3 q6 ?
  7.     @Override
      j% ~0 \# {7 X: ^, a+ ^, U
  8.     public void handleState(Monster monster) {
    ( p/ [5 Z, F7 J) D
  9.         // Финальная фаза боя2 X3 [9 A3 V# B" i) }
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");+ h$ f6 \7 i( |* _- |, H
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    % h' Y9 H7 _, \2 B
  12.     }
    % G" K* P( S7 e# d/ j: u
  13. }; }& t# _' f4 e# |6 I
Скопировать код
# `& I, M* o: Y  A& `0 b  S. h5 Q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 m! o2 X4 Y: |) L2 O' _$ D  ?- ~$ o
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' M4 R' ?0 n/ i! B0 m, H# \3 n; t. _
  2. package org.l2jmobius.gameserver.model.actor;
    0 c) e8 n, G" K/ z7 H

  3. . ]/ }! @0 E! ?. B% J. o+ F+ N( K
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . f8 l3 ]' h/ Y7 M' V1 }) K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 p0 \. n2 B9 @

  6. 5 }* y4 Z( r+ W
  7. public class Monster extends Creature {) E+ ?7 |8 E5 C
  8.     private String name;
    1 f! o7 |6 Z: ~) V; y! G
  9.     private double attackPower;/ v# r* O, r8 m0 f  _9 Q
  10.     private MonsterState state; // Текущее состояние монстра. b% ]- u1 D) [4 U1 m2 f
  11. ' W+ x) x/ j7 @* g
  12.     // Конструктор монстра
    , d3 z# O& c* [8 r1 M# h- y
  13.     public Monster(String name, double attackPower) {
    4 ^5 r$ R+ ?" M, s
  14.         this.name = name;" W) Z9 i8 s# x5 F9 N- A4 n
  15.         this.attackPower = attackPower;
    8 Y, m  ]. S8 \, {" Y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние. q6 u6 N# ]1 W# @5 a1 C& l
  17.     }
    % D, |5 q: i, H5 c9 O: K. `/ C
  18. $ s% b& }4 B4 Y# _1 O" N: G& P
  19.     // Метод для смены состояния6 K$ P# B. A5 f% j5 P# U
  20.     public void setState(MonsterState newState) {9 j: F) X. Y! w' ^2 q8 d2 ?' J" z
  21.         this.state = newState;3 l0 t, N* ^, ^2 Z9 x1 |# u6 |
  22.     }  {* q. H- ^( p1 _3 m5 V
  23. 0 r+ y$ o7 a( d: }1 Y1 k
  24.     // Выполнение действий на основе текущего состояния
    * A- H+ \' z, T' V( e( i7 q
  25.     public void executeState() {. Y' o0 k0 a, @7 x. l
  26.         state.handleState(this);
    7 i3 v; f2 x9 W8 v( V! w; C# S' Q
  27.     }
    ) I; ]& P+ B+ p7 a1 S
  28. 2 K8 x' r; Y8 L# M: C3 [& g1 z
  29.     // Геттеры и сеттеры: ]1 Z$ P; a) I3 \( B
  30.     public String getName() {
      _" u) ?1 a- d: _/ W3 M: x
  31.         return name;
    : H/ ?! P! B9 n0 l  G" K6 d. b
  32.     }
    ' g# K5 B# A8 n  E, V7 r; ~
  33. 7 f3 b" p. [+ M2 d7 P
  34.     public double getAttackPower() {; ]  M' N2 R* p
  35.         return attackPower;! ]* j! Z) @  ]8 D4 L/ e0 E) h
  36.     }
    , }! u' \6 {) A+ x1 ~

  37. + `, y. i# L% y; U+ R0 f+ g" }9 e0 K
  38.     public void setAttackPower(double attackPower) {
    4 {  r1 K% S# w# z6 u0 z
  39.         this.attackPower = attackPower;- u: Q) f1 {9 W1 q
  40.     }1 k" o0 }6 [) W0 u
  41. }) z! U4 L0 G: h$ a
Скопировать код

% @4 a0 p0 f! N, V' NШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.( J( t( r7 X1 Q( v, |8 }
2 a7 p3 d/ e9 H* o9 G- U9 s4 `
  1. // Пакет org.l2jmobius.gameserver.model.battle' ?8 s+ }! T; t* M, c
  2. package org.l2jmobius.gameserver.model.battle;% Z7 K* `% L9 |  r7 u& k

  3. % R+ u( `- v" L. i
  4. import org.l2jmobius.gameserver.model.actor.Monster;( [0 m- E' z* r- [, e
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ {) {0 K* @" w0 s
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    4 w- y2 x9 i3 [4 _, q2 D. w: e
  7.   i  g5 p9 t9 Y; @7 E
  8. public class BattleSimulation {# y6 H; N1 \. z3 @. O* ~
  9.     public static void main(String[] args) {5 K" M9 a* f# Y0 H
  10.         // Создаем монстра с начальной атакой# e/ j7 o9 f" r" v1 R% t
  11.         Monster monster = new Monster("Дракон", 100);& F: a$ y7 l" `3 M# Y3 `8 x2 y# ~  M
  12. ; W+ v: [6 d$ ~
  13.         // Начальная фаза
    6 \; J/ {- c6 J- M
  14.         monster.executeState();- ]; l# M- V3 h( V
  15. 0 F) y- d2 K4 `. e
  16.         // Переход в агрессивную фазу/ k& B; O% f0 h! u) Q* Q5 c9 v
  17.         monster.setState(new AggressiveState());6 X' z. i9 B0 Q( z7 t3 O
  18.         monster.executeState();
    , C" @3 S5 N: [- G

  19. ; c6 |  I) ~$ t# ]  J5 D- Q- j
  20.         // Финальная фаза' ^) ^' C8 m+ W0 J) |5 M
  21.         monster.setState(new FinalState());$ Y9 {% F2 c& i# j# a) @# f
  22.         monster.executeState();5 _2 B1 z- `0 O
  23.     }; O: g) i! b0 c7 v: B: B
  24. }
    # [/ l; l% H$ j, ]/ I3 b
Скопировать код
# L9 @1 Z  |$ Q" \0 F
Комментарии по структуре пакетов и классов:$ t/ B# C4 o; H* G9 m  |' h- ^
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 U& K' T& T& E% V1 h) R" p
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
' B6 ~# ^8 U8 oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
& r+ ~" S. B) o; h- g' ]( a3 y5 u/ `
: y3 [9 Z& d  j3 ]4 B0 L' Y: _$ o) ~( ]

" ^! z: u6 @2 L2 z# Q  X5 M4 `6 K. D% q
- w7 z% s# W2 M/ d

/ [3 r) _+ x8 F+ \/ E2 S- u, H- o6 \) x
$ O3 \. h5 s% w  }# h/ n' ^, `7 T

3 `- i- V2 B# [7 T# A4 E/ y3 {- o2 D  h; a7 H
2 `/ S0 V) ^: B  R- w9 p6 G

8 L  q2 a4 f) D7 f- @, e, G3 R7 D) l8 q4 k$ d! x

; s3 }8 i, b0 j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
; Y* T" n2 K! Z9 u! J, M- K7 `Для управления сложными взаимодействиями, такими как  ...
0 ?* D7 T3 _, ?* I9 P9 p
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21( C3 X/ U; Y' t7 d
Отличный подход! Использование шаблона "Состояние" де ...
9 K7 [8 K7 Y2 R# A& [
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
! J9 T1 N. }* u, V
2 q: m/ f1 g9 W5 a! V3 S) I$ r: z1 uШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя., ?7 y7 _5 Z7 w0 H# l" E+ ]

- |$ A. Z+ J, E9 q
  1. // Пакет org.l2jmobius.gameserver.model.actor* k( {: u3 q% `) w
  2. package org.l2jmobius.gameserver.model.actor;/ k& N. Q: B) f8 @5 r

  3. ( ~5 _2 @6 i$ U1 X
  4. // Перечисление для типов атак9 }" M6 }9 R* X" w' f! u3 A4 C4 L
  5. public enum AttackType {
    3 I# Q7 ^' w* a3 L9 C
  6.     PHYSICAL, MAGICAL;# P4 [0 ~* |1 h8 t: K  e# m+ A( R
  7. }
    " K% W1 }+ A  l" ]- L
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" Q" }- V5 \1 L: I6 i1 Q; ^" u) n% _+ TОбновленный класс для агрессивного состояния монстра:$ C' J, [  p$ P, O1 W& L# M9 \% a. J
* I0 g( E  u) j3 k/ c3 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 G/ ?' Y# h- ?% a# n; _: A. [
  2. package org.l2jmobius.gameserver.model.actor.state;; r3 Y0 I$ n5 Y' S

  3. * ^9 s/ _# |2 D* N  x
  4. import org.l2jmobius.gameserver.model.actor.Monster;* A! W, ~' M9 u8 [
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    0 ~- @3 n7 N' q

  6. 1 K& r4 `7 [1 |6 ^
  7. import java.util.Random;4 k) ]$ M, c( a& Q
  8. : H2 g2 P' o, r3 o! Q2 E$ ?5 |
  9. public class AggressiveState implements MonsterState {
    % _9 d" g* Y, X; M, \* w
  10.     private Random random = new Random();
    7 I( Q) f* V  R7 O/ c. X; z" V- V

  11. : c% y1 q  I: o5 B+ `+ |
  12.     @Override% G: ^/ p1 c% t7 y# S- l: l
  13.     public void handleState(Monster monster) {9 E$ y' u- E1 v$ S, C& d+ q$ C
  14.         // Выбираем случайный тип атаки: физическая или магическая
    / P1 K" T) t# f
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ! B3 N. B' t$ l. o! d2 k$ e' E

  16. # M. O5 h2 A% Q4 [
  17.         // Логика для агрессивной фазы боя* t* D9 ?" k" w+ U9 }+ r
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    8 J( a; d( g1 h; W8 |
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ; r/ ]8 C, m( M0 `
  20.         / m" ]" W. f) z; C0 |  w6 @) v
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - r$ v$ k; Q( m
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    0 D7 E# ]* k7 M
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);8 F9 f. z+ [: p% X6 h
  24.     }- P# w& N! C. \6 r% U
  25. }
    $ L5 a" w4 I6 P  P
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
) ~. J) v6 ~$ K7 }# k% h+ Q7 Q; H" N, L% {
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . h5 j  V4 P3 W- Y
  2. package org.l2jmobius.gameserver.model.actor;4 c# U4 b" w" v  n, J( r& V1 x" ?( H

  3. 3 B* s( j$ D. j. A+ @" m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ S4 Y" d2 s4 W) G
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    / [. Y. }. J+ W7 N1 l) q5 ~3 a/ b

  6. " F+ S' A/ x8 A$ o  f5 i4 |2 o0 F
  7. public class Monster extends Creature {# ~  q9 }8 ~" Q# y/ @/ d
  8.     private String name;% e8 g8 m8 h2 u) L* s7 n: n; c
  9.     private double attackPower;' s, }$ N- Q$ P& {
  10.     private MonsterState state; // Текущее состояние монстра
    - g4 I! f6 ~8 ^% z

  11. , N  _# V3 E/ R4 v# G" x
  12.     // Конструктор монстра
    ; q- p' B$ p# r& B
  13.     public Monster(String name, double attackPower) {! Q7 u. s' _: Z5 S; w6 _6 c% o8 ]
  14.         this.name = name;' {9 z9 M+ j3 a2 C
  15.         this.attackPower = attackPower;) c; }4 R/ P, S( ^6 W% e: _
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию& s+ }0 z* n) }( w
  17.     }
    0 }9 ^1 [7 W! K, a# Z) \3 [1 b* R

  18. 1 N. [* n- C* r5 _0 F: j
  19.     // Метод для смены состояния
    8 j, _2 G. C& d1 i! }3 d  ]! s% O
  20.     public void setState(MonsterState newState) {; P: M4 n6 E; h) B6 M7 G. n5 |
  21.         this.state = newState;
    ' _% n+ j( h9 P' }) u' F
  22.     }; @2 ]5 m0 Z9 U* z1 h

  23. ; s* |: h! e/ J+ A
  24.     // Выполнение действий на основе текущего состояния1 `) U+ Z5 S7 u0 C& J" Q2 x1 k8 U
  25.     public void executeState() {% t) T1 @5 b7 y# A
  26.         state.handleState(this);
    " p7 ^, K! f( p
  27.     }
    8 `% r4 L) O( n/ \
  28. ( V; ~0 i3 s8 E- \
  29.     // Геттеры и сеттеры
    ' w( ^  z) x6 S
  30.     public String getName() {
    6 G0 R/ K( q  B4 A3 Z! _: }; B
  31.         return name;
    6 J# R. {; _  H  Q/ K) U. z
  32.     }. _& Y, r6 x1 V2 x' e
  33. $ v6 x& s- ~9 T9 R, j
  34.     public double getAttackPower() {8 \5 h# H6 v( B$ a! J$ K8 r' l
  35.         return attackPower;8 V/ R4 {  X$ h7 L
  36.     }
    3 j4 E) m. Q( v9 z3 r6 h
  37. : H' l+ }0 e4 O  V# s2 `% M
  38.     public void setAttackPower(double attackPower) {
    * ]% e( a+ e9 W! ~( F5 {/ `! g
  39.         this.attackPower = attackPower;
    - Q! M" f5 Q; P: [* p
  40.     }
    1 Y" `6 [$ h5 D0 A, I2 `  {
  41. }
    % e- U+ s/ t+ C% l  c9 I, y; ~
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: O2 T8 A. P6 X' E6 I7 N7 H
8 E" s$ r1 h! s* t8 P
  1. // Пакет org.l2jmobius.gameserver.model.battle; V9 Z! x0 F6 m4 h  [
  2. package org.l2jmobius.gameserver.model.battle;2 U+ D/ t3 ]4 H; Z# z

  3. 0 w1 L  s' n0 U6 m4 i+ k
  4. import org.l2jmobius.gameserver.model.actor.Monster;& z3 Y& F# j. ?4 b/ w
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , X7 _3 W" y# _( f

  6. 6 B: m4 P+ \5 S, ?1 w6 s
  7. public class BattleSimulation {+ ^5 @! f: Z. E/ P* s
  8.     public static void main(String[] args) {
    , {$ V9 B; }  \& W- _1 Q, V) b
  9.         // Создаем монстра
    2 u) H+ s, M' ]. I( A' S
  10.         Monster monster = new Monster("Дракон", 100);8 A3 I$ [9 Y/ W+ h

  11. ' ^/ `1 K0 l" H
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ k' F4 K; r3 ?! M; l
  13.         monster.setState(new AggressiveState());
    ; d) T$ S0 U3 M& h8 Y
  14.         monster.executeState();8 E" W. b) V3 K. f" N5 @
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    - O5 V/ e0 ~8 L+ R/ c* o  }& x% ^
  16.     }
    / a5 ^2 l( c& r
  17. }
    0 P% y6 B3 w; s/ `4 S4 L
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
. s8 m& g- i% G# M! c- N$ @1 AЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& M' j( h1 o  z6 x

, a/ v% V3 T  {+ z& O
( ?4 r' t+ U& N, m
& B% U0 {" I6 G& \# M5 B% v& V0 ]# [
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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