Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
2 D7 j% d- w; A3 P1 S9 b
* I) z: f4 m$ Z

# Z  X* [" x1 M4 lЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
( \# @6 n( x) zЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!% m. G. S, X) Q4 T- K
Астралия ?
4 k0 u! ?! D5 D8 X( u
' q8 Q5 l& ~% |

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
1 G4 h; }+ L/ N0 u/ L( t) UВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?3 {% I3 k9 a# @& A( p$ I9 i; j
: K+ r1 C; A8 v5 T
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 . |' O5 H( T/ P4 ]3 T
AlexCoder опубликовал в 2024-10-16 18:31
4 F; C$ w% \0 f' s' F& QДень добрый!
- j: S4 W0 D4 O1 _8 F# `* VВ статье описано взаимодействие игрока с N ...
! p  ^! _. Q" I' a' s5 m9 u
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ H# G2 v8 v- @7 [
8 b) W9 a- j* ^7 e/ h; j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' ]" E0 @2 b- w1 g1 H) o$ f
9 f# Z& w) ]0 L! H' C
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 f# f" }: O4 R) d- g" \
% H: x: K! T$ d4 I& L. u" A
  1. <font color="Green">// Пакет для состояний монстра</font>
    # Y* ?( \" P9 K& B  B5 [
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 ^, {5 K; r, ]9 r) F/ \
  3. <font color="Green">
    0 F/ ?3 d# V! C/ U/ i% |. v
  4. // Интерфейс, представляющий состояния монстра</font>
    0 _% h6 U# n! u
  5. public interface MonsterState {
    9 p2 a- c; I' i- _! F0 r8 z
  6.     void handleState(Monster monster);& X  X4 j- @3 Y
  7. }. Z; t! Z9 Q# s
Скопировать код
1 [: u, x8 D9 f( E8 c
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 s: Z- M/ F7 H& r( |7 I. X
' [$ J3 v  P) S7 @( m: F
Класс для начального состояния монстра:
* i* w  E" n2 L
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    " `# v$ m7 d* T- g! ?6 L; c9 Q
  2. package org.l2jmobius.gameserver.model.actor.state;4 x, Z! _" n$ }0 y

  3. / O5 U' ]7 ^& ?" l  n' c* C" o2 h% A
  4. import org.l2jmobius.gameserver.model.actor.Monster;( Z  V# Y* ?. R% T8 |+ r
  5. " y6 b* V4 R$ r4 r. i' I
  6. public class InitialState implements MonsterState {4 D0 J: E7 L( p0 H
  7.     @Override3 F( {  J1 E1 g) i1 u3 E
  8.     public void handleState(Monster monster) {+ E0 l9 t! z  {7 o$ G
  9.         // Начальная фаза боя; Y" i' S1 H( v8 x# V
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ r9 B! M& L& F
  11.     }% L% A/ \9 o# x. C8 f/ n5 Q
  12. }
    8 n: D! n0 w* b4 l* r
Скопировать код

& i. |" z' W# Y8 i, l8 C3 w
* U; M9 L  m( T* F8 b& h1 ~) f6 U
' F2 D6 [" }4 s
; T3 q! _1 j" D6 W, y; {# z0 T
7 m2 e% }1 U& |2 v' m1 v* ]$ H. H

- Y6 m! [: ~" W9 W3 O
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ w( }+ U) `1 O
) z  P2 ]; I4 t! n6 B3 T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; x. T& V, n6 ^+ l- h0 V9 w; m! r' |0 t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 w- J+ h  E+ `( [

1 l  _/ v+ ^0 f5 P
  1. // Пакет для состояний монстра
    ( Y6 m: X8 ^4 Z3 d  d+ C+ l
  2. package org.l2jmobius.gameserver.model.actor.state;; \' _8 Z' S* g- r1 ?/ \0 N
  3. ; j( r0 _6 [: r
  4. // Интерфейс, представляющий состояния монстра
    : ~/ A; Y; U0 p" a. S5 y0 K
  5. public interface MonsterState {8 h. r) u6 J- h9 h+ A
  6.     void handleState(Monster monster);7 n, v" f4 R, ~( p
  7. }
    & f' {9 R9 z& M  K, w
Скопировать код

8 U/ a5 [$ e$ C' k% X4 G# AШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& s" C$ z5 U- F! y7 q1 ?4 @  G( i3 a! u( w6 F% A; {" N
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# ?4 E, v$ z) Y; [
$ U7 z4 _2 ~5 z
Класс для начального состояния монстра:8 |: k* Q( P0 C5 l9 L$ x7 i" g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* }. ^" h9 r: l" |" f" t5 P9 F
  2. package org.l2jmobius.gameserver.model.actor.state;0 ]. g; C6 P- M7 g( Z, X4 b
  3. , a$ ~' Y6 z0 I# m! b
  4. import org.l2jmobius.gameserver.model.actor.Monster;' i1 Z, Q' q- Z

  5. ( J! A* I* V- `
  6. public class InitialState implements MonsterState {6 K6 K0 _8 k% b& l9 h9 ~
  7.     @Override
    : J, H  u4 t" o: Y3 I7 ]
  8.     public void handleState(Monster monster) {( |$ _( q7 O) R$ c6 `% ~
  9.         // Начальная фаза боя
      J- F1 z6 C2 k# |8 h
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    $ M4 M4 V* o: n2 ~/ P
  11.     }9 f9 e7 M, z3 D8 o  m
  12. }
    9 ]  g& g3 B7 ^
Скопировать код
Класс для агрессивного состояния монстра:% x. g1 t0 I! `$ _3 x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( X. R% {2 Y# I+ c) {* R- B
  2. package org.l2jmobius.gameserver.model.actor.state;* J$ G7 m3 X/ B: u7 @

  3. $ P% w1 V/ x4 b2 N& A4 t
  4. import org.l2jmobius.gameserver.model.actor.Monster;* t! b* @' J% Y3 ]

  5. $ p0 h" p* c" h' E2 ~
  6. public class AggressiveState implements MonsterState {5 F! L9 C: K' B3 O
  7.     @Override$ N  f7 ^0 L1 u, V+ p
  8.     public void handleState(Monster monster) {
    . ~) y; ~' p1 A0 r7 [9 b4 S
  9.         // Агрессивная фаза боя
    : d- P5 ~7 k5 r/ a/ o* v* P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    5 u2 f6 V" |7 S( ~- J0 v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки6 _3 i7 n. `' H. J
  12.     }& L+ v7 [6 M4 M7 i3 f
  13. }2 w" G0 }) k& w/ \6 n
Скопировать код
Класс для финального состояния монстра:& U! f/ Q7 k" ~# `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 L- d/ W4 t" Q  T: g# k
  2. package org.l2jmobius.gameserver.model.actor.state;
    / d9 g+ }5 ^+ X  N
  3. * c6 w) @" D) H  s1 Q( d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 _  d% ]/ Y. ]( P/ ?& R

  5. , T) O: ^% _7 c9 b4 `0 ^0 w
  6. public class FinalState implements MonsterState {
    # E- ~4 m) _+ P6 F& O* @
  7.     @Override' R3 ~8 n2 G) X! S( I  l
  8.     public void handleState(Monster monster) {
    + a& ?( C& A: w1 m$ N  C
  9.         // Финальная фаза боя/ b6 j9 [! O: t8 S. J- p! S; R- k0 s3 @
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");( E" B* B$ {! S( O, A1 z$ O
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки2 }" K$ d) T1 v5 z% A! x
  12.     }1 r1 g6 r0 Y" C# v0 U7 Y
  13. }
    ; x8 O9 H/ h) m
Скопировать код
9 k1 D# z9 c. P$ c
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 }" I( N# W% ^% q- p) Q) F7 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 W( f+ U. r/ u1 d9 ^7 @& g  R
  2. package org.l2jmobius.gameserver.model.actor;' S% R- Q  \" H9 H( t8 U+ C8 f
  3. - z- w* U7 \- e
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;# z+ U3 U+ s+ B+ e" ~" g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 E7 \/ I6 x7 f7 e
  6. 5 k2 T3 \" F* y1 |% k
  7. public class Monster extends Creature {; Q' ^) U; [" }+ P
  8.     private String name;
    ) o- B( H9 o8 t/ d$ u) }4 X1 J. B
  9.     private double attackPower;
      @9 j' R* U* u' [! P
  10.     private MonsterState state; // Текущее состояние монстра8 _/ X" A3 Y5 z! l4 k+ ^; }6 @

  11. 6 g8 k4 Q) T8 b/ y2 d& s" @7 L0 @
  12.     // Конструктор монстра! Z/ |. j: w( p7 V; v! ?. [' O8 r
  13.     public Monster(String name, double attackPower) {* Q1 X3 {& K% E8 @
  14.         this.name = name;' ~) H# P; m. H3 W' G
  15.         this.attackPower = attackPower;
    ! p% }7 N7 r7 F  m+ N4 v1 w% F
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    . ]  G1 {; c) W9 T# Q: n
  17.     }  z& M; ]0 S+ n% j  }& b4 q
  18. % O. G1 W: W! Z) w* s, I' _; i5 d. F
  19.     // Метод для смены состояния
    + x, W0 H' P) z! K! z2 u
  20.     public void setState(MonsterState newState) {4 S) J- w8 `  g7 c* }% C3 ^; r6 x
  21.         this.state = newState;- @0 r& B& Y3 U: E8 G  {
  22.     }% l! N5 t+ _7 a/ A9 j; o. r% ^7 c
  23. " }* M' y  [5 e) |1 E+ I
  24.     // Выполнение действий на основе текущего состояния
      N- E* v- V) l0 j
  25.     public void executeState() {9 I4 t& X# k4 D0 \4 x
  26.         state.handleState(this);
    ( I( o0 C3 n5 j
  27.     }/ X8 m! x7 N- N* X
  28. . b! O4 r% p6 M/ ~+ v6 }
  29.     // Геттеры и сеттеры
    ) a1 p. z1 |" l) X$ [0 \. D
  30.     public String getName() {
    8 [8 W: g8 G$ w. L& ?# `' a
  31.         return name;5 P# D3 |5 `! b; j5 z
  32.     }# q- u% w' L6 m; d

  33. 0 h. |$ @5 c: V) T0 S! |' T
  34.     public double getAttackPower() {
    & N" T& F9 m% [# I# _. G* e- e
  35.         return attackPower;* J0 M$ a. u5 i3 S0 \6 G# {6 E
  36.     }
    9 f, A& p; G0 Z) T
  37.   A  n* O9 V# {# q; ?
  38.     public void setAttackPower(double attackPower) {( u% T( I2 Z  ^' n+ ]" D- L* r! }
  39.         this.attackPower = attackPower;
      q) R% d0 d1 P8 W2 I+ V" U
  40.     }( ~4 P4 b$ r0 ~! _* w7 F; s
  41. }2 U) q8 }1 K6 H! e; q7 A
Скопировать код

' [& o; A  G; T+ _% h& W# oШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
4 M' v+ o. d0 h& E3 N. ]5 l+ e0 v( @$ q
  1. // Пакет org.l2jmobius.gameserver.model.battle
    4 W, Y8 M- M/ a' a: t  V
  2. package org.l2jmobius.gameserver.model.battle;
    + C- P9 I- z3 {, q3 N$ f& F6 b

  3. / q' ]$ m9 V2 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! X; }# E; M: a8 i, P5 U
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    + `2 _$ i- A: p; S4 b- c
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 X7 R- L# t$ V* r, j8 j; z! `$ C6 v
  7. ' E: c  ^( x; C% a' ^( _
  8. public class BattleSimulation {1 ^2 D- K3 x5 W4 H+ h+ _
  9.     public static void main(String[] args) {+ y. y' K5 A- p& n( M
  10.         // Создаем монстра с начальной атакой
      b& u! L$ q1 h3 l/ X, S# I
  11.         Monster monster = new Monster("Дракон", 100);
    ) |; E& s/ }5 h, p; U

  12. ) W+ F1 Y" b  q
  13.         // Начальная фаза
    5 L; W  l$ h" G* G- }! p9 \4 Y
  14.         monster.executeState();
    ; {, k2 y% R0 k) u6 k9 a8 |6 |

  15. 2 |/ u- R6 c, D7 }; q
  16.         // Переход в агрессивную фазу
    * f! ~/ N7 `  Y* C% g  R( R
  17.         monster.setState(new AggressiveState());
    ' i( z: ]8 c/ Q/ f, Z/ @1 v
  18.         monster.executeState();
    % j2 \  m- }1 ~4 x7 J2 x
  19. ( b$ i( y+ }9 G. {; y) E
  20.         // Финальная фаза
    : a0 T4 u( l7 G% {4 `
  21.         monster.setState(new FinalState());
    5 u* r% d5 k5 {+ s4 ^0 v+ W
  22.         monster.executeState();
    , F0 O. X0 a1 i; X
  23.     }2 }% q, d# l7 Q! m! h6 Q( E+ o
  24. }  I7 k- ~8 D( S6 `3 R6 z3 t+ w1 J
Скопировать код

8 F9 k# j3 S1 x# r$ e  ]Комментарии по структуре пакетов и классов:( E: M- P  E# R) m  Y6 V8 _
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    # f: w8 {# R9 T4 p0 G; ^/ w1 t# B
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.* P* a1 a0 l& P# ]1 Z/ R4 [/ g
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 [/ A; [  B- y8 c( q' Z

1 l3 g9 ~5 O$ [+ D! b# z( _* f! n/ J. I/ w9 f  p7 d' n

! e5 x$ n3 X# Z1 V! I: O* ^; F# X( s0 ?0 U
* x# A8 P) }. ~1 a; a* u! B

3 `) @: i+ `5 T$ z! [& m
+ ?+ h7 ~3 f3 _3 N) t3 P; p
& [1 L( q! p- w* x0 W; i- ?
  k9 l% @, ?; }9 |$ j5 t0 d% |/ I

6 e6 D: _( R5 X' O0 w; W& B* s1 f: A( X; S* s8 A
( D& s3 V6 p0 ]& u/ _$ |3 X
, ~5 a: ?& J5 w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04! D1 N6 [4 K" S6 j; j
Для управления сложными взаимодействиями, такими как  ...

: ]7 w6 {' B4 C0 v9 cОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) y+ }; u3 H! L6 z  g  b
Отличный подход! Использование шаблона "Состояние" де ...
9 X) _. _7 y  _: r
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.$ W/ q* W' r9 }+ {/ y( _
: Z- O) ~/ l3 C, l( Y; |* i
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.2 M4 m2 e+ x4 c$ U* ~

: `3 d  B/ e" ]/ E4 D
  1. // Пакет org.l2jmobius.gameserver.model.actor
    2 ]" H! ~0 u) h# u% t* `
  2. package org.l2jmobius.gameserver.model.actor;$ ~$ ~5 @& w6 j/ J2 h% ?" P# C% R

  3. : W0 c2 G; G4 q, q6 S, J) l
  4. // Перечисление для типов атак
    , p& _( }4 Y: L, V: K5 q2 C
  5. public enum AttackType {
    2 K; P3 a( o* s) T" v
  6.     PHYSICAL, MAGICAL;
    ' ]- n7 B" T/ _! k) z
  7. }. a+ k2 f5 Q4 i% @- H1 A2 c- W
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.) W0 N$ ^6 [5 o, u7 o
Обновленный класс для агрессивного состояния монстра:- A. S/ u( L% n8 s/ M( f

7 L# X3 e; Y' D; L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . |2 l/ Z4 H* r- `% L" G: o- V7 s3 a3 W1 T
  2. package org.l2jmobius.gameserver.model.actor.state;, p' k: S# u! Z! C& [' X5 B, j
  3. ) W+ H+ F3 D  B  t) l
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 d: T+ i3 C2 T, ~
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' O  q! s/ ]0 A# F

  6. 2 O, ?8 T. Z; m9 U: _
  7. import java.util.Random;
    6 |. k4 S' n! E9 I. F

  8. 7 S  I6 S+ o+ k& A1 d
  9. public class AggressiveState implements MonsterState {
    ( \5 S( V& B( U! e2 @
  10.     private Random random = new Random();
    8 ~) T4 [4 b  B5 B) d, X: I
  11. 5 u  c3 }1 y. R. \- ]. S, V3 T
  12.     @Override0 u9 G; J, V! i: _. N& P
  13.     public void handleState(Monster monster) {
    ) c6 F0 R: c' {2 z6 M( a+ Q
  14.         // Выбираем случайный тип атаки: физическая или магическая
    . Z$ V0 O9 F! L- D) }5 Q( X
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    9 ~1 o) D6 a2 x8 B( j
  16. 0 K1 _; T6 y3 f, S# y4 C
  17.         // Логика для агрессивной фазы боя% Y  ]2 i* p* F! E
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    $ @' h: r" d3 z" t4 P1 P6 I" w
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    3 `. e7 G) d( ^) h$ O
  20.         
    : w4 j9 ~# H- q3 w
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 ^% y/ O# U  A* f6 @
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    " E8 X2 O6 [* o+ U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    - p% m3 `; a! U1 V9 l- x
  24.     }, M+ V  r. F4 l1 q+ @2 D( |
  25. }
    - p- w9 I3 Z1 h5 A
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки( }; J  ]# ?4 q

- I2 r; T# @) R; H% [7 U5 C2 ?3 b
  1. // Пакет org.l2jmobius.gameserver.model.actor1 H3 v% P7 x, a4 L3 t9 i
  2. package org.l2jmobius.gameserver.model.actor;
    # N* {2 a' e( h& r/ ^

  3. ! ^# i6 c4 T/ d
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* o* s& [0 O+ ^# i) K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    / S9 _9 q$ P' j
  6. 6 y" p! d1 q  O& Q8 z% N3 j
  7. public class Monster extends Creature {
    $ V" C6 H( u6 z7 ]7 r
  8.     private String name;# o* u/ T; l2 _
  9.     private double attackPower;6 o# W# R( c& j2 K/ k
  10.     private MonsterState state; // Текущее состояние монстра
    , H  ]. s+ H% K0 _
  11. ) l; R* p( g: ?
  12.     // Конструктор монстра' u" O0 T" Z, L% F: P
  13.     public Monster(String name, double attackPower) {
    ; T) c9 B/ [. L' K4 m
  14.         this.name = name;
    3 `! K. K* b. c: b& ~
  15.         this.attackPower = attackPower;
    $ v6 t* i" ^/ b& |' l
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 O- s; h6 i1 X% k( I" T5 S
  17.     }
    ' d8 ~" r8 V: [( U) T3 s1 L6 ?

  18.   S2 }5 d6 u) v6 U; Z" h! x3 J
  19.     // Метод для смены состояния
    , k1 }2 j! b" V+ t4 s  B
  20.     public void setState(MonsterState newState) {4 X) O$ }2 @" y/ Q: g
  21.         this.state = newState;
    8 B- a/ H2 \# Y7 k- ]% q
  22.     }( \: ~9 }: R" ?7 ]3 d9 n# P

  23. 6 `) R+ g8 J! E3 j2 s0 E1 A& y
  24.     // Выполнение действий на основе текущего состояния4 ^, x7 d  T: E! G, z0 \
  25.     public void executeState() {$ m+ ~6 |9 ?1 W2 ]
  26.         state.handleState(this);9 a2 E) ]$ ?$ A2 M  l7 J  e
  27.     }
    ! R8 S; }9 Z+ @6 C4 R. L3 j: b
  28. ) `) c, E& S  F
  29.     // Геттеры и сеттеры
    - r$ g) r: E( c
  30.     public String getName() {0 o; ^3 {: x5 ]1 ^7 Q* h+ C" @$ _
  31.         return name;
    4 F/ C/ n' d$ A5 _8 E. N. `
  32.     }
    4 s2 ]1 W' ?) b1 M: t; B
  33. ( ]0 B  A8 J6 V) i# A
  34.     public double getAttackPower() {) j/ L; R& y" D
  35.         return attackPower;% t2 L( h8 W: M3 j. [8 Q" x5 X
  36.     }% Z5 i5 w3 b! A4 z- i5 ]0 Z7 X
  37. 2 M: u- D  h1 ~4 Z  Y# V- ^
  38.     public void setAttackPower(double attackPower) {0 f' R* K& L; c
  39.         this.attackPower = attackPower;* t5 h0 y4 Z; Y1 ]4 E( k
  40.     }
    9 B" |3 @4 Q* _& J- q4 Q' z
  41. }
    6 w& m. b8 E: h5 r7 R
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.4 [! b- I, V% x9 I
1 ^. d2 D; E" }1 |1 F8 I9 ?
  1. // Пакет org.l2jmobius.gameserver.model.battle; q! c) J1 D" f+ R% J, ?7 V* x# ?
  2. package org.l2jmobius.gameserver.model.battle;( o% O6 W6 a( L1 T& N1 d0 @7 k; b
  3. - m6 K$ U. E( v4 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : R% h* ~" m, _3 b1 b. {- L& I9 d
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* F: {; y! b' b$ P7 e/ a# j1 c6 P
  6. * }" E9 y# B& x2 M" q& i% h
  7. public class BattleSimulation {
    / G0 h0 D0 ^4 ]/ `/ E5 t: o
  8.     public static void main(String[] args) {+ q' y! C0 m3 y& x5 r
  9.         // Создаем монстра
    0 ]# J2 b8 k% d, c8 b; m7 R% d% H
  10.         Monster monster = new Monster("Дракон", 100);
    3 R& \5 T/ ?' I' K" t1 s" h, w# S

  11. 3 ]/ `. g# g7 S+ ^' Y  V
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    . z5 z+ b% x! ?: o) n
  13.         monster.setState(new AggressiveState());
    # n7 j1 u# p" ~$ V" n- q
  14.         monster.executeState();1 s% M& D: D4 t
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак6 Q& D; ]3 m- }7 C! p2 p
  16.     }) K2 P% u3 x4 W8 X7 |& C
  17. }
    . ?) I; X' d0 l" k
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ R, P; t: D# T+ f# M, MЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!; Q$ q! M7 H4 w( w8 A

5 {' [( ]5 M7 N5 W2 @; X& I+ p6 p1 Z$ _$ o4 h

& v5 l* M# x+ }% i2 d) y4 j0 R% `
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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