Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!3 M8 i: v8 W& C

) i% o5 [8 W# l$ O! I% P9 }
7 d4 l1 j  j9 o5 D' V' ?* Y$ f6 A! T
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 ^- l3 d) ^, R( ~2 |8 {* _6 z
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
' P: K9 P  u' a0 @Астралия ?' y4 G; G- f$ a" z

9 ?4 Z+ A+ f- O7 J

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!$ }: ^  n. c' C# [
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?( O9 h; k* ^- }

" f" b! F" b: Q& f  p
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 : J* O; T+ U% a! A# y# t' m0 m
AlexCoder опубликовал в 2024-10-16 18:31
  |. P! r$ G" E2 A, m" {День добрый!
. {! K; l7 W" X6 ?) s4 zВ статье описано взаимодействие игрока с N ...
/ f% N- b9 ]4 ?  _% k2 ]6 _% C' i
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( V+ J9 _0 q% V  i4 e: k9 f9 w6 u+ `

0 R6 B( I; h& g$ k8 qЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 p7 p0 P3 Y6 w  Q- H

4 K+ Q& O2 V# AШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 b  W0 I7 ^# f0 v4 n5 p0 D6 U# F. ^0 r2 a/ I
  1. <font color="Green">// Пакет для состояний монстра</font>
    ! U9 u. O/ x/ L$ B
  2. package org.l2jmobius.gameserver.model.actor.state;8 E; G- M! Q8 T, `6 t( O! j: V
  3. <font color="Green">
    " S. Y; k1 ], \
  4. // Интерфейс, представляющий состояния монстра</font>8 Q* h4 n# z7 k. V4 U
  5. public interface MonsterState {
    ' A% t4 |( Y3 v0 o" y' U
  6.     void handleState(Monster monster);5 D4 ^/ V' L* l  l/ `: H: j3 O
  7. }# v6 U, V: E- ]/ U4 N
Скопировать код

" \+ S. {+ \! Y& HШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# Y" v+ H0 H. _- a# Q  ?7 w0 p' r. [& f. S+ h) {
Класс для начального состояния монстра:
/ ^- x2 S" F& Y
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    3 J7 M. ~. G& ~% c! `
  2. package org.l2jmobius.gameserver.model.actor.state;, |+ t% m' W' }( V; x+ b

  3. 7 C; c6 G# X' p8 L8 n  g
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 p! q+ o( t# s

  5. ! J( o% \% l  o# }
  6. public class InitialState implements MonsterState {; p- F. \# f+ v' n
  7.     @Override% m/ K, I7 F$ L
  8.     public void handleState(Monster monster) {
    / O# X1 n3 p  P) _9 n& J- t
  9.         // Начальная фаза боя
    ' _/ A# P: U9 n% r
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");/ Z- X( T' B% g: ~# `9 P5 ?
  11.     }8 J! E1 G# _! F+ ?. h( t- ~
  12. }
    9 T% X4 C* ~6 ]( v) m( \' e! c
Скопировать код
- j2 l8 }+ z9 H$ Y! q& |6 N
+ y! l# [/ h" D0 {' X$ Q3 n% b

& {8 J4 J7 p7 t. S2 M* M4 \. @2 k( P
2 {1 w  [% @$ M/ U  O) p' R0 U5 q
/ u6 Y. J; W% H* ^  j9 m0 G' c% X) V$ |3 e8 b, T

- B2 i9 Y1 i; p( Y
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 ?$ ^2 Z" l) O9 D- F

* L( h/ Y4 q; ^2 E: s  IЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 b/ R# J  ?: k# V# |( o& _/ d
$ I( J+ I0 ?: h3 M0 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- s- \& n+ ]& V& f. E* N* G1 i) r( [( Z5 X& e! E" ~* d( X3 v6 Q
  1. // Пакет для состояний монстра6 O- L4 e7 ^7 c* K7 t; B
  2. package org.l2jmobius.gameserver.model.actor.state;/ d6 ]; q8 z  u+ z$ I7 [

  3. 1 u, [, }& w" A, X6 w' d
  4. // Интерфейс, представляющий состояния монстра
    6 @5 s# o: s0 r$ O; B& T1 @
  5. public interface MonsterState {5 r  s7 p! |' }
  6.     void handleState(Monster monster);" F& _" B0 v. P; ^% Y) E& B3 g
  7. }, h# U; X  L! `% _* h' F* q
Скопировать код

1 T0 c( u8 |  z$ v) ?! ~! uШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& B" u& [% j, B# E/ \9 n$ v9 T3 F2 D, ~) S7 e! J0 G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% r4 c( X, S3 t/ a9 v/ L4 z- z/ b) A+ Y7 S: m0 l9 J* l1 Z, P. |
Класс для начального состояния монстра:# i/ O# r/ J( q* Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * c) A* ^2 O, q5 L
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 y, o  E& e% q, i( C/ e8 J# ~

  3. " C' g7 I. ^6 l4 A" G6 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # ^/ I/ N  d4 p5 i9 P$ I5 ]
  5. 8 Q" u, m/ R/ z8 [' O5 q: L& s" J! b
  6. public class InitialState implements MonsterState {& K" V6 W2 ]' U
  7.     @Override0 ?8 e# H: G1 B. y3 C" S+ }
  8.     public void handleState(Monster monster) {+ U* a' O8 B; e$ t
  9.         // Начальная фаза боя
    3 x2 q* x: W7 L, L, g& B  R
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 W! [8 B7 O  y" U
  11.     }
    ) B) |5 a# ~2 {
  12. }
    ( z! }- C3 B! G$ H1 U; [' [2 l
Скопировать код
Класс для агрессивного состояния монстра:
/ i' j0 [  p  t) A+ y! \, r3 H$ E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 `8 A& Z- F* o
  2. package org.l2jmobius.gameserver.model.actor.state;0 P* V$ n& a$ o& k6 U! H5 g4 W1 T

  3.   {: G( I* a8 ^0 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & O) P# B: K: e" B' M  c" D

  5. 4 n& h9 E# _& G* j% ]/ d' m. M6 M
  6. public class AggressiveState implements MonsterState {# W: P0 ~1 C8 \, ]& I" P% Z
  7.     @Override
    5 ?( e2 E" B( P' R) y! i0 p- M7 d- L) [
  8.     public void handleState(Monster monster) {
    * L$ X' L) u. t% v
  9.         // Агрессивная фаза боя
    9 m9 ~. R+ G: C/ B
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    * i$ J8 k3 U% a0 p& E, Z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    8 ^4 O" c  s0 y6 U" G% Y$ p
  12.     }* y# x- s# M$ S/ z9 n
  13. }
    0 g, [3 m1 \( u
Скопировать код
Класс для финального состояния монстра:0 P+ e/ Q/ s6 s$ Y# H/ g% K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ j( v: v3 |  N6 q! `7 R& t
  2. package org.l2jmobius.gameserver.model.actor.state;
    : \, w0 `  h$ h! h- t6 Q/ k
  3. % {' E! ?1 }9 n3 N. S( ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 W- ~! M3 S3 Y/ K* C2 q
  5. 0 b3 b' ]. y7 v
  6. public class FinalState implements MonsterState {
    % J& u2 U8 z( s/ u! [
  7.     @Override# s2 P  @* R9 q9 L: ?1 D" [; |
  8.     public void handleState(Monster monster) {
    7 g5 t  g2 R( F, O
  9.         // Финальная фаза боя
    6 y4 D. s: U2 s* K
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");% ]6 ^! Y' I9 ]5 u! E5 Y! \3 b8 @4 D
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    - h' x8 {$ I" C  b/ g/ N# ?: n* j
  12.     }) Q! A  {& Q: C# W3 w
  13. }
      v  K2 m% S% t) D
Скопировать код
" z0 M  t, y% f5 |  }# K+ j& ^
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 v$ B5 J" |4 Q! O* F# L7 U. n* x
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 l) V; G+ Q& B% g
  2. package org.l2jmobius.gameserver.model.actor;2 P' d- M3 S- {& U% k: F: j- V

  3. 3 z. k- W, U7 W7 s
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 Z8 M% \* D& U  w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 U$ Z; ^+ y6 e- x. G- F8 D" {6 \

  6. 6 |8 B9 B; X) s8 \
  7. public class Monster extends Creature {5 W9 C3 c+ i5 m
  8.     private String name;
    5 g( s/ K: h* Y4 P' {% R) O
  9.     private double attackPower;
    ! N  M9 A9 e2 q( u- A( j, Z
  10.     private MonsterState state; // Текущее состояние монстра6 a; D" R- K( _

  11. 8 C& z: d" \$ H
  12.     // Конструктор монстра& b% g* r/ }( ~9 p5 @* D" K; ~
  13.     public Monster(String name, double attackPower) {* e) I5 h7 ^8 d: O+ L) C
  14.         this.name = name;: z+ L' b( o! t+ T- n5 o
  15.         this.attackPower = attackPower;
    , o+ S$ K- l  @$ v! }! Z
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
      m) L% X: m, f( K8 \  S
  17.     }
    / t1 Y' d2 K/ ?8 M4 u* |

  18. 1 b5 L( J" f' M
  19.     // Метод для смены состояния
    8 q8 S$ v' f) b+ V$ K2 Q& Y
  20.     public void setState(MonsterState newState) {& c' a' ~% V4 i1 X3 r
  21.         this.state = newState;3 E5 Y* R( O; \' \8 }4 S
  22.     }% Q% `8 e1 ]3 w, e9 ~

  23. $ ]4 h% j6 l% P5 Y4 F( d
  24.     // Выполнение действий на основе текущего состояния- A0 Y7 H0 b1 X$ Y
  25.     public void executeState() {
    $ z) V. \4 c9 a2 g: t+ ?0 E5 i& ]
  26.         state.handleState(this);/ z9 g$ c3 U+ R
  27.     }
    . X" O' s) m& H" @8 p

  28. % E( v, o, o- u
  29.     // Геттеры и сеттеры
    " ^: C, e& A+ F& V- S- T5 U
  30.     public String getName() {3 W' \+ L, r. w2 i
  31.         return name;
    $ t1 i; M9 g7 Q, K4 J6 ~
  32.     }4 `7 F' T8 \7 R
  33. 3 f( b) E' Q* x* J! v( h
  34.     public double getAttackPower() {& ~* m  Q! D1 V: u' }# e, Q
  35.         return attackPower;. K8 P& l4 L) o' N3 D
  36.     }
    5 S8 l( Z  \' a6 E" @9 I
  37. + R$ B$ l- f' Y9 i
  38.     public void setAttackPower(double attackPower) {
    , {/ J2 y* R6 H8 t# N# g
  39.         this.attackPower = attackPower;
    ' t$ G0 c" O+ O$ v$ {9 d
  40.     }+ T, n$ w+ m* o1 E5 E
  41. }8 [8 ~2 Q( ?& [6 k: z& p4 c& h! ]4 k
Скопировать код
; k. m9 h( N+ K, G( W
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& a9 U9 T; p9 g0 Y0 n4 X/ i+ J' W7 O: K. F+ C
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 C' A- d0 n0 }' O2 p, f
  2. package org.l2jmobius.gameserver.model.battle;
    * f9 e# `0 p6 M  Z% d( Y
  3. . }$ \8 N/ A/ ?+ v2 O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " P0 C1 }. C" [1 E" v6 Q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 _+ Z, [/ {# i" g! J. D2 U9 u3 v
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    - W/ s- w- e6 y# q& @- ?  F

  7. 9 w* }, e0 i+ d% c. }
  8. public class BattleSimulation {
    4 V- c: i* k! W/ z, w, t$ q9 D
  9.     public static void main(String[] args) {/ y$ E0 N: D. J) @) v
  10.         // Создаем монстра с начальной атакой
    ) l( [. V0 e/ ^+ I
  11.         Monster monster = new Monster("Дракон", 100);, @3 x. p6 J6 F3 B5 C8 J
  12. & l1 t1 T! _* t2 O6 R, v
  13.         // Начальная фаза
    0 y/ d+ w- }2 k: j
  14.         monster.executeState();
    9 _6 c2 i3 |0 Y+ v! L; ^/ M: h

  15. 1 y7 I7 n1 Y* l4 C5 ^
  16.         // Переход в агрессивную фазу# c- t" n. S. i) U
  17.         monster.setState(new AggressiveState());* m+ y8 l9 L" P4 G2 Y* X" ~$ g$ ?
  18.         monster.executeState();
    4 c- u$ N( Z! e

  19. & P5 Y) E- `* T/ x) |3 b4 |
  20.         // Финальная фаза. C" d# z5 C: ~6 [
  21.         monster.setState(new FinalState());
    4 N& Z4 g7 N0 T- o6 o& J, y
  22.         monster.executeState();
    6 p; m4 W" a# b* o: W" h/ w
  23.     }" A# ~6 G( b6 b/ w& v
  24. }) }; i5 ~: u6 E! s8 A% B
Скопировать код
2 R7 E2 h7 w! N: I
Комментарии по структуре пакетов и классов:/ C$ v5 n$ |1 M& M
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    2 N, j9 ]* g; |' A/ B0 [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ ^( u) d& i' X+ N  y: b) ]Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!4 _, ~; k6 G1 h- }  L( o& u* e- X8 K& V
( e* g4 Q1 b3 {  \; C0 x( Y) d

8 y1 L% [5 @, s% B3 }4 V3 q8 e; O, Z+ C( ]$ V

4 }+ a9 ~' c3 M% a* i5 V+ @5 w) L( R
; z& r' t' i- J2 a

8 ]  O  J* G) }
6 ]  W2 J* r0 n; h# {
& x! A! |5 A  k8 B9 n. B- {, I$ P5 ^+ z6 ~' r2 `' A+ O1 m" H2 c
& y, l7 |% s# y0 c/ ~- Z

* k7 Y# }: G! R4 b1 \: X& g% b9 d
  `  ]1 d7 j$ I* N: t5 n2 t( ]8 {* G8 W# A9 d" ?( ]# p
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
1 ~- G. ?9 b" c* g/ Q5 ]; |$ X6 x, T  UДля управления сложными взаимодействиями, такими как  ...

! U& ?$ [! b0 F, s3 LОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21. a2 C, c  A: |3 |/ K" q2 H+ \
Отличный подход! Использование шаблона "Состояние" де ...

- Y% w# U+ `& F( i0 jХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
- n8 l" [6 v! `) B
. J& T5 h0 c0 v: IШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.6 h$ o. [9 F2 X( p" `7 e

, t  J( z( A6 j2 Z/ G
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 E, v4 x& ^/ ]$ m
  2. package org.l2jmobius.gameserver.model.actor;9 y& o/ k+ s0 s" C
  3. , _$ r3 S3 C# G3 j4 H9 K
  4. // Перечисление для типов атак
    : z! [% r0 Y& H) r; J! ^
  5. public enum AttackType {! G0 G4 ^) `7 B' O/ v+ ^
  6.     PHYSICAL, MAGICAL;
    8 K; l% l: [  ^. G
  7. }
    - I, }. Y$ K0 a0 H7 t% ^% l
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.2 `" n9 l7 @5 _8 |6 B
Обновленный класс для агрессивного состояния монстра:
" X5 ^, f6 S9 W( t" h- f1 z# u; Z5 g( d, Q1 u7 n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& M4 g; A* W$ ?6 T! g. t/ V
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 D0 }& @  ~# z4 w
  3. ' p# a% v; J2 L5 M! X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / W' y% E. m. @$ [$ {
  5. import org.l2jmobius.gameserver.model.actor.AttackType;0 o( L7 S7 z4 O; W# s  x

  6. ; e) r& |7 y( B. o9 S% j
  7. import java.util.Random;
    3 n/ C) a& A5 u! ~, {7 I: J; _
  8. 9 F# H, I9 G& t' c7 k/ B6 p) R
  9. public class AggressiveState implements MonsterState {
    9 G" o" O4 v& |  z
  10.     private Random random = new Random();: c2 |6 i: u: {4 \! }$ U$ `

  11. & C5 n# N1 u, ?! \' O
  12.     @Override; U. b( c9 b) l% L% }
  13.     public void handleState(Monster monster) {
    4 _7 Z) n% {8 e
  14.         // Выбираем случайный тип атаки: физическая или магическая
    $ e- V1 T5 k. d9 C* d
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    1 Z9 i0 o9 Z. U# o- R' }; `

  16. # G7 C  u: ]7 X; E/ x
  17.         // Логика для агрессивной фазы боя  @: F' \1 O& t, I
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 5 z! g4 o# }) t, Y4 R5 _
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    # @: h. [3 @) U
  20.         . f5 `  E; j  t4 D+ K1 O
  21.         // Увеличиваем силу атаки в зависимости от типа атаки! Q7 V* U' q, Y+ p
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;- G& m2 A+ A3 v8 c" I; r+ d
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    2 s5 V- D. H5 n6 D$ l" u6 X: w
  24.     }
    7 E5 a0 u  J* M: s
  25. }
    & y7 F* W% w  O/ a9 L& H9 T& ?
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
5 m9 d2 [3 L# e$ R, t6 [* ^6 R  f  ~$ M
  1. // Пакет org.l2jmobius.gameserver.model.actor3 ~1 r( B* }- g1 y: N! {; M
  2. package org.l2jmobius.gameserver.model.actor;8 F1 @/ ^8 ?# n" J. a4 {3 x
  3. ; Z: j& A; y3 _6 ^& \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    . J/ C$ g7 o/ U& h
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 E* l; y' T% v9 m

  6. 5 R& h* N% {8 V! O+ t4 D8 m
  7. public class Monster extends Creature {
    8 J/ s( p& u9 o, ~  K
  8.     private String name;; T3 B5 K( |$ T3 }( a7 O& t" [
  9.     private double attackPower;( |5 h5 y9 C: U, O* ^5 H
  10.     private MonsterState state; // Текущее состояние монстра) G! e2 @* B& N" h: [) s# t
  11. ) M: f9 Y% C7 c( b" D5 f
  12.     // Конструктор монстра
    1 k: u4 S4 N3 g, v, k7 g6 @
  13.     public Monster(String name, double attackPower) {
      M/ W5 q7 F9 F7 c; @3 j2 r6 Q2 y
  14.         this.name = name;2 c1 G0 H  d7 O# f3 T  q5 c
  15.         this.attackPower = attackPower;
    - i1 c) M2 `9 G3 o  y$ E& ]
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
      u2 L3 c, T; l+ @. e/ B
  17.     }8 H) m& m5 @6 R9 |0 [7 C( O8 Y- @
  18. 7 J8 x* I) P# g. \
  19.     // Метод для смены состояния
    2 b7 h' b3 _7 e- K
  20.     public void setState(MonsterState newState) {
    $ d) M' T4 q4 c! n3 f8 I: G- Y
  21.         this.state = newState;9 R  o2 U& B5 G' [; v/ w7 l
  22.     }
    ' `+ I6 T& c9 {# O% r
  23. 7 L3 L% r0 F$ G: R& E7 R5 D' u, r
  24.     // Выполнение действий на основе текущего состояния7 i9 Q, x! i) ~1 \1 o: Z( ~/ L
  25.     public void executeState() {
      A6 B* ]! n8 m* l! Y
  26.         state.handleState(this);
    2 p1 X: C  X2 O% m5 ~; m
  27.     }
    , Q0 a, A, H2 f, K  i* k
  28. ) h% D. e8 k: A6 K2 d
  29.     // Геттеры и сеттеры7 O1 o5 V9 ?% w) |, i
  30.     public String getName() {
    2 [" e4 z3 E. `& G4 i% l
  31.         return name;' N  N% a' x2 c
  32.     }+ D, R- Q3 O2 [7 ?! o8 b
  33. % S; ]* m0 F2 `
  34.     public double getAttackPower() {. n8 |4 c' L. F
  35.         return attackPower;' f% F; Z4 P; @2 }( t4 Z* ~5 d
  36.     }  H9 l% X0 b' X% i; b
  37. & Z2 [, V7 D6 s- b& m$ z6 G4 D
  38.     public void setAttackPower(double attackPower) {- E" X% K: R- l2 t7 s  s
  39.         this.attackPower = attackPower;
    + Q  \! Z- S6 T  ~/ ~0 ^" X
  40.     }
    8 {+ ~9 ~* a# M3 j% ~' J6 b- E
  41. }2 i% a" p3 m5 I. {; I; u
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 n- X: U  f/ F0 X9 w0 A. d& ?
$ U$ _: {5 L. Q& e0 G6 j) B! X
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & h" ^# d! }  u+ |! k" p
  2. package org.l2jmobius.gameserver.model.battle;
    ; d5 E1 `/ X1 X
  3. 4 j7 P1 ~5 t& }6 R, z" J& e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' T' N3 T  X6 ^, ]( U8 c8 {
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    3 @& W, B0 [# t6 s8 i* d5 B: x

  6.   x5 L. q& V( g) k' ]4 L$ _3 v' f
  7. public class BattleSimulation {
    ) ?$ Q6 x" r8 `/ Q) r
  8.     public static void main(String[] args) {
    % @+ _. ?- K0 j; @
  9.         // Создаем монстра; C# u! z5 r7 I5 Z
  10.         Monster monster = new Monster("Дракон", 100);
    ; i2 s" Z* W/ p) ]  {

  11. " J7 `# }5 \/ R
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак* B6 H6 G+ X% t: k# G/ \4 Z" [4 G
  13.         monster.setState(new AggressiveState());! S  @, r% y- K* D$ |  h; w, ~
  14.         monster.executeState();
    ) c4 C$ [! T/ E1 K4 F
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 G. {% `8 E8 x$ N# |  p
  16.     }
    ( i7 y0 @/ v1 t" ?- z, S2 t7 [5 {
  17. }5 ]( O. X6 z7 g6 A1 m
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
. O0 K5 d9 e1 m0 n+ j, g$ jЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
9 ~. [1 m) ]& B8 A9 c/ ?' Y( r' x) y) O3 t7 n
1 `, V9 \/ \" Q, I: F7 Q: S0 D
5 s! w  }% v2 J3 y! e  c* ~) v1 I1 r
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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