Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
- [! s4 }2 F2 i6 R9 ?4 {. e" H" M' ~2 Q# N
2 L# q3 J8 U5 C8 Q$ }3 T2 e
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.8 z/ M2 F  d% \$ Y# z* t* B" T
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!- y' [6 R& d( x1 b$ W
Астралия ?
0 w1 {& P4 D. ~+ y: h$ {( p4 j1 F0 Z( S% T

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
' ?# U- B" T7 ]( I! E, R1 k8 qВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?" ^. `" f9 c% M' v: L1 e

# O  X& n, x- X0 q/ L
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
# g% X. n. W# L- H2 U/ W% h2 y% u
AlexCoder опубликовал в 2024-10-16 18:31
* o5 V% k+ _1 f1 ^& PДень добрый!
/ M& g2 N( m2 M5 _0 N/ g2 rВ статье описано взаимодействие игрока с N ...

4 m, r: o8 y5 X5 QДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& h6 w* d* S* c8 `7 w$ m) m
  N; n' o$ \" d2 m" _1 oЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' `' @5 N2 Z0 p5 D2 h. d$ `

2 s  Y' ?6 s: `$ A! yШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 z$ p" _, F. H% n! a3 T0 R' p' d0 \% W
  1. <font color="Green">// Пакет для состояний монстра</font>
      @- o, r1 J  {# h
  2. package org.l2jmobius.gameserver.model.actor.state;2 a) x* D7 i5 _5 O% t% e* r
  3. <font color="Green">! [$ A# n  j2 B5 m3 i# `
  4. // Интерфейс, представляющий состояния монстра</font>6 g( ]: G, T) E7 E! a- h
  5. public interface MonsterState {1 Y& l0 h+ J4 g! i, S) c
  6.     void handleState(Monster monster);9 g$ S! S- v4 C4 R3 v4 K
  7. }0 |6 c- d& a: |* Q) M) |; x5 r7 Y
Скопировать код

# W6 R; Q1 a2 i$ Z+ oШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 w) g& A3 n, j3 t( I" |) ?

6 g0 f. N' q9 u; I" L; H# uКласс для начального состояния монстра:
" S1 ]9 ?8 F1 y  u" H  Y
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 E& J- r4 B' x4 z, ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 v" [( e; q) r! [6 u9 s3 n

  3. # D9 B4 f& J! ?. S8 I1 O
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ L& |7 x) m: X2 e9 c1 s& f' V
  5. ( ]2 d3 [/ K: T' p2 {
  6. public class InitialState implements MonsterState {
    ( O$ [$ A: z8 C& F( T
  7.     @Override
    7 g. o4 e0 L# u
  8.     public void handleState(Monster monster) {) _$ R; M7 Q! ?7 f! \# P, @% B2 J
  9.         // Начальная фаза боя, p7 L  b) Q2 G/ s
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 s% G( S  Z* h  Z. ]
  11.     }
    ! }2 \6 I( b- h( R2 P* T
  12. }- k' d3 B! ^7 J$ |2 Q5 g
Скопировать код
8 U, ~. V& b  U  |9 E7 A, B

, Z- D7 _" r2 Z! Y4 D7 {; m
+ o/ C0 E4 I5 h, {
% z/ g- r. |+ h, c2 m2 D% v( F4 V! w$ U0 _0 v2 T2 R
; v8 C/ \# j; V' S4 M) [

0 P6 @- s0 d9 |* G8 ^- h6 G# C7 o& p
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, ~# P5 G3 d  s9 B: b! ~( r7 n' w+ ?2 e5 {$ l* `! r& H2 a* ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( [; a0 @: Z0 V8 |/ H3 F  x" w1 [$ w
' }$ b7 @) C: c* o4 R- g. \
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.* g  n3 t: y3 f+ Z( ?$ X
2 z* F/ X  v) A+ c8 S% A, H
  1. // Пакет для состояний монстра3 w6 f( B1 \( Z, p: V
  2. package org.l2jmobius.gameserver.model.actor.state;
    * T8 Z  U. c9 j. m1 ?1 t
  3. : O1 ?0 T: b$ i2 Z0 l! A& b
  4. // Интерфейс, представляющий состояния монстра, u! t9 W9 B6 p$ f1 j
  5. public interface MonsterState {
    1 B2 F! f% Y! A1 C8 A
  6.     void handleState(Monster monster);, ]* k1 n6 s0 i& L% a0 N5 Z& W; O5 R
  7. }. l/ Q  [  l6 s1 ^" D
Скопировать код

2 o# q# y: h/ M! p% S- n, M3 G0 C1 yШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 F. y' y" ~6 r* _/ N% c5 X" b  |1 z' s$ @0 O3 m- w! P
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  i% M0 P" r8 v  n2 p& E8 Y9 z7 `

; S& r% s4 U2 M( Y. ^9 u! @7 s. g- r+ fКласс для начального состояния монстра:
" b/ _: V% R5 \( a% W$ |  V. w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- y, X, B6 G0 m, x  R
  2. package org.l2jmobius.gameserver.model.actor.state;$ X1 |. @+ h7 J# [; I

  3. ; @3 O! N: ]' E1 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ S# j/ Y$ f  t. \4 [/ t
  5. $ [' Y1 R. A# `2 H+ V
  6. public class InitialState implements MonsterState {
    7 [- ?) _5 X. m1 V, r
  7.     @Override
    ! X! y3 Z( ^7 W7 ~% C; |
  8.     public void handleState(Monster monster) {0 ?$ r4 ]. K# U6 w- O) z, S, |7 n
  9.         // Начальная фаза боя  \" g/ r" D/ p0 F( W) D/ v
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( G+ P6 z% q( L' u+ @# W
  11.     }
    " j! Z" l3 g2 S( y7 G
  12. }% D8 g1 _, C- Q8 N( L, B
Скопировать код
Класс для агрессивного состояния монстра:
: a3 `! l( t- h; M, \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 q2 P( J* k) H4 q' X
  2. package org.l2jmobius.gameserver.model.actor.state;  v; s2 H+ D3 F7 a& d6 L
  3. 1 q  Y( o% y8 L" [
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 u% w/ C+ N+ L, M
  5. 0 P$ k9 ~$ W1 A" E  h6 E
  6. public class AggressiveState implements MonsterState {1 b2 D" d/ W! k( I
  7.     @Override, A1 S/ t6 o+ J$ t
  8.     public void handleState(Monster monster) {3 H+ J" _" ~6 N4 t* a1 Q
  9.         // Агрессивная фаза боя
    9 d- W7 _0 V2 x1 @9 g$ G
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    . w% }/ c2 M3 z$ T
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    9 G5 D4 W3 H0 m" [4 y! _* f
  12.     }
    # o- {$ |  l6 {% \( [5 m; |; d
  13. }
    $ v0 U' h9 C+ u! I& E
Скопировать код
Класс для финального состояния монстра:
! L* m' B$ N* O1 |8 X; y/ e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( Y' R% ^! P- I/ B& E# [
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; [0 R/ l" n. ^) l

  3. ( `4 `. M# R' I' h+ m# `5 W
  4. import org.l2jmobius.gameserver.model.actor.Monster;) ?6 @& g- Q7 b' z: M  M  t0 V  b

  5. - F( e2 k! q  W! c! a. D4 {
  6. public class FinalState implements MonsterState {
    7 J3 h  C- m& i# ]2 Z* r
  7.     @Override
    - y* U5 u- m  C
  8.     public void handleState(Monster monster) {, F! D0 Y* f1 B6 s4 b+ `
  9.         // Финальная фаза боя5 t' i5 O; D$ B- g( E
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 l, C4 w) g  C3 J$ I
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 ?% U+ w0 l+ j' H2 r# q2 m
  12.     }
      o' Q* h' ?' V% o  i  y
  13. }' n/ K& E# i6 q3 x5 h, X
Скопировать код
+ Z, V8 }9 c* I& `
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* [2 W- R6 \( ]* v1 f
  1. // Пакет org.l2jmobius.gameserver.model.actor8 n: Z' O) i+ z* C5 J2 K! U
  2. package org.l2jmobius.gameserver.model.actor;* `3 R/ N! [0 Z8 m. K$ b/ l% e
  3. 4 k7 |# B9 z/ {. P. ?3 j/ O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    8 U+ t0 \& S9 ]# J) q6 }0 \( \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* e, n  G" \) M; B( s# I" [
  6. " h7 d7 [2 u. `  k% i; z3 i
  7. public class Monster extends Creature {! _$ f6 g: M6 G, r  ^) M
  8.     private String name;% o' k9 i- P9 s4 S
  9.     private double attackPower;, ]% Y/ a6 i2 h4 q' q5 R
  10.     private MonsterState state; // Текущее состояние монстра
    ; d6 @/ a; {& i/ ^+ f

  11. 5 H* K# [- r8 B9 _7 J2 U/ X
  12.     // Конструктор монстра
    6 Z8 g" _5 |& j/ ?: d) a
  13.     public Monster(String name, double attackPower) {4 S2 y- A3 h! c0 N) R
  14.         this.name = name;- J, Y1 i( k. f4 M5 Y
  15.         this.attackPower = attackPower;
    6 }  K8 ?; U7 l! L1 F) b: M9 s* g+ q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ' p/ y  b4 Y5 {( r9 u4 W7 [
  17.     }
    8 u! f4 x/ O- V0 l* G. l2 Z6 r

  18. 0 `" k+ O7 Q( K
  19.     // Метод для смены состояния
    3 e( f6 m3 F  J# B( m# L" J8 E
  20.     public void setState(MonsterState newState) {' V7 \, x4 [8 n9 J0 N
  21.         this.state = newState;1 j9 o+ R, b$ o0 z: J  v/ r, W
  22.     }8 u6 O' C0 _* K

  23. , G0 B( ?7 j; {0 Z
  24.     // Выполнение действий на основе текущего состояния
    , f1 e% t. @2 |* Q" a5 X- X9 }
  25.     public void executeState() {# T/ Z7 r4 y$ t8 ]: i2 N
  26.         state.handleState(this);/ L5 ~- F( B; f5 Z( F
  27.     }% k7 J: v+ V+ r. i: v! a

  28. ! b- D, j* I  k( _1 T
  29.     // Геттеры и сеттеры" R) U, M7 c3 j, A. d
  30.     public String getName() {2 R+ g9 Y) k+ Y% _1 v
  31.         return name;1 o2 f* a6 k. s0 [6 r6 B
  32.     }4 p3 F* p1 C( W% M) G8 c
  33. ( s6 N- ~; y5 u' k2 F8 o4 t
  34.     public double getAttackPower() {
    9 R0 Y9 g% d+ |
  35.         return attackPower;
    ; E, ?$ T6 l3 a. B+ T0 C; L; F
  36.     }
    - K2 o0 \/ d+ l" g" A! r* M
  37. $ w( q2 M, x  S) F' I7 G
  38.     public void setAttackPower(double attackPower) {! E# J3 @) T0 V8 k2 I/ H- p7 U
  39.         this.attackPower = attackPower;3 }' r, d# J0 `  L" y& x
  40.     }
    3 W5 I4 \% V9 W; u6 Z
  41. }
    8 }; p9 E) E; N# ~/ q' D- `, A
Скопировать код
- h$ t# o3 [6 c  L1 A
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: j8 h. b$ V+ B2 {) V
/ S' {* q) }6 e1 V
  1. // Пакет org.l2jmobius.gameserver.model.battle
    . ^9 y+ G% D5 J* \0 h! j0 i$ a
  2. package org.l2jmobius.gameserver.model.battle;+ @+ k; C: s7 k  S5 e2 a% w7 K

  3. & y! t3 W, {/ o& j
  4. import org.l2jmobius.gameserver.model.actor.Monster;# a1 b/ g0 r9 G: R7 C6 A) Z  c
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * a/ A$ U9 l; E
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;( u# y$ h; G" @& T
  7. # k2 G  N/ Y9 Q, l7 ]
  8. public class BattleSimulation {
    ' t$ \! z3 l7 P, {
  9.     public static void main(String[] args) {8 o& H- _6 i- t) I/ ]# ]  w; ]
  10.         // Создаем монстра с начальной атакой
    / d  h. ^' B9 E% u, }
  11.         Monster monster = new Monster("Дракон", 100);- Z2 B- J1 Y9 P3 H- F  g! x
  12. 6 z  t5 C# _& L) O" Q
  13.         // Начальная фаза( H4 P! G7 L7 T
  14.         monster.executeState();
    ! i6 S, N2 g1 @" Q/ A4 O

  15. % b( H2 W1 {( i4 l; l1 I
  16.         // Переход в агрессивную фазу) K# l7 g' K' X3 d/ T
  17.         monster.setState(new AggressiveState());
    ) V! }+ K" X$ A# I
  18.         monster.executeState();. Q: v. H3 A* o. F2 H* H
  19. / H$ ~4 K- L6 a! {; b& c
  20.         // Финальная фаза
    ! I- J& k4 |, `1 s# |  I
  21.         monster.setState(new FinalState());1 R  l2 v( X& t1 A: s
  22.         monster.executeState();
    * M* O5 o; V4 h- c% h' u! U2 a  N
  23.     }
    ) f" c8 e$ @" a: v$ k
  24. }
    + ]1 T1 p) `( r+ H" m+ k( c" L
Скопировать код
3 E/ P$ F- U8 a0 S
Комментарии по структуре пакетов и классов:
2 L: Q8 y8 B$ Z
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 v1 p" K; c9 @8 E
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.% k; k  R, z) P
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 u. Q5 ?  Q' G8 f# u. z8 m. h; t0 j3 q+ c% C; O. a
7 w& \6 ~: q7 e1 F4 n7 N9 G# @

9 Z9 t6 }) q2 X6 l$ [! u# Z' J7 v$ _  J" Z9 o$ }
$ s2 d1 }+ M; p  V# |
) M0 m4 r4 L8 D& m9 E
2 c3 m& D9 F7 n  L  k( d* H0 H

; R! F6 m" {# c* E+ T
$ m5 d# s: z  o9 z
# ^' F2 Y1 C2 ?( q
4 e" c  x/ C. f
- m  X3 J! Z: n1 K
  G3 R6 x: o) T- T+ m' x: R* |
* c7 ]  |  W* M; H
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:046 d3 p1 f4 Z6 A; U' |5 C
Для управления сложными взаимодействиями, такими как  ...
! P+ V+ S0 t/ \% Y
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
6 z% l1 d7 f, ?$ B1 @7 U/ OОтличный подход! Использование шаблона "Состояние" де ...
- T+ a/ @8 ]8 N
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
$ e' X# x8 H  [( M0 g' K0 D3 y, F; n, Q3 ?7 o
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
( b* {. C2 s, U! ]) {1 K9 j' o) I0 O: ?+ L  M: e
  1. // Пакет org.l2jmobius.gameserver.model.actor& E/ O# P+ a7 e8 i
  2. package org.l2jmobius.gameserver.model.actor;
    ) B4 c; g) S) X/ B4 u3 T+ ?8 _

  3. 2 d" C& s; i7 @, O* [: B4 L
  4. // Перечисление для типов атак. v) f' x% [+ y
  5. public enum AttackType {
    6 b% K  i  I6 ^. n( l3 }3 B$ D; W, `
  6.     PHYSICAL, MAGICAL;/ G% T. d: J5 E4 a7 Q( l! m! u
  7. }# ?+ M% d0 {( H# e) T
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
+ ^9 V' u8 t+ ~4 P. y8 {4 M! [Обновленный класс для агрессивного состояния монстра:: K* A% m5 M3 \& T- F

3 F: v, F! `( [) h& ~6 i8 H) s$ F( r$ E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ Z& P6 O& @' G0 e2 j
  2. package org.l2jmobius.gameserver.model.actor.state;7 v6 ^& P4 V$ @' Q' e
  3. : K5 K$ W/ ?# V$ w/ }
  4. import org.l2jmobius.gameserver.model.actor.Monster;% R0 X2 {% c1 f1 S2 H; y, J+ Z
  5. import org.l2jmobius.gameserver.model.actor.AttackType;8 [. G3 N3 Z6 i) x8 X- u( T
  6. 0 i3 w8 a1 d$ `& ?  Z$ @3 S% A
  7. import java.util.Random;( S+ e" t2 C( k& x

  8. ( B. r$ x0 n# Y' L3 s
  9. public class AggressiveState implements MonsterState {+ Z2 X3 G+ v* N0 s; g5 B
  10.     private Random random = new Random();5 Q6 G6 Z7 d* h' N4 f
  11. / `: e! g9 B- S8 n4 w
  12.     @Override
    9 G2 N$ l! q0 x
  13.     public void handleState(Monster monster) {) A$ b: d% }) g4 v" l0 }% B8 n2 m
  14.         // Выбираем случайный тип атаки: физическая или магическая$ i( n. ~6 I0 Y1 x0 s: J/ |7 V
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; p4 W& h- q+ G" B  r% W! R
  16. 1 ~" N* \9 u8 G0 y
  17.         // Логика для агрессивной фазы боя% \) q! e4 G. f; p
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " % }; [  @6 ?/ c5 v; e
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    1 t2 l( ^" z4 [: B; O! q
  20.         . j2 N! b8 [1 i' {7 C
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    $ l) m0 w' q. {7 ]
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    : V$ @' h4 e* l! _. A0 ?
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);1 T$ H+ ^4 H. W/ ~0 s
  24.     }
    ; ~2 j& Y( X, A6 l; I) N5 i) K) I
  25. }
    ; W5 U* D+ g) c; u) A' d' Q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки8 N) w% Y) m  g; f% N! h

! v1 V! F" ?) T" Y1 B: g" o% x& I0 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( e1 Q2 X# S  J, }7 r9 \0 l! ?
  2. package org.l2jmobius.gameserver.model.actor;* P/ ^4 ~0 q' h4 W& u
  3. 6 j5 `- ?3 @& @3 O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , M* J) k9 u, _0 s! i0 F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;. s/ }6 F3 W  W4 B3 R

  6. ; d9 J  n2 B1 O3 P! I' ~
  7. public class Monster extends Creature {% ?0 G1 ~3 G: u. b$ ?
  8.     private String name;0 z9 k- W6 Y) x, l; }
  9.     private double attackPower;2 M8 r& v; m! {2 p% t
  10.     private MonsterState state; // Текущее состояние монстра
    / y, m: f3 o* t1 L4 n
  11. 2 f& d* p0 R9 R# f' |
  12.     // Конструктор монстра7 ?: ^" y& `  l# r$ b# S
  13.     public Monster(String name, double attackPower) {
    4 I' }, B# @! N; r6 ?( w& Z
  14.         this.name = name;
    # F1 t1 R% w8 Z) s9 Z  d7 V
  15.         this.attackPower = attackPower;: k: l+ {0 ^% E. Q$ k- O2 }- y
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию5 [9 m9 c9 J! K' M' ~5 d
  17.     }1 ~: O5 z6 W/ I" N" D% I
  18. ( S: L8 z9 Q) V
  19.     // Метод для смены состояния% H( {9 {6 I( ~2 A2 n" s
  20.     public void setState(MonsterState newState) {! j' o  ?1 k' |1 Y
  21.         this.state = newState;* ]3 x8 f; z+ H% o& e! P; v
  22.     }
    $ _: A+ r8 r, v2 F+ r
  23. " R1 ]4 F  \9 Q% I/ G3 M
  24.     // Выполнение действий на основе текущего состояния
    ; b* a: K" f$ M! G, e  |$ p
  25.     public void executeState() {
    : Z' O7 W* c/ c$ Q: J2 a
  26.         state.handleState(this);
    7 P  y: B, c- p
  27.     }( l* {; Y8 _% Q7 b4 n& a# m+ r7 m& E

  28. 2 q1 j; b1 j+ [0 ^
  29.     // Геттеры и сеттеры
    $ I$ ]) X& u( a" N9 S1 ~8 K5 D& e
  30.     public String getName() {& f# C9 I; k6 [
  31.         return name;
      i% v* c2 [. j: {3 c
  32.     }: E9 R; W6 B  q! ]/ r8 g$ ^+ Y
  33. * t; X7 f/ d5 L6 O! W
  34.     public double getAttackPower() {
    - y- t  q5 D1 `# z
  35.         return attackPower;( n. ]  M# {$ p9 q. H$ N; c' J4 U
  36.     }8 }1 Y% E% f2 {: |( s1 |$ Q( h  }

  37. " F) r; o& ~$ ]; a
  38.     public void setAttackPower(double attackPower) {) x* X. R& ~1 b+ O3 x
  39.         this.attackPower = attackPower;  h8 \; R1 L# E
  40.     }
    " E: q, Y0 L& j% K7 e6 N: i
  41. }3 A* h9 v3 B0 L8 n% e( z( K
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.5 y' z- N; g8 B0 h4 ^3 e! `

" I0 B1 O, U5 E+ u8 y3 F/ q
  1. // Пакет org.l2jmobius.gameserver.model.battle" [0 x! O+ \5 I1 Q9 k) O
  2. package org.l2jmobius.gameserver.model.battle;
    8 W/ M- H8 P  U; l* L. k4 v6 B3 n1 e
  3. : k- g+ N3 i1 d8 u5 g) y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , w3 T1 z% G$ s- A6 h. H
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " P5 t; h3 u* ^  R8 W2 J" l

  6. 4 @. R. W" \* z: o
  7. public class BattleSimulation {: c* J5 a8 J; U+ r0 O; _" `) q! f0 G
  8.     public static void main(String[] args) {
    ! n% e5 t2 W, k& Z: ]* ?' x
  9.         // Создаем монстра
    6 \& H* I! E' j5 [! e) ^
  10.         Monster monster = new Monster("Дракон", 100);; W$ f3 i; \: t; j4 T2 a
  11. 2 C8 P0 E  I+ w! ^2 z- |# ]
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак  `3 u" \8 |! U: r: d
  13.         monster.setState(new AggressiveState());% Q; t* Q3 n3 \, ~4 z7 H2 P+ z
  14.         monster.executeState();+ p, t( |5 T0 X" E. H
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак& r# U: U+ A  J  l; A3 W5 @
  16.     }
    1 B- z: E7 Q6 K2 [2 \3 B5 E# e8 L
  17. }8 k3 E4 p3 g5 K0 _# Y/ r
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 K/ |: M: ~* r% w, s" RЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
$ l7 [2 n4 P1 Q& w+ R; c* l4 i
3 q; y! R4 }% \. A* @% \1 ?  u" K. U) ?: b( b& H

2 k/ p7 ?, g6 N* C5 W! s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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