Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
2 r5 \8 \3 c+ h5 x/ [0 k
/ ~1 g9 `# ]; u) G+ h  q) ~

2 V# ^6 h5 ?& m! w+ X" JЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 J* W/ k' R0 `' E' \/ t
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!% k5 O! O( l( p6 [
Астралия 🌟
' X/ z( w) I! l" w, u; D
. k- \0 [5 F" P# O; ?8 b

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
+ }& c& I# q; d6 BВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
# p% e* E; W* i2 w$ X, e! M5 I7 r% b; G! P2 N+ ]5 @% X
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 / j3 C3 p* x  f- Y. t
AlexCoder опубликовал в 2024-10-16 18:318 E( A8 v9 W  a, t) }% }
День добрый!
' @; C  l( O9 e& W$ G' K* S( KВ статье описано взаимодействие игрока с N ...

; W0 S& m- S8 yДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 e1 I: c( n  ]
) D% ^* O7 O6 E  O( l0 U
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# ^# |' S( }' x$ N; N/ F/ h) s! B( g9 p! Q, k' L
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% j; Q6 W4 D- Y: z' `+ _

+ u/ v8 V) `9 b0 F
  1. <font color="Green">// Пакет для состояний монстра</font>/ J' \: ]2 e) @" C
  2. package org.l2jmobius.gameserver.model.actor.state;
    . t& q2 A9 X* z; x/ S
  3. <font color="Green">
    : ]1 c7 f3 K! A0 E: q
  4. // Интерфейс, представляющий состояния монстра</font>
    8 r, G9 A- m5 f4 C
  5. public interface MonsterState {
    , T, F4 C! p3 q8 B' a; p
  6.     void handleState(Monster monster);
    : s" g, ~7 k5 d$ b
  7. }. h; i! d0 @1 F: P& B- E. J! B
Скопировать код
( J: v: J$ t$ x/ @" ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 t) E! a0 @8 k' }. X' |& t, f
3 Y" I0 v6 i+ R" [0 \$ |7 W" i2 N0 d
Класс для начального состояния монстра:: X* }5 [7 ^8 {; C2 k) v* E1 D
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>5 a. Q; R% H& `* m0 U3 c
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 N8 k1 C% b' C( Z/ ?2 ]2 y3 I/ A, _

  3. 3 a4 s' D5 g9 Y9 t$ `
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 B) u- d. ~4 d1 A& `# A7 G, z
  5. 8 {! G8 Q' l  t2 K1 G- x3 e' R) S
  6. public class InitialState implements MonsterState {
    , G& g7 U6 z# z1 J1 W- m8 L
  7.     @Override3 H6 E0 y/ u; ]2 I9 K
  8.     public void handleState(Monster monster) {
    ) M$ n+ D0 m  T4 \( y& c, Z, f
  9.         // Начальная фаза боя% D+ D# c9 G5 z. r5 [+ C
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % X" `$ [  y4 d1 M- v
  11.     }
    ) ^8 M. x5 C5 V
  12. }+ Z+ H& j: i8 E5 Z
Скопировать код

# H  e, p/ }. I( S- t: P3 P4 p/ r# T
7 q8 U& \3 b0 |- L6 M

: g& f3 s' B5 W) n* f& {9 E
5 r. C5 Y2 V; ^) G6 f( V
: M$ i, P( V5 H4 k) V/ b6 Y
; R, c7 P* i9 W
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   g) B& x0 R; z& ^' j
# s  H  h9 o9 c! Y3 U$ p5 O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. C9 Q/ n. i5 |* Q
6 d5 a  `- e9 Z. `. H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 e+ A1 k5 O& s; m  A) {0 u$ ]
4 q& [: j* K& I# L; ], u! x
  1. // Пакет для состояний монстра8 C: V/ U- A4 I. j
  2. package org.l2jmobius.gameserver.model.actor.state;
      \9 y1 q4 g# {) W  e6 Y

  3. ) j: |  w- P6 Z  Q" H1 R
  4. // Интерфейс, представляющий состояния монстра& }4 s" f# T) W* o$ ^0 }2 ^- l
  5. public interface MonsterState {! G; d5 d' \& H2 ?7 F. F2 {9 @
  6.     void handleState(Monster monster);
    7 b! }# x3 [9 c
  7. }! w  c- N: e% X$ N) z% k
Скопировать код

' Q; E2 K# C4 w6 L5 h( \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- \# [3 n: Z. h5 p& b* r( j& F% k/ c+ k( ~3 X
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- U. N* g1 X1 u9 L' N7 b( ^" l
Класс для начального состояния монстра:7 ~* {1 c. @3 |5 b8 U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / J0 D0 e8 q1 j
  2. package org.l2jmobius.gameserver.model.actor.state;
      X9 ^/ @; F. Z* |) z

  3. 3 r4 E( ?) @4 h/ ^! Z2 k# ^$ q( C( y
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 O: D0 }! t& ?

  5. * b6 k5 k6 }0 M$ ^
  6. public class InitialState implements MonsterState {
    , e5 ?4 B& c9 J3 [  u1 f( `3 ^: F" C! i8 k
  7.     @Override" i" y+ h& S* M3 ~5 I1 r- k! J! S
  8.     public void handleState(Monster monster) {# ^( h8 I- ^% h' H
  9.         // Начальная фаза боя- Z) j4 e; r! x$ e
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  e% R$ {% h) x# h8 j6 B: S
  11.     }" s) q+ @* H4 {  S5 \# Q0 Q
  12. }
    " o4 ~3 |0 U9 M  V
Скопировать код
Класс для агрессивного состояния монстра:
, @! L2 f/ s4 O7 d0 h& A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 T+ u- O6 ]" w" [9 d" P" a
  2. package org.l2jmobius.gameserver.model.actor.state;
    & h! F" o. m. d
  3. 3 k8 s' I) z+ n# ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 W9 Y% `: q2 Y% l9 z, M# G1 e2 |

  5. ( K9 r' l# y! I# f
  6. public class AggressiveState implements MonsterState {
    ; C$ b' S7 W1 h1 l
  7.     @Override
    9 p  m2 ^" W3 H2 q
  8.     public void handleState(Monster monster) {
    7 M4 s$ z2 t( x6 `5 i
  9.         // Агрессивная фаза боя
    % ?# C0 c2 Q+ \( n, b/ N: z7 l+ b
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    + b# m* q! `' {2 {: w4 ^' N' G1 a
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    8 {, K5 \7 y) J2 R
  12.     }& @9 m' h3 m- f; y* _
  13. }0 X  R) y2 j& \3 L, m% _, p( I
Скопировать код
Класс для финального состояния монстра:# C) @# P  |5 U: o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , v5 Z$ F$ J" v# ]! O, P( |7 y/ O
  2. package org.l2jmobius.gameserver.model.actor.state;
      ]" H/ ^: v, W# r1 V

  3. # r# y) c. o5 n2 U& z) Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;* ~2 G: `: p) S; e  o
  5. ! d9 [1 @) T5 R; Z* Y* z; L5 w
  6. public class FinalState implements MonsterState {
    . P: K5 [3 @* W. ~! N2 t! I% o
  7.     @Override
    & v. h2 L" W& `+ [
  8.     public void handleState(Monster monster) {
    , _: F1 D& E8 c! ?
  9.         // Финальная фаза боя
    . P+ V. v2 c: W1 ^3 W6 {6 O8 B
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    $ v  i- O2 h, {) o: x
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 Z6 t  Y; f  f7 b" A( b! {
  12.     }
    . d9 X+ E; Z% J4 B/ v3 }. t2 N& L& o
  13. }  F' F$ {5 D: e0 C1 r6 P
Скопировать код

9 N# C0 V" L6 mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 u4 i- M" X8 h; j( U& M
  1. // Пакет org.l2jmobius.gameserver.model.actor- `8 ?# m3 z$ m6 a+ `2 ?( L
  2. package org.l2jmobius.gameserver.model.actor;
      w3 j! t1 x; P9 Z9 {7 A
  3. 7 G+ q' B4 R' x5 H; g' F1 n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;: v! _. I* W, g- o) G% U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;" W) t% L; b: t- W: U* J, K5 l
  6. % }& V+ k- S8 v% P% J
  7. public class Monster extends Creature {- a4 [9 Z  I$ P$ `5 I" e# s' {
  8.     private String name;5 r6 U8 E: ]0 n; T
  9.     private double attackPower;
    $ Q" k. d$ B' m  l
  10.     private MonsterState state; // Текущее состояние монстра( K! m, U/ o' j! z8 ~, N9 k, _2 d
  11. $ m/ }, o% I/ C6 T- j' ?/ P
  12.     // Конструктор монстра
    6 I3 w/ k+ L: r! E7 O+ T
  13.     public Monster(String name, double attackPower) {' y) j/ g- L2 `. e
  14.         this.name = name;8 z1 v' V$ B( m; D% u; f- J
  15.         this.attackPower = attackPower;
    ' K& H/ |" d/ k) J
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние2 w. k; A7 F: k9 v& R
  17.     }
    9 O& ?; u) q! [
  18. 7 S4 C; v' B9 ~' h. M+ Q
  19.     // Метод для смены состояния% s& X* U8 d7 r" p. S; u5 S9 c% B
  20.     public void setState(MonsterState newState) {
    & P0 ~+ O0 F9 C/ Q% B
  21.         this.state = newState;9 J$ Z+ D- w1 |+ f
  22.     }
    3 A7 q6 ?+ x0 x' w1 l

  23. 2 F; @' H: x8 T+ ~- x8 o4 U& S1 f
  24.     // Выполнение действий на основе текущего состояния
    - |( \$ ?; C/ f4 O# l
  25.     public void executeState() {
    ! M" ]+ Q# q7 k/ Q* q  j7 D0 t
  26.         state.handleState(this);) g, k  D3 O$ v8 K0 ]1 ?- C
  27.     }+ C8 f* x  o+ Z$ z) M# s/ T9 x

  28. 3 \& ]8 m" T: K/ R
  29.     // Геттеры и сеттеры& H8 M' g" ?* E7 K5 X- ?8 o( B
  30.     public String getName() {7 c' K& @4 i- Z* x3 `7 A+ g: B& M9 e
  31.         return name;
    8 V+ w, g0 E. M; Z6 Y* I3 r
  32.     }
    , E1 X7 I6 }6 F
  33. % h; E2 |3 ]! E" x* u
  34.     public double getAttackPower() {
    3 `' [% U6 o  l0 K  I+ J! {
  35.         return attackPower;' F: g  E5 w, p0 z
  36.     }0 F, m+ t+ m' i/ }5 \6 w/ B
  37. . e6 V2 E3 y* ]6 {5 W+ U: h
  38.     public void setAttackPower(double attackPower) {7 r4 V# U* Z! s+ C5 i
  39.         this.attackPower = attackPower;
    # h! s2 G4 {9 S9 |( N
  40.     }
    : v, K  W+ v+ d- D! B* [# @
  41. }  p; d# ~* _/ S. O, w) \& r4 T
Скопировать код
1 M1 P2 a& F% P; @* w+ X- U1 }) T2 Y3 Q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра., h+ u/ \8 l6 }. K- |0 B

9 A: B  m# P2 s& P
  1. // Пакет org.l2jmobius.gameserver.model.battle( H, j' q6 b' ?" g9 b; g
  2. package org.l2jmobius.gameserver.model.battle;6 ?: H: ^3 m9 Q, I! Q. U3 f

  3. 5 {  d3 b! G( u7 ^& C$ N" R1 {; d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , Y( D/ @! e6 u  k! T2 o3 S  Z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, G( y3 @/ _  ?
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    , g; G2 s( K" ^# [" ?6 t
  7. 5 b- ~' h7 \: O+ Z1 v
  8. public class BattleSimulation {: ]7 n0 `2 Y4 i* s
  9.     public static void main(String[] args) {. }: B; |6 Z* X) Z: F5 p
  10.         // Создаем монстра с начальной атакой2 J* ?) |* @+ k. t
  11.         Monster monster = new Monster("Дракон", 100);4 c' P- `' X$ L" d1 w

  12. ( G. E. r* Q8 }% o
  13.         // Начальная фаза, [( |/ Y/ d+ Q0 F' V/ S
  14.         monster.executeState();
    1 r8 I  x$ Q& J' j: D2 [" t

  15. * z+ G! U- m0 L1 W% X" v/ U4 _/ g# e
  16.         // Переход в агрессивную фазу$ i+ s. a' Z; V) w# `' d0 B" t) L- ~
  17.         monster.setState(new AggressiveState());4 q2 X+ c# C  F  ^
  18.         monster.executeState();
    : I' S9 |- x* h

  19.   E7 Y: b' C, i+ D% u1 a5 t' D
  20.         // Финальная фаза
    # i: ~5 K- f$ c. q" N
  21.         monster.setState(new FinalState());  H5 H3 m8 y+ L0 K6 Q* g9 W
  22.         monster.executeState();+ u' g0 A" @8 f. u8 F
  23.     }6 y" w& |7 z) h6 E
  24. }% m0 Q' j# J6 p/ t3 _* I
Скопировать код

' a7 P. t) l" Q+ ~" a, DКомментарии по структуре пакетов и классов:
" W5 V2 k8 `2 d9 `: ~  S7 W
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 Y! ?' [+ u& {+ `
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& F1 G' m3 S0 u0 v/ E) S! zЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
7 u  h/ G1 {/ C9 p6 }* @
0 ?" D0 ]( I5 @8 R- r- r  \4 H0 B# D8 a* H/ N
7 L8 Z. b; V2 f: Y$ E' ]9 ^

6 k- V: `8 N9 W7 r( {
6 `$ z% C% s' w/ |% g' U7 m- Q3 _, F6 o' c
5 g) a) m# [4 Q: t% |! K
: g6 \  m( C6 Q$ Q$ u
; ?* W( a$ G: i0 b+ y- M/ ?

1 f4 {; _' f" S1 `2 {7 Q' g" d- ^+ C' o% u7 h" l) E
# g" _* c4 S3 v7 x( O6 N( L  N+ y' k
# N- ]( f$ E4 B. |. A. f
/ h2 a" K( c  G' t/ U1 M  [8 j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 [: @; f& s# g  b* i! aДля управления сложными взаимодействиями, такими как  ...

1 m. I% K7 q$ j2 |% Y) FОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
; p1 }6 i! y# W2 IОтличный подход! Использование шаблона "Состояние" де ...

4 S3 {. {* Z, c4 ]9 R3 cХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
# b! w/ V2 [5 k! X  y: Z- Q5 V4 C$ ]7 L- ~1 @4 V
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.0 V; c; m# }0 ?$ B  Y

. J, _, _0 V1 v1 n6 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) c- A' ?! h8 l4 |3 S- R9 W+ @
  2. package org.l2jmobius.gameserver.model.actor;, B% r# Q7 v9 |( ^
  3. 5 C0 p5 V* k7 B# W7 K$ v- T
  4. // Перечисление для типов атак
    1 m9 w1 l8 r' w8 C) }
  5. public enum AttackType {. N5 H/ V  Y7 C( V) P) g; y
  6.     PHYSICAL, MAGICAL;
    - D% K7 J$ M7 v: H+ B& n8 n" p* d( \
  7. }
    ' ~/ u/ ?  m( O. u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
; c- t6 C2 M: i3 Q- qОбновленный класс для агрессивного состояния монстра:
- V2 p+ W% ]6 n) W3 M, N* h
) |1 Z8 E: S6 K- ?& W8 ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & l$ u) R* Y2 Z# C
  2. package org.l2jmobius.gameserver.model.actor.state;
      P" d( m5 P7 A0 T/ T6 c3 m* X0 R

  3. 0 @% w' ^8 R8 o" i9 [$ W
  4. import org.l2jmobius.gameserver.model.actor.Monster;( G* P, Q' S+ m; y$ [
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    " J9 g. Q  G, P- j1 K" {
  6. / a" T# m1 f: U2 L- v6 c
  7. import java.util.Random;* q# k+ d3 o1 @: @2 I

  8. 8 @2 G  W9 R8 }1 m" r3 q  y
  9. public class AggressiveState implements MonsterState {6 z9 [* l% |; M3 N; E
  10.     private Random random = new Random();3 j" k* W% b6 R

  11. ' S2 z# z2 `, Z# A, w3 I
  12.     @Override
    ! {0 N9 b" ]7 J4 ?9 G/ `& S
  13.     public void handleState(Monster monster) {- K1 j$ o% c) q( k. x9 M5 j- `5 J4 u
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; ~3 n! Z! a* v" Q* O& J
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    / G! N6 N: h( ?7 J8 C
  16.   q6 e5 b: }+ \' D! ~
  17.         // Логика для агрессивной фазы боя
    / h% j# n  d% j0 ?5 \% d
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ) O; J7 g+ \# Z% D. e, |
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");) i* q8 I& _5 |4 s
  20.         * W/ Z: a/ s' `" E9 P* X5 A
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( n5 F0 A: Q7 J1 z7 y* H
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ' [- \0 j, U! V2 t: L: S* C
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    $ P% M* H2 Z* z) A6 r' d* ~7 y
  24.     }
    6 K$ Y* U1 Z( M$ X( V
  25. }7 L5 W! `0 W' }$ p* U( g
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
6 s# P& H3 |' `" U, z
& |: u, ^" G- S4 t
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : h8 l( i7 ^) d% G9 h9 c
  2. package org.l2jmobius.gameserver.model.actor;! h7 O; V$ ]- y5 Z( z
  3. ; J: r0 d; Y9 T, w+ I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;  g! p$ |# f1 x) [6 j
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;( `* o9 o( {7 w1 r. I

  6. 4 E; U+ M& i) k) D" |' z3 ?5 t
  7. public class Monster extends Creature {
    8 A5 _7 i& X* D) i: i: C! ^
  8.     private String name;
    ' Z) h* o$ e4 E9 \- Q" L& z
  9.     private double attackPower;
    0 s" }6 I8 j$ t7 T! K9 C: N
  10.     private MonsterState state; // Текущее состояние монстра
    * i9 h' n0 T4 e+ [/ f5 \( Y
  11. ! A1 `# y& L4 I9 E" v% ^" f
  12.     // Конструктор монстра
    . h: d: A0 R! o# V5 @; b& b
  13.     public Monster(String name, double attackPower) {
    " R1 i0 K' |, |
  14.         this.name = name;
    ( }9 J$ l! }! a1 h4 O! l
  15.         this.attackPower = attackPower;
    & q0 U$ _" j( V$ O0 a0 v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию9 h+ J& Y3 N0 ~2 B% {$ o
  17.     }
    6 l# t3 H3 e* N# ~

  18. : |# x+ l2 G6 H, q3 t
  19.     // Метод для смены состояния3 o* |3 P* S4 h+ y. K/ K- a
  20.     public void setState(MonsterState newState) {
    % n1 Q3 ]( u5 `" I6 a, L
  21.         this.state = newState;
    * A/ n1 E' @+ ]" T. i- Q$ ^
  22.     }# E5 i# T8 C4 }, F0 W

  23. 5 J+ Y( G. U7 q& g0 @. @
  24.     // Выполнение действий на основе текущего состояния
    ; }. f. b* I) [& @% J- F) s& w
  25.     public void executeState() {
    $ S0 w6 x/ I2 Z! r& h
  26.         state.handleState(this);2 v" J+ E  N6 T2 @2 Q7 `5 P
  27.     }2 t; t  R( d7 }0 \2 J
  28. 8 J5 x) Q+ y+ W; {7 g
  29.     // Геттеры и сеттеры
    4 a4 Z; ^- o6 F3 b. q2 Q: S
  30.     public String getName() {* b/ @/ L; t0 [3 _+ d
  31.         return name;: g7 u# s# E0 p3 B
  32.     }+ L1 d; I* d( D4 m* o" y

  33. - n' F; z0 r( p0 k* m; _; C
  34.     public double getAttackPower() {
    5 ?, d) s0 w. Q  N7 d0 N
  35.         return attackPower;9 q, ^0 Z. ^+ O& w+ w# T3 V
  36.     }4 e# o0 i; {& y8 [2 i

  37. 9 p7 y& \: [# j; c! v& t
  38.     public void setAttackPower(double attackPower) {+ j5 {! t' O$ k( S1 X
  39.         this.attackPower = attackPower;1 ?( Q4 F2 O( F# a8 @
  40.     }
    + ]4 t8 a& c4 C9 z
  41. }! c0 P' H! I$ y. Y5 G) ]0 U
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! R2 `* c! w' M6 A) g0 z
& @2 x: U) R4 ~+ i/ z
  1. // Пакет org.l2jmobius.gameserver.model.battle  l) K  U+ `& B; i
  2. package org.l2jmobius.gameserver.model.battle;
    6 d: ]  ^1 h! s' S# z" P0 s

  3. # z3 j) E, W/ B* m5 }# p4 }9 _3 F
  4. import org.l2jmobius.gameserver.model.actor.Monster;; G) l" l* U  ?# S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : G, B. F! \/ ]$ `) x8 f/ [
  6. 2 ]# @+ d0 q% V/ c7 z/ X. G
  7. public class BattleSimulation {
    7 T* u7 G0 w$ {& v
  8.     public static void main(String[] args) {
    $ i1 c, W, D' d, m
  9.         // Создаем монстра
    ; [- n% D3 Y5 f% U
  10.         Monster monster = new Monster("Дракон", 100);; A: e. v; w! B9 `

  11. 7 u7 d0 @. G+ J3 f3 O0 L& N
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( Y0 F, b' T3 l6 Y
  13.         monster.setState(new AggressiveState());
      v4 a7 j- G9 S- \6 T3 [8 f
  14.         monster.executeState();" g: c$ K- s- V% P4 _0 d) b( E
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    % H9 d& O4 _' j
  16.     }
    / K9 b" H& o8 ^1 n
  17. }( p. b5 [& i+ C
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
# _, N, p" _; Q# k  K5 `) s# ]Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!; I1 ]' ~+ \& J% V, P& p* ]5 @
+ J+ c6 t. l& Y1 N3 S) N/ I
$ B2 y, E' m; k9 K: J, O6 E( K' s
  F( C: a* X0 U& w, {2 H7 Z
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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