Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
( H/ n4 l5 S* M
' f" n* |( ?/ M  }! |3 r- Q0 [

! x3 ?) a1 _/ |+ j- DЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.! W% k+ D8 q  p8 y% I% ]
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
5 p! H4 O- e" YАстралия ?
0 _0 w% ^- L! g- a
4 e# @* E' \* R: @7 @: C0 a, \

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
% v9 v" Q% J3 N1 dВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
; `7 F' ?$ Q: j* o- _
3 _! Z. `4 S' v
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: ?$ ]' _0 [* t1 W
AlexCoder опубликовал в 2024-10-16 18:31
4 s% q, ~0 Y- r# nДень добрый!+ S. _( Q% Q6 O6 ?2 V
В статье описано взаимодействие игрока с N ...

' r/ P$ {: G4 L5 x! q5 n' o: `& h! tДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ! c5 N7 a3 t! ]4 t& ~
6 `' ]- T- F0 m2 L! U: b
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' V: w' ]& t5 {; y8 W' {8 X
; t3 Z4 s' C7 r& \4 A0 c( j7 yШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 X1 a9 j( l3 V6 u/ m

; w5 ?4 }* ?- [2 v0 l
  1. <font color="Green">// Пакет для состояний монстра</font>
    4 e1 B4 s% k+ j
  2. package org.l2jmobius.gameserver.model.actor.state;1 [5 R* A6 z3 Z4 U2 m$ ]! o* A
  3. <font color="Green">: k* l. H- Z) d; H
  4. // Интерфейс, представляющий состояния монстра</font>
    ( t  h, @& O) p* J0 [0 b. n( i
  5. public interface MonsterState {0 a8 t8 C$ h6 S0 T, V- l+ _; Y
  6.     void handleState(Monster monster);' z7 g4 R( R& p: j$ c
  7. }
      s( ?" H5 q, i. |# [
Скопировать код

7 W9 Y* |* ^* |9 ?7 Q1 hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 X1 q7 _+ N& [4 ~# K" n1 ?
5 R4 x6 \6 i% F7 d& `Класс для начального состояния монстра:
7 }/ ~8 D; @3 G
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    2 v; C- ^: @8 s* H
  2. package org.l2jmobius.gameserver.model.actor.state;6 x* h9 p6 z; _3 b. p* W
  3. + t8 K3 r( C0 e# d6 u, G
  4. import org.l2jmobius.gameserver.model.actor.Monster;% R. A! g7 P# X" H

  5. + C2 w# z" a0 S+ ~# {- A2 X: A
  6. public class InitialState implements MonsterState {
    5 p9 l. X4 o0 n0 H( ~  D. X: G
  7.     @Override4 F. T( H* n; Y$ o4 G2 i6 i; O. r
  8.     public void handleState(Monster monster) {' j7 r" o. P& T1 F0 H( T
  9.         // Начальная фаза боя
    9 R' N3 D8 E+ L2 H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 [5 M9 T  R( f' z
  11.     }
    7 ?- h5 R/ @0 m$ |7 Z+ K
  12. }
    8 T2 X# @" S' d. X; O$ R
Скопировать код

( d! {. f0 |* }
" H$ s  ?4 F3 w$ R9 R. E5 x+ Y4 m; j3 y: X1 F4 P

% |  K& o1 Z) _+ C1 L( v1 z  Y% @$ m3 R, L

3 A! g& l# [) Z8 {% d
2 C2 ^  ^8 v4 S; B  _
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* H& U5 c, G% n$ ~( V1 W
0 t8 \) @+ Y3 P* b' @0 \! R1 b' ZЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) E5 l3 d. V- H. [/ m2 o$ ?: H' ^4 B9 d* l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& E" t& o; g! h8 P$ @7 Y
7 q/ V$ W- z, C, L8 O0 L- ^( f
  1. // Пакет для состояний монстра
    4 {! i8 k! a* [: t0 _
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 _2 E- o$ h0 Y) C; X$ v

  3. $ A6 [( f$ y5 ?! x7 M+ y
  4. // Интерфейс, представляющий состояния монстра8 C3 u3 h$ w# w* E7 a+ K) i3 ?
  5. public interface MonsterState {2 e8 K- F3 B4 h
  6.     void handleState(Monster monster);3 O# H5 ~9 s" M
  7. }
    4 T" `2 g, n0 I" l, {, `; g
Скопировать код
& B; K2 A# G/ J% F$ U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 4 ^3 p3 U" r, W  t4 V' R

/ q0 j3 q: G3 N3 W7 @' z2 z- O, zЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) A& Y3 t, K; k3 v" }1 R0 ~3 ?! T9 G
Класс для начального состояния монстра:
( g* u: `* b! ?* `+ F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & [  [9 r9 H& }8 p1 q: [
  2. package org.l2jmobius.gameserver.model.actor.state;% W& t. U' e$ `% S% n/ X4 [

  3. * a' T/ Y1 Z$ g1 ]3 U2 ^; e, H
  4. import org.l2jmobius.gameserver.model.actor.Monster;# Q# [" T* [" F2 g
  5. - x8 z* f/ }4 }* x) X, X; o
  6. public class InitialState implements MonsterState {
    / }" x. B0 V' O4 j
  7.     @Override
    0 P. K3 e0 N! _
  8.     public void handleState(Monster monster) {
    + v, r2 {% M1 s4 A" F. g
  9.         // Начальная фаза боя! i% u! M0 q+ m$ `! s! I8 `
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % Y9 C$ w& C+ \4 S( c3 Z% j) u
  11.     }
    ) }& o- Z; S" @; G4 p6 k+ ~
  12. }$ k1 N6 ?% t8 W0 R5 l. M6 n
Скопировать код
Класс для агрессивного состояния монстра:
: v. T0 f) h; E8 o7 W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& V+ [- d, T& N2 a9 r1 O) g) N0 g
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! R) }& R: ^+ H+ M

  3. * d) v& c6 X3 i+ @4 g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - b( J# ?! ^' Z' g* l: \% I

  5. ! |7 ?+ q& Z5 i& _) z* N( J: \- b# c
  6. public class AggressiveState implements MonsterState {
    * ~6 }  D' r! D9 ]+ n" p2 B: I: K
  7.     @Override
    . y" e& v6 I# S) U
  8.     public void handleState(Monster monster) {
    ; P1 L& ]5 o! h7 u/ C2 r4 ?9 W
  9.         // Агрессивная фаза боя
    ' a5 g3 h* ^! W( G% S9 P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    . H5 H* r: R( {6 |8 X2 t6 V
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки# m! h- O/ F$ x+ w, F7 m- }9 ?
  12.     }3 j3 e: m7 ^0 F3 D
  13. }+ u1 R/ r* S# P. T* ~6 d
Скопировать код
Класс для финального состояния монстра:
4 n* y3 F1 Q0 k. e) s3 x9 \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) o; X4 q. U+ K7 T% g- H
  2. package org.l2jmobius.gameserver.model.actor.state;6 {: Z3 W5 `9 Y
  3. & m3 e1 @2 a! e; D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : \7 v' X7 V* W3 Z' i2 ^
  5. , U  y0 Y0 l! X1 P; z
  6. public class FinalState implements MonsterState {8 z  r! @1 P6 R  u$ m7 L
  7.     @Override7 N) y3 J: B6 F5 d1 V
  8.     public void handleState(Monster monster) {! T- S( W6 c9 \2 j
  9.         // Финальная фаза боя9 x! p7 ?+ A/ w+ g# ?4 @
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    5 o- o- ]$ \1 C/ z0 s" p
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ; R( t& w1 F6 i' s, a
  12.     }
    / I, T" `/ p$ V" V' q. w
  13. }$ W4 Q9 u" \% C
Скопировать код

$ K& p; {) C* [Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* `) `: t% W6 w/ P& @, r$ o
  1. // Пакет org.l2jmobius.gameserver.model.actor8 M' e7 r& G) Y3 _
  2. package org.l2jmobius.gameserver.model.actor;
    ' j$ m8 p% V' [2 l

  3. + f- u* [: d4 s( m" C
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( w3 h; p5 o0 Z3 @" F: c9 b/ L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' E6 k+ u5 u2 }0 s

  6. - p& }8 [8 U, o7 S7 e) c
  7. public class Monster extends Creature {
    + A; G' }4 M% h  a/ h' @" F
  8.     private String name;: T8 C  h$ v$ p9 B
  9.     private double attackPower;$ V2 f- e5 I4 W6 `  R- y, ]8 J1 k
  10.     private MonsterState state; // Текущее состояние монстра- A8 ?2 [+ i: l% E* Q
  11. " h" @' L7 z. U) Y3 _% f
  12.     // Конструктор монстра
    + p8 _2 f! T" c$ {
  13.     public Monster(String name, double attackPower) {
    : A8 y1 A1 \+ u
  14.         this.name = name;
    ; c$ E0 t; g! Y- n4 b3 ?; Z' o( r2 P  c
  15.         this.attackPower = attackPower;6 L' c6 f  H+ p% v+ f; I
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    . s" E3 E$ E, z8 L$ h5 ?( J7 a
  17.     }
    9 z/ D$ q# o  ]9 c

  18. 1 r, [; x3 |: z% [( C6 N/ s
  19.     // Метод для смены состояния- [! R, e( b6 R. r$ \8 H
  20.     public void setState(MonsterState newState) {1 i/ Y# z9 u# P1 J) h4 I
  21.         this.state = newState;
    ! ~) N7 `$ V" ~( H
  22.     }2 X& i. m$ G' `) K& N8 n
  23. ( l  i* N5 G2 J7 z) g* d+ w
  24.     // Выполнение действий на основе текущего состояния
    7 }& X; D9 s: T
  25.     public void executeState() {
    . r* r0 k2 e6 `- c6 {* B3 a3 R: d
  26.         state.handleState(this);, n" O$ ~3 K$ o* C5 A
  27.     }+ Q' V6 _! |7 b
  28. / p8 a: j$ ~" q; {/ k; b
  29.     // Геттеры и сеттеры
    + t  m( C$ Y* |" }
  30.     public String getName() {
    3 K! L, K) m" P. \
  31.         return name;7 W) R# @0 m0 ?% U$ z' x! J, u1 V, e8 R% w
  32.     }2 F  g( _6 {) V7 @/ C4 ~
  33. ; l; \  @! x6 B5 d$ X
  34.     public double getAttackPower() {
    6 {+ ?5 c. e. v- N1 k. y
  35.         return attackPower;
    7 B& d9 a6 H  S+ u
  36.     }: q6 n5 [4 v' {* g) E8 o9 Q* V1 }$ F

  37. 9 D  c" r$ k4 V
  38.     public void setAttackPower(double attackPower) {  U1 [, i- g: G; D/ g. G
  39.         this.attackPower = attackPower;
    - H, p: q3 B" g% t3 [
  40.     }7 Q; I. z& O/ t5 Q
  41. }
    , F! w  B  ?4 `: n8 J, o* Q
Скопировать код

: N2 ?4 t  o* `. X1 P- a8 ^Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: I+ J: i. v: H" t' ~3 Y
3 C3 {' V' h! z" k4 z
  1. // Пакет org.l2jmobius.gameserver.model.battle1 a  [2 _4 a; Q! j& l
  2. package org.l2jmobius.gameserver.model.battle;
    / l/ l* T' d4 o$ n" f6 x
  3. 8 H* V  t2 s' w6 B% O( n
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 t& ], P4 {( u  T! r1 K/ g) ]
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    3 U4 p) m5 s- v; t6 _: E" ~
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;/ n9 R6 r# X/ D1 q# E9 a
  7. & `6 W/ H( l$ M' `0 j
  8. public class BattleSimulation {# a  R+ ~0 e+ e: g* }4 d( S
  9.     public static void main(String[] args) {, m8 J! l* H5 t, {; c$ N; p0 e
  10.         // Создаем монстра с начальной атакой
    - r% D: U& r/ E3 y6 ?- D! ?
  11.         Monster monster = new Monster("Дракон", 100);
    7 a% j5 ^8 S: ]8 U
  12. 8 O5 {8 P5 \1 j: ?$ z/ I8 S" t1 x
  13.         // Начальная фаза
    * H2 Q8 b. w8 v2 Z+ r
  14.         monster.executeState();
    ; s1 X8 M, x1 r* Q  _0 x$ ^! r1 u

  15. 6 N) o% e6 o( P7 m: H
  16.         // Переход в агрессивную фазу. W( z- r& a7 g- f3 P
  17.         monster.setState(new AggressiveState());$ g, ^6 ?4 A: T
  18.         monster.executeState();6 A$ Y! s1 S* P1 s

  19. * T5 y7 h/ F6 V0 W9 ~, ~
  20.         // Финальная фаза- B* S* X7 U# e$ }
  21.         monster.setState(new FinalState());+ y9 k, Q; \" @3 v' d+ S1 B0 r
  22.         monster.executeState();
    " @- |& ?8 d# p
  23.     }( O& k2 x& y$ \
  24. }
    : |# s- Z* d) P7 y: x
Скопировать код
0 G, L# _) l! c6 a. M9 D
Комментарии по структуре пакетов и классов:: L+ P  A5 C& u% ?# O
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 ~+ u. }3 M, {& X3 Q" u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 e8 `' U! X1 r! wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 j: N0 H3 ?" `
5 U; o  y8 \" I# W% y2 r+ `
: T0 g% w5 `& y3 O

" u2 i2 m7 H& p1 X% u' X+ l
5 `7 T( G4 C8 n
: D0 s1 m* {; J+ j: Y. x: n1 f( ]' O
/ D% r' J, Y( A- z: H6 X$ Z! W
1 Q7 z4 q3 d8 Q' R! X4 h& _
4 O# U6 m' U  ]5 {$ y

2 V9 E% G( i4 @
3 M  d! v- i9 x+ t% c$ A/ |/ [0 Y) [. ^. L: U' A3 d! c4 F7 q

) D6 m( m6 J* U. \8 J  t- m$ q$ W, ?# }. y, c
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04" p! {3 x8 \( K% I0 F
Для управления сложными взаимодействиями, такими как  ...
( f3 X% y/ U- ^+ r$ w7 L5 |( a+ p; n
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21: I5 ~* M0 j; i, u
Отличный подход! Использование шаблона "Состояние" де ...
' y, S6 D* B! b' L# D9 W0 Y3 N
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
! t& F+ ?* ^: L+ ]) N  V
. ^% z  j' t) f5 F3 VШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.. v( ]: x- a# J/ @

, C7 W/ g' o" j! S
  1. // Пакет org.l2jmobius.gameserver.model.actor5 _4 i! b3 g) J. r- [9 i7 `
  2. package org.l2jmobius.gameserver.model.actor;' \. @% b8 C; z) h' k
  3. & F0 q' T/ \; [( r0 P8 Y
  4. // Перечисление для типов атак
    - t( W; j4 H! r5 a
  5. public enum AttackType {
    7 K2 Z! y1 M% A  u; K5 Y, A. s
  6.     PHYSICAL, MAGICAL;
    ( m$ ?! K4 g- S7 f4 F
  7. }% T, S7 B. ]. D, Y* A* z
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
1 y8 z2 n. n, F: L8 Y" y3 ?* q5 Z2 yОбновленный класс для агрессивного состояния монстра:$ K+ v+ `) @! J3 n) f) b$ k9 [
( v9 M" v) Z) r4 J2 H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 u4 b1 C& q9 z+ h+ p
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 N# @3 L8 ^7 ?( ?# f

  3. 5 |  D: n+ x4 n6 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : x( c! a7 R7 P! G" K0 V9 e' c
  5. import org.l2jmobius.gameserver.model.actor.AttackType;5 \- D, p  |9 ^" x! d2 b
  6. ) _& p; |( d; L: J) j
  7. import java.util.Random;
    ) R4 b$ g3 h# R4 a/ v7 u9 D

  8. . n$ G% O* ]2 U) V- M& M
  9. public class AggressiveState implements MonsterState {
    " F1 U7 E+ i( D3 N2 p+ ^
  10.     private Random random = new Random();* @* L! h; N9 v; Z9 j# a
  11. ! X, I4 S$ t$ C
  12.     @Override
    ; y) m% k6 }6 r
  13.     public void handleState(Monster monster) {
    # S3 H( H" c7 l
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ) ~/ s' T) `# V$ n
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;) J" M+ a  O$ Z0 E0 p5 v. E" k4 T

  16. 1 m% O6 k( V4 W7 M
  17.         // Логика для агрессивной фазы боя
    ' H4 k1 @' ]& N1 m
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " " Y# i$ X. j, n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");7 c" y( ?! _1 I8 R# ~
  20.         ) E" P/ Y( P8 e4 V+ p0 ^# A+ }
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ) o- |8 G# w0 H& W, ?
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    7 g5 {0 n& {! s! S$ P
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);. }' t6 U) {+ J, O- ]
  24.     }
    2 P% p! F# X5 D- b
  25. }* d& v5 S: l4 C
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки) s9 d+ Z1 `: K, d. ~" J

* \" U9 d; ?, L0 s3 P
  1. // Пакет org.l2jmobius.gameserver.model.actor0 ]  `3 K6 v1 B  E3 s7 w
  2. package org.l2jmobius.gameserver.model.actor;  V+ P, P; t! G
  3. 4 N# Z2 j' j( ?( @7 W( X. \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ M$ y# G. i$ y. P; K$ I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : Y& `' M6 a: \7 h6 c, W
  6. - ?) y* P+ U, D9 g. @3 E/ ]
  7. public class Monster extends Creature {& P; L3 H# d( V6 X, V  e- H" z# A
  8.     private String name;* b; O; P; a" H! i  ^, K1 L
  9.     private double attackPower;
    . _4 s, K2 I# y  A8 O  I  O3 C
  10.     private MonsterState state; // Текущее состояние монстра
    " _, ^2 a# H# z
  11. , h0 r5 y+ E, \0 j% G: V; s/ m
  12.     // Конструктор монстра
    3 V9 T+ G8 i* N
  13.     public Monster(String name, double attackPower) {  \/ h9 G$ a0 h0 w" }: w8 X$ w+ a; E
  14.         this.name = name;/ S0 o7 V  P) Y8 h  N6 g
  15.         this.attackPower = attackPower;
    ; U  Z4 [6 w; A
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ( x' g2 u9 k7 I% t# M
  17.     }
    0 U1 [  n, K' m/ P

  18.   C0 [8 F9 Q' }& S7 _
  19.     // Метод для смены состояния( E# {/ D7 O$ ]+ d* @
  20.     public void setState(MonsterState newState) {& {: F* f$ M# d5 N- v
  21.         this.state = newState;( S6 d. R0 o) e
  22.     }
    4 L( U4 }5 ]  E3 O

  23. , O% G( `+ d/ P; f& d$ [
  24.     // Выполнение действий на основе текущего состояния! H* F" P8 ^, c9 Z
  25.     public void executeState() {
    4 c7 z1 f; i$ X: Y
  26.         state.handleState(this);
    $ C; ^) i2 v9 l: {- [( a7 G
  27.     }0 R* U& L1 n: d0 I! _

  28. ) E4 Q0 ]- M' f: g6 o3 {+ f2 _
  29.     // Геттеры и сеттеры- j* C0 Q9 J  O3 p5 p
  30.     public String getName() {+ T) J# }+ ?9 F0 ?2 @4 Q4 N
  31.         return name;; H; u  B  y0 }" k6 I* F
  32.     }* X6 R8 V1 _& Z- T! D0 E1 I- ^4 r
  33. 8 W- m" P/ r2 l% X7 p/ E, R
  34.     public double getAttackPower() {- \0 s5 i4 y7 M/ t# |# k7 c
  35.         return attackPower;( B: ~; Q/ x6 [) |# k" R) l1 l
  36.     }
    , p6 n) j5 C& [7 E! w! ~6 \
  37. ' ~8 {+ n" C  u: ?% l8 M% ^
  38.     public void setAttackPower(double attackPower) {
    * M9 E  q8 _  s  O. m# q4 K
  39.         this.attackPower = attackPower;
    0 E3 X$ C( P/ g- v8 h  G
  40.     }
    , b  E" V: I; Z; y8 g8 a
  41. }
    " k( Y. N. f$ a$ Y; [. z. q
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.) C8 H# l0 j, k+ K

: a- |- c' o7 d$ Z1 I3 `1 o# e
  1. // Пакет org.l2jmobius.gameserver.model.battle5 I; G; O4 }+ u; M, }
  2. package org.l2jmobius.gameserver.model.battle;6 o0 D7 |/ V) F- U- X4 y/ N! l; L

  3. : L" }' x" d. q% |& N6 U9 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 R* |$ ?8 ~4 L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! G* R/ y) G' h" e5 ~
  6. 9 ]6 N+ K" a& Y' g8 h6 z8 ]
  7. public class BattleSimulation {1 x9 P: R! Z  A" B$ m& U$ K3 u- v
  8.     public static void main(String[] args) {
    $ j+ w3 K2 \+ L# s
  9.         // Создаем монстра
    4 @  d8 E$ }; v6 u9 P+ _
  10.         Monster monster = new Monster("Дракон", 100);
    4 @! F7 y; B. }& U+ g! Z

  11. / c; g9 z/ A2 E
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    " f  ~' E# |" c4 L% |
  13.         monster.setState(new AggressiveState());
    5 I$ x1 e- X* @0 @* [6 x8 X
  14.         monster.executeState();
    1 y7 o& Y2 h  w! `1 c) J" q; I/ G
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    . k& L4 U' ~, G" F3 \; I7 y5 p
  16.     }* ]6 f1 h# \/ b) R9 {/ O' Q
  17. }
    & y8 M# J2 }+ f
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
3 F( Q+ k6 [" E' Y4 Z5 ?7 \Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
$ l! r' T2 {! w- _* l8 I3 H) [7 h8 u6 b: S; M/ v
* w! |: G4 @/ T( v# A
' \/ i8 `5 b9 T5 x: y1 r3 U4 D
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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