Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
$ l! l# W- r9 F2 k9 B7 }. X) L3 g6 V6 S9 t2 d) m+ ^* N7 e

  Z8 t$ l- L2 R# r9 vЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
" q" M% {+ [' m; O" A% c; A1 \Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!, E( y- P9 R1 O- l) k
Астралия ?. t' y) M+ c6 R( B& c
# L! F! S7 ]) {3 z/ B6 V$ j( S

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!& F+ O( {3 g$ A) g
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
3 o) |- k0 e+ C" L' d  v3 ]- h
3 a4 L  o# O" [5 m/ i
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
8 ^  |+ r) T" X
AlexCoder опубликовал в 2024-10-16 18:31
4 T  l' u- K+ O0 e; V6 bДень добрый!! p$ n5 e, y/ f( `
В статье описано взаимодействие игрока с N ...

: a( x( ?. Q. ?7 [  H" |' @Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 f/ a  F  \" U4 j/ W8 ]" ^4 M0 R: D% P' ]1 b6 `
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ Y7 s4 C$ e' h" f3 ]
  b+ R4 t3 j) ~. ^* f- M) pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- W1 e4 L* ~0 Q, p
& u  z7 m+ m& A, [; T- c
  1. <font color="Green">// Пакет для состояний монстра</font>
    ; q* H/ x* c4 C- Y
  2. package org.l2jmobius.gameserver.model.actor.state;. ?; T2 b1 m" Z/ v( A
  3. <font color="Green">
    ) z8 A- C/ [% J/ u4 D1 ~; @8 z
  4. // Интерфейс, представляющий состояния монстра</font>
    - a; \% h! }* q: s
  5. public interface MonsterState {
    8 i2 A2 A+ [1 M1 T# K2 q* y9 ^
  6.     void handleState(Monster monster);1 z6 {. o$ y  w
  7. }4 a$ r* H; S* x/ O3 M
Скопировать код

5 S: ?3 q2 x% N9 V2 X% S3 lШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. r/ B+ k( m1 ]& d3 _6 O

% r( X( f4 h2 g. \2 e, z4 xКласс для начального состояния монстра:
7 `% O; E; ]/ X+ K5 u3 \- w
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ' n7 h0 |3 ^! `) j
  2. package org.l2jmobius.gameserver.model.actor.state;0 i7 L  M& ]( ?
  3. 9 S5 M+ H+ V1 j, q$ m) L2 A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; M4 K  {; Z$ u, q6 b9 i
  5. ) b, A1 F; G( Q! c
  6. public class InitialState implements MonsterState {
    7 X, {% V8 M2 a
  7.     @Override
    : Q' e; F8 @4 u7 R" }4 b! z+ d
  8.     public void handleState(Monster monster) {+ X& X4 [' v. p  \' C$ j* Z
  9.         // Начальная фаза боя9 A# H. N6 A; `( d8 y' Z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 _+ n0 B3 g4 l3 b5 V
  11.     }/ Z1 g6 G, y8 Z, S. o! j
  12. }
    ( O  f, q  G, Z" B
Скопировать код

7 }. H! h0 h: ?; [% a
8 x0 p9 T3 Q5 A* Z9 l+ I; @4 ^- T1 a* x% I3 V
- w  u  ~! {) y4 w/ R* `, Z5 d6 u
8 C, o5 m/ p8 d7 l4 X

% Q! Q- W4 W8 w/ T5 K
) a& C4 d, ~" p! r0 v& ~' ~6 `: M
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 ]$ j4 c) M5 N) k+ d
0 D& t4 I' r! E6 k* T. H
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) `6 [8 H8 f6 H+ N/ y+ U( b
7 P, K2 Z& W% A, oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( Q; F8 x$ d+ i( N, a: K. F- j; F4 K! _7 E6 f  s8 O1 ^" z
  1. // Пакет для состояний монстра
    # `; p! x# \4 [; E! j3 k! v- t
  2. package org.l2jmobius.gameserver.model.actor.state;# ~0 i, G: [3 b# b% h! ^; o# u. `

  3. 4 A3 x+ R6 }9 l* x
  4. // Интерфейс, представляющий состояния монстра* X9 P, e, E, b- `
  5. public interface MonsterState {
    ! i1 k) |8 |+ ~! C0 N
  6.     void handleState(Monster monster);
    ! X4 D5 f3 f0 N* ~4 o# X' r, i* S. @. v
  7. }
    1 @* C* u  r  u+ _0 K  ?5 s
Скопировать код

8 j4 N+ _3 |+ D$ n( Z$ T4 @3 c* QШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ! x. F  Z% k! b4 c# b( e

+ Q" h' D& ]5 [  p. ~# R3 F" OЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.6 z; }8 G3 f- e& C+ ?( ^( Q0 ?# ~6 B7 c

4 D# _& r5 t. mКласс для начального состояния монстра:
- U, }7 u2 W" H1 K5 w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 n! U; g1 W% K* H
  2. package org.l2jmobius.gameserver.model.actor.state;
    % n* X  i* H$ n( d9 O7 e
  3. 6 m3 b/ ?/ g8 N7 \1 o
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 ^7 D  \! U) D
  5. : y2 B- `2 p# W- J! I  J
  6. public class InitialState implements MonsterState {
    4 W0 O4 A% _) x/ T1 n+ U
  7.     @Override* T6 E1 F( g# c5 R8 m0 S/ E3 d
  8.     public void handleState(Monster monster) {- X. K5 x+ G. M1 \. |
  9.         // Начальная фаза боя  C! w5 V* {% h) q: J2 _4 i' u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, R% ^( r( {6 r1 n) a8 x, e% q* T
  11.     }& a( O. M% v8 e8 ?
  12. }
    / q% ]" R5 A% P, o$ ]
Скопировать код
Класс для агрессивного состояния монстра:
5 y5 C3 H; S" M: y8 m, w8 |, k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state+ J, u; y2 _5 D5 q
  2. package org.l2jmobius.gameserver.model.actor.state;
    + e- y. V( U$ E

  3. 7 U* G! `, c1 o9 e; O# Q) n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . l; m3 R6 H' [& i

  5. / h1 }9 b2 c2 G* U$ K
  6. public class AggressiveState implements MonsterState {: u: W0 K1 |' F* S! P  G
  7.     @Override9 A( ?( D9 `& [1 V+ g6 s# }
  8.     public void handleState(Monster monster) {
    * [5 `+ m  y+ {  B' ~+ D0 p
  9.         // Агрессивная фаза боя, [8 o9 V( B8 I
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 Q5 F! X8 R6 @7 q/ @1 @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    5 l( y: @* F7 |
  12.     }
    : [  }! [& a) r/ ]$ X" A( B
  13. }$ \5 W0 R5 }& T$ ^/ f9 r1 B
Скопировать код
Класс для финального состояния монстра:- V' U: q$ J/ _2 l2 s' X8 \' |: D, j
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 N# l5 ~, a- V! q- i% y4 I4 C
  2. package org.l2jmobius.gameserver.model.actor.state;/ m0 p) j4 v* U/ w- Q
  3. ' P7 H; k! ]5 z+ u. J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . F7 Q( `: Y$ L" d  |
  5. , ~6 Q  P$ x7 |8 w' K. T
  6. public class FinalState implements MonsterState {& q5 O2 ^: Z- D# Z; o
  7.     @Override+ @: ]: B/ y/ I
  8.     public void handleState(Monster monster) {" r7 f! p7 M- T! e0 X! p7 s# v9 H  m
  9.         // Финальная фаза боя
    4 J( d# t1 ?) R8 r/ U: F& v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ( i4 _4 F) }2 [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки7 Y6 J5 d( Z/ n" o# H( j
  12.     }
    & X- P+ h7 d. w# T, H8 B
  13. }
    : M0 {6 R' x) H  ^7 E
Скопировать код

' E$ K7 b8 {8 k" s  {, qШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; Q, X# t9 o+ q3 y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 }7 Z1 [$ L6 b2 E: m$ y/ J
  2. package org.l2jmobius.gameserver.model.actor;' H. m$ b$ P3 @9 {: t: B
  3. 4 Q9 C8 k- m9 E. q0 v: p6 k/ k
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;) W2 f5 i( H3 V2 y/ y) |  t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;& Z: K" K/ J/ N3 p  }6 ]

  6. 4 ~% |) C+ {2 X4 Y) s" x, M8 b; n
  7. public class Monster extends Creature {
    ! J$ }$ U/ }) e8 i( j
  8.     private String name;2 Z; Y$ ]8 V! }" y+ ]
  9.     private double attackPower;5 C( P# P% e4 V
  10.     private MonsterState state; // Текущее состояние монстра
    . f; C; T: V5 A" X3 r+ |! T

  11. 9 A4 L$ u2 a0 B7 v' x2 }
  12.     // Конструктор монстра$ F6 G7 K. }& I# W! V7 L2 z
  13.     public Monster(String name, double attackPower) {' B- d& w% t8 K( \
  14.         this.name = name;3 k, o7 K0 W! N- I5 O% Y4 A: z
  15.         this.attackPower = attackPower;8 A' `  u( g' M$ O5 d
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние8 S! Y& F( t2 [" {/ x
  17.     }9 F3 g- \6 y& ~& Z; P

  18. ) Y/ x6 b0 ]  q
  19.     // Метод для смены состояния
    & D6 _6 \2 g, {3 C4 n( i1 p
  20.     public void setState(MonsterState newState) {) ?3 `+ g) X0 ]0 }* A3 n
  21.         this.state = newState;. d  o* P; n; j
  22.     }* A) O% K7 e0 i$ _% F
  23. 2 y6 ~5 [1 L) K- S
  24.     // Выполнение действий на основе текущего состояния
    3 a1 M3 J* _  x) E; P* N9 {
  25.     public void executeState() {3 K$ [/ V# f2 J
  26.         state.handleState(this);
    6 l* N; K% k6 D- x
  27.     }0 g3 Z' k9 @' t& G) `: |8 ^

  28. 6 h# N- q4 z6 c. |) j8 d
  29.     // Геттеры и сеттеры* S0 d5 `* A# D. T5 I5 j- t' L& R
  30.     public String getName() {
    ) s/ b5 S9 N1 s6 G. n  y
  31.         return name;
    8 x. L* @6 ]0 d4 P+ h
  32.     }$ }6 g) ]- n9 C2 u: ?4 L
  33. 5 ?2 _, [$ A$ p+ E7 u' w
  34.     public double getAttackPower() {
    ' T" Z% [. H" b* U  l  }
  35.         return attackPower;
    2 F9 x- q1 L3 m; z# O
  36.     }
    / o/ u) Q0 w+ T8 d. Y$ q8 Q$ Q& S

  37. $ \" D0 H+ w4 x
  38.     public void setAttackPower(double attackPower) {# `! S6 G6 z$ L1 w  |
  39.         this.attackPower = attackPower;7 @6 x6 U1 n6 b1 ]: i+ l
  40.     }
    6 }3 K. W6 l, f# N
  41. }
    , o0 @+ y& Z, p0 c- S
Скопировать код
6 M2 }: O3 m/ m2 O- q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. u+ i! Y" F  f
/ o0 N' {- A: l4 d
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - B3 r. `! `, V* n) \2 u! j
  2. package org.l2jmobius.gameserver.model.battle;
    $ @% q( q7 B4 {: i! }" a

  3. 1 v* @/ T9 W# H( z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & Y6 G! _# a) r  s: i
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  \& \, ]$ }: _- P
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    5 m3 s3 ^* ^* g) I* ?
  7. 5 n, w; E" ~/ p, F/ j% Y6 L
  8. public class BattleSimulation {
    - B" Y2 {$ `/ o; Q1 y$ L4 H
  9.     public static void main(String[] args) {
    ( `) Z+ c8 \9 J2 ]7 X, k
  10.         // Создаем монстра с начальной атакой, G0 W/ U% P3 z
  11.         Monster monster = new Monster("Дракон", 100);0 ~  ]& D: d" U, y+ k' o& d0 u

  12. & G* u$ j7 E; P1 }: a; D1 _
  13.         // Начальная фаза/ Q( F; _+ u2 z+ t
  14.         monster.executeState();
    % M8 V* f3 J- T( ~( A& w! }9 _4 \, W

  15. ( d0 x. `. c! ^7 m' |
  16.         // Переход в агрессивную фазу
    ) A  `  I# ^* e4 a
  17.         monster.setState(new AggressiveState());6 }2 M" C( C. f4 p' I1 o8 {( Y4 B) h; i
  18.         monster.executeState();
    ! u3 p$ \1 T, ]4 X

  19. 5 h; s- }3 b8 H" W1 D& `  [
  20.         // Финальная фаза
    % i$ D8 T! ^  B2 {( y
  21.         monster.setState(new FinalState());
    / a1 j, Z- Z* X5 F8 @1 I
  22.         monster.executeState();
    9 E  x1 Y6 j( ^3 ]
  23.     }
    ) J8 b9 K( c) [3 T! P4 Q% a( K
  24. }* z4 b* [& z' ?: s0 o. n" M" h
Скопировать код

1 P9 c& H, @! ^: N) Y" pКомментарии по структуре пакетов и классов:
0 R, h8 K/ A, L1 L. ?
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ( H/ G5 E4 I  @% Y: g
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! p8 f" M* i& rЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
/ ^" e  y% H% t' L% j+ @! I# a) r3 c, g1 P! Y6 o

6 r9 S: o* W+ G' D! Q. t: m2 _/ o! M$ `2 ?( }
) Q2 g: A, |, e. c4 b5 v* T* p, w
  x% Z+ W9 m* Q' N& x; I
. B+ B/ C- J/ c; W7 s
8 K4 C/ h8 N$ V$ U$ i

  A& u4 u$ N& ~. T1 E) Q% n* \; b6 E
7 F) T: K/ z& t1 o# o' z

: n* A  f* X* ^1 D9 ^. S9 R1 c, G1 R2 _$ J2 z- S, |1 [, z. N$ A

- _! `+ f6 f: I$ C8 f1 A) w
; X, _; p4 f2 V0 x; L3 N) J
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
( n0 |& [- k2 x* Y3 y* y9 `& NДля управления сложными взаимодействиями, такими как  ...

# S9 z! W4 o0 A+ \Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:213 ]) L, |4 C2 u9 V' L6 \& \
Отличный подход! Использование шаблона "Состояние" де ...
4 ^4 V& v7 F4 J. c9 H9 T7 ]8 A
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" y7 w" k: \" `/ V1 |  U5 Z2 B3 ?  [5 y3 ]9 q' y  b$ B
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
7 U. U+ }, G9 G# ]* U+ y& }
  l& P, T6 w6 k
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 U6 b4 A; h8 z* P2 ?
  2. package org.l2jmobius.gameserver.model.actor;, _8 @& h" ^2 x- {

  3. 2 K" q+ U& T8 y* p9 o
  4. // Перечисление для типов атак
    7 G% }4 ~2 \. Q# w1 ]
  5. public enum AttackType {9 N3 a6 i- o7 F6 U: z, M$ k* M4 A6 p
  6.     PHYSICAL, MAGICAL;4 B4 p: k! d* K5 m  d+ y. {& [
  7. }
    * Z4 V" c: z0 Z
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.0 q8 v+ l; ?) y) t% ?
Обновленный класс для агрессивного состояния монстра:% |9 ^6 R" a. f# c) Y5 i
4 C) U8 e- Z" Z# Q. D) ~2 ^- B; R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 b9 L' O7 D: h! j1 ~4 d6 d% ~$ a
  2. package org.l2jmobius.gameserver.model.actor.state;3 j7 o, z7 w, t8 k' b! x7 B

  3. - t8 B3 [/ Y  g+ p# o/ p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 P# d) y) B. p- J- T
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 r2 e1 w4 p( E! @" [$ L

  6. 9 Y+ F* N8 O9 I
  7. import java.util.Random;" S4 r# J5 p% x8 s8 p
  8. 5 M) C, \* i7 C9 }
  9. public class AggressiveState implements MonsterState {. W# V  a- ?. b7 n0 i8 k8 F% M9 e1 C
  10.     private Random random = new Random();3 W4 ]# |' ^) m' T( O
  11. - ?- u& v9 h7 C7 i9 F
  12.     @Override
    " t! V* z- C) @. K. i1 f8 k2 w
  13.     public void handleState(Monster monster) {
    9 w, s4 |. \( B8 _2 N9 d5 U7 E
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; m7 i( Z! |, T, M* r/ E& Y
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;% H* L- q9 V" S* W+ \8 a/ U0 V

  16. 0 N+ p& D5 I& X- e  [, b% J# N
  17.         // Логика для агрессивной фазы боя
    8 i3 f, b9 X$ j" O. S% q4 e7 u
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    # y" X" V; _" B# D, V' @$ U
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");6 _6 Q( d4 `2 \3 h
  20.         
    9 d6 L; H- G# m* W% W2 B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    : p& R6 A& Y8 E7 {) x
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;0 I$ q2 d3 k, j8 S: O
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);1 {! J: n) s) r4 M. F
  24.     }
    2 L% A$ `3 X) N3 I3 I9 W
  25. }
    4 i+ L" X. |" O: u( a
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. d/ w2 N' Q: z. @/ [, x
4 M' r# p. z5 H1 a5 c1 k1 A, D
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 ^! C+ ^; A- Z
  2. package org.l2jmobius.gameserver.model.actor;2 B8 J: g) @8 m

  3. + v) V2 x: `$ c% e
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & v  m6 ?' P- m% D0 R& a
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- z& D9 d8 {( n
  6. ; G, \0 |. f0 B& d
  7. public class Monster extends Creature {
    ! c7 u7 C0 A# g, |
  8.     private String name;+ z9 a( c- _2 H3 r* Q
  9.     private double attackPower;& P3 r- W7 Z4 V( v( B
  10.     private MonsterState state; // Текущее состояние монстра5 K& v2 G* \+ |

  11. + B" g) ?' G$ B( _) [$ e  Z
  12.     // Конструктор монстра
    * L3 S4 L; c/ T- }
  13.     public Monster(String name, double attackPower) {
    ! D% l9 }& y! ]# q" |, o5 N8 j; p" t
  14.         this.name = name;4 i8 M( U1 H/ b% L! ~; Z; [8 `
  15.         this.attackPower = attackPower;
    . g( i+ m* C: I1 K7 T
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию7 D/ C+ i3 m+ ~, f& u  {
  17.     }
    # m+ x; F8 ~8 Q6 B% F0 ?& \
  18. & P6 q% Q9 N  u1 q
  19.     // Метод для смены состояния2 p$ }( _4 g4 K  b1 b+ N1 T
  20.     public void setState(MonsterState newState) {; t  f. a. c) ~0 L. X- v8 q
  21.         this.state = newState;- |+ o' [; [3 g4 w7 n' e  _1 j
  22.     }
    % O  o2 Z* l' J8 s4 K! C& c2 m
  23. ) q1 }' W  Y7 ~, H) I
  24.     // Выполнение действий на основе текущего состояния  j: I) ~9 P* t
  25.     public void executeState() {
    0 w; ~$ k, U" d6 t
  26.         state.handleState(this);
    ( S$ ~9 G) `$ j7 [8 h
  27.     }
    & D) v7 y" U& _) I; u  V

  28. 8 w1 ]$ B9 j* l0 P
  29.     // Геттеры и сеттеры- h; Z' {) a8 K
  30.     public String getName() {) a: W/ w7 ?! }3 R3 R% k3 J* n; g" w
  31.         return name;5 U+ S7 L5 J1 v8 W
  32.     }
    & A2 |, `5 t& P8 N& s6 E7 L, B" @
  33. ! a  `6 e; M: U+ |9 I5 S
  34.     public double getAttackPower() {
    ( M+ n2 K5 _( j1 N6 a, \
  35.         return attackPower;
    # U5 k) x0 }& _. ^
  36.     }, B, {( w* |4 A" ?" D

  37. ; S5 b- C  N$ l; E" K  v  r* G: M
  38.     public void setAttackPower(double attackPower) {8 O4 w0 n4 J5 U) t- K
  39.         this.attackPower = attackPower;
    $ z0 U/ A3 v+ L0 j4 z
  40.     }
    & C2 Z# c4 J1 ]- p
  41. }
    $ B; _9 p! k# {7 c
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.% |6 V& \6 |' k2 O$ g2 z7 ~- N1 v5 Z

  _# p3 W4 j1 {2 O: A- Y8 @5 X* Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ( Y( a, p2 a- O# z
  2. package org.l2jmobius.gameserver.model.battle;# Q+ H; j) \6 A. A5 S! E

  3. . F& C8 [# }4 k9 ^- D
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 I2 e: }( {$ n& y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! @& F: N1 U$ @
  6. 0 J. p* t# h5 K6 T- H; `0 z
  7. public class BattleSimulation {" |4 y6 o3 K: I6 v& {
  8.     public static void main(String[] args) {7 `) H, t* t% t! G3 L0 \
  9.         // Создаем монстра- i3 i1 ^/ _2 P" o7 O! W. w1 _! t7 f
  10.         Monster monster = new Monster("Дракон", 100);! V% m5 Z+ H6 a' t: _8 i
  11. & L7 L' C. t+ S% s
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( A$ t4 F  [9 s/ E* f# [; X' l9 h
  13.         monster.setState(new AggressiveState());3 U# p  p+ Q. ~
  14.         monster.executeState();
    9 r4 h; s5 y9 g* N; T9 M
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 J! g3 j' A, s0 g6 w$ ^6 q0 j; L- F
  16.     }* ^9 \9 f% Z0 ~, d: V
  17. }
    # P9 D$ F& R6 b% T4 ^
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 b( T9 i. P' n, P( A: }
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!! I6 ?& f9 i' L0 _" D

2 {% @$ m% Z) o1 @2 Y
6 ^( |* t# C* y# E- }$ q; t
9 h9 L( j& e. G5 x8 i
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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