Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
+ A% ?# f# t1 C" r
# S& i" A) o& ~
# ]4 D5 t* N$ W) A( _# `& j
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 `" C6 l. ?5 B! O: v2 k
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
" f  W2 c4 ~4 g+ E5 EАстралия ?
9 @" B! M$ G" R8 B' A  L
) q$ B, V+ {: b& [5 k! V, x% G6 x$ y

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
* C! y7 z6 M  SВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
  \8 T- Y* D& `/ K0 D6 `3 T1 V4 p/ B& c& _' H, W$ c0 U) Z
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 8 I. U  E+ v% c7 n
AlexCoder опубликовал в 2024-10-16 18:319 m  P; O/ U; k7 e6 `. D1 _
День добрый!
& M& v) L7 t) i0 L, \1 e9 J- B. ~8 \В статье описано взаимодействие игрока с N ...

% c6 ]! A; Y7 B5 H8 q7 u8 H; FДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, W- R3 {5 \& g+ ^& y' J1 y" d" O2 R. B1 j; ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
! C* _$ G* c* a4 _) Y
* ?# \! t& x( aШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 m7 D& x( d2 Y# p8 V4 [

' K/ ], F  {8 U( s
  1. <font color="Green">// Пакет для состояний монстра</font>/ b  B1 Z* T+ x' A
  2. package org.l2jmobius.gameserver.model.actor.state;
      U( W1 d, p! G
  3. <font color="Green">
    ' Q1 z" D+ i+ D* ^1 h! L/ y
  4. // Интерфейс, представляющий состояния монстра</font>! T. }' z. V# N' l! k
  5. public interface MonsterState {
    ) V' j0 {0 S) L# C/ h! f
  6.     void handleState(Monster monster);
    ; B2 i5 j" p! b. Y  |6 h
  7. }
    7 h, B5 l- V. L2 C2 _+ f* @
Скопировать код

$ g7 l' x2 p8 N; p% p) {" z' m0 ^Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ [9 N) E/ }( `

6 M) c/ z0 A+ PКласс для начального состояния монстра:
7 S2 ?( x9 K  }+ z0 g" n
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    5 ~! M& ?! P# }0 b1 g3 C* Z
  2. package org.l2jmobius.gameserver.model.actor.state;+ @* z! N, Z5 z7 k3 i+ w# i. H+ ~
  3. % Q8 e& `3 {, {3 Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( I* F/ o7 J8 l) s  i

  5. 8 m# B# x1 F- J* v* T" @
  6. public class InitialState implements MonsterState {
    * \. y( e/ E, t' w: p; @
  7.     @Override/ R2 u: s* G1 l. H9 t
  8.     public void handleState(Monster monster) {
    5 ~9 O5 Y; v  u; S
  9.         // Начальная фаза боя1 I1 \! L! m! j% [: [, r) o' ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, i+ ?, Z; A; ~* {4 O7 E
  11.     }1 o8 @- r0 s1 c9 c
  12. }
    " `& [( X+ ?. \, A
Скопировать код

$ V6 c# }/ ]1 Z/ ?& s6 s; j- r# _* F3 v5 P: f  N% U

/ i5 ]6 y0 t2 ^3 ]
9 S, M2 q4 A9 A8 ~) ?  x8 u
$ W  R# }. e: K+ m% U  m, U1 u8 y" w: z9 ^( e! ~2 u2 p

6 Q1 e; u6 ~. p# _8 z# m
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). : \; A" ?0 Q' H; P+ L

: z. X) y$ F8 C- ^Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* Y# J9 x9 T# ?  |" F  v* x5 `* O4 V" G; N1 i8 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 p3 s( W; i" Y8 G( Q( O: f
/ \" {* W$ e. L! E1 R) ]3 K7 B
  1. // Пакет для состояний монстра* C0 V3 R6 L  x. J( O9 c
  2. package org.l2jmobius.gameserver.model.actor.state;
    # {& `8 y  ?, d  N/ L$ {  W* v

  3. 7 I, E4 ]; U3 ?8 D0 c: h
  4. // Интерфейс, представляющий состояния монстра
    $ o& `/ R) |/ O+ j+ z3 x$ I5 ^1 v) G1 |9 A
  5. public interface MonsterState {
    4 F8 o& I. G2 t# E6 g' r
  6.     void handleState(Monster monster);
    8 ^* t: D9 a+ a8 w( P8 q
  7. }2 ^- m! V* @4 |5 {
Скопировать код

: W& a# d/ l* l. X6 k6 i+ }Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # n. `' p! s  O) n
( }# w# N" q. r' |/ ~2 U3 e
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" R  K: [4 W7 e( ~( @
: N* `7 q6 c- v2 o& R2 AКласс для начального состояния монстра:0 T* [! w5 w* v7 N8 v% o4 w( E; |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 i. s' C7 I/ Z( u9 G/ C* u9 |6 z
  2. package org.l2jmobius.gameserver.model.actor.state;( L% o% N* q/ n: a' d! I
  3. 0 \  I' `$ j7 L6 M! K/ U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; b# @/ V2 j: H; r1 n. a) Y  _6 }
  5. . R( C. I9 X9 x7 C2 ~6 A
  6. public class InitialState implements MonsterState {
    1 I  B, V! ^8 p7 P6 j5 H
  7.     @Override
    6 ^) W- v) d9 m# _6 v
  8.     public void handleState(Monster monster) {
    ) F# O4 H4 f& |3 ~9 n
  9.         // Начальная фаза боя
    & v7 m! z$ C0 ?) I& E6 d! }5 |
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 {' S/ s( @  B$ R5 N
  11.     }
    1 s" [8 {! h$ _7 ~, j' r
  12. }
    * _2 n7 Y, s5 _/ u# c1 u9 J' E& A- s
Скопировать код
Класс для агрессивного состояния монстра:
, i+ y$ ]# u  n3 \2 V# c% G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 L8 m+ M) w7 `
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 R8 U* g* D, ^: G1 ^* p! U) }
  3. / K+ Y& c8 J4 w7 i& a( ?) i
  4. import org.l2jmobius.gameserver.model.actor.Monster;. C6 P0 V8 R4 R
  5. - A) ~0 J" _+ P6 g& A8 ^$ `
  6. public class AggressiveState implements MonsterState {
    2 I# `+ ^- N8 l0 q
  7.     @Override7 }$ r) N5 b( O6 d* f/ Y. Z
  8.     public void handleState(Monster monster) {
    6 r6 N& P, z4 t: f. |7 T, C
  9.         // Агрессивная фаза боя, o9 D6 }1 o5 Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");+ x6 m# d# u+ d0 I
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    0 W7 A: Z# P7 p: V  P# r
  12.     }& K$ }, i  Y* L; G5 ^
  13. }
    . E8 y( U: A1 r* ?8 u4 \
Скопировать код
Класс для финального состояния монстра:
" J1 ^: y2 \3 y/ z" d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " h* J5 }4 O$ x8 }3 V$ m4 [
  2. package org.l2jmobius.gameserver.model.actor.state;0 E) [; `$ U- o

  3. 1 u: C/ u( b6 U: B( A" a( }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) I3 R0 a/ J- H6 c. R/ v
  5. ' Y4 y* H% f9 p
  6. public class FinalState implements MonsterState {
    7 ~6 j2 \: b4 e, C
  7.     @Override) g) Z6 M0 ^7 {* O/ g
  8.     public void handleState(Monster monster) {' Z0 O% E: \0 |; |3 W
  9.         // Финальная фаза боя$ i0 g1 V1 \+ m6 Z3 C/ p* X
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    2 K+ t5 C' L* e( h% H
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки6 p1 A% |# Y3 p1 t  d( ]
  12.     }# Y. b" }0 m; K0 R3 ?; d
  13. }* N; _6 v( B; t2 R3 q
Скопировать код

. r5 w' a* k/ G1 V  Y, oШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' N: w1 ~+ _; d8 Y# r
  1. // Пакет org.l2jmobius.gameserver.model.actor' e8 c6 Z( Q1 N' l
  2. package org.l2jmobius.gameserver.model.actor;& e: A& A( s$ i, U

  3. 1 j2 P9 O3 u. H# v$ }
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    $ t% C: D9 T1 H! h4 f3 e2 i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;0 N% Z+ _- ^; G4 J( ]! ~4 h

  6. : L' z5 _. y; D# u; s8 s! O
  7. public class Monster extends Creature {
    ! H1 m; k  A! O3 F7 z) J- i3 C
  8.     private String name;
    ( C2 w- g" t& a+ R2 k$ e) T' u
  9.     private double attackPower;+ Y7 x+ l* S: e& c
  10.     private MonsterState state; // Текущее состояние монстра
      I- i# C( V+ e, }

  11. 9 x3 D% ^" v3 R3 W. [
  12.     // Конструктор монстра3 `7 c, Y, L1 b. z. Y$ X
  13.     public Monster(String name, double attackPower) {* `! E, S2 e. x4 k
  14.         this.name = name;. q- W3 u# J& A
  15.         this.attackPower = attackPower;2 k& o1 L+ O6 i" Z8 y' t0 M. _
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ D/ Q6 o* q3 o+ J+ a) P
  17.     }
    ; f  S3 ?1 a9 B# X
  18. ; w; }# a* g! i9 C
  19.     // Метод для смены состояния
    0 `) v5 \* @5 D9 q- d3 `0 U: e
  20.     public void setState(MonsterState newState) {
    2 k+ f5 j+ M) N  _3 Y
  21.         this.state = newState;4 L8 Q- W! @. t6 q2 e
  22.     }, k% G8 X5 h- p. D# p

  23. ( U! \6 T7 }$ C3 |, N3 X) Y5 r
  24.     // Выполнение действий на основе текущего состояния
    : ^* N  e- r- `# k" ~
  25.     public void executeState() {
    . W0 t( D' h5 a5 U* i: r
  26.         state.handleState(this);
    1 b, R1 X* t2 u& d) d
  27.     }
    6 b8 h) W! n1 P# e
  28. ( |' R; f+ y2 i1 F
  29.     // Геттеры и сеттеры; l5 Z+ k3 M. B3 n8 ~5 X
  30.     public String getName() {4 V) B: B( p, z* `" p1 o1 d/ D
  31.         return name;
    , s) J* [: S  R" Z1 d+ P1 a% R$ [
  32.     }
    * b, Q( [8 U- S% {% ~1 z  t
  33. . O) y% M1 B- z6 R2 [" z# {
  34.     public double getAttackPower() {
    : |8 |3 Q0 G4 E$ u
  35.         return attackPower;8 v& ^" t) \0 W# h" B9 L( i
  36.     }( j+ k6 \# X. e! J8 w

  37. 7 W' O  l) ]' b! S8 |
  38.     public void setAttackPower(double attackPower) {8 z9 K9 y5 V! s, k3 E
  39.         this.attackPower = attackPower;
    # g( }# T8 u9 K# j
  40.     }
    1 W- S( e) [0 r$ P& T: d- g
  41. }
    % W( l" U9 P0 M0 G, q) J
Скопировать код

' ~, V  y) t+ \" w. d4 X3 PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 G# e4 Z: ^" B9 i3 y

/ n. l" }4 `- ]
  1. // Пакет org.l2jmobius.gameserver.model.battle% n# |3 X+ ]: _5 i- D
  2. package org.l2jmobius.gameserver.model.battle;
    ; Q; t6 G8 [- K/ R3 h8 [

  3. . A4 @2 F. |3 r) J4 C& a& J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + M% S+ y6 B6 @8 ~5 H
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 B5 j: K" U9 v2 A
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;( o  Y8 A& T5 Y! A- A1 E. b. i" p

  7. 0 ^8 s1 g* k& p+ U: F% O0 L$ n
  8. public class BattleSimulation {4 v! \# h) J0 l) C
  9.     public static void main(String[] args) {
    & B+ ~4 u' K" t$ P7 @4 C5 k
  10.         // Создаем монстра с начальной атакой
    ' @) Y- J' c9 C5 |+ m/ ]9 S# A
  11.         Monster monster = new Monster("Дракон", 100);: @( n  G3 o- y. u6 B* {4 Q, H
  12. / k% V, {# ]% Z' m
  13.         // Начальная фаза# K: @! X4 ^- p
  14.         monster.executeState();
    $ _3 n0 k! ]6 n
  15. ( |# t( u+ z+ u
  16.         // Переход в агрессивную фазу
    $ w- I. G2 O+ ^3 ~
  17.         monster.setState(new AggressiveState());
    ) y3 Y. O: `4 q$ S, y) U- H# X
  18.         monster.executeState();- z. B" V' s4 U7 Q; r6 q% h' Y
  19. 1 Z: q6 n( v  D$ Q, ~8 L
  20.         // Финальная фаза
    & @. M& R6 @8 D' z/ i
  21.         monster.setState(new FinalState());
    . ]; F3 E0 W# o  S9 [6 g
  22.         monster.executeState();; P* _' P$ w, ~5 ^- s) B9 O
  23.     }3 w0 ^( i, F4 q8 ~( D
  24. }8 u4 W) G7 v% d% q
Скопировать код
& r( T$ ~% V4 |% V* j' c
Комментарии по структуре пакетов и классов:
- Z6 B" G3 I, S1 t( i: R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.* s  V: f' r2 ^2 v
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 O( X: A% t8 [1 G- p3 o$ IЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' l, D( Q1 B- G- D
; T, y8 u& ]/ t8 _/ Q) q
* ~  T! Y- s' Y2 k* u0 \, K4 L8 a' u

6 M/ ?1 v9 m& c8 r
0 ?$ A8 N/ }* _, w6 {" n5 `0 _# `# `3 U% |% V% ?3 L

4 `4 p& j: ^! V- u* H5 k
9 x, D. Q8 q; ^1 k9 ~( K' F0 M# a1 f- u( A2 e9 h' O1 R6 w9 l( ]
0 ~7 F1 D7 K$ @! p: a/ }+ g

$ g- ?' f8 f( J; ^: `7 `# w2 C4 Q- ^- x6 t- F2 ^
) g7 `! `; C: g3 b5 i8 d
4 G' c+ r, r: R, z* k
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04! u5 O5 ~* e4 j
Для управления сложными взаимодействиями, такими как  ...
9 f; `% W- R" ]% s) g
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
* \5 v3 @4 q* T8 h% s, T* {6 SОтличный подход! Использование шаблона "Состояние" де ...

9 a( b& e* Z; v! ^+ B5 X$ OХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.3 q4 o, y; K8 W& ]/ B' g1 X- ?5 h
# W$ x% x# d) R" O4 ^3 E
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
. O# _9 R/ j5 ^6 h, X! |( x' U3 \3 e" W. a) a2 o2 g/ `
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 ^4 k6 u$ @' L5 o. f
  2. package org.l2jmobius.gameserver.model.actor;4 k/ H. a. A& Z
  3. ' @$ S, ~0 o/ ~( {0 e: v$ s
  4. // Перечисление для типов атак4 b  g$ i0 s) q* T7 P4 O
  5. public enum AttackType {% e! d/ r/ w! Z/ h* ~9 X& p3 _) }  Z
  6.     PHYSICAL, MAGICAL;
    ) c& K8 [2 n9 O
  7. }8 _* ~( A. ~! T0 F: w
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.) Y" f8 ?, f' \' F" K7 M
Обновленный класс для агрессивного состояния монстра:
5 P& b  P2 N& r6 W: w  v& ^* k' x' U8 `/ w+ k4 d2 g3 V+ f! [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& A/ z5 z! _/ |' Y9 o
  2. package org.l2jmobius.gameserver.model.actor.state;) H+ T; i' Y( T( h2 h. V2 l8 d

  3. 9 `2 L  s# j% u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! l4 @( f  Q/ D- U5 k$ w! W% q+ a7 q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    2 S/ e5 ^6 {8 M5 f4 F6 c
  6. ) N$ |" O3 l4 p+ H1 }+ ]6 Q
  7. import java.util.Random;6 E/ N; p- m- n1 E
  8. 1 D2 L5 b! J4 O: s* |
  9. public class AggressiveState implements MonsterState {$ J; M+ ?& B$ R& |! S1 w) t
  10.     private Random random = new Random();
    # }5 b* e3 k' U; x

  11. # H1 q/ b2 [* m" H+ k# C
  12.     @Override
    3 [  u' Q% \  U
  13.     public void handleState(Monster monster) {
    . ^: B+ ?( m* H7 x4 ?0 l/ x  E
  14.         // Выбираем случайный тип атаки: физическая или магическая/ |7 `" b8 _3 J7 }, a6 Z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;) g/ C% F  l. @, U( {
  16. ' y# G" _( E& P' [; y7 w3 Y
  17.         // Логика для агрессивной фазы боя
    $ R* g1 |: R& p% E; \* g
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ' y8 V2 _3 y0 Q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");2 i) w7 D/ `' Q
  20.         
    : @" R8 u' j- C- a# F
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 E! i4 B) r2 N  u+ Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ( L  Q$ T- O0 u# f  ~! c8 p. d
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);/ U' q6 ^* S0 m' d6 w- W5 f
  24.     }  I) R, Q7 T% I2 W
  25. }7 r% q& f/ i$ x
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки7 M) c" k) Q  `( h

/ e, l$ i- w: n0 P( Y, X6 l
  1. // Пакет org.l2jmobius.gameserver.model.actor7 f- g1 M# S0 w$ L% z* N
  2. package org.l2jmobius.gameserver.model.actor;7 s  h& \3 l1 P8 Q
  3. 1 X6 W2 b! q! W  B; V# B
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    * \% z6 Q# r, n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;5 T$ M# V6 Z7 Y: f/ Y

  6. $ _9 s$ k, t6 e4 y
  7. public class Monster extends Creature {, Q. R( a. ^1 n8 t6 E; N
  8.     private String name;
    ; z  |! r  u) S/ d! L# _" ]/ M
  9.     private double attackPower;  X9 a2 d! G8 ^+ v  v# A: ?
  10.     private MonsterState state; // Текущее состояние монстра
    3 C; @4 q, \' {# m$ x' G! G0 {
  11. " M  F' t; \# ^& Y8 Q& F1 v
  12.     // Конструктор монстра
    / l0 V! K4 ?) o+ I
  13.     public Monster(String name, double attackPower) {
    , B8 s& i4 ?: X1 ^7 s2 _* ~4 m2 d
  14.         this.name = name;6 s( `. w1 A$ M) C9 F% L
  15.         this.attackPower = attackPower;2 P* X5 y  G9 u* Y
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию: R9 U8 V7 p* R% G4 B
  17.     }, a2 N" M* `1 H/ L; }. g0 m  s7 Q
  18. ! ^5 u; ~& R" e, a+ g
  19.     // Метод для смены состояния
    # ?& V. ~: E- B" _) c- i% M
  20.     public void setState(MonsterState newState) {, U" H+ n& B. }4 \7 t
  21.         this.state = newState;) _$ W5 N0 ]8 T5 a# f4 L( K
  22.     }
    ! C, K1 W4 z# I4 Q4 o0 R4 W; `
  23. 2 j, e8 d" j/ A* `6 z" v1 {9 |: S
  24.     // Выполнение действий на основе текущего состояния
    # u/ [  n% B, t
  25.     public void executeState() {
    $ n5 L1 [* o6 j$ |2 S' v% j
  26.         state.handleState(this);
    8 X$ U- Y& I/ S9 W/ l% O; P  l- C# M
  27.     }0 K  V- _* Q0 x
  28. 0 h# w% W0 S3 C; @: t( y
  29.     // Геттеры и сеттеры
    3 G; F2 `: e" Q, q0 T2 e( j
  30.     public String getName() {
    + M* f: g) O4 K6 K* Z
  31.         return name;
    : R3 b, `: ?% \3 g- G% j
  32.     }
    ! G6 i' j" T4 W" z4 T
  33. , C, @/ l1 V. i- u9 _
  34.     public double getAttackPower() {
    ! R/ s, `% H8 s8 W, e+ I1 j
  35.         return attackPower;
    4 R! Y) E3 I/ R9 u, [
  36.     }+ K0 s1 h$ V. Z" ?9 m: V: i& \
  37. * ?, m1 P! ~) u# _2 ]
  38.     public void setAttackPower(double attackPower) {
    ) g0 L5 j% w, A4 q6 Q% f
  39.         this.attackPower = attackPower;& ?$ I7 k- v% d
  40.     }% \9 r; \! b8 `9 D9 I! q' c
  41. }) b( `7 K4 o* I! W, K( V7 g+ w
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
' |5 Y# v, Z4 l2 g* Q) f' ^7 P: V( b2 q7 P
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ! W; [$ S# Q, G( E! y: c" e$ }* s  T- K
  2. package org.l2jmobius.gameserver.model.battle;
    ) x$ q: n8 f$ B- I' N
  3. ; [$ j! f- A( J% W3 m% l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , B# `$ R1 y9 }3 C$ L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;8 [0 ^! A3 F0 y' Y$ z. P3 [
  6. 0 J& A$ i. n  k
  7. public class BattleSimulation {+ e( {  x  n5 e9 E/ W/ |
  8.     public static void main(String[] args) {
    " ^. \- c+ K3 Z- N, {6 Q
  9.         // Создаем монстра# ~3 b0 R/ k! h9 C* E3 J; j5 f( g
  10.         Monster monster = new Monster("Дракон", 100);. t& _) R0 K" m
  11. % ^( z) ~" `$ `; ^* q' Z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ! d4 O/ G( t, w5 n: F
  13.         monster.setState(new AggressiveState());6 z5 k) _* R4 X8 M
  14.         monster.executeState();
    4 ^% A* O+ w& X; E8 r  k7 G. @
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак7 i& ?1 a* d. J6 n0 X2 X5 V
  16.     }
    & ^' B2 V( p: K  k
  17. }+ d, a. a) m' A* u; h
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.# \) B* o- {% f/ N/ o4 s
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& m' q  D: G7 t% b. a) @
( f4 d9 o2 q6 h$ v

+ \9 K' Z! @6 F6 `  b8 o" g
' @; T0 z. J0 A5 j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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