Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  x9 o( C9 i0 k8 S' `

' Q' o# S) R) D0 d

0 {7 v$ G6 Q9 o0 D0 [Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 {' J! {% H; m+ r
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
6 s" Y: O  O# Z/ _  M$ nАстралия ?
2 ?+ M5 m3 W) e: ?; P" [3 [* w$ X; M

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
# R; ~1 r/ H, ^9 i8 u3 NВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
# [4 @! f8 X( i1 L5 @3 R3 R* P
4 q; V# t% o8 k, B3 e: ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ) E+ R7 H$ W' K% g
AlexCoder опубликовал в 2024-10-16 18:31
  X7 Z; h2 g4 W3 f1 PДень добрый!
+ t3 ^: k! [7 S1 u1 TВ статье описано взаимодействие игрока с N ...
8 z4 O" u# a7 J' D
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
+ \8 q& g) S6 B. v4 B- V; B2 h0 F& B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 B' X" U4 D; F% d' V) i" U

3 B2 F5 F* h8 R; TШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ b6 P% F; z- V9 C! [. T; Y9 b3 B: {6 D& T
  1. <font color="Green">// Пакет для состояний монстра</font>
    6 s9 t/ n6 W+ b; |/ _$ A  V! N) o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( H# [; {7 C8 K! Q8 S
  3. <font color="Green">' z, W/ I: E. |$ A' Q
  4. // Интерфейс, представляющий состояния монстра</font>0 Z& }4 a5 X- O' J4 T5 C
  5. public interface MonsterState {9 c3 C3 a$ T& N" ]. U, ~
  6.     void handleState(Monster monster);2 w" G% c5 K3 w4 {6 Q2 s! x6 i& M- ~
  7. }8 K4 E5 p; f" `, f& |
Скопировать код

7 s6 O5 @' S3 j! i8 N5 S) EШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. v+ r& g/ i1 ~% p3 X: f! O
6 U: C: O; o3 o! h$ F, B1 D6 V' D
Класс для начального состояния монстра:
6 {  R/ C5 q! s7 O0 c8 x
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>4 p* S. s" a0 U/ l' C
  2. package org.l2jmobius.gameserver.model.actor.state;* N( X. v& \0 f

  3. 3 O7 u9 ?2 }; n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . r% A! d! F$ F0 f) K% h2 L# f, E

  5. 8 s9 O0 d& Q. W$ d9 a' S( e4 |) C
  6. public class InitialState implements MonsterState {" Q6 w: q! ]% d
  7.     @Override3 w! a, j% v7 m- y, y
  8.     public void handleState(Monster monster) {
    ( L7 D; }4 Z7 U9 W8 }6 h% \
  9.         // Начальная фаза боя
    : Y, b- n$ r6 i3 T! W" F- w
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! p' b9 S  _7 R% J
  11.     }
    3 V& a& x& V' j& `- `
  12. }+ \9 o6 c/ G+ L! e8 d1 j, I! G
Скопировать код

' i/ c# l5 P9 m0 z% k6 [$ y! Q  L% g- F! I, a" @

4 C8 S( N" y2 _$ C6 ~4 l2 k, P2 b9 d" n! j3 T2 L( S) \& u8 C
( h& m# ]( B( L2 P8 L8 F4 G. e7 \

% O9 I5 B$ X1 |' j' D/ L4 b( b/ l& o0 ~2 \! R
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " l/ O3 A" o) ]- L3 `6 w
% }: C7 W$ k  B
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) A) i0 l$ {& \, Z0 X9 N) n, m

* `6 ~  R4 V' ~5 ~Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- z+ Q/ l- d' D
. l* U3 X* W- e' M$ p* A6 I5 f
  1. // Пакет для состояний монстра2 M  d) x8 s! a; @; E+ T
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; n5 N! E4 S$ N( _* ~( ^' T
  3. ; h# O: _$ v$ x& S) p! t8 z
  4. // Интерфейс, представляющий состояния монстра' U, r- t  E$ ~- L  @9 C7 @/ C
  5. public interface MonsterState {
    8 f( i- g! ?$ U2 v' b' b( Z1 K* @
  6.     void handleState(Monster monster);
    % F2 O- w" E: a' V
  7. }
    / X( d( y# Q- v4 |( z9 ~
Скопировать код
1 \' j0 }9 u0 _* z! J: N$ O) ?5 |3 U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
1 ?; C) Z3 G4 A* m: t; N
# S6 ?8 O3 {& R- P* S& xЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ d9 N) {8 a5 \6 Z; L
# d' r$ h* x& o  `! o+ G
Класс для начального состояния монстра:0 A" s" Z* N$ G& S+ `$ q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 _3 F: f8 z5 S1 J+ s$ L' X& P5 F
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' z- O2 h( I3 o  p5 Y
  3. 2 A. M! J: D6 g6 p' Z) `+ l! }
  4. import org.l2jmobius.gameserver.model.actor.Monster;% J- B+ y( V% a& L: {8 W1 [

  5. ! U* }" C: w+ W
  6. public class InitialState implements MonsterState {  e6 h/ O! Z3 N9 ^& P
  7.     @Override. Q' q* ]* z: w& X/ e( N  v$ S
  8.     public void handleState(Monster monster) {
    4 N: S4 M2 D$ g' d) u
  9.         // Начальная фаза боя! d3 O% X! f2 @. P, J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");- e* J' A2 _1 Y, t
  11.     }6 Q1 X1 Y- C/ ^+ G# U9 e
  12. }( p: p  p9 b$ i$ m6 j
Скопировать код
Класс для агрессивного состояния монстра:
. e# ~3 m& D9 h& d1 K- _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & t% _3 i& |& q! {) I; m
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 g3 u- P# X; t0 a- w5 I
  3. 8 \. V3 l6 B0 D2 S. H2 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 h0 C, Y) A6 O( Y8 P

  5. 2 T: u9 ~+ L2 L" y
  6. public class AggressiveState implements MonsterState {
    % O: [* J: s( R: X
  7.     @Override
    8 I- O. u9 }7 `& z
  8.     public void handleState(Monster monster) {$ n' I- |& \$ \; d% g% t3 d
  9.         // Агрессивная фаза боя+ v+ r4 F$ C" x- `3 ]4 x% b
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    $ X! A1 A2 r9 z7 o& L8 n5 N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    % n" ?0 z( B6 _& \+ e' u
  12.     }
    , K, ]: x) X+ {, H
  13. }
    0 n; s" A2 v& @
Скопировать код
Класс для финального состояния монстра:
4 U& r5 s* n" p: E" ?3 q+ [  o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) U6 H% ]! G- T5 r9 h7 |# q
  2. package org.l2jmobius.gameserver.model.actor.state;6 P$ ?3 v) N' c* l* b
  3. , M/ P6 M3 i4 J& F" ~( F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " h1 v3 }- N# ]/ Z7 x4 s" ~2 g8 z
  5. # T6 A8 @" g$ @9 Y
  6. public class FinalState implements MonsterState {
    " q+ ]) e" O: h3 Z- {
  7.     @Override
    - E1 u! b- L4 f$ h: f0 b  c
  8.     public void handleState(Monster monster) {
    % B8 _% R+ h. Y  E3 T$ g
  9.         // Финальная фаза боя
    $ P+ K( K% O/ m2 j& Q
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");- W% I: Z, q9 r. ]1 H
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    , t1 j% A9 ^* X9 K# i
  12.     }
    9 d, a' F, J* G( P
  13. }
    9 p. k) g- ^' H! r4 _$ y' z! F; n  W
Скопировать код

, N% g2 |: C8 H7 u/ CШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.3 Z) n1 g2 e, R& t9 q4 r6 B
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 i& u- x' f. E6 Q4 {- q/ f
  2. package org.l2jmobius.gameserver.model.actor;4 ~  E7 h' |& D; q4 D7 }

  3. % f! ?# I. z% w# }2 o' O) ~! b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- i# m6 D* z4 ^0 S
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 c5 L( w* i' D

  6. 8 P. i7 q$ O* r9 i2 Y' S
  7. public class Monster extends Creature {3 Y6 V5 O4 q! e$ ~8 J1 P/ x- V
  8.     private String name;
    4 X1 y/ ^9 K+ S% x
  9.     private double attackPower;
    5 a9 Y8 \: u7 I
  10.     private MonsterState state; // Текущее состояние монстра: z8 N5 f9 c: n' U$ f
  11. % q0 a: M5 K  k+ b
  12.     // Конструктор монстра
    & W) D4 P: p1 n! m8 V( x0 d3 ?8 U
  13.     public Monster(String name, double attackPower) {
    $ ?* x2 {* Q& x3 }. `3 m! N/ i$ I
  14.         this.name = name;; D4 o. T$ v* H: X# n* `4 p. o
  15.         this.attackPower = attackPower;" u9 T1 y. g8 Z/ j* D
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    : o& X" i1 \! A' O, U% ^. A, F
  17.     }/ s( F  k& m) J' B6 @6 `. Y" ^

  18. 2 O/ f: B. W; m7 [3 o
  19.     // Метод для смены состояния& |- B# J3 K( |; S
  20.     public void setState(MonsterState newState) {7 J$ T' ^/ j2 h2 |4 v) v+ c
  21.         this.state = newState;
    6 I! k! [: G0 f! z  {2 }3 Q
  22.     }+ i5 z6 U7 |) t

  23. 7 S/ x( J) [. y1 z+ p2 X  i  q% {
  24.     // Выполнение действий на основе текущего состояния
    ! H  A2 o% w! E6 Z/ H/ X0 @
  25.     public void executeState() {: }5 T- U3 A$ v) u/ @" U) I
  26.         state.handleState(this);
    5 _1 r  b' N& w3 d
  27.     }" I3 [7 d. \% `# \0 {- o, W
  28. ( e/ v4 R+ r/ e" F$ @- J  j3 i2 f
  29.     // Геттеры и сеттеры
      q+ ~* Z# ?6 |! F3 S
  30.     public String getName() {; N7 O- N. H4 U
  31.         return name;
    3 ^8 h2 H) s( n6 P9 J' U. N0 k: }
  32.     }3 T: h5 b8 S8 Z' v- L# r
  33. + m6 n2 \% t! M7 B5 C' r. C9 ~" A6 @
  34.     public double getAttackPower() {
    * R( S& H6 s  K3 W8 R
  35.         return attackPower;
    3 @: b" L$ f: y/ R' t) Q. c
  36.     }
    9 {& `6 V) _4 I. a8 n' v# ?

  37. ' d: r  T+ W9 g  q4 b
  38.     public void setAttackPower(double attackPower) {
    , L+ U9 `2 K* V/ }5 y8 H; K
  39.         this.attackPower = attackPower;
      a2 D( E+ P9 q3 q; W0 ?' U
  40.     }
    ( [" h: p% \. L! f: |
  41. }
    0 i5 D" B+ S2 q% ^0 K$ [
Скопировать код

0 U+ Q/ I- ]0 d# l4 [Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 I; N, L' p* V  m+ K. p- \9 Q
% |+ W' z- C! A) q
  1. // Пакет org.l2jmobius.gameserver.model.battle
    7 R6 x) d2 Q0 b8 o: ^( c) y
  2. package org.l2jmobius.gameserver.model.battle;
    9 |  i9 U* ?" Z  Z/ c! |: q

  3. . y. K: }; ?1 E  e" Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # Y8 t4 r! ^  M9 Y5 c* U# p
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;1 u5 Q$ L  W! k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    & R& w7 W; ^) \

  7. + P1 B- P, R& p$ x
  8. public class BattleSimulation {' y. ~# ?, P2 A1 u( c
  9.     public static void main(String[] args) {* W# ?+ v* v$ A3 x; K1 Y
  10.         // Создаем монстра с начальной атакой
    % Z7 e, A+ _! [! N
  11.         Monster monster = new Monster("Дракон", 100);
    9 C7 ^5 X! r  p0 d& t4 H
  12. # [1 c( Q+ I/ v& Y! S; \; C/ z! e
  13.         // Начальная фаза
    / J9 P, k2 n2 r( ~5 {/ \4 H6 K7 j
  14.         monster.executeState();' }: z7 @8 @$ @% t9 j
  15. ) ~3 n# K5 Q0 p
  16.         // Переход в агрессивную фазу
    : c, s: r2 l1 b: k
  17.         monster.setState(new AggressiveState());
    " a$ F/ p! u% R( m& q4 _
  18.         monster.executeState();9 o% \* i. E5 u

  19. + x. Z# k5 V! d; z  b7 X& E% c
  20.         // Финальная фаза
    6 v0 _( _* J  K4 s% ]4 L) A
  21.         monster.setState(new FinalState());
    ' s8 p  c2 L8 t& \) Z; ?! N
  22.         monster.executeState();0 E; _# T7 N5 f  l/ }
  23.     }6 g5 C0 i; t# K+ z; J7 q( V
  24. }' N, y! x0 s- G8 Z
Скопировать код
  s5 Q- B+ p" t/ K* i1 L3 f
Комментарии по структуре пакетов и классов:$ D  o: E" Y2 ?. N8 U) w) x( L3 r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    3 j6 t. E% k( ?3 T
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.. {8 r3 B9 `& y; A$ Q* H: Z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
, ]# ?; e  {9 h  n8 R8 A. w7 W  L: I! N3 s- ~

' Y' ^' j0 e; h! y5 p- P: z2 R2 t. Y; X  X; X: T
& L3 L4 |, r: V6 W! q

5 m) x& S8 f/ u
" P, y0 h# M6 g3 I4 _4 P, M- `5 P9 M7 q& x
& @6 _9 g/ `1 ~
- g% G, k. V8 G, B1 U
& T9 E3 C+ f, v7 |/ X+ d

9 j7 P4 ?7 C$ X9 ]& b/ a7 i8 Q5 n+ ?5 `3 o( s8 j

" s% r+ X* r! y2 ]2 x! C) `8 S' f
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04( m$ ]- @6 o; ^* I( q8 q
Для управления сложными взаимодействиями, такими как  ...

/ W; I2 [3 i" U* m, X) d" aОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
" r- q3 o+ o6 Z9 d6 H& x9 E$ lОтличный подход! Использование шаблона "Состояние" де ...

, A. q/ G0 K. m! DХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
5 o' E) T7 v5 e# x) n8 w5 K4 e" b/ @# P5 l# Z
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 r; z/ c3 Y4 A
. G2 J, y7 W3 h! p
  1. // Пакет org.l2jmobius.gameserver.model.actor/ [( Q) l, }9 t6 c! s
  2. package org.l2jmobius.gameserver.model.actor;
    5 R7 m3 ^/ ~/ ?. y7 `0 ?( L
  3. + u$ b+ L" S8 d: F' M1 E* y
  4. // Перечисление для типов атак
      y$ x$ k2 d- `# P% ]8 p
  5. public enum AttackType {/ G. |3 P& H9 z
  6.     PHYSICAL, MAGICAL;2 y5 }; t( X4 H/ O; l
  7. }! L5 v/ p! t9 X0 g9 F
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" p) I# W* t' aОбновленный класс для агрессивного состояния монстра:
/ G8 ?) Q9 a. y: Z0 _% w6 F' f0 g/ ?) Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . E* K0 B8 P% e# k% K: {
  2. package org.l2jmobius.gameserver.model.actor.state;3 C# w2 @+ {* d' X+ q, k8 T
  3. - @; y0 P* E# T2 Q' s8 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & [* Z! t! z5 V8 K5 Y
  5. import org.l2jmobius.gameserver.model.actor.AttackType;* y6 d8 N5 O  n& s& f& c( U
  6. + s$ z. d0 X& P1 X" J# q
  7. import java.util.Random;- [1 v, W0 V2 k: K1 r& `" b& v* o

  8. ; A4 x- e% l# |9 _8 y7 D$ Y
  9. public class AggressiveState implements MonsterState {, e; W# |3 b( Z. c8 [
  10.     private Random random = new Random();
    0 |" S4 }( [$ m1 K. D

  11.   h' ]( q0 B% o  s2 R. i
  12.     @Override) f1 f& _6 ~; {) @8 f4 C9 \
  13.     public void handleState(Monster monster) {2 @+ ^( ~$ u; H# o/ ]# o
  14.         // Выбираем случайный тип атаки: физическая или магическая
    4 Z1 i6 h& z1 V4 D/ ?
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    0 F, ^0 c6 }& q8 u  o% d1 S

  16. * e: M0 {! b& M& t
  17.         // Логика для агрессивной фазы боя7 A1 z4 _* ^* F
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    3 ?& z7 m+ Q# w% Y2 G
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");& [9 }6 \; e) o' y* G) L4 N
  20.         
      i9 Q* B! l% ]8 ~
  21.         // Увеличиваем силу атаки в зависимости от типа атаки! F8 `$ c+ o/ H5 c( V/ R  T
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, u8 t! z3 I4 p, [9 P& D* x1 N  H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    1 p' b! w' C1 u# T; R1 F+ L
  24.     }
    . r/ z6 Q1 l, v# e3 g' h9 j
  25. }$ w" C7 l* y5 F' \! z' b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
7 A; Y+ @6 {% F0 d
. s) H0 \' q& i/ t
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - j7 k& {, Q" ~1 f
  2. package org.l2jmobius.gameserver.model.actor;( y' r  J/ V, C1 ~. L! g! }, E8 G

  3.   s3 t5 }) G  @, x; W% w4 K8 f) }
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 j, \# M% H7 q% ^3 z& s
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;# d" S1 e9 g5 F5 S; Z3 P+ {1 ^

  6. & B- A* _2 ]" z1 k
  7. public class Monster extends Creature {4 k" q3 I" u/ P9 h  E  {
  8.     private String name;( N" l  u9 i, b. A+ S# f( K
  9.     private double attackPower;' Y$ w7 n# G2 z) U/ F
  10.     private MonsterState state; // Текущее состояние монстра
    8 B1 D0 W' \5 l: O& w2 ?
  11. 8 R! V! Q) |) i" S+ D9 p: l
  12.     // Конструктор монстра( k( i6 [  \$ ]$ j
  13.     public Monster(String name, double attackPower) {" e$ x$ N* k( p8 U/ ~
  14.         this.name = name;" ?& T9 W- z4 A( J9 C9 `$ H
  15.         this.attackPower = attackPower;9 I- V& `- Z+ n$ |( z' B* V
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    * j7 I2 A9 l: k; _
  17.     }2 a' {( X; s" D% f8 I# u
  18. ( q+ B2 P* `- \* }
  19.     // Метод для смены состояния. V* C, E$ `7 {- \7 Z) Y
  20.     public void setState(MonsterState newState) {
    5 R: q; q. c  |7 }2 v$ ]: |: I4 `
  21.         this.state = newState;$ t1 D& g/ v8 |3 t; m
  22.     }; a$ ^. Z7 j5 I
  23. 9 X* Q& l3 W6 @6 v) D* z
  24.     // Выполнение действий на основе текущего состояния
    ' |: C$ I" c+ W3 [1 q, X
  25.     public void executeState() {" t2 C7 }( }/ |1 J0 n6 U" w
  26.         state.handleState(this);
    / C1 I0 e: S, P7 ]3 c
  27.     }
    6 B# d2 a* j$ H) G. {

  28. % `& v  |8 y+ I7 w; R
  29.     // Геттеры и сеттеры* t0 _; a# s6 i! O: w* n; R
  30.     public String getName() {
    0 f9 `$ O$ l& K+ z. J+ x, g
  31.         return name;
    4 }5 M. x( q' Z# B0 _8 f9 H/ ^5 v
  32.     }
    5 v( ]* I7 k  n! D7 d- Z6 w8 F
  33. 3 r7 x8 v3 D  v4 w/ t9 S
  34.     public double getAttackPower() {
    , |* l6 K# q& j/ I1 L! h; ?
  35.         return attackPower;( b. o* J" Q4 [/ V! @
  36.     }
    - q* V# a6 }9 E' \8 m
  37. 2 s/ e0 B) B+ F" D- ^. H
  38.     public void setAttackPower(double attackPower) {
    & ^( @. K' h( {8 F6 v) ?& l
  39.         this.attackPower = attackPower;' L! S& A5 s. B6 ^' g8 B. P
  40.     }
    . i; V/ B1 ^5 l8 g+ @7 J
  41. }
    6 k* h% B8 ?' o3 G
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
- j, L' m: z; Z" I) O4 B+ j. t: m7 y, w
  1. // Пакет org.l2jmobius.gameserver.model.battle* L9 u) ^4 R: o: k4 ^
  2. package org.l2jmobius.gameserver.model.battle;8 g4 k) j0 ?5 F8 c
  3. + [9 c6 S2 i, A/ ~1 W
  4. import org.l2jmobius.gameserver.model.actor.Monster;* h; `( }; `: w4 g: E& x3 |+ Q1 ~$ X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 ^2 d  ^- m( W4 O% \
  6. ! _) M  ^& q% q" R' E- `; m( a& K
  7. public class BattleSimulation {
    $ h3 w# ~4 y; ~8 u
  8.     public static void main(String[] args) {
    & v3 w+ Y7 x: e
  9.         // Создаем монстра
    5 J" f; Z9 Z( [* M% B$ W! P
  10.         Monster monster = new Monster("Дракон", 100);$ b0 ?; ?) v, t3 e1 Q2 B
  11.   [1 ]7 U1 Q; \# ]6 r, q& a
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    * E' k2 v# |! u3 \% K9 n
  13.         monster.setState(new AggressiveState());
    8 \. C+ x" ^& c$ L; [, y/ v
  14.         monster.executeState();, f4 ?2 }: I1 d9 P1 U: s
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак* R7 H4 P$ l- J0 M+ {
  16.     }, E1 r2 C2 n# W3 Z
  17. }
    # ~1 h3 C6 o$ S% R+ l
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.- E5 D4 ^" Z! K
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
5 V8 z1 s% o# B( G9 r* M* i3 @/ n3 w' ]) U
+ X0 ]2 H, P6 _" U- ?' k

4 G" `7 R) f, P7 X
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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