Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
( F+ C5 F2 h( ]* I3 }% d2 A( W0 [0 J+ t$ }2 \
/ q5 a7 l" F( F1 L" |1 g9 ~- C
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
/ w" f  M; W; n; G& A# NЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!% X5 Q9 ]& @; o- F  r
Астралия ?! F% O1 M( \/ y: F

% s9 {; G6 E* G7 H. j

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
" W' C; k6 W* B6 W/ Q6 J8 oВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
  I+ H+ Y7 T5 g7 g$ z% I. v& T: @# s/ {. c7 y! Y6 ?
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
) |/ h% Q' ^* Y0 S' ]
AlexCoder опубликовал в 2024-10-16 18:31& Z5 ^$ R3 H$ F. t
День добрый!
0 `: a4 j; T) t) G8 Z! w1 {4 QВ статье описано взаимодействие игрока с N ...

( y7 G" I8 ^7 M( BДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). : U+ W6 M- u& f
% z) q4 M) z9 J! j" x- ^
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) C1 z$ f4 S0 m1 Y* D0 A8 e' W6 r8 P
( s* e" S# m$ ~/ L0 K' j6 \Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
5 d, P& N) r8 L# u4 w" i+ W, ]  M7 h/ Z% C/ G
  1. <font color="Green">// Пакет для состояний монстра</font>
    1 E" o( R  n  s* l! L' V  P
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 X. m+ t, [; j3 [: q
  3. <font color="Green">! m2 P, J! @" i( M
  4. // Интерфейс, представляющий состояния монстра</font>
    0 Y: V# v* D5 B1 t! ?
  5. public interface MonsterState {
    / J1 m% G2 S# s- H
  6.     void handleState(Monster monster);1 L1 g2 r+ h1 Y: f  W- ~, j, ]9 f
  7. }  _+ n$ i1 d4 D+ }4 B6 I# P
Скопировать код

+ h  j' I8 y, G! V$ M( T$ B4 M+ kШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ P4 _/ \0 w; O" u& ~) k! h! g) W2 ^( x9 q9 D% `$ b* `3 q4 G
Класс для начального состояния монстра:
$ w: M6 D; O) V! E. `; K
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>2 \6 j5 ?2 _% l- s' n1 B0 l' i
  2. package org.l2jmobius.gameserver.model.actor.state;  x- Q1 m& ?& P; K
  3. " e1 q8 l" r* z, [7 v# C/ Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 s- @( U' B8 n1 ^9 e

  5. 3 Z3 h% ?" V7 |" ]
  6. public class InitialState implements MonsterState {7 w3 `. e9 N+ ^4 O3 a8 D5 H' t
  7.     @Override
    9 s" W# G6 g! e6 c
  8.     public void handleState(Monster monster) {- w! S* o' c5 h: O$ y
  9.         // Начальная фаза боя  ]( a; c2 K$ W/ m8 x) z) i$ v# H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");2 _# N  V! s3 |+ J: ?7 D
  11.     }
      H9 f0 n) G6 H! [8 E
  12. }
      J' Y* D4 |- q3 k4 T
Скопировать код
2 w- P2 S# d  D" W

/ m" r- a, k- g% n( ?- r; B/ ]4 @# S6 o2 W& _) b" S

: }; S9 K" g3 i  N# S, f8 R' P; B: c5 c4 o9 }. }4 G
. K9 q$ o5 ^6 b5 L
( u9 z4 C( a7 i( M4 `4 m
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( m) Y. X3 L* L9 l7 ^3 T

1 R. ]2 p4 G# k1 U' ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) ]& `1 l- L% z, P- O# o$ x7 h: M+ ~1 V
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
  J3 m3 r, G" M/ P; m  O5 g* }" J- @! I- Q  W& B
  1. // Пакет для состояний монстра0 _: C+ g, ]  {6 \& D$ P/ e
  2. package org.l2jmobius.gameserver.model.actor.state;
    " ~+ I7 e0 Q( d  b0 K, x

  3. # U4 E' s4 R2 |+ F
  4. // Интерфейс, представляющий состояния монстра# U$ J7 C% d! k2 O; k
  5. public interface MonsterState {
    % |; A7 @$ f% J1 d8 l1 |
  6.     void handleState(Monster monster);% y' Q' u( o$ }# K! E
  7. }- d- _8 v9 \5 H7 w4 ~; z; }
Скопировать код
9 O5 l2 ?0 A( _' R: N
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 ]- e. y1 }2 e  ~8 ^1 j

/ R$ a4 |' U9 ^8 Z* w$ j) @# iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- e2 F' b8 |4 j" `' L  @% |$ _
) ^' X8 W# f& G! p0 ]; OКласс для начального состояния монстра:
# I' H) K/ v  ?4 N8 c+ M$ c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , w7 \0 @( D( u. \7 `8 w* ?1 x0 J
  2. package org.l2jmobius.gameserver.model.actor.state;
    . f; A6 H+ a! E' s; C4 U

  3. * X: N  X: s5 [0 I- i+ U  d) L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , m4 ^& T$ e2 J/ n, R- Z! J  ^

  5. 5 k% L  C; g/ a  x5 `! P, O1 _
  6. public class InitialState implements MonsterState {4 L1 U3 _$ W, L; J
  7.     @Override: j- [& `4 I. l. I
  8.     public void handleState(Monster monster) {
    : A# k: K1 e) P
  9.         // Начальная фаза боя
    8 T" k0 y- a$ }) x9 i9 z2 t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# Z. `. Y& `( b/ Y
  11.     }) ]4 g% d+ ]5 T& v/ m' n
  12. }
    . r$ A, S+ C! l1 g; M: G" V+ n
Скопировать код
Класс для агрессивного состояния монстра:
, a6 V3 |9 }: b8 Z$ o/ f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, M: }1 t7 e* H# d2 L
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) F0 H( F: }7 }+ u- D1 U6 K7 [
  3. 4 Z7 [: ]; i! J( v
  4. import org.l2jmobius.gameserver.model.actor.Monster;' o8 r  s& P* u: j9 D
  5. ! `& e: R/ N2 g6 s
  6. public class AggressiveState implements MonsterState {
    : ~8 a' l$ `: e
  7.     @Override
    5 r6 Z( ?7 u2 D' ^4 F/ y" G
  8.     public void handleState(Monster monster) {% ^7 w! m/ o0 q2 Q  N3 ^2 k0 G2 s
  9.         // Агрессивная фаза боя
    " A! K0 E  s  K/ q0 L% U
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( Q5 x6 m6 l; n( s; x  o$ o6 D
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    1 a) F: T! l" j, u( \, q
  12.     }  b3 D+ R/ E! B  j5 Q, G
  13. }/ ?) ^" G1 r$ Z
Скопировать код
Класс для финального состояния монстра:
0 `, U% j& f) k4 X0 b" \" D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # h/ }6 F9 Q6 ~2 B
  2. package org.l2jmobius.gameserver.model.actor.state;
      o2 h# C" N% W. H. v3 D" p9 g

  3. # K; ?6 V9 }1 c1 N( l
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 D0 z) B9 T% H3 F; @& a

  5.   O# Z' Q+ u% X- \- N* K( \
  6. public class FinalState implements MonsterState {
    8 A3 u: p2 m9 Z1 D
  7.     @Override: T, a4 c8 C$ {
  8.     public void handleState(Monster monster) {' a1 {  a. D& a/ e* y! T; F" U, F6 k
  9.         // Финальная фаза боя+ m: J, m4 ?. ?) E( H& c
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");) H  E2 K0 j- F+ |9 m1 C6 F$ P
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 u% [: \+ A) t4 R2 i; `- `
  12.     }. E: J2 ~) ?' U% W8 X
  13. }
    + C1 p; p, o8 Y; Z+ c
Скопировать код

' g, r6 k. `' \8 `9 mШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
! i6 n  e; t( y1 e, k9 U. F
  1. // Пакет org.l2jmobius.gameserver.model.actor$ J0 B$ X5 p: r9 U$ A
  2. package org.l2jmobius.gameserver.model.actor;
    * w, T  q0 k  z4 S4 T
  3. 9 `6 _! ~" m5 ?% X9 [& p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& s  y4 P- }* D1 c( u
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ w! K! K/ J1 S9 N4 Y5 F: D; @

  6. 0 c  J) B+ L4 x. f& g2 v
  7. public class Monster extends Creature {& x9 p# T( C7 P3 N
  8.     private String name;
    / i3 r$ `! u7 T3 `1 }' U
  9.     private double attackPower;& c+ m4 m, U. ~! W
  10.     private MonsterState state; // Текущее состояние монстра
      |6 r' Z: V6 t* ?
  11. 0 }$ V& T3 b5 Q
  12.     // Конструктор монстра
    5 {2 Z- x  P! }5 M4 k
  13.     public Monster(String name, double attackPower) {
    ! I  t5 h2 i4 }2 t
  14.         this.name = name;
    * [1 j7 ~: T. ]5 u
  15.         this.attackPower = attackPower;
    / k; ?, r! c1 o: G: ^" b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние2 K& h: T7 Y# Z1 U
  17.     }
    ' O, ~" x' Q+ }* P( y

  18. ! u* e' m1 j$ f# e) E
  19.     // Метод для смены состояния* m) Y: f  M. S$ |
  20.     public void setState(MonsterState newState) {
    5 M. l$ X1 e! f5 f) f$ r+ \
  21.         this.state = newState;
    , U% w1 P  @% i
  22.     }; J% j. M# w# }# s& R  o1 p
  23. 2 W' i8 P% y/ Q3 @! G. c# X! h9 G
  24.     // Выполнение действий на основе текущего состояния9 m; m4 Y4 k7 G  G% w
  25.     public void executeState() {
    7 A' e/ M; k( ^; e
  26.         state.handleState(this);
      D" A6 c- s. N
  27.     }
    % R5 |* {: l+ t( x+ ?9 ^

  28. , f# ]; h  q) C$ @: I! I
  29.     // Геттеры и сеттеры* b& x! e7 A4 I# _8 k$ Z
  30.     public String getName() {/ s5 E6 E6 ]7 Q' `7 ^* k; u
  31.         return name;
    9 M1 r; s1 i% H. P
  32.     }' g/ X8 E6 Q* X. B

  33. " }' h! u. [+ T1 M1 \% Q
  34.     public double getAttackPower() {8 K2 W$ T3 {$ a) r+ u% L
  35.         return attackPower;% o+ w7 S: q" v; c3 j" L
  36.     }& h& z. g0 ^7 H( N! m
  37.   d" z) G% X) c7 X8 B! K
  38.     public void setAttackPower(double attackPower) {" M" y( z3 D0 [. h5 H. p
  39.         this.attackPower = attackPower;# s) W0 K7 t$ m. |1 K
  40.     }
    ! W& ]1 R9 F$ \+ c# p  P
  41. }4 G+ z8 y" l, Z+ c: e
Скопировать код
$ e/ i3 u& p! {# A# C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.  f# X5 _2 Z8 z5 q# `) a8 f

. _1 d& {5 H! N. z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 r# ]0 S1 A+ T5 i8 W. P" \9 k
  2. package org.l2jmobius.gameserver.model.battle;8 ~% @7 [6 {, h

  3. $ g- e4 j9 y4 ?5 |5 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;! d! d# g: m$ f% O( S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    4 d7 I& r3 d6 n+ l4 q# m8 c
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    * x8 V( G  G. n5 R) `
  7. 6 n2 i1 F- k( H! o- X7 \+ ^
  8. public class BattleSimulation {8 g( M1 }& S2 z& X) n' l9 |
  9.     public static void main(String[] args) {1 [- y3 V6 u6 e6 |8 T1 l# E8 L3 u
  10.         // Создаем монстра с начальной атакой
    # l9 A' S; w. h& h" V( o, [4 C
  11.         Monster monster = new Monster("Дракон", 100);* g" N8 C  q+ I3 m

  12. 0 m3 @3 n& D/ {& X
  13.         // Начальная фаза
    & N# ]9 Q  v4 V' w5 O0 l
  14.         monster.executeState();
    6 h% Z9 Y7 N, o  V# w8 y

  15. 8 z' `6 C1 x6 v) t
  16.         // Переход в агрессивную фазу
    0 L* C5 ~% N9 y* a( h
  17.         monster.setState(new AggressiveState());6 Y3 G; g  U+ O4 \9 v! r
  18.         monster.executeState();. i3 y# d$ ^  e1 K; d" i

  19. # ^2 P/ \  b# A0 ^  a8 v
  20.         // Финальная фаза
    0 t) K2 \5 g' T+ b  h
  21.         monster.setState(new FinalState());! c( v/ I/ A2 d
  22.         monster.executeState();: v6 u& H1 |7 U5 k# e
  23.     }
    + \0 g8 v6 H9 s8 Q( O' h
  24. }
    5 @" v- c7 Y- f4 w7 u, D6 [; O
Скопировать код

& X% p9 C( h# ]Комментарии по структуре пакетов и классов:" ~6 j  ^* j& c% u$ T9 Y; e
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ' _( L) J) C7 E/ ~
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
  m5 a! F- _5 j. f+ iЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! `! ^5 a& D, e" G' k5 \9 z

; j" c% a. i/ i# ^' {* E' D9 F2 A9 a) ~7 K, ?
* }& ]0 S7 d- f, d+ v

4 d0 W+ Z* k, m0 o5 k  i) P6 }* x7 A
6 L/ ~; o* |! F; b
4 g1 _& i9 U7 O0 g' S6 M0 i9 e$ t9 J. }, }+ O& ~, T* h4 i

, P. ^! a7 A8 e  c7 ], Z+ o5 S* E) y
4 p% g' x" \/ ]* \

' w! h( M) a3 f, O& B2 d- _  E5 c) L1 L: b$ T; w9 `) m' n
, M4 e* U5 [8 s4 S

4 V2 k# b; Z' {. X. m' a) L$ t" e
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
: h( h% y  R  n8 _- JДля управления сложными взаимодействиями, такими как  ...

4 ]5 b' j1 s* NОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
( c  J) M* Z1 y; Z4 {* cОтличный подход! Использование шаблона "Состояние" де ...
0 |, D' d1 e# \5 U' L
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.+ O- v% y" f* W- d% @1 G/ a2 c! n

) c7 n  O* l* v- k4 zШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: K% T$ h, \' t6 K6 t

! _2 H- @3 y# T  ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 [  }8 H; A. |7 t" N  O5 r4 [
  2. package org.l2jmobius.gameserver.model.actor;2 O" W) O8 d& B3 `
  3. , {1 a1 T. {, V9 Z7 p& Y) d; S
  4. // Перечисление для типов атак. @0 }% c, g6 c4 C
  5. public enum AttackType {
    * C: A5 A8 I* \+ e# T4 V
  6.     PHYSICAL, MAGICAL;# @: F% c$ j$ o" j1 B
  7. }
    * |3 ^2 ~# I3 D
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
& M) ^+ K7 g. D  M$ g9 v1 ^Обновленный класс для агрессивного состояния монстра:
0 ]3 n$ v7 v! k" ]0 k  S" {+ y2 V; J$ H0 N( Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 k" e" m3 l2 s$ J+ U  _
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 `# t' G; S) @  Z: b

  3. " W# V; L, W+ y+ L* R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 E# e  u% k- [; G
  5. import org.l2jmobius.gameserver.model.actor.AttackType;+ y( S& O& y* V, J1 s. ^
  6. ! U8 y- H  A2 n3 r
  7. import java.util.Random;
    , s1 u! y4 E) V& n8 v6 E3 I" y

  8. * l" ~8 b7 R# ~& R7 `
  9. public class AggressiveState implements MonsterState {
    ' }( r0 e9 z! b
  10.     private Random random = new Random();
    5 {: _  y! X" q! W; o

  11. * e, |: t% }8 B6 I6 u1 j4 ]
  12.     @Override* q- J# r' {8 S- e
  13.     public void handleState(Monster monster) {
    0 L8 K$ ^  {& B6 x: C% S; b" I
  14.         // Выбираем случайный тип атаки: физическая или магическая" I8 I) e! I) R9 _( f0 M
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    4 b  I7 a6 E: U  o/ `# }0 i
  16. $ j. U) }/ N6 X0 s5 F# {# _( f, F: {
  17.         // Логика для агрессивной фазы боя7 q; p7 G  F! y, K
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 B8 a  U- q7 V' S+ ^, ]
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ' I. ]0 F3 _. S
  20.         
    $ T% J- y$ h! c9 [, u
  21.         // Увеличиваем силу атаки в зависимости от типа атаки. \3 t) M* Y# e; d, }
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    % Q# y% G: y' }! b* @5 @3 r  S
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    & w7 ]& X0 g8 t! W( W0 o( w4 z. j
  24.     }
    / ~& d: `  i3 l; K
  25. }
    ( R' ?" O0 N7 `+ N0 A7 @9 \. |
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки) ~+ m, |  i1 \, g& s9 n$ W) [
+ x/ M' o; x. g4 D/ E
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / X4 n; v% R. y: Q$ W+ x) v) h
  2. package org.l2jmobius.gameserver.model.actor;
    ' d- w7 ?; h4 I/ S" V
  3. 3 V# g; ~1 ~5 r/ h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 |$ K3 ^# L$ N( A3 X. D6 b0 U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* `, o$ q5 ^! W, y; A6 l

  6. . R+ W$ b, T* h* E% l4 }* T
  7. public class Monster extends Creature {( I6 x; W/ i, I* A5 p
  8.     private String name;
    % p) R; a7 m# b9 C1 C
  9.     private double attackPower;
    1 K  Z$ f( U8 E# l; n  f
  10.     private MonsterState state; // Текущее состояние монстра0 Z# m" d/ F* Q7 O
  11. . r0 c/ j0 K6 ]' j, B, v' l0 R
  12.     // Конструктор монстра
    $ b! T9 z/ |" D/ u+ f, d
  13.     public Monster(String name, double attackPower) {9 `  ?7 u, S2 b7 V; c
  14.         this.name = name;' F8 z' @' u$ E
  15.         this.attackPower = attackPower;' U# I. t/ F6 Y( V3 R8 i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию: \, ]: q# |; U! F5 v( J" Y
  17.     }
      U, E8 v$ {) j/ R
  18. - B; E& U  Y7 q  ?6 B
  19.     // Метод для смены состояния1 C5 Q" y( P3 Q+ G
  20.     public void setState(MonsterState newState) {6 `6 {% Q& y6 ~' \
  21.         this.state = newState;/ q) Z' @) x0 {, M8 X5 Z
  22.     }6 d9 v# Z& j' O; H6 l

  23. & a$ R9 Z8 x; j
  24.     // Выполнение действий на основе текущего состояния
    4 \+ }: D( Z  P4 f! V' H' s. M7 K7 I
  25.     public void executeState() {" \3 J- Q' o4 ]! @% c8 G4 f; y
  26.         state.handleState(this);
    7 T& W  E# X" W3 z8 `
  27.     }
    % H8 ~8 z( p  R4 C  Y$ ^
  28. 7 y, E6 M7 i# M. q5 K& Q; C6 b8 g
  29.     // Геттеры и сеттеры
    ! P% d- y( H7 A% C' R0 b( a
  30.     public String getName() {
    " i# Q3 d  {( L) t. b
  31.         return name;
    + p  |7 n# j  s& W! e
  32.     }
    % t4 ?6 B3 l! ]: @0 W
  33. 4 _6 C8 J9 d/ H3 c' B9 J& v6 n
  34.     public double getAttackPower() {4 @1 c" u) f+ ~: x$ d+ b% l+ R6 I
  35.         return attackPower;1 l. f! c; P- `- O4 ]' f- H* ~: T0 R
  36.     }
    ; l( d) r8 T, F* m8 I

  37. 6 q* S( W6 I- a5 v8 c5 N
  38.     public void setAttackPower(double attackPower) {
    $ P/ j, w/ O7 l* e
  39.         this.attackPower = attackPower;# ~' v; @  `; Q# O
  40.     }
    & v5 ?/ x: I" J2 T8 _0 [
  41. }
    ; h% e4 O6 Q: `' l9 ]
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе./ @, L3 ^1 W1 R6 k  s4 Q: M( w
) h: T, p: ?: i  v
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : U3 u+ T# J. U2 u: `
  2. package org.l2jmobius.gameserver.model.battle;
    6 `8 {6 b0 V) r" {

  3. 7 k/ e+ Y  z, M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 T; m$ m8 y" s9 W! f
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * b. i/ g* Q( e' Z

  6. ) S& B5 `& v% N0 c' J) K7 Q9 R
  7. public class BattleSimulation {
    " U, b; {& |: p8 e: w! b* E9 `+ m
  8.     public static void main(String[] args) {
    - C7 _5 l/ N' s$ t$ {
  9.         // Создаем монстра' x, N. I& S# X, Y* M
  10.         Monster monster = new Monster("Дракон", 100);& k( F2 B, k# F

  11. 8 o- N/ H# v% v+ K
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак1 t) A. d0 b. \) i# v+ Z$ w! ^- @
  13.         monster.setState(new AggressiveState());1 T$ X7 K4 @# }4 E5 S- e
  14.         monster.executeState();& ]( {3 E; k  ~4 l
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ) b7 X4 D6 U5 x, @/ P% ?
  16.     }
    ; {6 `+ U+ n: U* }/ `
  17. }
    - x) Z2 E( j8 n$ q5 B) u
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
9 S: Y5 ?0 j/ G% L3 ?Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
, M2 v, U. o5 S& k$ ?
" m/ {2 p; F" f& ~* Y
2 }* H& v- V9 ]
8 W. `1 Z3 `+ Y# ]3 g" @! ]
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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