Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# ?6 K! y$ S/ w( v4 W: a! a( U, g0 T) a# e
/ M  x' e) O; }6 ~7 d0 t/ O
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
) Q" l/ \( J' `" G# I( yЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!+ ^/ ?* x) b3 ~4 I6 I
Астралия ?
8 X; u/ K! M0 ]( [5 B5 Z! B1 @/ M2 Q2 L, B% J3 y

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
( O6 b% ]0 ^( l$ U3 I) E% MВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?% `  @$ `& M* k6 V7 t8 W
/ u! q2 J3 `) c9 M/ P0 `; J
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
0 K( z, o! x9 ~, w7 w& a" j) h
AlexCoder опубликовал в 2024-10-16 18:31! U9 c7 s8 d2 i. X: A, W+ B; t
День добрый!  B' Y' V3 x3 W* \/ E
В статье описано взаимодействие игрока с N ...

6 ?1 K3 B& u" @; ]. W" _5 _- ]/ [/ EДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). # o! T) E$ t& K, X, }
: V- M* b, C4 ^* X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 [6 E5 G6 \7 q6 T: ~
9 `, ~: N; S4 V7 i* O. LШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., \; A) v2 o6 S) U9 M

1 E1 {, S* ~3 h8 U
  1. <font color="Green">// Пакет для состояний монстра</font>
    6 u0 @3 c8 S( d" i: ^6 L
  2. package org.l2jmobius.gameserver.model.actor.state;$ J' p( D" C) I4 X. w
  3. <font color="Green">' H* y* T# p; a, j9 e7 I; p+ x5 \
  4. // Интерфейс, представляющий состояния монстра</font>
    8 i; Y% a3 m8 F4 X% ^8 f/ h
  5. public interface MonsterState {' U7 M7 p  X7 F$ o8 ]
  6.     void handleState(Monster monster);! Y! {% U& f0 f' M. t# F4 K
  7. }, R. R) w1 ?: H/ q( `* z/ ]! {$ o
Скопировать код

* }5 U% _: ]; ~7 d2 _' q, c) o0 rШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
& |& J, N% a$ _  W5 C8 z- d( ^; D: [' I- j' v
Класс для начального состояния монстра:3 c  {3 W+ g- O1 Y! w/ H
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    " u- i* N' {2 w& e* _
  2. package org.l2jmobius.gameserver.model.actor.state;
    # y2 b/ \) t, h  p8 D" K) N

  3. , w  s- L. s6 {7 n# R& }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 ?! o, i2 L9 u  }5 j
  5. 4 R1 q( H4 F  g7 E: ]1 P
  6. public class InitialState implements MonsterState {
    ' V) n' I4 t; L9 ~5 U
  7.     @Override) l! r% J$ \' p" q" ], x* u
  8.     public void handleState(Monster monster) {
    3 ]* s% l. l. v+ a0 }  R5 `( |
  9.         // Начальная фаза боя
    9 b) `+ L2 H) G' ?( {  S, C
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    - [, @7 C  G! U# R9 x7 p3 M
  11.     }1 x) d1 j7 A; A- X- i
  12. }
    . J6 E! ^/ @" [9 `' R" e
Скопировать код

. B1 K7 @* t( V0 [
  m% Z2 l$ q! ^+ D) s
7 y8 z- q0 i8 [, j4 Z& K
' p! L0 |+ g) f+ `* G( w" U
& f7 H0 Y/ p6 d0 F. [8 v3 P9 G9 Q. ^$ f6 k" i0 _7 B1 a( g( B
$ L4 t8 m+ \9 f+ L2 F. ?
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 ~7 A% q, A0 M1 V& O+ E
# \8 |! d& L* |0 ?6 a* i+ }Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 k% f1 n+ ]0 H1 m1 x: u

$ G  M8 q  ?  d1 o/ @2 s0 l+ wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% S2 V4 k+ L% }) ^" F

" A/ U# `" i0 F4 Y
  1. // Пакет для состояний монстра4 X1 S( V5 R  r3 W& S5 J8 g. C
  2. package org.l2jmobius.gameserver.model.actor.state;; E, i/ _" v$ a) J, E( S1 c* R5 |

  3. 1 C: z/ U# _( P$ y% F3 w6 U
  4. // Интерфейс, представляющий состояния монстра- B; C) j8 ?$ V. r7 H4 R: G- e
  5. public interface MonsterState {
    ( j) z  e5 K! {% ]
  6.     void handleState(Monster monster);0 D0 U2 k( X  r+ _
  7. }) k. ^5 n, I7 j4 m- B& ]  R) `7 M
Скопировать код

# f) p7 B. H9 z3 {% P: l; {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & a/ i4 L0 N$ x! t( ?4 I
; e1 u& z1 x$ X2 y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
( U  J% h/ `  Q
: J6 T6 t, i. WКласс для начального состояния монстра:
) a% h: B: B5 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + x$ \8 P6 ^- ~: y2 W. O  s% }7 }' N
  2. package org.l2jmobius.gameserver.model.actor.state;7 B  l0 z* j# [
  3. * K, b; Z! F& ]' q
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 l& `* s3 U7 A* \3 {7 Z8 i

  5. : K9 Q- T7 |6 |- V4 ~, H' [
  6. public class InitialState implements MonsterState {( W! R  i$ D: j$ O  P9 S& X
  7.     @Override4 ]0 o- f/ p  ?3 M7 x3 K- g, K+ d6 F
  8.     public void handleState(Monster monster) {1 ~, g3 }7 t& Z- {0 v* G
  9.         // Начальная фаза боя
    + _1 @  x6 h  g9 p' d
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 m) X9 t' w( }9 E
  11.     }
    3 l+ ~( l' c. b$ w8 s
  12. }* U% e  B% O7 ~4 k
Скопировать код
Класс для агрессивного состояния монстра:
( E! \+ p# G! J1 U  s8 c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : g& i$ h, K2 |9 d5 r
  2. package org.l2jmobius.gameserver.model.actor.state;
    % x2 K/ A, j; t% `

  3. : F4 \* D) U% z
  4. import org.l2jmobius.gameserver.model.actor.Monster;( ?; T  e+ c) E5 @  ?
  5. 0 ]$ N1 v9 w, f
  6. public class AggressiveState implements MonsterState {& N$ d' M3 }) V0 N* S7 d# A2 I
  7.     @Override% S+ K& J( k1 o; L
  8.     public void handleState(Monster monster) {
    8 s' o/ d( o( h$ V& D
  9.         // Агрессивная фаза боя
    2 q# c4 Z) V; b
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    1 X- H9 q# X* |: t4 G, P* D! s
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ( n8 e& B$ F& f7 x4 B' L! r
  12.     }
    0 P! D! R# e1 F
  13. }$ n- @" }' `$ Q5 \* a) w
Скопировать код
Класс для финального состояния монстра:
7 ~4 N  A( S+ Y) U& Q) k, g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / ]$ G: s7 ~$ ]) Y2 @1 n
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 @& ?4 a( k3 w3 U5 t( i

  3. ' k9 c- r! L: B. ^" o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 |5 o# {/ p: O8 M, i6 |' _  L" R
  5. 9 ~9 n: \( t9 V5 f; s6 x+ x6 F
  6. public class FinalState implements MonsterState {) g4 `) C7 c1 B( `4 L7 N, A1 R7 o
  7.     @Override( D# q# x  j" h7 S8 D4 g7 g
  8.     public void handleState(Monster monster) {8 J6 I- @- J# ?- X4 ?3 Y  Y
  9.         // Финальная фаза боя
    - Z6 V( _9 g. J  M. y- _. w6 {0 [
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    : l' d4 u1 z$ }6 H( _$ U4 u
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 _! M& h7 B5 f3 \: n! s# I1 B
  12.     }8 h. n+ f/ @+ I1 Y
  13. }
    7 b% C: K$ g% @* Y' ^# N9 I  H/ `& @
Скопировать код
$ R0 _: P2 q1 \4 j2 i
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ c+ z: V' H, k% k7 o. C
  1. // Пакет org.l2jmobius.gameserver.model.actor$ ]/ p6 v9 ^$ h) o: H
  2. package org.l2jmobius.gameserver.model.actor;1 @  |8 O1 _: O2 F! J) E
  3. 9 u. r3 O3 ]/ n; p7 }' n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 P' V4 K; O5 w" b, ~. ]9 U! t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  f/ @1 R1 L5 D1 X

  6. $ B& Q% e' O, ~! Z
  7. public class Monster extends Creature {  E6 y" O5 ^( A9 b7 A
  8.     private String name;
    4 E! M4 f+ n, T/ P+ `+ ]
  9.     private double attackPower;
    6 w) o; X, h% G5 a9 f
  10.     private MonsterState state; // Текущее состояние монстра* E- a' F6 J. e" U6 V8 `9 f
  11. ) G* T7 L% O, N$ N# {
  12.     // Конструктор монстра+ p4 [# m# |. Y' d, k3 w4 U
  13.     public Monster(String name, double attackPower) {" x! z6 U* d6 B+ J4 e; K
  14.         this.name = name;
    8 i) t% v9 t. I0 l3 n
  15.         this.attackPower = attackPower;3 P& t( P0 L4 _2 [3 U& [
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние8 d& c- r" U$ W2 @
  17.     }+ s( |* v( a8 C* o* E

  18. 6 l% r) v/ Q! ^7 M
  19.     // Метод для смены состояния" W; b0 O! @% h0 s6 r! k
  20.     public void setState(MonsterState newState) {
    / f% o% \% h% i, `
  21.         this.state = newState;
    9 t5 X) }" [3 V) L9 Y; [. y" A
  22.     }
    % R) ?* y) }3 T0 B. ]/ L7 x- X4 u

  23. 6 U& w& U5 c( |( Z. L5 ~) e. Z% o0 d  m
  24.     // Выполнение действий на основе текущего состояния, f, A- e8 I' U' ]
  25.     public void executeState() {3 ]  z: ]! Y+ H+ f7 R: ]* E8 f
  26.         state.handleState(this);
    ) L8 Y5 O3 ?  X, h: G8 |* n' R- r9 \
  27.     }9 @6 k  l" a2 q( I' y! K. L4 Y* Y0 c
  28. 0 d" _. Y1 c1 Q! {
  29.     // Геттеры и сеттеры0 S: \' M8 Q; ^; {$ t
  30.     public String getName() {2 j4 z' M1 G; r; X% O) ?4 K- L
  31.         return name;
    4 u  [# _/ F. R9 k; U4 z
  32.     }
    : z8 _; O' p# N( h! ?) C
  33. ) p: C/ d6 b& D. l( j- {
  34.     public double getAttackPower() {, K+ p; i4 a9 L8 K9 s' q0 r* t
  35.         return attackPower;6 R$ p. M( S$ I. {$ z5 R4 L# V
  36.     }
    # y7 V- d' v+ @+ d: h: B" y9 n
  37. 2 p# p2 n, y7 |
  38.     public void setAttackPower(double attackPower) {
    - z: ^+ j! S' r. C
  39.         this.attackPower = attackPower;
    1 p! ]/ ], S+ }* {  i
  40.     }  D+ g( h7 T$ c
  41. }3 O3 e0 H3 U, i  Y$ K
Скопировать код

9 h4 x- i- R8 ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 F. N1 u5 a8 d- {6 o% {5 s
1 x- I- _' [, v; D! {6 S4 [/ k) G, X7 V
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : {0 W/ D  b  _  Q
  2. package org.l2jmobius.gameserver.model.battle;
    & ]) g8 S% t) f4 t- B. K" t0 W

  3. 1 e1 _# b7 \4 U9 ]3 @4 V: O
  4. import org.l2jmobius.gameserver.model.actor.Monster;" r6 z# K/ y' D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    9 A& C0 D; L) D7 G7 B( t
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;% f5 [9 w0 a+ j& C) S; y( I3 x8 q8 R

  7. 4 N8 r+ l( a: f: q
  8. public class BattleSimulation {. a& h3 K$ ?. @$ W% [3 ]; c" S
  9.     public static void main(String[] args) {& `# j# C8 T* f/ J
  10.         // Создаем монстра с начальной атакой
    * w) V$ S. w" T, s% o: U
  11.         Monster monster = new Monster("Дракон", 100);+ {" I  P( n$ X; i+ V" t
  12. 9 @; J6 i: X$ @" s3 n
  13.         // Начальная фаза
    4 W: S9 @! j: R2 n. `
  14.         monster.executeState();$ z$ f+ P) ^; `3 F% ~
  15. . O' B4 D/ {/ M2 ]. N9 d- M/ h
  16.         // Переход в агрессивную фазу
    - {% B+ {; p  W8 F- `
  17.         monster.setState(new AggressiveState());
      T/ n; O% U# E1 A
  18.         monster.executeState();; t' d& ^4 v# _4 m7 k
  19. 3 a! ?6 c: X$ R. g$ S7 g: _; p0 W6 e
  20.         // Финальная фаза
    / ]8 J: N0 J' V1 r" [/ m
  21.         monster.setState(new FinalState());8 {/ E0 s; h- m/ p( D- k# m! H
  22.         monster.executeState();( T: G; n- D: \4 i
  23.     }. H, e7 m, b' [
  24. }2 [. o, Y. O$ l. I! s
Скопировать код

. W6 D$ l' `3 n/ p9 U+ PКомментарии по структуре пакетов и классов:0 g* Z+ O5 K+ s5 Y1 a, U! q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.6 ?# y  W# [% k+ P; c3 `0 L9 j6 \0 Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.+ i& _5 \! D' t% \
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!/ [0 D. j$ V9 r
+ g. P# j0 k+ \4 }( M

( Z9 S/ l# `& U
8 ^+ W& g- r- O/ A- m) k' B/ M7 ]) P4 x1 s
5 R+ ?" F$ Q; _2 B/ O2 N8 {' u2 V

) H$ w; |# B- Y$ Y: J) D) b1 @% P; Y$ b( ^
3 q9 k# i2 {$ H0 H- z: @7 G+ N
' h& }+ W; T* q" A5 k$ l( d
0 b4 `7 K6 [% A! S9 c

5 f- l* X6 [7 V# {4 p6 w
6 r/ R$ g. Z% N4 b3 b/ q. h' o; o9 D. n! C( g% ^- B. `7 v2 R0 I
/ a8 o, v5 d3 R1 h4 p* W; b7 \& T
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 r7 x- `; {* V8 @& ^
Для управления сложными взаимодействиями, такими как  ...
, G' f6 ~0 k  s
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21( |6 d. I/ d5 s4 q& k& g
Отличный подход! Использование шаблона "Состояние" де ...
: _* d0 _$ b6 W- |& T9 }
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
  n& ?  `+ f  J6 @1 a% W* A# c8 s8 d' I, {. d
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.% L- K# x4 |3 f$ b5 o& ^" `2 H

. L0 D- E: ?0 p& ~9 U
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 o% J# v- [9 i) `4 i
  2. package org.l2jmobius.gameserver.model.actor;
    9 \' N$ O+ g( Y

  3. 3 o7 G6 ?% e4 [: e
  4. // Перечисление для типов атак
    " s: [6 A  |+ J* I
  5. public enum AttackType {' R/ |0 F% S- f* u8 A* {4 |7 }" {
  6.     PHYSICAL, MAGICAL;' a, x4 E: J0 @9 R$ a
  7. }
    ; h9 P! {$ |- U4 A$ s! S
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.+ f" X8 j" }$ J9 {* P
Обновленный класс для агрессивного состояния монстра:+ ]' \& n* F. U; b4 D+ a' ~# x
$ Q4 {* X4 a7 o) D$ _' V5 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : I' Y3 p/ N/ I$ n% k
  2. package org.l2jmobius.gameserver.model.actor.state;! l$ ^8 i/ T# _; e; r& Q
  3. 7 y3 E. l9 h; c$ Q/ }1 ]% o
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 N$ A* R0 }4 ]0 e
  5. import org.l2jmobius.gameserver.model.actor.AttackType;! J. n  h' w. u& Y
  6. ; N! @0 F7 ?9 G6 a) r3 [4 R
  7. import java.util.Random;
    ' a& D1 B" Z  p; n
  8. 8 s( s/ R6 \7 J1 B" ^  S+ v
  9. public class AggressiveState implements MonsterState {" `) }& h: b2 Q
  10.     private Random random = new Random();
    % B5 ]& B. c* U; K$ j! W7 K

  11. # v( {2 W: D# q7 }& v5 C8 T3 t: a
  12.     @Override3 p6 }  ^  K- U$ f
  13.     public void handleState(Monster monster) {) t: ^) [9 O' D1 t, I6 T
  14.         // Выбираем случайный тип атаки: физическая или магическая8 f6 W( G( W3 J8 }4 v0 _
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    + d, v1 r4 t) U$ f! w, q7 v
  16. 7 X& t6 `+ o* ^! E
  17.         // Логика для агрессивной фазы боя* v# c) ]# N( u( _; A) h, S9 I. c
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " + l8 ]8 Q$ Q; y, j3 z9 Q. H, ^& z
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");7 o# V! I4 S4 @; z- U" \. R
  20.         
    0 R4 X# \! l  z( B, [/ t
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( A$ M3 q) K0 R. Y$ b: V7 S) G9 |, N
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;5 K6 s5 A5 T, K! O! {' z- c, o
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);; f! o1 C! H8 j5 S+ }; s7 F9 n0 d' \
  24.     }* Z- @  r8 _5 V+ I6 {+ a. ?
  25. }/ P3 D9 k+ o* S# r- X
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки" W, M+ I# k! I( l1 `# p
! l$ ^6 n$ D1 b3 b4 A* Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + L, i' W. L& [- P3 T# R$ t
  2. package org.l2jmobius.gameserver.model.actor;' D: q! X8 Y/ q' x( s

  3. 1 z3 T( }$ ~- y8 v
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 X5 M% |* O8 X* R8 ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* U' Z) [5 p2 m7 C; h6 C

  6. ( c8 b7 b' {9 Q7 j+ B6 C7 z
  7. public class Monster extends Creature {; V1 y$ r1 O0 z/ G$ N& y* {9 g
  8.     private String name;3 R2 D% A$ t  r2 I% [' w
  9.     private double attackPower;! D! F' ]  [- ]" Z+ n
  10.     private MonsterState state; // Текущее состояние монстра
    $ i  R1 |( `4 S4 }, x6 E3 z
  11. / Z7 S! s5 a- Z
  12.     // Конструктор монстра
    2 @" W7 k8 k$ o4 C! n9 C
  13.     public Monster(String name, double attackPower) {
    / G# K# d  P+ r/ Z4 x
  14.         this.name = name;& G/ C, d0 @$ X, k, @( W
  15.         this.attackPower = attackPower;5 c& v& ]( L- E
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию/ w: ]2 g- i" F1 O0 r" H- Z2 \
  17.     }# u3 O5 F' Q- S  V" y  G

  18. 5 I- t0 P* z6 ?0 ]  b/ C
  19.     // Метод для смены состояния3 d* G$ d" x/ ^' a4 Y" t
  20.     public void setState(MonsterState newState) {1 P1 e$ [- ]6 J9 p" A( e# k
  21.         this.state = newState;
    5 E3 y7 P- \' F2 b' M( D5 F& S) C
  22.     }" g8 r! W$ ?0 d8 s

  23. , h/ m" z7 V4 h/ [
  24.     // Выполнение действий на основе текущего состояния
    1 M  i& Z" H/ E+ W- `- l
  25.     public void executeState() {/ C# N0 q2 O8 N
  26.         state.handleState(this);  i$ ~7 p. B, f7 }1 o
  27.     }
    9 L- k6 P! z/ _5 l4 f& f
  28. , [" b- P% h) T1 h% `5 v6 ~
  29.     // Геттеры и сеттеры3 {4 g' y. F9 G4 c/ i; S6 A
  30.     public String getName() {* d! |/ i6 Z! c& t1 L$ N( _
  31.         return name;
    1 ~3 p* }5 t. _5 Q  B
  32.     }2 H. y9 }* S& x9 |2 C

  33. 5 L: s$ m) P$ C5 }' c& ]
  34.     public double getAttackPower() {  O7 |4 _/ h3 ^
  35.         return attackPower;! c0 u6 `7 v- r. W4 ~, i
  36.     }! W6 l+ U) ]' M

  37. * X0 J% ]3 j' }3 ?; X) I
  38.     public void setAttackPower(double attackPower) {
    & \- k; @' l% d- d3 u
  39.         this.attackPower = attackPower;, v' c1 o- l) \# r# n8 Z
  40.     }
    ( C( Q7 w! r7 h# }6 G0 e
  41. }  [: [" U* H: U  s# M$ J( @
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
( |% Z* P! l9 b7 {" [# G/ k, O
7 I# b# N1 w$ ~5 I) X
  1. // Пакет org.l2jmobius.gameserver.model.battle
    % ?7 J4 z5 T3 x% C
  2. package org.l2jmobius.gameserver.model.battle;& S0 v. Z4 `& r" C  a' |
  3. ! U* g- y+ t2 L: K# r9 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;: {* V6 N, L8 O6 T, b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! n% `- O" [) W5 }0 U* G+ ]

  6. 7 Q/ G! ^" G0 e- H; b
  7. public class BattleSimulation {* |; S" B2 K; t" }
  8.     public static void main(String[] args) {
    ! U1 I5 }- q+ g4 j7 i
  9.         // Создаем монстра
    / S! a/ f7 P9 o! ?
  10.         Monster monster = new Monster("Дракон", 100);
    , O  q( ~- o' Z% Z9 l* f- w
  11.   Z- _9 ?8 @, {/ ]- {) R' M
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    3 Y% k3 \6 T; h
  13.         monster.setState(new AggressiveState());- m6 Q- v2 f4 Y( \
  14.         monster.executeState();
    ( S" b: [4 F% C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    + l/ e7 }: j) K0 c7 S5 {
  16.     }
    + f. F2 T. h& ?9 t
  17. }
    * t. h5 H$ E4 m/ l7 T1 T+ S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.1 S( Z& C' K" X$ u7 |
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
& _1 e' R; X+ K: O
9 H, O$ |) I; p
+ q; R% p: `- H% _
# D- T2 _# `" s# O
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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