Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
  k& ]' @% \9 M6 l) @
: a0 R" b* y. e7 k0 ?9 R
  l9 q) q. P8 W$ `+ ?- L# G" h
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.0 G! \; ^- w* e* y
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!, z' @0 E0 c6 _3 Z7 Y; y8 U
Астралия ?
9 T, _5 n& |$ F# ?; K& V9 B# q+ L% H! j" c& H& _2 S$ e

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!9 ]* |8 F/ @( z8 f
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?. K2 z0 a& T1 X7 A( Q. v0 B

- O; Z4 o" E6 G, n9 G2 m( l) A
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
% ^! W# ~6 J6 w( o
AlexCoder опубликовал в 2024-10-16 18:31
! y( m$ z# B8 l- {, MДень добрый!0 a  ?0 k& N6 M! [' C
В статье описано взаимодействие игрока с N ...

. J7 ^. j8 Y. P: H9 \" E! {1 zДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 w( X0 y% P% `8 Z+ M1 ^; Q' }
1 H- A- e* ]' E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
+ \6 ?' [8 e# a2 g# U
4 Q  t. w$ A, `, G7 iШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.4 A' I7 z1 F, F/ I9 U* R+ M
: F* [4 t3 T) n/ }, T
  1. <font color="Green">// Пакет для состояний монстра</font>* b" B; l4 F& B) v" R
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 Y9 @0 P! Y( h* _  N
  3. <font color="Green">( g) _$ }) U7 g- ~2 D
  4. // Интерфейс, представляющий состояния монстра</font>
    ( s! `! `  Y5 Z) v8 T; r3 \" s9 `
  5. public interface MonsterState {
    9 D. E# J7 R" H/ r$ z
  6.     void handleState(Monster monster);( j: D$ N' C4 S0 u( d# I
  7. }& f  b# e2 c" W2 p$ ~2 W( [- }+ U! d
Скопировать код
6 g. t4 `  d+ R( G( H8 U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% h# N) C' y% P4 ~& M
! H, u) c- n5 ]% }Класс для начального состояния монстра:
' y. b3 ?* b& b/ A( L
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- i! w1 ?8 q7 V3 h: J! D
  2. package org.l2jmobius.gameserver.model.actor.state;3 s0 q, I9 O; F% o0 ~% n

  3. 7 u  |) u, C7 R# k
  4. import org.l2jmobius.gameserver.model.actor.Monster;# O9 Y! R4 B* U1 S8 @' b
  5. 3 `4 f+ q* X/ e
  6. public class InitialState implements MonsterState {
    ) h, ^7 u' `7 l8 z8 j  n
  7.     @Override* }2 `3 K# S+ p. C
  8.     public void handleState(Monster monster) {7 O$ D8 O! }, t! b4 k
  9.         // Начальная фаза боя4 O/ D& @: ]6 M5 i) n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" x+ J1 H: c( J: ]/ {; X% U- Q1 {
  11.     }% u! Y/ w6 D& ~; G1 N) {0 r" W
  12. }
    ' O& L. A* V1 @* O% A
Скопировать код

$ b% V) Q7 V% V2 o& a# F% m) C- M, S- J/ w9 e
; K& X4 x! [) g6 @
$ O/ Q/ a% T, R8 _& G- v. T0 o

. R! Z5 P# C6 ]. j( ?7 Q3 w& x$ M! ^. _+ Q8 J
+ e; x5 U/ [. f' d2 B3 y' k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& r  u1 K  \: V! F7 ^; w  k- b5 r5 l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  u5 A$ f9 H. {9 @# N

# m; z$ p& Y4 M+ |9 s4 N, I% [3 @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& }9 h3 U6 V7 ]5 q
3 _0 B( J' m4 m
  1. // Пакет для состояний монстра/ n6 Q1 P4 W- e' x, u" U
  2. package org.l2jmobius.gameserver.model.actor.state;% ?% A- K1 z$ [& _5 I0 B
  3. * L: L; j/ y. x7 A4 M
  4. // Интерфейс, представляющий состояния монстра& s- L9 S  f9 G0 r3 a1 P* `
  5. public interface MonsterState {
    ; q! \, @6 \" F  T5 y
  6.     void handleState(Monster monster);, e, d8 w- o" n9 W- U) T/ r
  7. }
    , K6 p+ `: s$ J' q
Скопировать код

' k  R5 ?% Z0 m0 S8 aШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * _0 Z+ _. V( x9 F  c
5 k% J$ e1 x4 |$ X7 J9 k+ R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.- p4 P+ X5 Z. @! O8 J, k0 @" J+ P

* f! a8 q; J+ K7 z" |Класс для начального состояния монстра:
1 U* g! ]. k: L% b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; L1 ]! Q" H3 ~/ u
  2. package org.l2jmobius.gameserver.model.actor.state;3 x8 o; E8 c4 K# a4 c
  3. ; ~$ ]! S& f: n3 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 h; F% k4 U9 P/ B

  5. 0 i$ D8 H! {' ]) C2 p1 d" X+ g  ]
  6. public class InitialState implements MonsterState {
    2 |, H8 L& C$ m& P
  7.     @Override3 Z/ c1 W8 n0 W' |
  8.     public void handleState(Monster monster) {/ y* x: |1 H. |' a! p* ~  E
  9.         // Начальная фаза боя6 t/ o9 _3 D9 \: |8 {3 P+ X
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" Q0 P, d4 g5 Z7 S9 w; [
  11.     }
    & N! \4 j! }0 u& P% \6 b
  12. }
    3 ?9 S  e6 _3 `3 G" L5 v
Скопировать код
Класс для агрессивного состояния монстра:
! o, {6 ^- U$ E  W: L- R9 U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 j. C+ C4 @: {% J) I
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 g- A2 X; B1 f

  3. * a5 O( j) J* w* g' `( U5 E1 A  v/ M
  4. import org.l2jmobius.gameserver.model.actor.Monster;  ]2 ]' R; T2 H0 L

  5. * `0 s: q$ f4 M6 q  n
  6. public class AggressiveState implements MonsterState {3 C: K! C* h5 c7 m& M( j! C; T
  7.     @Override% v0 f$ Q- T; g/ Q, {; B5 q
  8.     public void handleState(Monster monster) {) ]  p7 o: P$ ]. @0 a
  9.         // Агрессивная фаза боя$ h( M( _* }) d  [! I
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    & x7 ^) P1 S" b" S+ z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки- K* U) C9 F- H+ v4 ^
  12.     }% I/ t& I1 t. f4 D; H8 b
  13. }
    * \& ]* p3 F  {! ~) w8 z
Скопировать код
Класс для финального состояния монстра:
7 b  r  d9 Q6 `( I5 U8 ?7 H3 f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% d( }0 y# e/ n, Y, V. X. d6 o
  2. package org.l2jmobius.gameserver.model.actor.state;+ I3 f  t8 ^6 `4 h, ?& H

  3. ; x2 H% a7 E3 M) l. Y5 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # P0 |! D/ |7 [' T

  5. 2 l- d4 ~4 x6 u) }; [9 y
  6. public class FinalState implements MonsterState {
    9 U8 Z* B/ c& L2 \0 D% [- Z
  7.     @Override. A. D4 `; F: q; F
  8.     public void handleState(Monster monster) {) f8 z. D; H7 D
  9.         // Финальная фаза боя
    : @# Q% n) }1 K. ?- {7 y
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
      X0 @5 y1 z9 n0 B8 O9 V
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    - |* {. }" V8 i' w
  12.     }, q/ b* B  N+ c+ C- l1 E
  13. }
      Z: B7 O3 E, h- L
Скопировать код
& g& D& y) p& C5 m- b; Q8 D
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; E4 q+ r: B2 x- b  _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    2 f6 ]) z4 {' p2 y$ C% m1 T
  2. package org.l2jmobius.gameserver.model.actor;; F) X6 ?8 t3 G& q+ c: k! c

  3. 7 s+ ]- O+ h5 p6 Y' D9 l! V
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* G5 V; d) w& c
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ l9 A9 a2 z8 D6 R: v3 s4 U) j: O

  6. " Z6 y- R1 ?6 v6 r
  7. public class Monster extends Creature {3 {) j* @. D. j2 F* ~
  8.     private String name;; {7 @9 j0 s4 d
  9.     private double attackPower;' u! O/ j, O; C! i/ m. G9 J; A
  10.     private MonsterState state; // Текущее состояние монстра6 Z* G! S- `9 e. r

  11. . K9 H" E, @3 g
  12.     // Конструктор монстра
    4 `$ x- k/ t2 I/ w; K, n; B3 E
  13.     public Monster(String name, double attackPower) {# S% g3 d8 K- {& h' y1 M
  14.         this.name = name;/ h6 C* r" D9 i- z. e" y; D
  15.         this.attackPower = attackPower;
    3 x  _5 n4 j7 g: K$ M
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ( {, Z' W; C% [6 O- v7 w3 L1 s
  17.     }
      q, Q9 h& Z! X
  18. # O- h/ N: C# t2 ]
  19.     // Метод для смены состояния
    7 r% p( V, E" c: x! Y9 g- e
  20.     public void setState(MonsterState newState) {
    . n6 g6 @9 Q& q2 z
  21.         this.state = newState;% T4 }0 K' c( z0 U; I( ]
  22.     }
    3 P9 u8 j, F: l: s+ r

  23. 2 d% L! V9 U( A' _+ d8 X4 ]
  24.     // Выполнение действий на основе текущего состояния
    5 b% ^! Z: s. i
  25.     public void executeState() {+ n- N! R) s% h: O1 N
  26.         state.handleState(this);9 a( {. Z1 j8 r! c( i
  27.     }7 ?$ g3 R& {9 u$ O0 `  {! k

  28. ( T1 x7 {6 |- R( y2 s
  29.     // Геттеры и сеттеры
    " f5 k; J( T5 z0 G. [- q) K0 p
  30.     public String getName() {
    / i, f4 E3 V* t, }
  31.         return name;
    - N7 P+ G9 y$ \6 K# S
  32.     }
    ' _3 z% K9 s+ w
  33. : p" L* z: ^6 Q- h
  34.     public double getAttackPower() {# X+ S$ S! f- r; `0 m7 v
  35.         return attackPower;5 @$ H8 ?- a8 y$ X
  36.     }. V4 R* q. n, f% G$ `

  37. / k/ ^# \- K+ k& |7 t% s
  38.     public void setAttackPower(double attackPower) {
    " G: x7 s8 m" C
  39.         this.attackPower = attackPower;$ @2 W3 {: v- N/ w& D8 |# _& N8 J
  40.     }
    / \7 ]; S: D" V7 p$ C
  41. }0 k4 K  U! U7 s1 B" `
Скопировать код
1 Y9 k9 Y1 d$ Y6 O
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& f8 }- m: A% ^( ]9 R
: P. l: H9 n. z
  1. // Пакет org.l2jmobius.gameserver.model.battle" O" ~* v6 |' o5 C" B* t5 Q! c" ?
  2. package org.l2jmobius.gameserver.model.battle;
    : R: U: }# i  H% k
  3. ( v) S* \: m: A4 H: r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) U) S4 m4 \0 j. g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;# C  Y) [7 n) I
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    4 q3 G" f" a+ \2 f  k" a' y

  7. " K, m& s! j$ p! g. U* d/ w
  8. public class BattleSimulation {3 e0 P+ @- p, [( H
  9.     public static void main(String[] args) {
    5 d# P0 T8 l. W( U
  10.         // Создаем монстра с начальной атакой( i6 N$ h) F3 |: x. E
  11.         Monster monster = new Monster("Дракон", 100);
    : f* |5 i+ _: f4 x+ Z4 {
  12. $ m9 o% C7 G; g
  13.         // Начальная фаза, s- w8 I1 o# d+ F( K. c
  14.         monster.executeState();+ e3 N8 s$ n; ~; P
  15. $ i- x, z5 }) i9 v! F2 d
  16.         // Переход в агрессивную фазу
    , N* d2 G1 F3 `& t3 N6 C5 |
  17.         monster.setState(new AggressiveState());- F: O) J) _' j1 y& d: U  y0 g: m  Y
  18.         monster.executeState();* {4 J3 E' |2 a$ A. P* C
  19. + l# ]0 w9 I9 T# t2 S# i5 ~
  20.         // Финальная фаза
    - P; X/ t; b; Z" I
  21.         monster.setState(new FinalState());
    : ~" @# m% E* l
  22.         monster.executeState();: Z3 {; h" H- p: V  a9 Z
  23.     }
    1 q- R' v8 t) x
  24. }* t# |9 H- ]# |
Скопировать код
  N0 o$ F. k* V' R; t5 }+ ~: |1 }# f
Комментарии по структуре пакетов и классов:
( a6 e% _  c) ^! D( P. q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- X( S! y! g! \0 ]  `
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
" C1 N2 G4 W# N9 Q2 gЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
2 j! Q8 v  g8 _' f$ s# I+ y4 q
7 X8 @: ]$ v, j, Q9 E. B7 c4 ~" a' w! B; d0 I& p9 i% g

2 h$ T# V# P/ V8 I* Z
# o7 V8 m3 |7 X2 z$ V3 T2 u% W) d8 R* p+ s$ y/ l

% T5 L( k  ?8 X5 d  p
* P% }! r3 W. H- L1 `2 U  i* G( @4 M0 K3 e4 X* N5 F* J

6 G+ h" E4 t% L" _% i' P& Q( C& q0 Z7 T1 U; K+ ~

: Q0 E1 J3 r; B' H! z- u, N& H/ K+ q* v" t
7 N/ [. n; L8 `: B5 `7 y. v0 l

  M+ N8 d: x/ ^8 Z+ W
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
5 o3 ]. E  I9 H! T8 MДля управления сложными взаимодействиями, такими как  ...
$ T4 d0 F0 ?( r0 W
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:211 }# \" \* V+ ^
Отличный подход! Использование шаблона "Состояние" де ...
0 K, w  L$ z0 R6 v
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 V1 ^* D" B! I+ J9 m# ]! ~
* ~. @5 V6 S: @# X" {8 z* JШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 s2 {9 `8 {: Z" ?* r
" R- a3 }, o, N5 F0 r" Q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ j# k: {9 g! ?5 T6 d! @8 Y; Y7 ^
  2. package org.l2jmobius.gameserver.model.actor;) Q7 ~# r+ x, O& |3 g! S$ O. m. w9 n

  3. / J  k8 y/ k# Z! {0 Q- z& V
  4. // Перечисление для типов атак
    4 L& S1 }% |3 ~- s; }% }
  5. public enum AttackType {
    * y2 ?1 _5 }" i" o2 @
  6.     PHYSICAL, MAGICAL;
    " |$ ~% o+ n+ u2 M  W" _
  7. }: ~* k5 s: k7 O% m6 q$ u2 N, I
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.2 X5 m% v7 @+ d+ T' \% e# d9 o$ o
Обновленный класс для агрессивного состояния монстра:
, V& S( p1 L8 |; X) D1 A$ j+ b" C. R8 L) P  m7 q/ e# Y) `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + n0 L3 ]2 Y7 Y9 }  j( H
  2. package org.l2jmobius.gameserver.model.actor.state;1 J$ s- h* S2 B( C9 Q8 U8 W9 J
  3. : L! v. ^& D& p: ]9 a! g: n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) k7 F. A" w. m- B0 c' ?5 b* C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    3 ]% a$ M! z/ L: C* x
  6. ) \. V8 U& s3 j8 s1 y5 u" N; l
  7. import java.util.Random;
    ; ]" x3 W# ?1 _

  8. / e6 y+ r' [' ]# t4 ~
  9. public class AggressiveState implements MonsterState {9 y4 r( t7 t; [% [2 t4 a& I
  10.     private Random random = new Random();
    / k5 n  a1 m9 R) o& v( V

  11. ; I4 W* W7 `$ k2 V
  12.     @Override; ^5 M0 V  y- Y; f7 t/ u: w7 e; i) w
  13.     public void handleState(Monster monster) {: A8 S* X# O! q: g
  14.         // Выбираем случайный тип атаки: физическая или магическая/ a# m- f5 v- q7 ^
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;+ ~6 U. w* W$ t' ~" m4 p% V
  16. $ @" ~5 A8 W- r
  17.         // Логика для агрессивной фазы боя
    2 ~5 d4 u+ d9 @, m' k1 R5 A
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 5 y" G0 T. C% U/ [2 \; R
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    0 w& x: j, Z  ^) M9 b  o6 x- x
  20.         2 N1 W9 v- W8 y# {) R
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    : |/ o/ g* F7 z+ Z' A3 q0 r
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    & o* J, G. i$ c- b/ U' r/ K
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    6 Z! [, j0 ^( Q
  24.     }
    4 G1 f% k+ T# X0 x
  25. }% n- n1 m' M- e$ x2 O
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
& q3 ^  m4 p1 t& u" J9 S* y4 l7 }3 e" Y. P" ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' H' L3 I, L, n4 D  H
  2. package org.l2jmobius.gameserver.model.actor;
    # U" r: f5 ]- J/ A  z  \

  3. % R! `  D6 }% T7 S* ^4 F4 Q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    1 z6 w# _6 I8 P5 F9 n6 G% J/ r! N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;) O: m' D. h0 t! K0 }) M
  6. 5 s4 u: M6 N& }
  7. public class Monster extends Creature {' Z1 f4 L- Y$ N" N/ K
  8.     private String name;
    : n0 w! S& I+ j+ G
  9.     private double attackPower;, @1 B9 [0 y& D$ \6 _5 r
  10.     private MonsterState state; // Текущее состояние монстра3 x& b% }7 ~, g  @

  11. % a3 i6 s/ i7 S
  12.     // Конструктор монстра% y& w" j, Z$ `
  13.     public Monster(String name, double attackPower) {
    : S9 E. T* N1 h3 v6 V% o4 Y, {
  14.         this.name = name;
    * p& c0 H6 T2 y8 {; m
  15.         this.attackPower = attackPower;
    & Z2 m! F) h! v0 i1 r
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    4 M1 h9 T/ I/ w: X% o
  17.     }
    + x5 b. t( K! l3 S  ]$ F
  18. + {" w0 R, R+ X) q
  19.     // Метод для смены состояния
    5 H7 v9 j5 E' L" Y9 ?2 z! ~
  20.     public void setState(MonsterState newState) {; V, U& c, B% k3 [& Y$ U8 f6 B
  21.         this.state = newState;/ B# O+ R; f5 s
  22.     }+ Q0 b$ P( o. L( i
  23. + s# c( X2 C- M( K$ k" q. r
  24.     // Выполнение действий на основе текущего состояния
    0 B! u5 A4 C, h' ]1 R/ u5 M
  25.     public void executeState() {, c1 i! O. w, J9 x
  26.         state.handleState(this);
    * X/ J" f( u& Y3 z' @
  27.     }9 I. y1 S1 h$ a$ y

  28. 8 M8 q! [9 R/ I* s+ R( v
  29.     // Геттеры и сеттеры& U2 G! S1 ?, G* q( v* ^4 ?  s& P
  30.     public String getName() {
    * e+ e' J2 O) w5 H+ ~: [  F
  31.         return name;1 B: |  Y2 W# J* v! J$ q
  32.     }  b$ e: N: }% a; j0 S+ i

  33.   z; q1 d; B5 a. y$ ^3 H# r
  34.     public double getAttackPower() {: t7 S3 @* r) p& ]* A4 @# S
  35.         return attackPower;$ F& m  H/ W5 d8 D
  36.     }
    7 N9 a/ p  E3 j; ?$ V
  37. 9 ?  C% P8 g0 l5 D: p$ f) _
  38.     public void setAttackPower(double attackPower) {6 F5 ?6 P* ?5 b" P; h
  39.         this.attackPower = attackPower;& f1 }7 T( g6 ]
  40.     }% p& o. R8 p$ {, A* s& `
  41. }7 \: r$ N9 B0 l7 `6 s) J
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
* s  }  k# g4 ?! Y% H7 h& h" J, I, Q8 ?: c: B
  1. // Пакет org.l2jmobius.gameserver.model.battle, u2 @- I* I  {7 ~2 l
  2. package org.l2jmobius.gameserver.model.battle;
    $ b4 S) C( w4 q2 b% F

  3. : ^8 s) P+ t1 k$ I0 D- c
  4. import org.l2jmobius.gameserver.model.actor.Monster;( s4 p! ^. i' \8 B! j" Q8 B, ?+ D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    4 O7 {0 `% G' C

  6. 7 F* ~9 N. a' @
  7. public class BattleSimulation {
    0 o; ]0 M& @; b, P" _
  8.     public static void main(String[] args) {
    / _) w& M( t3 e9 Q8 l* H
  9.         // Создаем монстра* z  a/ y# O$ h6 \
  10.         Monster monster = new Monster("Дракон", 100);  G: k5 K1 J/ m8 G2 R. v0 R& X
  11. * W; P  i0 w, f/ L- ], K& h. q
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    0 _) b9 P7 p/ e& F) K4 v7 X, L
  13.         monster.setState(new AggressiveState());
    : z: y. u/ Q: \+ i' e
  14.         monster.executeState();
    ( Q4 _) ^6 }4 ~  |2 v0 Q- @* P: b
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак3 @  j" \) m3 {0 m& V- q
  16.     }2 E: K. U5 M/ G. |
  17. }
    0 A7 {- k* B4 n" P8 w( X
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 I' M) L% ~8 @2 ^4 Z" o1 BЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
3 N0 N. {9 ^2 h; s6 {& q/ Y1 ~. i9 e6 E; g: K7 O& k) h

7 g3 E: S3 y: M, Y( r9 Y+ P* r  [5 }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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