Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / I3 ?. W! s3 P2 h6 Q
8 C" @ H9 l& R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# R4 A+ L! V" r9 u/ f+ M- M H$ K# r' @1 a! ?6 }) D J3 [2 \) Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; r( ?; s; A+ G. e3 |
* a8 @3 C$ O5 A- // Пакет для состояний монстра
9 e$ N, I( ~7 i; N - package org.l2jmobius.gameserver.model.actor.state;
4 c5 |9 v) \% J; Q) n# J' l* ]% X - # E: t- Q+ L% C$ a, B
- // Интерфейс, представляющий состояния монстра
& G; ?, H# }' \4 \1 ~; f/ ]* n - public interface MonsterState {# D- Y& P4 {" p. W% \* Q5 q
- void handleState(Monster monster);! c& Z8 c& v1 P7 |8 }
- }
& @: d: x6 M3 U; _, @/ r) Y2 e0 i
Скопировать код 3 c% k4 [6 |, [* [7 r
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 o* a/ H4 K# O, U. m) k z% ^; r+ D2 d0 I% O' z, K% J }
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% j, K }# I0 c, Z. Y9 {
5 l2 @4 y5 R9 n& G" _, aКласс для начального состояния монстра:+ }4 `* F4 ~1 z! [: a0 D5 P
- // Пакет org.l2jmobius.gameserver.model.actor.state9 M. j i$ x6 \1 b4 M W
- package org.l2jmobius.gameserver.model.actor.state;
/ d0 ~4 s' W- z8 f - 6 X' l1 B' ]- @: j' f' `# M- k
- import org.l2jmobius.gameserver.model.actor.Monster;
5 l T1 _* c4 j7 U+ ]0 P! w- f9 l - " L9 k9 L# D8 ]9 \( \& r9 n
- public class InitialState implements MonsterState {- O) o, d3 w1 s
- @Override% _( `* G3 `7 |; d! c, k
- public void handleState(Monster monster) {- d9 b1 Z* d. @8 B
- // Начальная фаза боя/ t/ c7 W8 {- m) P4 l
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ [+ D, }5 r4 B) E
- }
9 }' b% z. G0 C0 _3 t - }* m: E+ G5 L; ~8 \5 @
Скопировать код Класс для агрессивного состояния монстра:
" } k5 B! J7 v b% c' i- // Пакет org.l2jmobius.gameserver.model.actor.state
6 e5 c# ^ C* t) ^" e( e1 { - package org.l2jmobius.gameserver.model.actor.state;$ J& { i# q! K! o; b
7 a8 \/ z3 o, ?4 r0 x+ A+ ^. F0 _" P0 P- import org.l2jmobius.gameserver.model.actor.Monster;
4 z- U8 G1 N( o" |: C% O
0 Z! ?: l9 |- q- public class AggressiveState implements MonsterState {
& T$ r* I* {& G% M - @Override, @- v% u& d( I) K, `
- public void handleState(Monster monster) {
# o S& H! ?) W - // Агрессивная фаза боя1 m5 Z& L) j5 ^* U! _
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");& }3 \0 G$ B4 N5 M! D. w
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 g# f3 t" [/ i) _. m
- }
- |2 b" K) ]1 m7 o$ v. K7 I# l - }
. A8 |5 h) C- M3 |# j- r ?
Скопировать код Класс для финального состояния монстра:
. A, o! z* `$ d& F3 N- // Пакет org.l2jmobius.gameserver.model.actor.state, Y! p0 f" S, X0 n, j0 B- s( e
- package org.l2jmobius.gameserver.model.actor.state;: ?7 {. t: X) t2 \
- O' u# _, l7 q* [/ q1 O8 H0 v( n
- import org.l2jmobius.gameserver.model.actor.Monster;- v. y0 K3 ]; c8 A: K$ A! `5 s
: G B: {7 i3 W- U! K! g- k- public class FinalState implements MonsterState {8 I. B i5 G& _' w8 e+ b2 Z6 Y
- @Override1 w( c% }4 X% W/ `" K) n9 h$ K
- public void handleState(Monster monster) {
% J' Q5 j, t9 o$ _) I( {' t7 _ - // Финальная фаза боя
( [4 N7 g4 ?% R: U - System.out.println(monster.getName() + " готовится к финальной атаке!");
( a+ y9 D# Q: i7 A m5 F - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. P9 b" W0 i: S& W; C; `
- }' u, v2 g7 L8 F2 n1 `
- }
( o6 A. I( j2 {
Скопировать код
; h; N' F4 b+ ]$ k4 M" {0 tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.9 s: y; W. ?* u) s0 V, L* ?
- // Пакет org.l2jmobius.gameserver.model.actor+ d" @) g! V, ^: ]$ k9 C
- package org.l2jmobius.gameserver.model.actor;$ r5 P8 S# j6 o) {0 i- Y
- 3 i% c" x7 ? f7 J
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
: {: ?1 Z4 A+ c. i2 K8 K - import org.l2jmobius.gameserver.model.actor.state.InitialState;
% d! X. V% ^' {5 q- M$ G
q9 A! }' V# h: d4 m( U- public class Monster extends Creature {! t% X7 Z( Z1 k* I; }
- private String name;9 d. q( U: [! s$ r+ C* d5 R
- private double attackPower;; G* w; i" K# g5 t# n" T3 u* ]
- private MonsterState state; // Текущее состояние монстра6 N' b+ s& C7 @ I+ U4 Q
- 1 r( j8 ?5 g% P2 q
- // Конструктор монстра
8 V+ y" A" k2 j/ H0 d - public Monster(String name, double attackPower) {
L* u% t, ^( ]$ } - this.name = name;
: e' a9 E# b( | - this.attackPower = attackPower;
' h1 Z' q* m! W, m, F: M3 C - this.state = new InitialState(); // Устанавливаем начальное состояние
0 ]0 _. V' x/ i% ^8 d - }+ @, b% B: \" G6 Z! ^1 x L
0 _* x4 t6 p! K- // Метод для смены состояния' P+ R K% ^: i& _; q9 J: r( S
- public void setState(MonsterState newState) {0 a5 I7 H. n" O7 {, a0 a% d4 C4 m
- this.state = newState;+ @4 F" S e1 J8 v: k
- }
9 N" o; x8 Z; w6 V8 d
: C+ H7 a: F" _8 t6 q- // Выполнение действий на основе текущего состояния
) X" J1 L6 l5 i) k3 Q: X - public void executeState() {
_- f1 O- i* Q+ Q* @9 F6 c - state.handleState(this);8 R$ w8 A. X+ i# ?) A
- }
0 j8 d+ I9 A, c) N/ P
# U7 U& ^/ @! _$ z, V* ?$ D- F- // Геттеры и сеттеры
. i, l4 z, z* ?: ^( D+ a - public String getName() {
8 s; w) e3 d3 ^" L2 ` - return name;
: Y j {( X z# I$ t' _6 }! d( O - }
% v: G4 Q/ _1 [; O" ~7 u - , r, S R! X- @% K4 L- o% a( d
- public double getAttackPower() {1 ?1 e9 C2 o2 y b) _ L
- return attackPower;
: d+ a7 w/ c3 l; Y; w2 l8 g - }
' V J! Z' G: T6 N R {' S. a
3 t l) l- g/ k. @* z+ [) p- public void setAttackPower(double attackPower) {
! p% p7 k! v2 v& q2 k* c8 J+ K - this.attackPower = attackPower;0 l" b3 |7 ^. F0 [
- }, z2 r% K* }# U' i5 t, D
- }
q" B+ Z3 ^; N' T
Скопировать код
' L5 k, ~& U) R) EШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.7 }, I9 W* b# Z. g1 N, e/ _! ~
( `8 f1 F0 v& Z+ L7 X/ U
- // Пакет org.l2jmobius.gameserver.model.battle8 H" m; b O- V/ W- r
- package org.l2jmobius.gameserver.model.battle;6 M( X) H! d& i0 K5 Y
0 L7 ]4 q) h( t* J- import org.l2jmobius.gameserver.model.actor.Monster;
: \* _" T# d6 A% ^ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 j, G) f: C4 c% V) k
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
' [# B# z5 C1 X( r% R# h; ^
4 v+ R. |" z' h! }- public class BattleSimulation {
% h1 `3 }- V: M! S2 ] - public static void main(String[] args) { a- @0 M2 C) g# T/ k9 Y
- // Создаем монстра с начальной атакой
# x3 A1 x. z" W& a - Monster monster = new Monster("Дракон", 100);6 h9 j4 e a- K7 Q1 ~6 R
- 3 X9 v& Q" p0 T6 B1 S" V
- // Начальная фаза! i7 Z9 `; G; g# [1 u, X3 s
- monster.executeState();
7 O, V: t; l% s, \+ K& o
# g1 k$ ^: L# ]$ ? t" }! R: u- // Переход в агрессивную фазу
7 `% N5 E+ o3 l; _6 D - monster.setState(new AggressiveState());/ G% P3 C5 v- |6 s" U7 `9 C2 Z1 w
- monster.executeState(); l7 Y. l6 t6 f- g; m& k
- * }" T* j- q7 Q* p; p) F3 A! ~$ t+ z' a
- // Финальная фаза
# t$ s' `8 M+ c% `- V - monster.setState(new FinalState());
- l- p8 Q* Z; h4 t: P9 B0 _ - monster.executeState();( N& b" }% O8 `' G' E! Z* F
- }
! {: |/ X8 F1 [2 J) L, m! y7 O - }
: \3 k! H* c" x9 {3 {
Скопировать код & b; w3 J0 f2 L! i- j+ M9 I
Комментарии по структуре пакетов и классов:
6 B! T) n4 o( G' p* I- S- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.9 x# U/ \0 Y7 {7 A1 ?& x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.3 ?7 z% A/ Y d
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!9 z# U. _5 |% \! L
! s( v: @- c" R O& p# C) o
+ b' O) m% F2 p s6 y; f
2 e8 M" M* n' T1 v8 \4 l0 _& \- U; ~. T8 l6 U
' J2 z' ~2 N+ Y2 y
* F& \+ W* ]3 N. S! @( j; R n/ w2 k% x: @# a4 \/ b( o
) {, }* ~5 O! { o- h) _3 u7 w
/ F5 [/ ^: t( |* o3 ^0 N- _
o W: }: S8 L& {* B. }* R% n. z" u0 Q5 I o0 e/ f
5 `- p( `7 L, B/ r0 o" c
2 N, ?2 {! g4 X! x8 R
: p) Q, Z# M2 |( d( ^ |