Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
, o, r+ a1 Z/ K3 a" c
* i# K& r, K- s" ^3 `# @
9 m" _5 i6 l: E: d% x( a' i; j
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
; w* N* C/ b$ B0 F( D5 yЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
: M; u+ f( w% {$ n. ~; ~' g8 wАстралия ?
; b! j# @$ h- A: {
. h" e5 C+ v  J0 w

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
- R2 M7 `: i7 V! dВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
! X3 i3 ?0 C0 [. l, ~/ Z4 {4 Y; P4 H" M
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 / \- b. g- }& `& t* B( W
AlexCoder опубликовал в 2024-10-16 18:312 D& l, L  l+ q; u3 @
День добрый!
2 Y. b. N' G; JВ статье описано взаимодействие игрока с N ...

5 ?& v! v& x. H# AДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . m* L' u( ^) P% F' b2 w
8 r9 s: G- e5 K2 ~( t+ t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ B1 x7 X- a$ ]
8 t8 I; n9 u) j; a. L; oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 a: {( x/ o) S- K. d1 J/ l& p- ^: B+ i* Q  Z3 m% V5 J3 |' i/ u5 E
  1. <font color="Green">// Пакет для состояний монстра</font>
    , G: B! V& q% M5 g% C6 Q# I/ }
  2. package org.l2jmobius.gameserver.model.actor.state;1 ?: U0 C* y" j8 }. {) p5 q
  3. <font color="Green">" i- Z5 c7 H6 ~0 h. b3 A! F
  4. // Интерфейс, представляющий состояния монстра</font>
    # K8 J" P7 L: N3 u1 E: m/ d
  5. public interface MonsterState {1 k+ {# d, n; p: W. g1 }
  6.     void handleState(Monster monster);! |/ t4 Y7 n, J, i- \; ?
  7. }$ Y' c4 l5 j0 {9 o% z
Скопировать код

" Z8 l' k' W1 f8 ?) p9 m6 N* u- k5 OШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 e- x0 r/ t, f) }4 `  b

0 A; t% d6 \+ T5 s( J: G5 ?' aКласс для начального состояния монстра:- Y: Q$ v# F* c/ Z" d' `
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>7 q" P6 S& |' J6 F3 x; j$ m8 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    * F: X$ Z, l7 }
  3. 8 ~' s' T; O! q( |5 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 ], t/ f2 C; o
  5. 2 p) c  {# T: @% o' A
  6. public class InitialState implements MonsterState {9 a  G0 D7 e6 B
  7.     @Override
    1 _4 S, D6 u7 b# L4 g2 N. r
  8.     public void handleState(Monster monster) {- ~5 B) h8 t8 d8 B; Y  E0 \/ ?
  9.         // Начальная фаза боя& U0 N& b# r$ `% @. i$ Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");% m# U) a7 u, N. D& h5 x
  11.     }
    # i! P# b$ r' i5 b
  12. }5 @% c, i$ b1 y/ \; b8 Q+ l% i/ s  J3 |
Скопировать код
* u) K" v! u3 ?4 h  Q  S

7 c& P# S0 ?0 q" q6 m, l9 A8 y6 P/ y1 @5 R6 F

& B; n; n! n$ O# L5 V8 V6 w  D0 D

6 @- c- p$ d' `% `
9 N. F2 a& M$ |+ a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 {4 X6 |4 z1 \$ w1 h% |. |$ P# h
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# }3 m* N4 ~2 q  J

1 ]4 b3 v* R' F5 n* Z7 JШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! T. d, p, H6 `  `- z! z3 i( R5 I: ~8 B. d" ~1 P( |
  1. // Пакет для состояний монстра
    ! s0 n0 g, C* N$ G; t& {) D/ m
  2. package org.l2jmobius.gameserver.model.actor.state;
    , ]# r* m; o% I& c7 h4 @. l
  3. . j: x1 `$ w( D( X$ w3 a4 D; |
  4. // Интерфейс, представляющий состояния монстра
    ) M* t) T' c, Y
  5. public interface MonsterState {
    - V/ S2 G4 v4 H: R2 p: B5 ]/ D
  6.     void handleState(Monster monster);
    0 @2 _5 ~, \3 K6 W! Q# c
  7. }' ]  Y8 A0 T, v3 a. V
Скопировать код
' q, {# e. A' h9 K! [: A
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 4 Y, J4 b/ [% u% L" o
3 U  h! p+ g$ T  ~3 i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 }- p3 @, ?4 e6 \4 `2 A7 i

( s* v9 `# r; {" f3 z+ DКласс для начального состояния монстра:
6 l; S6 E. B. B/ |, O+ ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  x8 ^; a1 H3 \, b% a( ~
  2. package org.l2jmobius.gameserver.model.actor.state;3 {8 j+ Q0 _2 E+ w6 N; j& {, o

  3. 6 r! o% O! M; j- ]1 @; \! Z8 M- M- |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      h& T  z2 i( g" e

  5. 6 |3 E, B( D+ g- O: r# Q
  6. public class InitialState implements MonsterState {
    $ s( L: w  f1 r, [- e' U; Z4 @. f
  7.     @Override; Z4 z. ~& w; l/ ~3 k
  8.     public void handleState(Monster monster) {+ e% X$ J! o) G" i8 q$ R
  9.         // Начальная фаза боя
    ! p' O) K6 e  w: \
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( P# v8 V$ j4 G) O# s3 \0 x: o
  11.     }3 E: Y" R1 e% R/ _% s
  12. }& A# b' _- n- ?1 |0 ]- u
Скопировать код
Класс для агрессивного состояния монстра:2 E" C$ l, X. R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 {" P; O# E# ^& b
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 R/ G' ^* X- `% E$ P

  3. ' `: e1 O+ n1 l8 T) X% @, }
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 X% K( U9 l5 Q6 a2 ^/ B

  5. ! _0 n- |! l/ v, q2 p
  6. public class AggressiveState implements MonsterState {
    9 U9 V2 r! ]4 ^; y  k; b
  7.     @Override7 h# w- i% W2 _" X0 |
  8.     public void handleState(Monster monster) {/ S3 d4 q% d+ N7 @$ R
  9.         // Агрессивная фаза боя, f8 I$ Q4 }! H" l4 n) d
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");+ n. e, Z" p8 T
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки0 z2 s6 W/ v; m8 N9 s
  12.     }
    - Z# Y* E$ q  _5 x
  13. }
    0 z7 U* u2 M  L1 ]
Скопировать код
Класс для финального состояния монстра:
( g# _# z0 n+ D1 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 D$ [' E6 l0 X2 ?" [
  2. package org.l2jmobius.gameserver.model.actor.state;4 k# P4 v2 y5 U- \! l# S# m; F5 O: h

  3. / L3 A( `4 E2 a9 i( O  p+ _+ p, u
  4. import org.l2jmobius.gameserver.model.actor.Monster;! K$ M* E' P) N; B

  5. + d' f" y  L$ u2 {
  6. public class FinalState implements MonsterState {0 l2 A: B& S2 s# j/ m0 b1 |. u; t/ x
  7.     @Override) o" g0 ]- t! e( s% i1 }$ L
  8.     public void handleState(Monster monster) {
    ( t$ U1 d' Q+ u7 h
  9.         // Финальная фаза боя
    , A  R1 [% [2 D1 ^1 c
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");6 H5 N" q+ V; D( D
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    8 m$ Y2 W) L/ B" @
  12.     }
    . [6 g( h# u+ w9 @
  13. }9 w( s7 U: Q7 q: O
Скопировать код

6 _( O5 z8 m0 O  g' b3 J: zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! L' L. f1 M3 O
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 h6 K7 j! m1 t/ a2 C& z
  2. package org.l2jmobius.gameserver.model.actor;
    0 U2 K$ s! z& T6 d  x) ?4 t

  3. % a2 r0 F' I3 v2 ]7 N* t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 q+ L0 w3 ~  R1 E2 v4 \9 H& y# \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' v2 p# J  ^! u  K1 z( {, n
  6. 8 x, N$ Y0 R9 v2 m* B. V
  7. public class Monster extends Creature {
    - R/ {, R2 d9 s, t
  8.     private String name;# B; u! v; m' L) ?) H- [
  9.     private double attackPower;
    ! |+ Q6 l/ G- G2 o  A$ r
  10.     private MonsterState state; // Текущее состояние монстра
    + x" \/ _4 M' C" p

  11. / j! y3 M0 t/ b1 T1 N, ~% ?
  12.     // Конструктор монстра
    % H- ]; a& t# f! I! F$ r: i2 S6 ]
  13.     public Monster(String name, double attackPower) {
    / o# \; W& K$ D. v* ?
  14.         this.name = name;
    : o3 p# b7 u" N) w, i3 y% X
  15.         this.attackPower = attackPower;
    4 Y# ~4 E  w5 u) L) e
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    4 ^# j, v  t, G! D' d# v, U
  17.     }
    + O# n7 C0 o9 Y6 K# I, h

  18. 8 c+ [! a/ J# Z+ F
  19.     // Метод для смены состояния
    4 x8 V3 [5 O4 c, J
  20.     public void setState(MonsterState newState) {4 R3 u% @& J7 q! r' `  n5 u
  21.         this.state = newState;' C8 n" e% b) K* K& d6 Z/ E
  22.     }
    / z9 S' c1 Y+ x

  23. ( r! B9 V7 @$ v2 j* {
  24.     // Выполнение действий на основе текущего состояния7 e! G+ s$ b+ Y
  25.     public void executeState() {% ]# `# S! w$ o  Y' X! ^
  26.         state.handleState(this);
    2 N% v% I# v) R  q
  27.     }
    : O0 M% q. h  h
  28. : P5 c6 Q0 t0 X+ b7 I  P
  29.     // Геттеры и сеттеры
    6 H& h' q' L* m5 g
  30.     public String getName() {
    - X, \5 R& C8 }4 C
  31.         return name;* P7 N% |$ r5 U# `2 W  H
  32.     }) X( O# D( R7 y1 |( j
  33. ( A# Z+ r" T  z5 \" p4 S
  34.     public double getAttackPower() {
    ( ?' z/ Q" [4 O8 C
  35.         return attackPower;
    8 ?0 o  A3 ?# R1 _. ~
  36.     }, D  j# n* G! S! q

  37. 4 z8 H) i$ c9 I) Z$ n
  38.     public void setAttackPower(double attackPower) {' O4 U# o4 U  P* n
  39.         this.attackPower = attackPower;
    6 f, A" \& Z! k) ?) y
  40.     }# u2 U0 V: f7 C8 M! x7 v$ E* y2 p; n
  41. }
    ( J0 M2 X9 n8 b/ P3 r; O
Скопировать код
- K4 f/ b) k9 b$ F# r
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& E, q; [9 G, l; V; y( n' V) i8 q4 r0 d
  1. // Пакет org.l2jmobius.gameserver.model.battle6 T/ i4 h7 {% x( T
  2. package org.l2jmobius.gameserver.model.battle;7 d6 d" w; U3 Y' q/ |; v+ _" f  M

  3. + Y3 J8 Y/ c* Y* Q% U: Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;% \5 ?- A" C* I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ i1 h" L' g9 V: s
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;* H% G9 X4 X' T: k0 D& K( L
  7. 2 m" j5 t8 S. Q: _
  8. public class BattleSimulation {
    - q& q6 V" _7 O/ o- d; P
  9.     public static void main(String[] args) {
      a) Z3 j, M$ b* @# X8 D
  10.         // Создаем монстра с начальной атакой
    ( m) m( Q) a7 [/ ]7 k
  11.         Monster monster = new Monster("Дракон", 100);' ^7 ^; \2 R) A7 j; m: j
  12. - X; G1 j/ W6 n/ A' W. ?
  13.         // Начальная фаза2 J- I# [' @1 q; C% O! X; ]
  14.         monster.executeState();
    ' y; {" M6 P$ T4 E0 h/ b
  15. 6 a  E) j1 m8 j9 _) D
  16.         // Переход в агрессивную фазу5 V6 M! P9 a! a
  17.         monster.setState(new AggressiveState());
    * S. C+ i/ x2 m. i3 Z5 b0 G( m7 Q
  18.         monster.executeState();
    , Z" {9 ]7 j' {) K" E" K( j

  19. # e& _: g4 w; V
  20.         // Финальная фаза5 d; X5 E* h1 l7 x  c6 z  u% S# n
  21.         monster.setState(new FinalState());
    / k8 R2 ~5 M. i" R
  22.         monster.executeState();3 G; P8 i$ u% W% S' c
  23.     }, q: P! F8 Q/ K1 U  D! p
  24. }- W4 `9 J5 H1 u
Скопировать код
- G4 x% R# l9 B) j' ~% T
Комментарии по структуре пакетов и классов:2 W# `( ]: N7 _4 c, u
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    # Y& |5 }& D: V6 s: @; `3 F( A8 f
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! l5 b! U3 f- J! x
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
1 l; ~- g2 W. y1 I0 p: i. S
5 m' E) g1 z# D4 y: M0 x+ L1 r0 o6 Y7 c+ T9 W

8 ^* k- N: O- B# k0 ?2 {: G/ N
( P5 `- v8 f7 V5 g# z
2 g( ]$ ]0 P) ]5 l
( p& ~: T* J; I+ ~1 N3 D' `( u* _9 N( W; H& ~

2 u4 i' n% E: N
& f7 T- z) S. |- |3 s: a# N/ X
2 [5 j4 g' C+ x! S" L7 q" @' z3 G: u7 h0 e( V

9 ?7 n) x5 M, j# c5 J) L
( a* S+ D5 p; v1 Z# W6 Q
* D1 P. E& L0 E/ }
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04% C! T1 O' \" s8 r6 R# A
Для управления сложными взаимодействиями, такими как  ...

. k) q, x' _: m  A1 I! xОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21. y2 l/ i+ n- l  p. W% H
Отличный подход! Использование шаблона "Состояние" де ...

8 @7 `; F  ^1 OХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
+ u$ F1 ^5 w5 J( P% ?" x5 ]0 C
2 M- O8 v; w- \! DШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
1 u! T- a' x7 w' n% ~  t2 z
0 p- O: b, D( v) V
  1. // Пакет org.l2jmobius.gameserver.model.actor! |0 x* ^( ]9 L. k. i# P9 W
  2. package org.l2jmobius.gameserver.model.actor;
    9 e3 Q  m1 W9 Q" `  a% h' m

  3. % Y8 M; {& K1 K8 H7 n4 y( |" |
  4. // Перечисление для типов атак
    2 o( o" l* _' z: D1 s' t: r; x
  5. public enum AttackType {5 \$ Y0 h/ f6 x$ m/ g0 r
  6.     PHYSICAL, MAGICAL;
    - K6 C, x% y3 B6 q
  7. }( l; B! w/ ?3 A% J
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.: i( e! I+ R$ Y$ j4 W: h  [( b# k
Обновленный класс для агрессивного состояния монстра:
0 s5 F/ I$ D7 p4 l8 x, [
1 ~7 z9 Y2 F: y$ g8 @0 K6 |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % V% I5 O' _+ I& k! ^
  2. package org.l2jmobius.gameserver.model.actor.state;7 J  q: J0 o& L
  3. 5 \0 J' [, x- ~! d. S% B/ m# K  B; }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : O# G& i# E& v1 }: Y5 p
  5. import org.l2jmobius.gameserver.model.actor.AttackType;  c$ V3 P9 l, \4 Z
  6. 7 y- f+ p  S# z) Q7 R
  7. import java.util.Random;
    ' y2 L5 W; L- X8 ]$ N8 E0 S. h

  8. ) H& s6 p. h$ f7 @( Q: O
  9. public class AggressiveState implements MonsterState {4 y7 G( ]- x4 d- J
  10.     private Random random = new Random();
    4 S. A' m# E5 s. _" G5 Y- u
  11.   U9 a3 }9 x; h
  12.     @Override
    # }. K' k6 Z6 K4 B, ^5 [3 E
  13.     public void handleState(Monster monster) {+ a0 ~" k; j4 i. M+ e
  14.         // Выбираем случайный тип атаки: физическая или магическая
    4 g6 k& s0 r# e  A$ w
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;' f7 @1 Z- z" g! ~
  16. ; e/ q7 @. W' @8 u5 U( b# r/ a
  17.         // Логика для агрессивной фазы боя+ R& o$ K3 p* D1 {& V+ g
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : ?3 ?) z+ F2 T# R
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & f* ?6 g+ N. v
  20.         
    - m8 U6 E" W1 [' `" i; j
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    3 ]' k$ p  i$ {; P0 T2 r+ D1 y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* `7 ]0 M7 p) \, u+ E4 L# f5 n$ l
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);( j1 g' Q  Q7 }4 ^
  24.     }5 T- c" }% e( }% P; |3 d0 O
  25. }+ p; K3 @7 P* ?" w
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки2 }. i; I& h" v" f
% a' v. L* Y6 D! ]( ^
  1. // Пакет org.l2jmobius.gameserver.model.actor! P5 K# L6 b7 S- |4 X3 A
  2. package org.l2jmobius.gameserver.model.actor;
    1 A/ l* j! M5 e% |% p' K% O. }

  3. ( t4 b" h# P9 k, W' h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 N! C% H& W- \7 N) a, _* Q
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # @) C5 k4 w8 l3 h% U% ?
  6. - P& l+ i$ q* Y7 U  ~+ @
  7. public class Monster extends Creature {
    7 X; E5 `" k  h% H* G1 v, H
  8.     private String name;
      I  g2 Y3 s  Q7 ?2 c
  9.     private double attackPower;
    ! J6 ?) X4 S' G* V9 \
  10.     private MonsterState state; // Текущее состояние монстра/ _$ z9 N- c1 `9 w+ o
  11. % x, F9 M+ ^3 d
  12.     // Конструктор монстра# `  y5 y6 M* b/ N
  13.     public Monster(String name, double attackPower) {
    , C( v) ?0 |0 ]$ c
  14.         this.name = name;1 i0 f8 _# P- l+ o) f
  15.         this.attackPower = attackPower;9 M& s0 g2 K/ _4 }/ p% \7 [
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию8 N4 K% ]$ Y3 y' p7 }' y
  17.     }! m9 w- o% f! ^- T+ D1 t

  18. 6 L( N5 I1 {8 ^: a# M
  19.     // Метод для смены состояния3 l$ m. y' ^% F/ W. v& h" F
  20.     public void setState(MonsterState newState) {! |. i$ r6 ?0 d8 ^' J- z& b# V
  21.         this.state = newState;
    - x5 V9 J) J6 j3 y1 |+ R
  22.     }) e" Q, R) n0 G  g7 U% T1 ?! T
  23. ; F, [/ ]+ _* i0 C
  24.     // Выполнение действий на основе текущего состояния- E+ T2 @( k' l7 ~& }+ o. a. ~0 W* b
  25.     public void executeState() {, J% f$ r8 {1 N$ Z
  26.         state.handleState(this);7 S! j$ [  g5 s/ u0 ]& n. S
  27.     }6 R7 R' T9 |, R
  28. 2 C0 ], Y4 v7 V. ^; ^
  29.     // Геттеры и сеттеры  A* ?7 ]" k5 _8 x& m
  30.     public String getName() {
    , S: J+ ~$ B3 _. I( `3 P0 c- T
  31.         return name;' B+ `* d3 w9 b6 {( r& S. l
  32.     }3 i/ {% [6 w+ z, g4 V6 F( H. Z
  33. 6 @! h. U& y% W( |" h
  34.     public double getAttackPower() {$ b) d% M- s( z- t0 B* ]" ?
  35.         return attackPower;
    # x+ f: @/ x9 Q6 e* c
  36.     }$ ?" _. ^) @6 m$ L7 o
  37. 1 i1 Z- T' a+ j: t; p$ m2 a
  38.     public void setAttackPower(double attackPower) {. c% W7 i" Y! f. q1 T% B/ a1 ^
  39.         this.attackPower = attackPower;2 d- z; E# N0 t* l
  40.     }  x3 b) f' m2 @7 i' O, _
  41. }/ A) [$ C+ L2 @1 t( N
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.6 p; s8 A/ b$ y0 V9 Y0 p4 k

6 r" Z# ~& D" y4 F3 l$ ^- n# i  |6 ?
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : G% H9 h- K; j- t6 M
  2. package org.l2jmobius.gameserver.model.battle;, i" X! A% [5 G3 ~' F3 }- ~
  3. 8 W; o* e  U% `6 M( F, l1 F4 }
  4. import org.l2jmobius.gameserver.model.actor.Monster;' N  L% s( b& f5 T5 G) W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . k5 W, I- ]( S( V* n9 J
  6. * z/ H4 @/ g( N2 U/ a2 p
  7. public class BattleSimulation {
    - g8 k( U/ m* [4 l: J8 A& F
  8.     public static void main(String[] args) {
    $ u  t$ V* Z3 q2 R! w  ~
  9.         // Создаем монстра3 |6 d3 f& g" }) F: x
  10.         Monster monster = new Monster("Дракон", 100);
    + [. m& t$ d" h7 E6 a
  11. 0 P1 |. \# |9 J  O7 w
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( e0 B4 C9 A! v- R8 P$ H$ _9 H$ _
  13.         monster.setState(new AggressiveState());  H9 t7 @/ V+ `! }. d  j
  14.         monster.executeState();* l. T4 S2 K; F" }  Q  s0 l8 ]
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    " W4 r2 B: D# _  W. ~% @
  16.     }
    4 ]6 v2 w! W, J! O5 O& Y0 b) z
  17. }4 g- I+ B$ ]9 r, I/ w5 C- m
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.; @3 d, v* P5 O3 o( R2 ^
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!) Y! R# C( l  A( K7 k

$ c: B# |! p  `; A3 m; w' v( F) Q% B; K2 u, d1 S6 c
! m6 @: [6 P) l8 A& C
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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