Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!: S, A( q" Q5 _3 q0 L+ f6 |

1 y/ K! g# f& x# j: |

0 b5 w3 G4 u5 `7 ]Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
) g4 }+ D- p0 x  m6 J! AЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!9 Y5 [1 S1 g; s, Y2 i
Астралия ?  [7 e' G. J) D, b& F

" H; J* W( L, w) n, u* Q4 }7 v

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!" y8 p+ L* s$ l5 B! n0 a5 g2 ]3 k
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
7 i4 d. j9 G+ N& W5 g8 Y
- w/ V! K* c# W9 a' I
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
# Z" j; Z) t1 f( L9 q" @4 z! }
AlexCoder опубликовал в 2024-10-16 18:31! E8 a6 @# T" X6 u) q8 Z1 Y+ _2 @- S3 u
День добрый!: x5 l( t4 d  T. j
В статье описано взаимодействие игрока с N ...

8 D/ H: e9 R2 vДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. y* n! G/ I* P# ^1 y+ c3 b
4 H/ f8 R0 n( R7 H) T, C! G6 nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! D  Z! ^! e, N- E& Q) `
% @0 x2 j; z( W& ~/ U2 q9 ?3 a
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 F) h3 @) p: V
7 o7 z- o2 q, m& T1 f! }0 C
  1. <font color="Green">// Пакет для состояний монстра</font>2 t/ T# y# }/ j: A/ N5 ]
  2. package org.l2jmobius.gameserver.model.actor.state;/ r: _! [! z# Z$ {$ m
  3. <font color="Green">
    ; {; g7 p0 r7 y
  4. // Интерфейс, представляющий состояния монстра</font>% @4 X% j1 T! s
  5. public interface MonsterState {# i/ _+ a' }; E* J6 b" O4 T7 ]
  6.     void handleState(Monster monster);, L: [# r' P' z# w& w8 k
  7. }
    ( Q- f& o' {/ W' V* k2 A% Q! r
Скопировать код

/ {4 O  d0 H* bШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% c- s0 w2 W2 L' {; x: P
( M1 L5 _) f0 h; p6 E; s- ?Класс для начального состояния монстра:
: O' N. }; f! @- f. ^7 n
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    * g6 ~& N  ?1 v
  2. package org.l2jmobius.gameserver.model.actor.state;
    : @  R  c. W; H* H) V

  3. 9 E. n, T/ \' M4 Y- j; N
  4. import org.l2jmobius.gameserver.model.actor.Monster;# ?! b$ V3 T6 W# U' H

  5. / s$ T( U! H" R
  6. public class InitialState implements MonsterState {
    : D* K) B6 j6 Z5 }# C- \
  7.     @Override& ~" H  V5 O1 q- B( e9 _
  8.     public void handleState(Monster monster) {
    3 A- A* G% m6 H* A
  9.         // Начальная фаза боя- @5 ]! b. @4 R' W2 N, l. i& r; M; [
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 Q; f, z3 E0 i; Q) M6 O3 N5 o8 Z) W
  11.     }  F9 n0 x2 g3 P. `. J
  12. }, y; W; |0 }+ O7 @
Скопировать код
+ X# b' ^* l: n

% P9 Y- D' X. W# M% V$ k0 g) z* A, ~$ U. f& F% O- C% {3 V8 h/ G; {
4 z5 w$ a0 ~/ c$ @6 j9 Z
/ f# ?  y, v+ z# v! ]
/ y/ {$ x) c- a0 [! }

( d1 ~; p7 j) E. i! q1 @
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ n, J  G+ I' T* k' }- p: O+ Y, m( c. f- \# y8 ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 Q  N1 d; Z( d5 H

) w1 o' H& y& ?3 L+ `Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ H& R3 _; F# K! p1 h- k

; o# y$ w0 f  h/ y
  1. // Пакет для состояний монстра
    : q& N; U& R: X. A  T& I
  2. package org.l2jmobius.gameserver.model.actor.state;
    : [' h8 d* p7 R$ \6 H7 I+ X

  3. % Q+ x. l5 t  k" W. v8 g
  4. // Интерфейс, представляющий состояния монстра
    - ?3 k  e+ q: n* ~0 v/ _( I
  5. public interface MonsterState {
    ( n% K9 r2 T/ M& @1 d6 M* e5 o
  6.     void handleState(Monster monster);+ G" t8 _9 T( |* k
  7. }' z! W" t+ H6 D. g8 F% I
Скопировать код

0 F$ Q" I3 `# k( J( A+ O6 T% R. @Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
  a' S- D! H4 S' r
) h+ V4 o7 ^2 q, Q: c* jЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" p; C2 S) C# M' A; t  T% p
( w  ]; W# l8 }) ^, O; SКласс для начального состояния монстра:
1 y" y$ @! I2 U; J/ S, F1 n  R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' _! _0 |0 _2 V9 Q( o# C
  2. package org.l2jmobius.gameserver.model.actor.state;( ?6 v; @! S8 |' T5 Q' Q
  3. 6 d9 T" L: p' v9 G% L7 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 z0 x+ ^# C4 D& \2 F/ G( I  `

  5. 6 @2 F) v$ _6 F! P5 a8 x
  6. public class InitialState implements MonsterState {
    1 R1 e& C2 T( l  N
  7.     @Override
    9 L1 Z% z0 U2 l% L- a  O- j
  8.     public void handleState(Monster monster) {
      Y4 I8 i& v5 g( t6 R
  9.         // Начальная фаза боя/ }: K: p# q. i' g+ C5 O
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * ^. x4 @9 e0 B* A/ G
  11.     }
    - z6 b7 H# X  ]" l6 _6 m
  12. }
    # i6 `  A  ?* [5 t9 G
Скопировать код
Класс для агрессивного состояния монстра:0 K0 O# g/ z: f) Z  b  Q) g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( C  @+ e1 u% `0 y# {( Z+ b
  2. package org.l2jmobius.gameserver.model.actor.state;, }2 A9 x: [) z; L/ i
  3.   d( o' J7 y9 f2 [) e7 h8 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; Y+ M2 L6 R: A4 g' c
  5. ; t! _( B' B; i  A! k% @
  6. public class AggressiveState implements MonsterState {
    5 w7 _4 \2 y! I+ F7 ~' F; o4 i) l
  7.     @Override- M4 Y! |! v8 n* S
  8.     public void handleState(Monster monster) {/ m6 ?6 y* W1 J$ o8 j
  9.         // Агрессивная фаза боя% z& `" ~- A- Y* H; V1 }# N
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    + O7 t* g( m  |- Y. c
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* p3 D0 ?& [* k  T
  12.     }! Q5 m% n) ?$ r& a/ m8 [: D7 e- D
  13. }" g$ ]1 Q8 \' g, ~: o; r
Скопировать код
Класс для финального состояния монстра:4 r7 n7 {6 A2 p; i( ]5 b3 v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' f0 u' ?5 Z+ J, u
  2. package org.l2jmobius.gameserver.model.actor.state;4 ?0 I3 j+ Z& H3 a, ~

  3. : O: S$ p  }% f" |$ _* V
  4. import org.l2jmobius.gameserver.model.actor.Monster;- t4 Z. r$ h/ q- @7 S+ A9 C
  5. / n& r6 T( y. n' ?
  6. public class FinalState implements MonsterState {
    % C2 D, n0 i# \, V0 k, \
  7.     @Override
    / L7 {2 M8 Y5 D2 C5 a7 y7 Q: ^
  8.     public void handleState(Monster monster) {2 p: S; e9 U) @* B+ c3 L9 P& g
  9.         // Финальная фаза боя
    7 |  @, l' r( T) M
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");1 ?5 g4 H+ q$ p, W6 x  o! h  O
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% j3 Z7 t$ [- L+ Y" j* H( m; B
  12.     }
    # W# P: F2 N& c2 L# `( ?/ R9 G0 q9 o
  13. }
    ( O: W: n) ?3 [& M$ a/ @( T% q
Скопировать код

+ z6 i  p: ?& @# B+ N: EШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- S  C' w2 k/ j1 B. }- G7 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , F; a- z5 h1 I6 x) U8 F  J0 r
  2. package org.l2jmobius.gameserver.model.actor;* V# Q9 d4 p  @1 v; T# \3 B
  3. * J# o6 V) t% H% S* X  ?! [
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    # n  \# \0 m. g4 U5 t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    4 D4 X9 G0 X: K5 y* M
  6.   y0 L- v: L7 j8 B, Y
  7. public class Monster extends Creature {
    * E. e+ j! D3 H$ A8 V
  8.     private String name;  R2 T" V6 u( `8 d
  9.     private double attackPower;' Z* m/ J' i# |6 s- q( c6 N
  10.     private MonsterState state; // Текущее состояние монстра' f/ _8 E+ p3 w  j* Q4 R4 W
  11. ; F+ K( V; j- q" h, o5 Y
  12.     // Конструктор монстра% f6 X! _0 U7 X
  13.     public Monster(String name, double attackPower) {6 t: g+ d" H" {) f/ R; v1 q* k0 }
  14.         this.name = name;
    9 V( Z1 m: J( n  T$ X* T$ A
  15.         this.attackPower = attackPower;
    6 E3 u" f' Y$ S. a+ N: Q1 q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    * H! m* G" E4 `# q
  17.     }
    - j* E3 z* H, Y" b7 S7 O2 L4 h- w% b

  18. 8 V$ S4 Y2 h% I6 ?7 ]
  19.     // Метод для смены состояния/ H3 F) G3 C9 W! C( n! `
  20.     public void setState(MonsterState newState) {
    3 S2 X  A. F+ p- F
  21.         this.state = newState;
    ; j! R% V+ I5 c+ E
  22.     }) M% l3 v1 r7 j4 s* V! d) |4 I' j0 a
  23. ( Z2 c7 i  R5 _" ?; c
  24.     // Выполнение действий на основе текущего состояния
    " Q9 S% U  n8 o2 A2 {+ h* ^/ h
  25.     public void executeState() {( x- w; A/ `# q0 k2 C
  26.         state.handleState(this);+ h  ?% j+ t* z# @. p
  27.     }
    , w6 I6 p7 e3 |# i1 p% F

  28. 7 J  y, L$ A" X
  29.     // Геттеры и сеттеры! b. w, ^" B( I! Z8 x4 H
  30.     public String getName() {6 M( w' P  u- Q. I1 y
  31.         return name;# z* Q$ x! ~( t8 K8 S0 [
  32.     }
    " d- G" V' o0 L/ }6 [: b+ C

  33.   l! T7 T) x" x# _. x0 d
  34.     public double getAttackPower() {
    1 ]2 K2 m% r4 u5 D. r9 {" X
  35.         return attackPower;! z, L- W: F1 I
  36.     }
    6 O) ?% \" `( O9 s6 u% ?
  37. 4 r; C* c! S) r; t
  38.     public void setAttackPower(double attackPower) {
    6 R1 f' n6 s3 |* L/ \0 O; X4 l( Y
  39.         this.attackPower = attackPower;+ w4 T: v+ [  h& ^
  40.     }
    # \+ H! y/ _) |/ O: o5 g# o
  41. }) r9 o) {& P# }  y
Скопировать код
' @6 o0 l  v% ^% x7 Z4 |
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 l5 I; [- i' j3 O) t2 E( v2 r4 g0 U5 T4 }) w, ^# B" C; `6 d9 R  F8 y; n
  1. // Пакет org.l2jmobius.gameserver.model.battle
    3 I' U: ~9 s5 v3 I8 z9 I3 o8 C
  2. package org.l2jmobius.gameserver.model.battle;
    / W1 |) S2 a& O0 z9 \% O: t% v7 s% a

  3. ) {/ x4 R$ M' P" Y8 U- |3 O/ V
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 t" R5 h- Y$ j8 N+ N( Q; W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    - |% e3 J8 B- [6 P
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    9 r+ E; R, m- d% W+ M6 A' U

  7. 6 j9 b  E4 d. ^4 x5 e- b
  8. public class BattleSimulation {8 _9 j7 m: k" g) O$ \
  9.     public static void main(String[] args) {! J, V0 y+ m, X" M2 S
  10.         // Создаем монстра с начальной атакой9 q- }% r8 [: O9 ]; K
  11.         Monster monster = new Monster("Дракон", 100);$ E! g$ }  {1 }# s# }- d

  12. % \" f& K# A( ^+ V
  13.         // Начальная фаза
    , ?& S' y) u8 Y8 h$ @! z
  14.         monster.executeState();
    8 [3 x0 q5 k" i! }

  15. . s+ \3 F6 r* J5 H
  16.         // Переход в агрессивную фазу
    . C$ X( c! B+ o4 d
  17.         monster.setState(new AggressiveState());; W3 ^* l3 V; d  ^8 T1 H
  18.         monster.executeState();) i; u- X7 |! @5 T- z' ^
  19. : K3 X) K) v9 g
  20.         // Финальная фаза
    ' B6 K- M) o# {+ x2 }4 ~0 p9 d+ A
  21.         monster.setState(new FinalState());/ w' @" P. h7 V) |& s; l4 o
  22.         monster.executeState();( t" X. c% _( Y. V) z
  23.     }
    / S# g8 |' L# p. g7 s
  24. }3 s: O7 s7 N% u1 T' h4 C
Скопировать код

3 }: x9 E! [: a; W, ?Комментарии по структуре пакетов и классов:
+ J  x$ v4 T" C
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    + Q- c5 k: ?' q7 t$ Y! X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.* U% E9 t* w& L
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 L# Y  M4 r5 x) k$ R7 K" }4 F' {4 a" W( K' h; F
$ R/ r0 f, p1 Q4 F4 ^
7 H+ G0 K- S: v0 t" x# ~  a, c
( M% C4 j2 I) m4 Z+ s) Q) e1 W

! v0 f) i/ I0 A
* Y; @) ]. y! L$ L) \) `  Y) V/ Q
7 S1 r7 V$ X! w0 E5 M
+ g/ @4 I! |' Z: C. `$ R! }: t
) h3 e1 q' ^/ z9 l9 H; g0 N
$ i. |) o, q7 B+ C# a: }1 n3 Q( L$ @& O! \% i4 z
3 d* Z! R9 R" J+ c* m5 ?
+ p/ M3 `. b) L! r# L

4 Y9 E% V. J- _4 K2 _
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 u: V$ k, Q% {, E; v
Для управления сложными взаимодействиями, такими как  ...
7 |! S4 u3 J5 V: t
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
% w6 Q  C! w. W$ G  ^Отличный подход! Использование шаблона "Состояние" де ...
5 L9 Y3 J3 b' m, p3 y- M
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. r2 g5 A: L, b/ [
  v- y9 g5 U$ D# ^6 w( vШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: X- I9 Y! l% r( j
# r; i1 J& j( p3 y# A: ~
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 e* y+ q! U2 e) \5 h* ]8 {: h- ?
  2. package org.l2jmobius.gameserver.model.actor;
    5 ]1 J' |9 u6 X. f$ y

  3. % D/ P/ G4 Y' H; f9 s$ a3 H
  4. // Перечисление для типов атак
    8 N7 W9 K2 w! b+ E1 _
  5. public enum AttackType {. D9 x$ i& T# n! w  l7 P+ l. [, Y
  6.     PHYSICAL, MAGICAL;
    6 x/ c7 e; Y2 ]& W/ n6 i! x2 V
  7. }
    1 I1 ^6 e, w! [$ L- Y2 \( ~6 m
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 V0 q5 f: z% E) I! ^Обновленный класс для агрессивного состояния монстра:
+ G" f/ I( c7 F3 Z- G3 o! E+ z) I; _6 K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 j. M" o# `4 \9 \9 J. f7 E
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 O  Q  N% }0 Y( ^! R8 h: [

  3. & r$ ~' Q, Z! f) g
  4. import org.l2jmobius.gameserver.model.actor.Monster;# d3 z! e6 _* \: T9 z
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    0 Q2 d3 @0 P% H; C

  6. ) Q7 N2 m: ^. P% i% c. {
  7. import java.util.Random;
    * v0 f5 p& I! ^

  8. 6 B$ K: S/ M& O, J9 g/ I3 \
  9. public class AggressiveState implements MonsterState {
    - p0 z1 D: R/ S
  10.     private Random random = new Random();
    5 U8 f' \( W. L
  11. . i% C) W; Q6 j, I' w% @
  12.     @Override
    * Q7 `5 v3 V4 }6 Q* P- J" T1 V! y
  13.     public void handleState(Monster monster) {
    2 b7 u* j7 i1 T! w3 h. P+ Q
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ' P0 E% y2 j( _7 L2 G9 e
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    . J. I2 {# o' ~! q8 t! {4 r0 i' c
  16. ( l5 T3 {' h4 n1 G/ u) P2 o
  17.         // Логика для агрессивной фазы боя* [# U- g' [$ c. T
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 W  K5 I& ~! M; H
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    2 Z# i# B8 Q2 S" T. ?4 J* v, Z
  20.         
    % R5 ~" R7 [1 h: E+ d, C. C
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
      D# V1 }3 X4 A$ H1 q3 Y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    . V/ q" j  ]8 z/ f. h5 }
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);5 u* x! |! F! P% _  m( U
  24.     }
    4 p& Y! B1 h0 m* [8 B, G
  25. }
    6 J) R' @; G& u
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки+ @% w6 P- L+ l

+ t1 W  _' N" H; D7 t
  1. // Пакет org.l2jmobius.gameserver.model.actor& I8 Q6 x; D/ D( O0 F3 Q. E
  2. package org.l2jmobius.gameserver.model.actor;
    2 x" A  W$ J* t1 u

  3. 5 I* i# Z( J# P+ a+ b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , L$ \* J+ g' q; e" {
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;! o1 n- {! a* a* j( U) Z
  6. 6 F( `/ S' E: B2 z9 q6 ^+ Z
  7. public class Monster extends Creature {4 X  q5 _# [7 V( p0 }1 `
  8.     private String name;- \$ B& k/ J: Q1 l* _6 M: s6 y
  9.     private double attackPower;
    , _. y6 J/ I% m1 O2 b; T1 x
  10.     private MonsterState state; // Текущее состояние монстра5 x. o0 L! u1 w* K. W0 Y" M4 z1 M

  11. ' w' D' t$ |% F5 h% q
  12.     // Конструктор монстра3 r' K; K: S7 m! `1 O/ V
  13.     public Monster(String name, double attackPower) {4 ~4 r* f" z" a. D9 }
  14.         this.name = name;& F" o1 f% D8 C; s# t/ |9 p
  15.         this.attackPower = attackPower;0 s5 W. X5 H0 t, s9 W
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию8 p8 s3 I: @" n6 L6 k1 ~8 \- J3 Q
  17.     }% g0 O' j& d- [5 q# z

  18. 4 a+ x8 m) B; A) s* Z4 ]4 F; V1 |
  19.     // Метод для смены состояния* A! A2 |' e6 c3 Z7 E% M+ E
  20.     public void setState(MonsterState newState) {
    ' S' j1 |9 ~3 {% q" q5 V+ V
  21.         this.state = newState;
    - U+ B9 x! N; T9 ^2 F8 j$ y
  22.     }- S, w% W2 B+ L, Y$ n* @% Q
  23. 8 j( B( A- g/ o& z
  24.     // Выполнение действий на основе текущего состояния7 A) u3 S: q% x9 e( B
  25.     public void executeState() {
    * F/ S9 H  ?% I9 Y: V- q
  26.         state.handleState(this);
    $ Y& B4 r. G; D8 y3 l
  27.     }
    # n- h- V: \9 M) f* v* X$ _, Y
  28. 1 B. ?; f* j7 v
  29.     // Геттеры и сеттеры
    8 \, t3 w+ V( _! y
  30.     public String getName() {
    7 A3 \% T' q! l5 K+ v8 J
  31.         return name;
    9 s, c! m2 X! ^/ B/ ]/ v- g- m
  32.     }
    / v  \* V* Y3 M* {3 ?
  33. ) W4 [& ~) ]2 L9 y) ]
  34.     public double getAttackPower() {
    ) s/ f; I+ Q9 h- J) C! v* e
  35.         return attackPower;
    6 {1 v* a; o. ~8 D2 s
  36.     }6 s! L" ^9 h# U- b% m1 b& W9 s

  37. & q# f! e+ X2 x8 p. g9 J. e
  38.     public void setAttackPower(double attackPower) {) \9 ^3 f3 e7 J% O* Y7 q: Z, g5 N# j
  39.         this.attackPower = attackPower;$ p9 t% C- B& [7 S- S( ]
  40.     }
    . |% E# C5 \% b2 K
  41. }  s5 Q( ~/ G( J( `) M! b. d
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.9 a$ ~4 y% \" U# e' |" L/ r
* B( _0 w& Y3 w1 a/ b) d
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 @3 {& i2 w, z- k: v
  2. package org.l2jmobius.gameserver.model.battle;8 \8 [$ }3 H9 v2 Q! |6 Z. X

  3. : j, K. ^4 h, }7 X- o5 `/ C9 P. e5 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 L( X. Y. e. Y1 f' S5 K, D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 j7 {0 Q+ t: y% e' f
  6. ; Z7 s; X  d$ [; d. }
  7. public class BattleSimulation {
    + g8 O# \+ \. V% M, ]9 W; r. x
  8.     public static void main(String[] args) {" m! T2 S! H3 c
  9.         // Создаем монстра* n/ p% t3 K% _  p
  10.         Monster monster = new Monster("Дракон", 100);: N" S+ f. @& G. ]9 @, v" h

  11. 2 h# {* S# e, E: Y
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    7 t' y$ O5 D5 H# z+ j, U. U+ ?) N1 a
  13.         monster.setState(new AggressiveState());
    ! }$ C2 v8 c! |$ T7 d
  14.         monster.executeState();
    / N! {: ]+ r2 E0 q9 h: d/ D( G
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ( {/ a( p, K  [& M6 P. Y3 F0 g7 ?
  16.     }& c$ s$ X% i/ S0 D! I2 g9 Z" k
  17. }/ z! E: `4 L5 R4 {9 W9 ]
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 H8 F' o: w! G/ CЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. D. V9 h4 q7 y# r0 _6 d
5 D$ q* T5 `- N: I; |) j9 ]
5 R  W3 Z3 o+ S7 b7 e
7 I% X  r# I8 [
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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