Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!2 i) v8 O* V& N. |5 e

; k$ m- Y8 ]8 ^* y/ z5 `5 f& N

! R4 C, u# I1 nЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
6 w4 \* j! U. F, S1 z# ~  [# @Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!0 k! [  j7 R, e  ?  |* j: b9 E2 @1 }
Астралия 🌟& F/ I% f3 w9 Q2 m7 u& N% d

# {1 a* p7 v0 e

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!/ @% J7 n' \1 Q) h3 v7 N
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?8 A. Y: v' q0 h- i% w/ o/ j" P5 k6 ^
# h$ a3 t7 j0 t. T
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 6 W& B: ^0 F; _
AlexCoder опубликовал в 2024-10-16 18:31! s) D# \4 U4 Z, H0 `
День добрый!
0 y( o; {9 ^+ v$ }В статье описано взаимодействие игрока с N ...
# o, ], {8 b4 \/ q- `
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 6 C8 Y: ]" K8 F7 u

9 R5 b) {1 r- _2 Y# R9 \9 LЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; N! y% {* E# n3 O

7 y9 ?% h" Q/ X' sШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 j3 L4 O* B9 S1 W( O8 J

. N/ v9 d0 S" B3 q6 K3 ~% {7 K' [
  1. <font color="Green">// Пакет для состояний монстра</font>2 F, E( l6 P4 E# W% |8 d
  2. package org.l2jmobius.gameserver.model.actor.state;0 l0 Z* X! b  [& V. c4 b1 I# H* Y$ Q
  3. <font color="Green">0 L% ~, }- I8 ~; Y- B( G: |
  4. // Интерфейс, представляющий состояния монстра</font>
    # b  G7 P7 I0 g, ^
  5. public interface MonsterState {
    ( c3 ~. S* F- `8 F1 j
  6.     void handleState(Monster monster);; [" r, N' I) E/ F9 u6 R( o0 `# K4 E
  7. }2 b2 t4 G$ Z. L  ^. n% I3 r
Скопировать код
; F& j- l6 M& \* S# D
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
. T1 D# m. A  u3 V1 g+ H' I. ^! z- O$ T$ H" I3 q" {0 \/ `
Класс для начального состояния монстра:) t; W2 ]) g# t% z, w/ {. ^" ?. l
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>9 I& J( {' f5 l2 Y3 _
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 f, C  i% f  u+ q$ i

  3. - s  Y  ~; j7 J8 c: G8 W& I" F8 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;% Q& Q  c! j% e( @3 m! t

  5. 2 y; \& M! X1 m8 M$ q" K
  6. public class InitialState implements MonsterState {4 n: S4 s5 Y. A7 O6 ^
  7.     @Override+ y2 h& k7 s; I8 \5 |" D3 a; m" U
  8.     public void handleState(Monster monster) {# x3 \$ d3 T! J# L* y
  9.         // Начальная фаза боя
    ! Z$ B# M" }5 R2 v
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    $ \: ~6 b  x% O8 Z# M) W
  11.     }
    ! Q0 t! s( _1 j$ O  Q
  12. }' r7 w, Z# s' A
Скопировать код
: v- R! E# k! s3 K% J

- a7 ^: g; L! j+ X" h
9 }  E' v6 O; @$ |) d# Y" z* f: C0 w# V! ?

: v) K0 M+ r" c8 B* w, L# B5 W4 H% P* y' v
0 U/ u- s( H5 O5 n0 z
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" a" E; w+ e2 ~& q0 g) `. D* R; S# l+ {7 o6 u
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  C- B8 R' |' b

+ x5 m( K. \2 S! o% B4 oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ r8 {$ r; ^: I% m4 J& q0 L
2 M" Z. F) p3 B2 |
  1. // Пакет для состояний монстра
    + b: b" _. P& Z. T
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 {8 x8 i1 F5 N' ]- p+ R* n

  3. 3 u+ c+ R3 W7 p# S9 Z/ v
  4. // Интерфейс, представляющий состояния монстра
    9 O0 l  @) D- r: L
  5. public interface MonsterState {
    # k" c6 t$ f' @5 K# T# n
  6.     void handleState(Monster monster);+ T- L+ {7 n4 m+ W6 f3 @
  7. }( D) C5 S7 A5 N
Скопировать код

! O" N' f1 `& P+ KШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
0 Z1 s& b& ?* ~4 k8 a7 i1 t, q1 U' b* {
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 q$ `4 `2 d8 |: G2 P4 E# _
% @2 x6 E4 u$ f4 Z+ g
Класс для начального состояния монстра:- n4 x, c% l, H0 N) b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 _# b" V4 d" g% r8 k3 K( b
  2. package org.l2jmobius.gameserver.model.actor.state;) m1 R3 B: J8 B) Q4 c% {( s' g7 h
  3. , |; ?+ m% L! r  r- |3 F' ]  Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;- b% V, t% K/ j/ A  h, e
  5. + D1 M6 P) @" `  w
  6. public class InitialState implements MonsterState {" y' {& j3 L5 D0 j- g7 [% H
  7.     @Override
    0 F& `, C" m- a1 _
  8.     public void handleState(Monster monster) {  e# v5 ]& E! o  r3 v( I1 q, f5 D
  9.         // Начальная фаза боя* L) r3 S/ U0 `2 w
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 D+ z1 A8 P" o4 c/ C7 d
  11.     }
    ) \0 D1 u5 ^7 ?
  12. }
    % D. R4 l$ t5 a* Q  F, m, h
Скопировать код
Класс для агрессивного состояния монстра:
" }. M- ^& h7 h9 h2 m; o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ c2 Z% N$ k& ]4 r+ X
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 j; y- Q% p- ]/ _. D' ^/ Q7 k4 ^  g

  3. $ f  c, [: \1 \6 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - d! C6 n4 ~0 G" U' k

  5. : Y# V7 u$ w6 ~+ ^% l% j0 K
  6. public class AggressiveState implements MonsterState {
    1 _2 ~; _# r& T$ T
  7.     @Override
    8 i, P+ Y& Q3 M
  8.     public void handleState(Monster monster) {4 g5 `7 f4 W0 C$ U  ^& m6 O- p
  9.         // Агрессивная фаза боя
    ( J% R# |5 h( H; E9 P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 I5 @5 s& G3 a" W% i1 x# g1 p
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ) }" o! y/ f; W. `
  12.     }6 ~. l: ^4 M4 v, C8 m" Z
  13. }, B' j: y% ?4 E4 L! A" ~- @1 ^8 ?/ {
Скопировать код
Класс для финального состояния монстра:7 Z$ P# B8 Z, W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, s3 T% N6 G: G! u' E
  2. package org.l2jmobius.gameserver.model.actor.state;
      @4 {" T4 _: ]% m1 G0 m( M

  3. % S# x& f$ i; H9 M7 J2 r9 y- i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' h$ f( G& k0 B* R2 s2 r

  5. ; e# B6 ]: M; M1 w8 O2 i& Y
  6. public class FinalState implements MonsterState {
    9 @1 `) k; t0 e9 M1 |
  7.     @Override: ]3 m4 I) J# ?6 ^8 d0 D" ^- j
  8.     public void handleState(Monster monster) {; f) E+ t) j' ^+ g0 C
  9.         // Финальная фаза боя
    $ l5 Q/ L* G% y! I5 ?1 m: J$ W3 ~
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");) Y2 I3 V& D1 E6 }" A4 `
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки, ?, G5 U7 @/ l, C
  12.     }  X9 w. V% |$ X% T. N5 l0 G
  13. }
    4 i8 z( ?5 k$ ]- u' z4 f7 Y& w
Скопировать код

' P, F' A3 S5 \# W8 _Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 \& S7 c0 g& P* o7 v" k
  1. // Пакет org.l2jmobius.gameserver.model.actor, K- Q6 t$ Q, B0 H" U; T5 b: i9 _* f9 K
  2. package org.l2jmobius.gameserver.model.actor;5 |- Q0 y* x/ ?) {0 o

  3. # k, u: K: o. d
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" f" y! _. Y1 r( F, [4 I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 d4 s, R+ [0 z/ P
  6. ' m. A, z/ I1 T1 ~
  7. public class Monster extends Creature {. H: O% S9 q5 P+ T  R7 ]
  8.     private String name;3 r( x1 q  L  |, f6 Q4 }
  9.     private double attackPower;
    $ i3 k, W! C5 b' K
  10.     private MonsterState state; // Текущее состояние монстра
    : [0 E. y( B. `/ D; t' H/ f
  11. ! G! Z& Y0 [/ P/ v# @% E1 ]) Y
  12.     // Конструктор монстра/ L8 l$ P9 P; ?! v  F
  13.     public Monster(String name, double attackPower) {/ G2 q- B% F$ P; k* U
  14.         this.name = name;& z" G  d& C. ?- S" j; H+ i! @
  15.         this.attackPower = attackPower;/ V( y4 F" d! I
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 I; N6 x% z8 I% E) A2 p# y& l
  17.     }
    ' ^3 J8 @/ G( l: f4 V; v; f
  18. 5 ^. m. y  P9 j* _! v! @& |2 Y  d: p
  19.     // Метод для смены состояния! p' K) x' J+ K7 V0 ~
  20.     public void setState(MonsterState newState) {8 n/ P# M6 @; A7 y
  21.         this.state = newState;4 Z# ~& U: `- w6 e% W) z: A  |+ U
  22.     }
    ) S; c7 P7 {$ N- F/ y
  23. 4 f5 g; n6 ~& h- a: V  R+ s
  24.     // Выполнение действий на основе текущего состояния# V4 s7 ^7 f4 T/ l% G# N
  25.     public void executeState() {. G0 K& g/ e- A
  26.         state.handleState(this);
    7 |. U) [( @; X' s
  27.     }
    2 n6 {# K/ u, m9 y7 U8 v$ _! a/ V$ g

  28. 9 I6 b- Y: l% |9 ~! c8 \; f5 }( Q! ~
  29.     // Геттеры и сеттеры* _) `% b) l) W
  30.     public String getName() {: `0 A$ m) `+ [% O$ d
  31.         return name;
    # g$ E% g) y# i4 G8 o' I
  32.     }7 i5 p. x" c4 T/ d  r$ J4 J

  33. 2 Q2 E( C+ z- e5 j2 Q
  34.     public double getAttackPower() {
    - J+ |' \  b( u: t8 O7 B1 F* D
  35.         return attackPower;
    % o: [# ]. Y1 }' {
  36.     }% l8 w, H8 b+ X

  37. 8 Z- k. }7 E0 g0 c, z8 n
  38.     public void setAttackPower(double attackPower) {
    1 X# g* v1 l: Q# p1 x+ U/ [7 p1 ^; C/ b
  39.         this.attackPower = attackPower;4 e* I& E5 x" }6 u% R  e- c3 I8 Y' |
  40.     }# P/ p" l+ `5 D& b  h
  41. }# ~0 @3 X, a3 O1 {2 p6 Z
Скопировать код
0 d( t& c# z3 \0 w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.0 l$ |. T/ H. E: v2 S) a5 R

+ ^* P% g  [# e- p* Y# \
  1. // Пакет org.l2jmobius.gameserver.model.battle4 Z' y& p# z! ?3 q
  2. package org.l2jmobius.gameserver.model.battle;; |. z0 ~  @9 O2 N5 M0 K
  3. 1 w# z4 }& i( t* b* ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;! ^# I+ B) r8 r2 c9 F4 s: m
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 G2 Y" K6 h3 S; T( S# X! Z+ {# }: P
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;% ^- Z9 d1 X% Y$ A, W
  7. , t! S2 w  O6 n1 V, {8 _+ v$ r* ]
  8. public class BattleSimulation {7 x8 x- J; X) `( V, t. y4 h
  9.     public static void main(String[] args) {- C6 b1 F  ~& |5 s  v, e7 w- \
  10.         // Создаем монстра с начальной атакой; R' C# g2 c/ e% ~
  11.         Monster monster = new Monster("Дракон", 100);% v* Y& k. m# f

  12. * U/ m' _- t1 j3 {" a
  13.         // Начальная фаза" B9 e" T0 o% a& D6 `) L! S
  14.         monster.executeState();2 ]& D4 X5 o- T, h

  15. 8 u& Q* F' g! `- D0 I% U( r
  16.         // Переход в агрессивную фазу3 b9 s9 J) N; o' q5 A, X4 o6 X
  17.         monster.setState(new AggressiveState());
    $ m: C8 Z+ a" D$ M' B
  18.         monster.executeState();
    8 R4 y6 d2 j8 L) q5 x0 ?+ S5 z

  19. $ n0 w" o6 v2 {+ b+ A/ [5 b
  20.         // Финальная фаза
    ) P0 W! N9 Q% u& ?/ z- a
  21.         monster.setState(new FinalState());2 t5 ?4 w( p+ S1 t9 d& L" t
  22.         monster.executeState();: p! S7 o; F# i/ h$ [5 t2 t  X; l  i* r
  23.     }6 q' S, i+ O3 Y: e/ T
  24. }: j: q" N' B8 ~) y
Скопировать код
* t/ D, J/ I7 }3 q
Комментарии по структуре пакетов и классов:
! [# g. |; [" }
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 F0 |6 ?  w' d  ~0 W& {3 Q: Y5 p
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
, j% M- n# G& Q8 N; ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 z( I0 b* i* O+ M' ?- r/ I

( u' N) j1 g) G1 j% ~
0 P4 J' u9 w+ u$ n* P" M2 W0 s$ x4 I
3 H+ u$ @4 X8 V. a4 S

" Z2 j' |( [; U8 K6 f) W) C5 @% R+ {( e" Y

! L1 n6 a0 V/ Z& p( w
. n7 Z* [+ }* n6 R7 `
9 h, X) r9 `, K+ h$ ^+ ^+ W6 b
7 f6 g3 C, q* q. @) R$ |& j$ y% U( z- ]7 w4 W% n/ O
" l1 r! U6 R, X+ r4 i8 V1 `$ H
' N* v0 G" e# k5 h9 P

  b& Q! J2 J; v1 w4 x$ \0 z
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
% |, m3 n* R* E% G1 t! N4 N  q' tДля управления сложными взаимодействиями, такими как  ...

" ~9 g- |9 \% V6 V. @1 PОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:216 D5 M/ q! G4 Y, a& D4 B
Отличный подход! Использование шаблона "Состояние" де ...

, V; w0 G' ^/ q3 ?+ nХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
5 W/ P4 G4 a' h2 v9 m9 a  L+ X5 Q4 @3 N% x* y  C
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
" D+ [# z- o+ g4 ?9 y" h, ^! D- Q  X5 ^7 j! Z9 l- {% H" T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) x  m; }/ \  W( n  W
  2. package org.l2jmobius.gameserver.model.actor;
    ( n3 ~0 \; N3 A5 ^. [, k

  3. ) v& f! ]! u! {& ~! }# d
  4. // Перечисление для типов атак. w( b; G' Q% O5 P' O
  5. public enum AttackType {
    - M8 `# X$ M4 g  ]
  6.     PHYSICAL, MAGICAL;
    3 p3 p; M) O* n/ b0 e  C5 f
  7. }- p; D. O  d3 C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 `# o+ ], d+ V+ eОбновленный класс для агрессивного состояния монстра:
* t5 E& N" l! c9 E7 ~2 v" p: I& |. H* t0 L! r$ e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + P' w3 O! G1 X! n: ~! q$ \; b  B
  2. package org.l2jmobius.gameserver.model.actor.state;
    / ]: W2 a1 Z) V5 N2 A; H* n
  3. ; R" ?$ z4 ~: _- Y  i' ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 ?; K# p# b- w& _( {& {' [
  5. import org.l2jmobius.gameserver.model.actor.AttackType;. N5 z' P0 w; G! J, @; o  I
  6. - x" Y. [: W' {7 l% s
  7. import java.util.Random;( a1 P! g4 d* G. t. H& w9 Q
  8. % ?5 {1 B, d+ V1 G) m
  9. public class AggressiveState implements MonsterState {, g8 o, X; C' }5 A9 [2 M. {- P
  10.     private Random random = new Random();
    4 i# @1 X/ M- I# @+ W

  11. & b& i, [/ y% S/ A1 T  c# B! y
  12.     @Override
    ! x  ^, h0 _0 k0 k0 |' g! O# @
  13.     public void handleState(Monster monster) {
    ) ?6 t6 f' h) r- ?: B% ]
  14.         // Выбираем случайный тип атаки: физическая или магическая& S' A7 p$ h4 R% z3 \
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;7 `. V) k2 g3 s7 o# Q+ H

  16. 0 R/ e: Z. t6 @% [* E3 I
  17.         // Логика для агрессивной фазы боя8 t; c$ G+ f' |5 U6 o
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " & }) r' g# C) W/ U
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( h  t; Z# _% u" s0 F
  20.         
      U( b5 r1 \" h2 H: m7 l9 V3 |
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    * a3 y6 ]1 z6 r9 @9 l2 |
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    * i" R! t. @5 I" S4 e
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);8 D3 l* U! ]8 ]+ ~+ L
  24.     }
    : e( T/ o; T, J( x9 O7 X" h
  25. }6 ?% y0 {/ _( d3 Y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
, d1 ^6 n, ~- I3 U' _8 h9 [% @4 q' Q4 f0 y# @7 u8 M; c3 e+ w
  1. // Пакет org.l2jmobius.gameserver.model.actor- Q6 P; W" I# K3 j
  2. package org.l2jmobius.gameserver.model.actor;
    8 h2 {8 D# N1 x  I5 Q# X1 M
  3. 0 ~$ ^# p! }0 N. z  w' R# ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 c$ _9 a' L5 R' v# l. ]+ ^! S
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    , E: W# D: W2 ?' u
  6. # t8 Q5 e4 u/ ~* Z9 [
  7. public class Monster extends Creature {% z: s1 \; D% @/ G; C
  8.     private String name;  V0 Z0 ~/ ^4 P9 N' m. m" }+ t
  9.     private double attackPower;, y$ L# I3 ]1 u
  10.     private MonsterState state; // Текущее состояние монстра
    % u/ {6 F  [; i( T  ~8 z$ n
  11.   _6 `1 a/ t+ A
  12.     // Конструктор монстра" Y) Q: B! U: {4 `, N
  13.     public Monster(String name, double attackPower) {3 f8 H, C0 i; ~) F
  14.         this.name = name;9 n9 l, \$ ^0 G7 h" @; l/ y# I% l
  15.         this.attackPower = attackPower;
    6 A$ f! N2 \6 c+ o/ {* D! R
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    # y, a' E: m. f* w3 V
  17.     }
    - ?+ K# j4 y# k1 S
  18. ) M; w  N! T% D# |2 o
  19.     // Метод для смены состояния" R8 F9 d( [  R* P' \3 @# Y, h( w
  20.     public void setState(MonsterState newState) {
    8 C# \! X- A, {9 J+ C6 C
  21.         this.state = newState;; I  S* F- }8 v$ q7 v/ ^
  22.     }0 O1 \. T8 i' R6 n2 F

  23. 5 t8 T, P3 I6 p* Y
  24.     // Выполнение действий на основе текущего состояния! I0 V# a! x/ T9 @% L
  25.     public void executeState() {9 E2 i) b' B, b0 M: |
  26.         state.handleState(this);! e5 Y! a) B- H% w5 G/ \) k
  27.     }) C1 i  d1 y# b( {

  28. 4 y/ K5 u0 p1 |
  29.     // Геттеры и сеттеры$ [" B0 w/ }0 v. a3 Q6 n
  30.     public String getName() {
    & Y+ z; a0 t3 k3 c
  31.         return name;. l  c+ y" V9 ?
  32.     }( \' k3 P+ m& O

  33. + W6 l. C3 N% S/ p' p: h. G
  34.     public double getAttackPower() {: }+ V/ _% b9 A. |* j
  35.         return attackPower;
    ! N, h9 m! R9 B# _( k% l0 T( s* u
  36.     }2 |- F1 s2 k; d

  37. ) r. h7 g2 c, n9 _
  38.     public void setAttackPower(double attackPower) {/ z7 Q- \) Q. R
  39.         this.attackPower = attackPower;5 J3 l8 ?! A" w# R8 g' a
  40.     }( U' ?. q: R. k; d
  41. }, t4 ]6 K& O7 s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 A* T9 H6 J" m6 C8 w

4 n& A9 ?6 B. N* I* w4 D3 ?9 V, V
  1. // Пакет org.l2jmobius.gameserver.model.battle  C9 d2 A: L- R
  2. package org.l2jmobius.gameserver.model.battle;2 U: c" h& W3 a8 Y: H0 y& A. [

  3. % l! [- n# e8 f5 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 q4 S; B( D0 s' p- m5 b5 o: y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 z" u4 _% i$ w) I% ?+ R
  6. ; h# V# w/ p- `  Q. I  i! ^3 g
  7. public class BattleSimulation {
    " ^3 c  G% Q& g. ]1 m; p" P
  8.     public static void main(String[] args) {" r; v& O5 V+ S# ~% Q& g& v
  9.         // Создаем монстра& W4 `5 D6 L- _9 Q0 o% k2 F& `2 X* q
  10.         Monster monster = new Monster("Дракон", 100);
    3 ]# @5 ]- R( C4 J9 `# z$ g! P
  11. 5 ~4 L% d1 I/ W3 I
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    5 ~. s# A8 J- ~2 `
  13.         monster.setState(new AggressiveState());
    # ?  @. N% t/ D0 {
  14.         monster.executeState();
    * Q- u) k& W$ }1 g. Y
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак1 T% z0 E' L, r' j# A* {* }
  16.     }
    5 C8 C# Q; v" A5 p+ r3 ?
  17. }% u  t! W. v6 y$ O: d9 W) T
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% b( m  N, }. H' L
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
. P" ?0 N. F# h( m
( |; Z. Y8 q: L- H! n
# k2 W! |% e' ]* f; X5 S
' p8 e" M: l: `# f  A/ Q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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