Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!- o/ @0 B* b& X

' w) t' E3 H2 }4 t; w8 U
& T0 e; _. Q( l- }) p8 \8 W5 @
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
) o  i1 M' G6 }& bЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!, n- a. n( q" [$ P! |, `0 |
Астралия ?7 k/ y/ O( ^" `+ x! w
/ g, o% G. t* q$ h

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
$ F2 e4 u# O" UВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
' E" t7 w( o! m  n4 N1 q" k
8 ~) V* k  f  e3 C" [
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
. O) m! O8 @: h
AlexCoder опубликовал в 2024-10-16 18:31; Z8 L, j: z; q$ Y. ]' Y
День добрый!
  d; a; x. }4 _2 U1 PВ статье описано взаимодействие игрока с N ...
. k- S$ I' s* s7 a9 ?3 v" Y
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 w) j% S, U1 M* Z) b' ~

! P; l' Y5 F% iЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
8 y0 ~% }3 z! K5 V$ K- P" ^
( N5 ^* u( r) H% H7 p7 c7 fШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. G2 w2 D& |  u" D# e

5 }% r* D2 O$ L8 m! i5 Z$ e! N
  1. <font color="Green">// Пакет для состояний монстра</font>
    0 w+ E, M2 s; n- ~4 i
  2. package org.l2jmobius.gameserver.model.actor.state;/ K5 U3 n1 B7 R6 o: c5 X% ^
  3. <font color="Green">
    " R7 }  `& t5 P1 A
  4. // Интерфейс, представляющий состояния монстра</font>* o6 h( C% e* ]6 {2 T% c7 i) H5 R
  5. public interface MonsterState {
    - K  X# X1 B7 n0 g1 F* Z
  6.     void handleState(Monster monster);
    . `: c1 q+ o$ w: t$ D" K
  7. }8 ?; q' d# n. g: k' c  z( c
Скопировать код
6 _8 C( @& d: ]" `! P  p& q. ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ O/ K8 }2 p# M, _* m
; q6 [" L) O: P: OКласс для начального состояния монстра:9 K$ D" \. _' J3 D
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>5 b* q! {0 u3 e9 p* X7 g
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 c# K' o& t( z% O
  3. + H1 d* O/ B$ }3 ?# N6 d
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 b0 q: o* N5 y# l; h1 Z* L1 I

  5. + x8 ^; F7 m; ], b5 R, B
  6. public class InitialState implements MonsterState {1 C9 _$ Y. l! F( ~' p9 w
  7.     @Override+ C6 j4 s) @" D+ I
  8.     public void handleState(Monster monster) {4 ?7 ?; D6 d- u
  9.         // Начальная фаза боя
    8 q! n6 _4 j$ T
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");) x% @9 o4 ~; ?" N& X5 X
  11.     }
    & w$ c8 z: F# D
  12. }
    ( q9 J6 B+ ~  i6 b
Скопировать код
, V- o$ ]: s9 s1 ^! c2 \
* Q: Z3 o9 F- x  K. l" F
% c+ q5 g* f% G
# X4 b. m5 M, Y, u1 ?$ E! m

* w  F" a4 @% u3 V  w: H% V$ C4 w0 t/ x% ]

* m0 u6 S2 b  r5 l- U
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 Y, Q7 G: K, R

: V2 d% K' e$ P8 ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 n: v! S' ^: \0 t9 G) l4 w, f

3 O0 c7 r) B! ^( MШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 E0 I, }! P/ L( p
4 F1 a! u4 \) I1 E
  1. // Пакет для состояний монстра' w4 y6 G! j6 Y* T2 G
  2. package org.l2jmobius.gameserver.model.actor.state;# P# U$ k$ F( _# o& j* S' e& A
  3. 4 H0 ]4 B, O# n) W6 [0 K3 U
  4. // Интерфейс, представляющий состояния монстра
    ; c% M5 Z& s1 N# D8 s% F
  5. public interface MonsterState {
    # s7 R6 [) G9 j3 \% y% p. m" w
  6.     void handleState(Monster monster);+ C+ P( X1 [4 V" F! a, l
  7. }
    4 l6 n. y5 D  F( j. h$ d
Скопировать код

; w2 Z- X* z( V5 P# C6 bШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. : I1 t& l$ u7 z

3 T2 A7 R9 U/ V% R# _6 {Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.6 [7 J' K3 q# }- q
8 ^1 g1 X6 X6 D/ z* \. M. y5 D
Класс для начального состояния монстра:
# @0 s% F% k. f7 p  i3 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 @* {% \! H/ G" g7 D
  2. package org.l2jmobius.gameserver.model.actor.state;
    " P# W% K: S2 Q) @/ n1 T, l7 u  i! c

  3. 5 m- S) D3 e/ O: Y$ C0 \6 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;& @9 w) }, `4 Y" S
  5. . }/ v! O1 b; m; J
  6. public class InitialState implements MonsterState {
    : M9 b  T0 k$ n# \/ Y# I; r/ V9 D3 G+ F
  7.     @Override+ g& W3 \- o* S' ~* X6 w; j( U# Y3 S
  8.     public void handleState(Monster monster) {) r# n9 h9 d0 U0 J' V
  9.         // Начальная фаза боя
    9 y: l6 _' z1 R" h
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! S8 ]) @& D1 P
  11.     }
    # J1 s+ U( R) e+ S% c3 P! t) B) O
  12. }
    : U1 H5 n8 F# R3 m3 ~% W/ ]
Скопировать код
Класс для агрессивного состояния монстра:
  z: k5 a$ H4 m7 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : J  c) h+ m7 ^/ f1 A" W7 w1 a
  2. package org.l2jmobius.gameserver.model.actor.state;/ W/ p1 c# }* R
  3. 0 I7 n( v; I' C" I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 B4 [, L" ]# C

  5. 6 ?. t. V  `( x0 B: E
  6. public class AggressiveState implements MonsterState {
    / @# }/ y, P- y7 j
  7.     @Override
    * l; o, n% p3 X7 d
  8.     public void handleState(Monster monster) {3 D# w" W5 x4 u: F0 O6 N  E
  9.         // Агрессивная фаза боя
    * V: q) p4 G/ g
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* `+ G* E0 j. `  E$ [' A% r: G
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    - ^9 l/ a: Y( c" q- `
  12.     }
    : {* o# G' ^9 T: d' i
  13. }
    # f. X4 D3 k2 P; e) h
Скопировать код
Класс для финального состояния монстра:% k* D8 i+ ?( n4 y- F* ^% P  X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . N$ |- l, l- d0 T5 W' E) L
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 r6 e# X4 @1 c7 x. ]
  3. ' R3 Y: z. N% n/ _! n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! {6 S" y3 y- P' f& d9 a
  5. 1 t; Z8 f1 F* g1 d& L, t
  6. public class FinalState implements MonsterState {" t" a; B0 \' V
  7.     @Override
    ( A0 L* L& R( n& ]
  8.     public void handleState(Monster monster) {; K4 i$ a+ g+ ]" S$ n6 J
  9.         // Финальная фаза боя
    9 \8 O! w* H' a
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    9 `0 \4 b2 [: P. F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    8 L# V, K  O' o# t4 ?7 ^! N6 i
  12.     }
    ) x, p; ^# J5 S5 {( n5 ]5 ]& G
  13. }
    / y" `9 p9 h  q! c8 C/ Z
Скопировать код

% A6 Q' k9 l  U! t* jШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 v, R5 {! B' c
  1. // Пакет org.l2jmobius.gameserver.model.actor: a+ Y7 Z- h8 m. ^* \* |
  2. package org.l2jmobius.gameserver.model.actor;% Q5 p2 N. c7 H

  3. 3 f, t  c: M/ {/ a. t$ x8 G
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; \: p: B' f2 C
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 X$ u9 L$ q) R5 t: P: p1 R9 A
  6. ! W9 Y9 L) `" n' s6 E
  7. public class Monster extends Creature {
    ! s- p! l/ ?# I& O! I
  8.     private String name;
      M7 c5 V4 U$ c6 L! H3 C& z3 u7 N
  9.     private double attackPower;
    ! d# o3 ^/ X( _* e) D7 Y9 a
  10.     private MonsterState state; // Текущее состояние монстра
    7 T( K- l+ p* d/ {4 C
  11. - j4 x( R! U7 \0 ~7 K6 k
  12.     // Конструктор монстра& l: T* Z/ f  d
  13.     public Monster(String name, double attackPower) {
    ' ^0 g) @% m5 \. u0 P6 W% O
  14.         this.name = name;
    ( ^  u6 G. ^" e! g
  15.         this.attackPower = attackPower;$ B, y6 F6 P6 f0 T% s$ l
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние9 G& s* y) O% h
  17.     }/ n8 X4 t5 O/ V5 i7 r# F
  18. & D9 j# W, b& Q6 z9 j4 X* u
  19.     // Метод для смены состояния) s% v! b- {' U
  20.     public void setState(MonsterState newState) {: |& a9 o' Q/ v, v$ F& ?
  21.         this.state = newState;+ @4 t# `' M, K" d
  22.     }! t1 Y( _( e+ c) n7 G

  23. : E( ?, v( f' I0 ]0 w. ?
  24.     // Выполнение действий на основе текущего состояния' R+ D' H' l- r9 z! C0 n; U
  25.     public void executeState() {7 e% V( o8 R! `6 N/ T
  26.         state.handleState(this);
    + P$ X# o- q% R" j$ w4 v; q
  27.     }3 J, |9 o0 w4 B: r" v7 l

  28. 0 L) {+ P0 q$ A/ Y7 N/ Z# t  o% ^$ e6 k
  29.     // Геттеры и сеттеры. S9 f$ S- D2 _5 Z  H$ b. A( i' D
  30.     public String getName() {2 h# o) l0 T5 p  o9 m: i
  31.         return name;
    * N6 L+ T, s) A6 B1 O) W
  32.     }$ @  ]: a6 o/ x8 Z- _+ X) b1 l" o9 F

  33. 0 S- b$ m; |+ T. `7 j2 a
  34.     public double getAttackPower() {) w& X8 ]! d# ]1 a
  35.         return attackPower;
    7 x3 U7 j  f0 z6 {" [
  36.     }
    - x  C5 x* o* D6 F! `6 g5 {

  37. , p* c$ F9 P' d* w, O
  38.     public void setAttackPower(double attackPower) {8 x. s* d. t& ?) s2 i, J6 L( k
  39.         this.attackPower = attackPower;# e/ A0 \3 i8 c9 Q: h8 m. c
  40.     }% y: s# H- f9 I4 B9 l
  41. }8 k0 D' s0 d6 X, O4 f5 G3 x
Скопировать код
; N: Q" Y+ O2 ?# }2 z5 K4 m" _
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ n" B) y& O. U4 i7 B$ [0 @! I
0 _  {. @  Y! O7 l% B8 x5 V8 z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 Z; h) E: p2 f% q8 l  p
  2. package org.l2jmobius.gameserver.model.battle;
    6 t. v: C6 j0 s# H- G

  3. 5 O* v, Q7 X* m* V
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 @* m& q/ A. r$ s) z! g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " b7 M  H2 l- b/ ~/ h2 F; s
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    & D. O) }0 k) }! b
  7. : r+ k4 x' D' ?8 V& H$ M; D
  8. public class BattleSimulation {
    ; g9 L* A' t3 a+ p6 I
  9.     public static void main(String[] args) {" [* Y9 [2 I3 w
  10.         // Создаем монстра с начальной атакой- F$ A: E6 F" k( y5 g
  11.         Monster monster = new Monster("Дракон", 100);6 W/ A4 I6 R3 r! s5 u
  12. 6 Q8 b( e8 }( ~1 c+ |
  13.         // Начальная фаза
    ; x" B; z$ G" y9 C
  14.         monster.executeState();8 Y1 I7 h+ M# p
  15. , w% _' G3 _) H* ]! a- V7 p4 N/ Y
  16.         // Переход в агрессивную фазу. I0 [' k8 f" e- [- r- |) w$ x9 }; L
  17.         monster.setState(new AggressiveState());8 ~0 S9 W9 s  j6 m
  18.         monster.executeState();+ v' G; ]+ J7 C6 s) ~7 v! l/ I# b
  19. $ {  ~/ p5 r" O) u" M8 f: ^8 l
  20.         // Финальная фаза! a; S4 Y1 b2 T
  21.         monster.setState(new FinalState());
    3 X4 K1 u$ ]$ ~4 s5 n- j8 ^: x/ K& j
  22.         monster.executeState();: l' Z* L5 V1 K2 w; Z/ f/ ~
  23.     }& e0 W4 V5 g+ s6 j; N8 t/ w1 G; p4 ]
  24. }
    5 |8 D. P" \% q; U$ T
Скопировать код

" a6 C# k! L( d9 pКомментарии по структуре пакетов и классов:# @7 T2 K2 E) q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% y! _0 [; G8 T+ F1 x9 S/ {  A
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." \. V# Z4 Q; E7 p" a
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. J2 v" r& ?5 X4 d, C
' B- |5 x$ [* _  n4 X0 V
6 F! y" @5 O: d. b" j1 t" M$ t
, I6 K7 a7 K9 U& n
5 C7 Z/ ~$ J% r* m7 }2 u. D6 Z/ n9 Z+ p
; x) @2 Y7 [/ g9 m
! a7 p4 [/ M* _0 K% Z

# N) X9 l9 C. Z9 r! M
/ `& V7 O7 R$ ]  A1 r, x8 f5 |2 f5 }) \# O3 [
$ Y2 F" o" Q5 X
1 [7 X+ s! I5 t2 j" c

2 G+ ?; i' {9 `; H7 V& i$ K; d' u' c, u# t" d  t7 Z
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04" W2 ?+ A7 j. _) s$ O5 P% i) z
Для управления сложными взаимодействиями, такими как  ...
9 v/ |6 a" h, N1 c0 ?# h( g$ q
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
+ _& d' }+ y6 w1 k5 XОтличный подход! Использование шаблона "Состояние" де ...
# F7 ~9 \. h$ |# `9 V
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% e5 P4 d6 A& k0 {2 G* R) ]3 o" S# \0 v2 |* V
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.3 R! R6 w) x' V: n
6 T' ^4 i. l7 [# b' O
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 T, V6 q/ l8 E; R) S6 \
  2. package org.l2jmobius.gameserver.model.actor;
    + ]6 `, U7 D2 b. k' g5 v

  3. 5 j5 ?* l6 E% \, b
  4. // Перечисление для типов атак
    & u" R+ j- k  R# A# ^
  5. public enum AttackType {9 n5 u% n9 E0 m0 U5 B; V7 p* I
  6.     PHYSICAL, MAGICAL;( A6 E' f" N8 Y: G
  7. }" t/ C) Q, B! x4 ^1 G* k
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
! @) _! l, M; R. dОбновленный класс для агрессивного состояния монстра:" G4 F8 o3 s. s* _( S: ?- B
1 ~! F5 r/ H, X% X9 e' z% y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! Z9 Z9 s0 P; \  X. Y9 _# _# J* h
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 W( D% d( g' q' @( p* o' D
  3. 7 o! j& ~8 W% l, ^/ {" H; E8 M, l7 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ U1 `0 A% f- Z# n  b3 e9 P; J( a
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ; L( C' z: i7 h% k0 I# {

  6. / S" H7 m7 _% k/ s: n0 o2 z
  7. import java.util.Random;) Z% z! l" i$ I

  8. - o: c2 Q$ T% r! }! f( ]3 R
  9. public class AggressiveState implements MonsterState {5 @# Q/ W3 ?1 b! w
  10.     private Random random = new Random();7 ~6 b6 {) i; z2 _9 M
  11. 4 Q% t9 ]4 p& S+ X
  12.     @Override
    4 N4 S2 x; E: Y, @0 M; q) Y" v
  13.     public void handleState(Monster monster) {
    3 s+ x" v8 j" [& C5 a
  14.         // Выбираем случайный тип атаки: физическая или магическая3 D; U& r& m( e' F  d6 Q. a6 B
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    , M3 K0 P  c) A

  16. 0 V- n) l" K3 g% ~
  17.         // Логика для агрессивной фазы боя6 q; d. @4 M! j9 R+ m2 v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " . W: U4 U6 z/ d) `% |8 J
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    4 F( {* s" x! S- T$ g
  20.         
    - h0 E/ P/ O) Y1 N
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    7 D7 E/ ?, K3 V8 S$ M+ p+ T% m
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;+ F. l+ z: n' [7 l5 p8 ?- X6 _
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);3 \) h5 a3 Q. x7 R  g, c, W
  24.     }
    $ X: x$ k! k7 m2 I
  25. }' l; ~( g, x, ~# s
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
: P7 z; }6 Z/ u! J$ M  Q$ N5 a4 A' {3 ^3 [8 {  W& D0 F
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : F( P  P5 u* L
  2. package org.l2jmobius.gameserver.model.actor;
    / i4 ]$ w  S/ h
  3. 6 v+ y' o: x+ q( O2 ^0 P$ W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 F3 y7 q6 N& Z  e0 b1 F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % P1 m: k1 {9 h: l$ T
  6. 4 L/ c* z5 ^) }; o4 f
  7. public class Monster extends Creature {9 D/ ~$ U: @" m5 d) Z1 W
  8.     private String name;8 o& Q2 U( v4 ~. u3 e0 O
  9.     private double attackPower;/ x" z$ S8 Q, b* u
  10.     private MonsterState state; // Текущее состояние монстра! D6 A1 W; x) Z* e. q
  11. 6 I5 P; ~* {6 M9 h' G' K
  12.     // Конструктор монстра
      T3 q0 i" ?. j# W2 m0 N% b! f7 o. M
  13.     public Monster(String name, double attackPower) {4 |/ k) H1 j) H2 C
  14.         this.name = name;
    4 a1 U: m* E/ W; s+ y
  15.         this.attackPower = attackPower;/ q8 X) t0 B: u
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    / O: t. ~4 t2 Q- j) _
  17.     }
    / ?/ X* W% B" {9 z
  18. . c$ ^5 e8 W* @4 q9 y: V
  19.     // Метод для смены состояния
    , @) V0 f3 G$ u. b
  20.     public void setState(MonsterState newState) {
    * W+ x' s! ?; |& n( h$ s% C! }
  21.         this.state = newState;
    4 o6 ^4 Q, b+ U* K2 k) a8 u
  22.     }; E% U3 v* O. }) P7 z

  23. 4 q+ o/ j! E- b/ k/ [3 j
  24.     // Выполнение действий на основе текущего состояния
    - _( E" q0 Y0 g9 a
  25.     public void executeState() {* P2 x! [% [8 `7 k* Z2 k$ t) d
  26.         state.handleState(this);
    % U' ]) [$ `" i) s( c: t7 e
  27.     }7 n6 @( S- t1 M/ U/ f: w  y

  28. 1 ?) J* s' ]8 c5 T
  29.     // Геттеры и сеттеры
    9 {+ W- c: n, n! i, C
  30.     public String getName() {
    5 ^  x$ F* F1 T. q& P* J; k- r; x
  31.         return name;
    . L# o+ \, |+ h' G0 k' [
  32.     }
    ( }& [) ?& [6 V, J$ _; ~" N
  33. 3 @% g; `* X! ^% f
  34.     public double getAttackPower() {+ c( R. U$ `5 ~9 C7 _0 ~: `' M1 T
  35.         return attackPower;
    $ r/ K4 i' v9 e( G
  36.     }. c( m* Q+ M2 N$ g1 o& [# ~% q( {

  37. " F/ p3 M7 ?1 H
  38.     public void setAttackPower(double attackPower) {' i. E' U) B& k* _  h
  39.         this.attackPower = attackPower;
    + T% J& A+ `2 J/ E, ^. P. E4 T0 l' ?/ b
  40.     }3 Y8 t- m) ~/ u9 G9 D- }
  41. }
    . I: o/ I& J' Q2 v- a
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! Q' u3 n3 T4 y1 y( b) T' t
- X% U* w& f6 _2 W- e
  1. // Пакет org.l2jmobius.gameserver.model.battle( T/ R) f: o3 A0 }: q/ p
  2. package org.l2jmobius.gameserver.model.battle;
    " L  B$ Y. u0 c$ Q" S

  3. ! B# o! _6 B" }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . k- f  ^* |; I& E7 Y. ~% v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 e6 h5 Q0 x, d& G- y  q3 i2 @- T

  6. ' s1 t* `, M5 Y2 f
  7. public class BattleSimulation {  c! i9 S( s5 g% B
  8.     public static void main(String[] args) {
      A. f; v+ ?( B/ F
  9.         // Создаем монстра, V/ o$ v" y0 S( D+ ?  j2 \" V
  10.         Monster monster = new Monster("Дракон", 100);
    + p. S- A4 G( q5 q

  11. 6 Z- U4 g) s9 J3 J
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак! @6 s$ w! m+ r+ ?- d
  13.         monster.setState(new AggressiveState());% B( A& S3 S  ?
  14.         monster.executeState();
    2 {) k$ |5 I. q' n
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 O; \; n: G9 e6 v3 e" G
  16.     }
    , S/ r) m3 T8 N& ~. a  _: {5 p9 I6 t
  17. }! q: ~5 V4 @; \" w
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.( U' d( N% @+ i- M
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. |& o! ^- o, s" s0 A, d) x5 A
% U  I/ M1 \! n3 o

* R: \! f9 V5 {+ g
! p3 a- l& b0 S6 {' n
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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