Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  B! t* j  X. W' l9 ^
4 f" n: X$ L1 G. a
: d3 r& N+ ^4 ~
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.2 W3 H0 |0 z9 U& }$ A
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 Y% H9 \8 e7 Q5 A/ ]Астралия ?
% N# B1 y" ^. g" D( b, F" g
6 c' P: a! i$ q5 B8 o- C

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!9 l5 m' n# ]) v7 ^
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
& x! i8 t. u! M5 |8 _" ^* |3 j2 [. a+ C# ]& C) [
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
, m/ D! |8 w, d. K  E2 y5 Z
AlexCoder опубликовал в 2024-10-16 18:31' x6 d$ D4 I, L
День добрый!! J3 A, k) s; W7 A! p* A
В статье описано взаимодействие игрока с N ...

) q2 R( E% p4 Q  [- z. P3 GДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 \3 k; ~9 y& R

0 x' l( e# v, ~* H! DЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.* Q! f: w* @, l) O# j/ O" t
( r" V6 X+ B% ?2 n, }
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 s7 p$ R0 _8 u
% X: }: b0 E# }) V2 ^
  1. <font color="Green">// Пакет для состояний монстра</font>
    ( n* m" k: ~/ ^$ t, ~7 @) s( ]
  2. package org.l2jmobius.gameserver.model.actor.state;7 k3 ]5 [, t3 t' X  b  O: \
  3. <font color="Green">
    . a8 ^) Y# e$ j) u6 z! C- c7 n
  4. // Интерфейс, представляющий состояния монстра</font>1 R% t5 u3 {( e% I) c
  5. public interface MonsterState {5 O. ]- \  s* c4 X
  6.     void handleState(Monster monster);
    3 U) R/ a* l$ f9 C9 M- Z1 G
  7. }4 _7 W( A2 \) Q: ?
Скопировать код

$ h/ i4 c& U, f* Z% IШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.9 @( m5 U3 ~) H% I. K( r
) {1 c. I6 G$ k0 J5 J/ |6 M! l# _
Класс для начального состояния монстра:/ K4 g! _6 d+ y9 x! P
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    - V  \  k" K% N
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( |: G, X7 |$ z  C9 b' _
  3. ' P0 i  z* X' a# K( W! X6 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;* Q) j1 Z4 [( Z2 Y' [

  5. $ M& m' Y+ S! X  @% K' X
  6. public class InitialState implements MonsterState {
    . ~: k" L2 `6 X7 @
  7.     @Override, V0 P4 m3 {* `
  8.     public void handleState(Monster monster) {. r/ T3 S4 k' |( s# v  a
  9.         // Начальная фаза боя6 j& ~. `" j4 o5 J2 U
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( \; Y; W9 o' M6 {4 n; f/ e
  11.     }
    $ m5 v$ @9 L6 T+ D: j
  12. }
    , Q0 ]8 {/ ~+ y$ X
Скопировать код
7 |& _7 K: v0 N/ j  o" j3 n

/ b4 j/ j) g1 Z% H9 n  `  h/ `5 S, f' [$ I- [% \

+ ^( m. d2 y6 X; O5 l2 Y8 w
+ x9 l4 A/ C0 N; y4 E% ?
8 e& O+ o. t$ X% t# W7 X# J. {, L' o
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 z7 R/ Z6 h0 Z( D& H
1 s+ S( a* M, z( X' |' p' \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( ?/ y9 S1 A4 T. y0 E  f$ Q
% w' S0 \3 L2 `) u# K7 o( l! I+ @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 `1 M: U5 b7 |8 C: Y- N- |. f+ O) q+ y& k- E' C  h2 R
  1. // Пакет для состояний монстра9 Z( U! |" ]( I$ _  ~9 V
  2. package org.l2jmobius.gameserver.model.actor.state;
    " X/ w! J! i, O
  3. + \6 N! m, G. h! X( O
  4. // Интерфейс, представляющий состояния монстра
    # T# a9 b" K% U( f; y
  5. public interface MonsterState {) T* I/ V3 u8 V! v9 A( Y
  6.     void handleState(Monster monster);
    / r" m5 ?' L$ E8 w  e3 U/ j# o  ~) q
  7. }
    - q. T; @- y% o7 B' [
Скопировать код
& a5 e- D3 B+ u' C- ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 6 t5 u; ~4 C# M1 W& {% Y6 i8 w+ W

6 v& q/ q7 e& l) ~; M7 v1 `" RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" @1 q( z, r6 ~6 l  m; l" R
0 O# N9 G+ u( U5 g# SКласс для начального состояния монстра:  x- w* N6 K$ @5 G6 s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* p9 ~1 `% L* |: ~& [- {4 M) t
  2. package org.l2jmobius.gameserver.model.actor.state;% T' w. i0 ]( A5 w
  3. # {8 z' m$ J3 s( _& e
  4. import org.l2jmobius.gameserver.model.actor.Monster;' }7 a2 I1 i6 }' U9 a( l. x. Y7 Z

  5. , o& j9 A# A+ t% `+ P! y
  6. public class InitialState implements MonsterState {) a6 H7 T7 r8 l2 @
  7.     @Override) T! e8 C2 P& a, _; f
  8.     public void handleState(Monster monster) {
    ( A; V% [8 V$ w+ `2 y
  9.         // Начальная фаза боя) W/ X5 L4 x% N! E1 y! ]9 O
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 U/ Z7 Y2 f  @# l7 t/ O/ D
  11.     }
    * ^% Y* d3 {) |1 ?2 e
  12. }8 W0 x$ r0 X8 c6 J; m; h; w
Скопировать код
Класс для агрессивного состояния монстра:( t/ j$ i( E) {! @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* b1 e. @# a: W9 I& A
  2. package org.l2jmobius.gameserver.model.actor.state;
    / U% u+ C5 v, Y9 K. O, d/ l
  3. 1 u: ^, o/ L+ D' c1 p: Z9 R
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 S- w& j' Z* G* c. c# e* i
  5. 4 L$ P' o1 w- k7 e. s/ Z
  6. public class AggressiveState implements MonsterState {
    3 G* l! H3 W% k! m) l
  7.     @Override6 `8 v  G3 Z$ \& K+ I, v9 X
  8.     public void handleState(Monster monster) {* o* v0 V' v/ X, F
  9.         // Агрессивная фаза боя
    1 X: w( U2 d' d; ]  i
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    " M+ j9 O; O1 w& A' h' ?. f# a
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    7 E; x# Y+ Q% c8 o5 L' q* a$ X% F* v
  12.     }# {! \) m% I+ q2 D, J
  13. }
    ! e9 N$ X1 [, L
Скопировать код
Класс для финального состояния монстра:& q7 z3 d) L7 J1 X6 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 P/ [. o% H& V
  2. package org.l2jmobius.gameserver.model.actor.state;1 ?% J& `% }9 U  E

  3. ; O$ }: e8 V% Y; T% v5 k9 s6 s/ i
  4. import org.l2jmobius.gameserver.model.actor.Monster;  j; E0 L- u3 l! M3 `2 K. G# @
  5. 8 X: d7 z* c$ k6 b
  6. public class FinalState implements MonsterState {
    " ^: R4 D8 y: O2 {: z- k
  7.     @Override1 f1 P7 Y2 i, k) Y+ U  D; D# S
  8.     public void handleState(Monster monster) {5 C+ K: U; g- R: ?
  9.         // Финальная фаза боя
    ) o. f/ N% {5 c4 B
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");/ @- V9 m: l* X# K) J
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    8 F- B! o! J( e) D+ j, L
  12.     }
    1 ~* H, t/ m5 G6 z1 K
  13. }
    1 ?  S  s6 o. T( Z$ e! |! Z5 \
Скопировать код

" u; a$ E" ^: ^- z/ x, lШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* o" T6 L3 G; y  g3 K% ~/ y$ y
  1. // Пакет org.l2jmobius.gameserver.model.actor; {# J% H, H  Z) h2 y% b' w8 T* x
  2. package org.l2jmobius.gameserver.model.actor;) v1 ]2 @& U$ J4 X% F1 ]# d

  3. 7 F# q" j9 E; h% [& `" ~9 q6 `
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 y$ ?9 ^% P* G$ \9 L, E' e. b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 O+ m1 r% ~& L) V! w

  6. 4 x! }' B" i0 c* V
  7. public class Monster extends Creature {, H$ r) |$ l8 Z6 P
  8.     private String name;
    5 j( M6 m! F$ m& ^
  9.     private double attackPower;1 r, @. ^7 c& n/ z4 M0 A. X( m
  10.     private MonsterState state; // Текущее состояние монстра- X5 Y" K  z& ]' j( P: A

  11. , Q6 z; h4 E4 t/ {4 y9 d) T
  12.     // Конструктор монстра
    & N& F5 \- I% ~+ I2 o; ^! A
  13.     public Monster(String name, double attackPower) {
    $ F$ N# j- F0 `: F
  14.         this.name = name;2 _/ M; }9 J0 E  g1 j6 s
  15.         this.attackPower = attackPower;3 Z& R$ g7 z$ K$ L/ Z- B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    8 w" S) ~3 @9 T. D3 z7 z
  17.     }* u" ~" t5 W2 `& G' j$ n  O
  18. ' E6 K0 I: z( N( H" w
  19.     // Метод для смены состояния
    ) H4 M) l2 k$ S1 ~; d
  20.     public void setState(MonsterState newState) {
    8 k! d9 d6 V% ^* k3 o0 v5 _
  21.         this.state = newState;
    % _6 k; ]/ {" I/ c0 w9 r$ d% s
  22.     }5 p  f  G' x+ Y: |( A

  23. 1 c& L8 w7 O( W
  24.     // Выполнение действий на основе текущего состояния0 H: P) H, d, _8 E1 e
  25.     public void executeState() {8 T- U5 `0 {0 U$ ?: b( E8 E% h
  26.         state.handleState(this);
    ' c7 R2 d: ~4 w! d
  27.     }$ N+ O% F# L+ q% r2 W+ k
  28. 0 c$ {. k) e) F/ x3 ?) m
  29.     // Геттеры и сеттеры
    8 R, W& t% F  S/ ?' p3 ?4 L
  30.     public String getName() {2 s' \3 G1 G8 q# E. X+ t/ A
  31.         return name;
    " d! K  L4 Q0 l0 ~" u) t
  32.     }) n$ O% ^1 t! E  \9 m6 Q
  33. 0 }: \: H" U3 U& o8 `, z% M! j1 T
  34.     public double getAttackPower() {
    + F, q: b! L2 g
  35.         return attackPower;/ O, B9 t8 w, Q" w! |! y5 D7 ?8 n
  36.     }: s0 T/ B' R4 ~$ B
  37. ' C! v  ^% e2 T- A5 r# p
  38.     public void setAttackPower(double attackPower) {
    & ^0 w* q) ]/ j, T$ ^
  39.         this.attackPower = attackPower;
    2 W) B  g4 ~+ `  S# v3 [
  40.     }
    ' x$ J0 G; p, s, A8 @! F
  41. }/ E; E* {& K% _# z4 L
Скопировать код

  A& u, ~% |" BШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.1 W# ^6 O& G" x, |+ W/ t7 S

' C, C$ Y" H2 V) M1 V) I% ]
  1. // Пакет org.l2jmobius.gameserver.model.battle" \- f9 B, r; X2 a- v
  2. package org.l2jmobius.gameserver.model.battle;
    . M% E) u. v9 |2 ?

  3.   Y# Z% L  n  z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' |8 v0 n7 }4 r3 Z* W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  t4 W6 Q4 h" w& G
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;7 H& |, r- q$ [0 o1 ?- ^/ J- [
  7. / Z. M6 P! I+ l- i7 _) x4 O
  8. public class BattleSimulation {
    ) C) V" ?1 T) a5 I
  9.     public static void main(String[] args) {# W7 H! k# Q' H+ H
  10.         // Создаем монстра с начальной атакой9 G7 A/ N" D' [: {
  11.         Monster monster = new Monster("Дракон", 100);1 t& G" ^9 D: S& q6 U2 Y4 [* E

  12. 9 y3 W, a1 e% t: m3 a6 y5 x
  13.         // Начальная фаза
    # R8 f; U8 }- ^5 E1 y- R; n
  14.         monster.executeState();
    6 ?, S7 @" E% e' W4 A

  15. ; A. n. A: c. _/ v9 D& Z
  16.         // Переход в агрессивную фазу6 {! N5 K& f6 H9 X# D- J0 L
  17.         monster.setState(new AggressiveState());
    4 h6 ]9 P$ E/ M& h
  18.         monster.executeState();
    0 e4 h2 W* W' _: @& B/ d5 Z4 l

  19. / i& j+ Q" c7 g! Y' g5 h
  20.         // Финальная фаза
    ' I7 V  M' @' ]+ m) I
  21.         monster.setState(new FinalState());$ n% ]8 t: V5 i
  22.         monster.executeState();
    7 _- i0 U4 t# ]) s+ k/ A4 ^
  23.     }2 u/ v) |3 v. y! P5 B
  24. }
    * \, G6 m5 y% _& A
Скопировать код
. k, r9 M/ ]" z* t  z; y
Комментарии по структуре пакетов и классов:
; k' K4 l7 P$ y5 [
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    6 K# ?( `1 C. G! D! p' \, P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 `1 Z: W! W5 a! \1 z6 X* @2 oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) w9 T& z4 m0 e3 e& W# p3 L  k; `
. V# L$ V+ W1 t$ Z; B/ o6 P

$ e( I, S; x( o7 w5 J# P6 n: y' k+ n/ ?' z# z0 U0 b% V6 }' }! N

6 K9 }+ \# q) K( z* S# y+ k
" k8 ~# k  r5 G5 o1 F& q# y
$ Q0 p8 @6 Y! M) Q
3 _7 _+ w  r1 _  _9 U# z! y) E2 X+ J" `& E5 n1 B

# v; g2 q8 N8 ]$ G$ t
& i% v# |4 ]& l+ H. l- ~0 X4 X; @. w. X  j8 C
' W( V5 z7 O4 @
+ R& ~" c9 d7 [% m$ d; n
( z4 O8 I1 T8 m* |1 {" ?, B: ~4 N
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04- Y& ~% A+ T' \+ P0 m) P
Для управления сложными взаимодействиями, такими как  ...

: I* H5 S* @( x! PОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21! x) W" J6 _& B" X1 S# n8 o
Отличный подход! Использование шаблона "Состояние" де ...

, a+ q8 [% ~+ ?Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.1 ]9 ]) ?2 m7 p% c5 D" Z

# z  w; I6 }8 N2 s  @' lШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.- L7 \# Q* W, |1 d7 X" v$ e( L! b
, w2 P4 X& Q: h8 X0 G2 g: N
  1. // Пакет org.l2jmobius.gameserver.model.actor
      W6 p* b, s2 e3 {0 {2 U
  2. package org.l2jmobius.gameserver.model.actor;/ f1 r; c/ l% m- l% u4 u! q2 \' V

  3. 0 e( b3 ]$ \/ g5 J# y4 G7 G/ o
  4. // Перечисление для типов атак/ V& f7 S+ |/ F4 l1 C& R5 P
  5. public enum AttackType {
    2 M* d8 R" v: K% Q) R) A
  6.     PHYSICAL, MAGICAL;. B, y( Y4 r! F+ \( \* M
  7. }
    ; L3 L4 A# H( X* q4 m
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
+ l5 J+ X* q+ z" z7 PОбновленный класс для агрессивного состояния монстра:
# q' L% f1 g3 n! O) l# W4 i# C- J6 X% c! g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 ~1 E0 B" U! g0 [3 U! [7 ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    & e1 Q" o  Q, X+ X
  3. + H1 r6 A& I1 x
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ p( U5 z9 ?9 ^
  5. import org.l2jmobius.gameserver.model.actor.AttackType;1 v1 S* u/ K! N0 Q9 |7 R

  6. 5 A$ h( S, U6 S; j( `
  7. import java.util.Random;
    9 I' x# `/ U2 }5 G2 t8 d. q' m) O

  8. " ?, x7 i/ }4 G$ l( ^! w% x
  9. public class AggressiveState implements MonsterState {8 }9 @; N) m2 c  z
  10.     private Random random = new Random();: B$ d9 K3 |3 S3 F; N
  11. - C9 s$ C$ A% G6 t4 ]% b0 m# n  m
  12.     @Override* h% q6 c8 `+ `# }1 p( }
  13.     public void handleState(Monster monster) {! N7 D& ?9 B, S) M
  14.         // Выбираем случайный тип атаки: физическая или магическая
    + R, m  g# s, I- p* k
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;5 ^% a- z  S9 |8 h0 R( x5 e' B
  16. 1 d+ C! G- `- e5 l5 J9 ?. ?
  17.         // Логика для агрессивной фазы боя
    - h' R7 o6 B. I" l4 U% W9 j
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    / x/ g+ O2 Y4 K4 @" l8 P
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");# A" b1 k# d2 q( {" Z, g
  20.         
    3 f. W% K4 [7 r5 a, ^9 Z' E! W
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ) G) ]( x1 U7 f( P
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;5 n: T# B; Q# j
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    9 D) X8 Q/ G- z. e% e
  24.     }
    ( o% ?- o# m6 p1 N4 z
  25. }! L4 \* Z$ P- N& h3 \# B. P9 m7 L
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки& S7 B' H  g$ o/ Z) O- B
& t  b, E6 m3 t! D# O) b
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / z* x# [, h$ X7 ~7 ~% M7 [
  2. package org.l2jmobius.gameserver.model.actor;( _8 {( L3 |, H( V! A& Y' X- m% q
  3. 9 O# V8 f3 O0 P# X+ R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! k  o3 x& Y9 D) K; D
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' H0 {+ d: x& F( t* x" y

  6.   |3 a' B, K, u. z& f
  7. public class Monster extends Creature {
    / I, l* ?! Y8 L' _* }1 k, F
  8.     private String name;
    ( z- r. t! }( v2 ^) \0 e, O# D
  9.     private double attackPower;
    " c9 C" |0 E' J& S7 U
  10.     private MonsterState state; // Текущее состояние монстра( s$ ]3 i  p2 [$ K) Q

  11. ' n( C; o3 ^, {7 E6 v( C
  12.     // Конструктор монстра
    $ a. |- m! b0 J& b$ F1 C
  13.     public Monster(String name, double attackPower) {
    . [) ?9 b: u% e% X
  14.         this.name = name;% N* Y+ R4 \% S/ b% ]
  15.         this.attackPower = attackPower;9 \# b) h7 z6 W3 S2 O) q
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ' F: u# Y1 g0 n5 W) _9 D7 O
  17.     }
    . K. S! c/ E( O' ~+ m0 R  S: I

  18. : C+ }2 `# u$ X2 s3 y2 K; E- V
  19.     // Метод для смены состояния9 A$ M" G  S/ ]! r
  20.     public void setState(MonsterState newState) {, ^5 Q' f2 N' w% b( X4 Y4 K1 E
  21.         this.state = newState;7 O) {  B2 a' J$ t3 T  b1 w5 {
  22.     }8 `2 `9 `- N; t  R9 ^! f' z

  23. $ K/ Z. p) u  w3 y
  24.     // Выполнение действий на основе текущего состояния+ c2 c3 C8 K3 O9 q7 T8 m( i
  25.     public void executeState() {
    + B% K$ P0 r+ [) W0 K) S
  26.         state.handleState(this);
    2 X9 q; Q3 t6 X' o% h
  27.     }
    3 y! A( l2 @, n: O. x8 U) c

  28. 1 Q- K: y" F" J" Y; c. J
  29.     // Геттеры и сеттеры- W3 H! n- j0 i+ c' y3 u9 P# Y
  30.     public String getName() {* Q6 i+ [0 A7 w, K2 A% u( a! I* G
  31.         return name;
    1 H5 l1 s" C% R' \- M
  32.     }
      E, \. _/ q( W( r+ c* A

  33. 6 D& l. D, m- u% v! }
  34.     public double getAttackPower() {+ |5 n5 w( Y  G0 f. g! ^: \* r
  35.         return attackPower;( z+ B, C2 z1 D+ }
  36.     }) e" @: F; D. d- N  P

  37. + \5 I2 _; U% y) A7 t
  38.     public void setAttackPower(double attackPower) {% N. ?3 c0 ^' s8 K' O5 L
  39.         this.attackPower = attackPower;) k/ O: P3 E* C2 B
  40.     }/ ?3 |" P4 k2 p9 M# s
  41. }
    " i5 ~, I0 ?9 e8 l7 k' S
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
; f5 S6 D/ U* b9 i! j! S9 Q
+ E' \8 U, n. i  A, N
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 l+ D& P6 E/ t' B& F4 j' Y
  2. package org.l2jmobius.gameserver.model.battle;
    ( ]+ Y% N2 W) Z% V+ l. }, p& l

  3. 3 R8 |7 ^. _% U1 {# m1 P6 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 J5 f# r  W4 C5 u8 ?) g% L% O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 ?# H* G! u3 G8 O0 |# R

  6. / m( m% W) W. |: Y6 n
  7. public class BattleSimulation {- p5 U3 x2 O. p2 F( Z* \
  8.     public static void main(String[] args) {
    : a4 e# o% q$ c; K
  9.         // Создаем монстра
    $ V- G! G3 o4 H1 H5 o
  10.         Monster monster = new Monster("Дракон", 100);
    # N1 v/ r1 F" Y% @# g2 l3 X
  11. 5 G& F, O. ?( B/ U- t3 C1 }
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак$ D) W. L- a7 J5 l
  13.         monster.setState(new AggressiveState());* S# f# E; \/ z" @" j
  14.         monster.executeState();
    , t2 k* H$ d; ?7 a- F8 P3 b1 ?
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    9 L  ^# g2 [7 q2 w& H
  16.     }6 r  e; |" c9 [2 r! q  r
  17. }0 r6 P* V, _9 R3 i  E
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.1 g' e4 F4 \: I; Y- ]" O6 Z4 E3 y" w
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!5 |0 X" O, ?8 ~$ r, T. f
, f9 z7 E; W& i4 c
* O  J4 c: ~/ a# n

7 A& f1 ^! n8 }! q8 ]2 O
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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