Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!; i" I% K& y  z! @# W. n& n- B

* g. S% q7 I& p3 i& ?
. h  {8 j  I# J# M
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.) A5 K! e0 U/ ^& A3 ~: q/ q. [
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) _3 E' X5 B5 O! |Астралия 🌟
9 D: h8 E$ G8 m4 j7 o# G: W/ u* f, c* m

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* c2 o" b2 W2 O
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
( [* ]) ?6 @6 o+ D4 Z' x% P1 f3 j3 ~5 t( |1 u: F0 ?1 ?. l
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 J* N  p( H! k
AlexCoder опубликовал в 2024-10-16 18:31
  w! o4 V4 h/ j. i1 c" j9 sДень добрый!
' m/ ~2 V0 p: H5 `+ i9 ZВ статье описано взаимодействие игрока с N ...
3 b5 f+ k; h8 J; Q7 n6 q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 6 ~3 C$ B! @$ o
  @3 `  q0 V% J# w$ w) r- E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
+ Y9 [/ [- A$ P/ F' ?( w- J
( @: r' k% m* a( L( x0 RШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% m8 _! i9 M) Q8 I2 m1 O' n$ ~8 |- V) z2 m! b
  1. <font color="Green">// Пакет для состояний монстра</font>
    4 _; ]( ^& ?- ~, S
  2. package org.l2jmobius.gameserver.model.actor.state;
    % h7 f8 G9 s3 E2 E7 m# B) [! P
  3. <font color="Green">
    - e3 ]8 ^2 P+ d2 f! R
  4. // Интерфейс, представляющий состояния монстра</font>
    & ?: d% w. @, U9 m; Y/ w
  5. public interface MonsterState {
    1 e: U* B- l* P
  6.     void handleState(Monster monster);
    0 G  H( T1 Y+ c, w
  7. }
    * W3 D/ K8 |- `
Скопировать код

) ?5 U) H( D# q! o5 @  ^Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, G4 W- D  t+ r, F% P! E
" h& [& x4 @7 I- L' ]Класс для начального состояния монстра:3 g5 ^' c7 E& q$ B
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>. L6 c' K  T2 r  `3 |% j
  2. package org.l2jmobius.gameserver.model.actor.state;$ K2 w* B7 v2 Q
  3. / m5 _/ L4 w, H: I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ b+ X) y8 A/ d2 y% o9 G6 X

  5. ' s3 U. n) v, p4 _
  6. public class InitialState implements MonsterState {# i! y& t% T# k+ f- y* Q- O: O
  7.     @Override
    5 N$ D9 G0 a( Q
  8.     public void handleState(Monster monster) {7 G( b: C9 {% w* f4 R9 L
  9.         // Начальная фаза боя
    % H6 o! r6 H0 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    $ v! t* j2 E: k' r  b- R4 c5 J
  11.     }
    ; H  y& o9 I8 ^. P# m  F
  12. }3 s+ o7 U$ H9 K4 _) B1 g+ r
Скопировать код

3 w! n" x" h$ y* l3 y# ?( F. K  l+ A, y- \+ G
3 P) _& n# X4 X# r2 r9 P

; `) W- }) X' J! Q6 J
6 p6 C: s7 h6 n+ y% [# z- Z3 ]' q; r2 ]3 a( `. x

* W+ g3 J* f4 S1 h, T, q+ \
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* U9 t8 }* W- w9 k, V- F; W9 _, f4 b9 T, R' e: G8 c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  y4 T" H4 w) V2 T! [* N, {
  r* m$ S; P6 K$ xШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
. H( u/ u$ q( X! l, u8 y" O+ S& h! o1 c: d0 {7 a: d, H' j2 }8 x
  1. // Пакет для состояний монстра# P8 E# d6 k2 _7 U7 t2 j' D
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 {6 A% r1 e, \5 V: W$ k9 e) p
  3. ! c# c" p, f3 `# M$ v* R7 T
  4. // Интерфейс, представляющий состояния монстра- h& a/ L( F; l
  5. public interface MonsterState {
    5 b- y' n8 Q2 a
  6.     void handleState(Monster monster);6 }  v( Z$ ?: e) m
  7. }
    9 ?) `7 C4 d% m8 S- P, n( g
Скопировать код
7 A" g+ n4 `; }# ^2 \8 n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 d  J7 R7 _: h% J$ G: z( }( [

3 P+ t# e2 p2 q! r% e9 `0 j5 EЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, p; c3 }9 j7 B4 v1 L2 ]6 E$ d% Z# {+ ~! f+ y, M: r; I& j
Класс для начального состояния монстра:
# X5 G( ]$ ^6 X; G0 D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* i5 @% Z% D7 e% c4 \* b
  2. package org.l2jmobius.gameserver.model.actor.state;
    % M: Z' s6 }/ O* r* X* e# E

  3. ( }! S" A1 d( o* C# t+ [, ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; j, |/ L$ d2 d& ~. ^
  5.   s: {3 O' k! G
  6. public class InitialState implements MonsterState {
    9 a6 Q2 u5 v, K# ?5 {
  7.     @Override
    8 q" t  z9 h& B
  8.     public void handleState(Monster monster) {" Z1 w8 r$ Q' ?$ [
  9.         // Начальная фаза боя
    1 b& W4 B5 j: A5 N" d
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 @3 ~0 u8 b/ W5 p
  11.     }. d; I5 t; r$ d2 o1 P. u! y
  12. }; o  o" a/ [. X% e
Скопировать код
Класс для агрессивного состояния монстра:+ K6 \9 Q3 w! n2 g$ U! `1 r1 r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" x5 n$ z# R0 S; U+ p' ?7 a
  2. package org.l2jmobius.gameserver.model.actor.state;& c5 e. K: b* F: x# M* b

  3. & ]& |5 I8 R( q( {3 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 o  j6 _1 Q1 e! ?3 W

  5. 1 a$ p( b* S# A8 O
  6. public class AggressiveState implements MonsterState {
    9 Z: a( }5 [  d) {
  7.     @Override3 f$ p( A. l( s/ b
  8.     public void handleState(Monster monster) {$ M- l, ]) Y9 [0 G
  9.         // Агрессивная фаза боя! p1 a2 C3 {$ q; c
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");) X1 a% N( M2 F2 N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ Z3 C" V6 i( K2 J  A0 v9 w+ c9 y
  12.     }
    & O; }7 o+ y7 P% d" g/ v* j" h# `% Y
  13. }+ q7 a+ |6 ^6 @: a
Скопировать код
Класс для финального состояния монстра:
# t0 ?- M6 D- U# Y* a6 b8 r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 K  k% E% G  r  b$ g
  2. package org.l2jmobius.gameserver.model.actor.state;
    , j3 T" Z: P) Q0 L+ }

  3. $ R4 B$ @' z6 D4 F" M: e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # w3 Z/ k" l8 ^% n5 z# y

  5. 6 A- s6 ^- [# R" L  i% e
  6. public class FinalState implements MonsterState {, D- w& |7 `( ]
  7.     @Override4 `" m9 |( ?) ?$ O) y- w( U' _
  8.     public void handleState(Monster monster) {$ G$ |  S; D$ e) R
  9.         // Финальная фаза боя
    1 \* h0 ?6 A7 Q/ G; `
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    0 j$ n. h( @4 a7 s
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки+ K$ }3 ?. y0 O  y- U
  12.     }
      n' m. n9 ^0 @2 W( y
  13. }! v2 G/ u" N6 k/ g  T  L# G& f5 R2 G
Скопировать код
' F3 y5 r1 v) G3 j. m$ o8 ?1 b1 Z2 d
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
5 c8 a' k- F- `( J9 J- q2 p
  1. // Пакет org.l2jmobius.gameserver.model.actor- P3 x, r% p" J7 m! A& [. c
  2. package org.l2jmobius.gameserver.model.actor;3 O' H% Q6 Z; f3 l
  3. . b6 D! h" }5 f/ n4 |' Q2 u* W# g
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 a+ C( J* d+ d! O
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ; J9 _+ W* w: H, U) E/ s3 |: P

  6. 6 n: z7 _$ w2 O! l# V' L  |4 T, z
  7. public class Monster extends Creature {
    9 m* X: v. A9 o$ `3 b6 m! c+ d' L- ?
  8.     private String name;8 A5 [: U5 w' f& D% x6 h
  9.     private double attackPower;* x& y5 |* S4 H# {+ O. G
  10.     private MonsterState state; // Текущее состояние монстра
    , E* S" |4 v3 o! o5 Z; ?& ~- m

  11. + ~/ g% v: w) K' }
  12.     // Конструктор монстра
    9 r8 r3 z9 [$ N+ ]/ R9 ~
  13.     public Monster(String name, double attackPower) {1 c/ _/ U; W$ T5 N9 e
  14.         this.name = name;
      d  B8 B( m# W" @' s
  15.         this.attackPower = attackPower;; p* C" _* X" l# p1 X) }2 m
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    2 u1 k( f) q- F/ Q
  17.     }3 a- t1 j: j; Y. n! N
  18. ) f; l1 s% Z  Z  u
  19.     // Метод для смены состояния4 m& s  z- F% {2 ^. O. t. [
  20.     public void setState(MonsterState newState) {
    : m0 j. z2 U! K! L
  21.         this.state = newState;) T4 E4 Q0 D* i7 U4 ?' R( u
  22.     }" O+ R0 N9 A  \! @
  23. 4 |: \! @! p& I& e2 y& L' D5 ^
  24.     // Выполнение действий на основе текущего состояния: e& u7 T1 p/ M
  25.     public void executeState() {
    - X  ~/ y/ s& k, `) F4 h. q
  26.         state.handleState(this);
    , F: S( o( F3 [1 L6 o% b" A1 Y
  27.     }
    $ q" a3 p- C9 n3 p) ~* c! u2 m: ~+ H
  28. $ ]6 n. m9 C9 G; {- H) |
  29.     // Геттеры и сеттеры. [" O! ?1 |  b' Z% l# d* ?" p
  30.     public String getName() {
    " ]1 t9 U* }+ p7 D+ u" X
  31.         return name;" z7 b% s; j% e* J' @" V- k
  32.     }
    - y8 K" w2 x5 i4 t( E4 \

  33. 7 m  }1 X7 {; o; L
  34.     public double getAttackPower() {
    % y% j$ V1 R5 C: `4 [4 s
  35.         return attackPower;; {+ x/ Q/ A8 a$ s2 A0 E) N
  36.     }+ ^! T3 ~' q2 k2 H1 V1 t
  37. 1 {. I7 ?" G' Y6 S% _
  38.     public void setAttackPower(double attackPower) {
    + o% [/ t- i, y+ Y) ~% F# e
  39.         this.attackPower = attackPower;/ U1 G" k' ~2 S! Q
  40.     }* y, `/ J0 Q* M7 U2 z! w! c
  41. }
    & `9 B% B% M3 J; `) i; x/ K: c9 k
Скопировать код
5 `) o  w% @0 k8 o6 s# z/ l& T
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.' Y2 r: `+ m8 K1 ]! b* g
: S/ m8 Q/ Q0 h; m+ ~$ @
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; `3 s9 ?) P( M; A2 d
  2. package org.l2jmobius.gameserver.model.battle;
    0 [( B1 X% a/ k1 R

  3. $ Q, T8 ]# x: w# P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      B0 Z+ m0 F7 K! e! l
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) I6 ^% {# c$ M+ H. x1 {
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 G4 E3 G, p" l; D2 _2 R

  7. 9 z3 b$ `0 a8 x9 }& h; D/ p9 O* `
  8. public class BattleSimulation {
    : U# Y, k& ~; w  N: F/ J" m
  9.     public static void main(String[] args) {2 p. M" \+ f+ Q1 v9 x' [
  10.         // Создаем монстра с начальной атакой
    7 k( }. m) d9 V% w
  11.         Monster monster = new Monster("Дракон", 100);
    ' i. I' {& X( z# U
  12. " L4 `, x0 W: K* [4 \; [& D
  13.         // Начальная фаза
    $ E' }  A/ \/ U( ^
  14.         monster.executeState();
    % Q8 Y2 E+ @& K1 w6 b3 b

  15.   l4 `* E  ?9 }# t  C
  16.         // Переход в агрессивную фазу0 Z- m( A- B/ s; M$ l" |2 p
  17.         monster.setState(new AggressiveState());
    ! }8 X2 i" Z- W& z# c" F
  18.         monster.executeState();
    7 ]- A: q. h. V7 E  R3 c% R
  19. 6 |) C  V" `$ r" s# i  R( w; s/ a
  20.         // Финальная фаза
      a( d9 |4 g) ^/ N) |& v2 q8 Y
  21.         monster.setState(new FinalState());( R$ L) ]/ C7 i7 o- Y
  22.         monster.executeState();
    8 z7 @, A2 m' s. z7 i
  23.     }9 R5 S2 f" `. |( m
  24. }$ w  m  M6 t/ a, q" v
Скопировать код

4 |# W0 S" v; g/ Y- ]8 cКомментарии по структуре пакетов и классов:! U" g4 u# O4 r# c' E# o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% ~& U# M! S8 t5 m% Q+ u8 U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.# `4 F; O, W" ]7 J' \3 a
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!! P- d& ]: _: Z# w
5 o! g) g( P* p/ Q* S8 H0 k
/ T* X* I8 M' d* |0 ~  K
1 n# L3 S# E* O7 o
2 Q- b0 C3 z; R# S% s+ A, s

  D$ s& z  _. O* I  ~- Q" ?! W; `* d& A- t" w! K% @

  a1 ?7 i1 k; z4 ]
3 U; c: N( Y+ N6 C% r& `; K" M( Q" M

4 E" q, E& J  v8 r: S$ h% g7 i$ Z+ z2 S* ~' [; o

: t' F/ }9 c9 u: b' y% N) i4 C
3 x$ K" p! S, H4 o3 W, F3 e7 g1 c" F8 @! E  U1 s8 @; ]1 T
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
, E# S* D7 V1 c9 Y0 {1 A+ k. VДля управления сложными взаимодействиями, такими как  ...

2 G* X0 K) c) ]Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21: K' T8 Y. J" ^- `$ E: U: H
Отличный подход! Использование шаблона "Состояние" де ...

5 a! m# l: H* Q' j; CХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.3 O7 X6 o) `( v8 D

. K! g. i$ o1 {! l/ C3 JШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
- r& f0 Q7 p) n2 S8 ^% ]% f0 v  }* {& R# B3 E( U! h
  1. // Пакет org.l2jmobius.gameserver.model.actor" d- J7 H: n) y  H/ g& k( o' I, N8 \
  2. package org.l2jmobius.gameserver.model.actor;% u$ U  k0 F* A' R( J8 K4 L2 j

  3. 5 f- x0 g4 {! j$ z! ^3 b5 O
  4. // Перечисление для типов атак
    , a8 Q8 O3 o6 c' K  j8 G
  5. public enum AttackType {( b( d5 D- k% L' V' e
  6.     PHYSICAL, MAGICAL;5 s0 Y3 K8 l0 d; W! S3 t, M0 P
  7. }) S1 y# s7 m) T' I8 S3 x
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
/ H9 a; l2 ]3 a& M3 c& vОбновленный класс для агрессивного состояния монстра:1 W7 e- R5 r! G# V9 v& s9 g

- \; q/ D! \9 ~1 M2 C8 M2 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* O% _7 N& ?8 S0 \6 l4 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    , s* p9 t3 l& G( u5 T0 o2 {" e4 }
  3. 5 m0 j& p6 f( H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & I% ?& n+ E( p( E
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    3 E& E4 r9 z( ^: M' m
  6. . Z# e; S" D) b8 m  X$ S3 [/ [5 p
  7. import java.util.Random;' o% x8 b/ {( I8 S0 W( L$ I
  8. ' q  z8 K7 }$ V& p& V) G
  9. public class AggressiveState implements MonsterState {
    + [0 ]( E1 W* N7 e
  10.     private Random random = new Random();9 b) c+ ^1 Q$ g" G$ ^/ f

  11. & x  H6 }4 @! _  i3 k
  12.     @Override
    * D2 O- z2 o7 J
  13.     public void handleState(Monster monster) {5 X" T: k. ^! l; o6 |4 j
  14.         // Выбираем случайный тип атаки: физическая или магическая- o+ M( g% o" J% L" a
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;0 G6 r( t, {  V* n- F

  16. / B0 J# i" e% q; {/ u
  17.         // Логика для агрессивной фазы боя
    6 I# y6 K5 j( J! z+ R
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 4 \! ~/ G0 \: ^$ y" G# P
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    , k2 H+ V( Y1 W9 |5 z
  20.         / e. f$ w; l) ^; z( b
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    . f' H, M$ v& D! L& ]
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ( i4 x# J  y! @. V1 ]5 {# g5 Z( ~8 M8 W
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    2 @2 \- _% X/ t- H
  24.     }
    ( g* r- L3 L( N# h
  25. }  x; U* X0 K6 I
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
% r0 u7 c, k$ L3 M* K0 v4 `
& _. S8 S  R6 F
  1. // Пакет org.l2jmobius.gameserver.model.actor) j  N+ g9 ]- C& u! v
  2. package org.l2jmobius.gameserver.model.actor;
    + }$ x; ]) |  B0 U, M
  3. 6 p2 [* o3 o  l: T2 {5 @4 M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;7 v* P1 O+ Y* K  X( P
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 G- B/ _# A# l
  6. # _# C6 U3 x0 F5 J9 }
  7. public class Monster extends Creature {, ]  {9 i! m  z9 K  K3 |) f
  8.     private String name;7 o$ E3 _3 A0 r- L2 [* V4 P- V
  9.     private double attackPower;# H8 V! P" N) j2 Z
  10.     private MonsterState state; // Текущее состояние монстра
    9 Z+ T: O8 x8 d$ u; b; v4 o9 f# o; \

  11. # V& Y  u" O- W8 X% G1 H
  12.     // Конструктор монстра
    # P3 }- j0 r& s9 @% O
  13.     public Monster(String name, double attackPower) {
    % G2 C, i9 v. ]
  14.         this.name = name;* K- F% |3 ~3 [: ?6 A& G
  15.         this.attackPower = attackPower;
    " J' ~+ X, [% X" X5 s
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию! p! `/ N) d, M6 U1 D# N
  17.     }+ D' e* O( L9 y/ n

  18. 5 N5 {; o9 J" N* q+ B( ^
  19.     // Метод для смены состояния
    * n* y- x7 E) `' T. o2 ?4 U
  20.     public void setState(MonsterState newState) {+ \/ ]1 S) C  m4 `
  21.         this.state = newState;
    & M5 h! \6 X. d4 Y- G
  22.     }
    2 J0 d) N2 N% L+ Z; I

  23. ! ~1 B3 o- R' y2 \  k! {3 L
  24.     // Выполнение действий на основе текущего состояния6 m& ?. f! ~4 R& d
  25.     public void executeState() {- s. X. l5 ]2 _2 [
  26.         state.handleState(this);
    , C) J6 N$ a8 X1 Z5 V3 N2 u6 ]
  27.     }
    ( G, B! G3 T/ ~- j- a/ B; T* M

  28. 2 n: _0 B# X" b& ?( W+ u# C2 F
  29.     // Геттеры и сеттеры$ V# Y  K: A5 ^
  30.     public String getName() {
    4 K( O) D1 F. t- l
  31.         return name;
    - T7 j" o7 Z9 p+ q& L
  32.     }, |1 Q; e" f1 O% v1 O

  33. 9 g  m7 M- @; C) h. }
  34.     public double getAttackPower() {
    - Z# R4 @+ {* h+ a4 ?
  35.         return attackPower;
    ; q9 u4 g9 [6 ?8 C; x
  36.     }
    8 P2 _# [9 s7 H8 \; I0 Q8 L
  37.   t" s* `- `- k( O+ _
  38.     public void setAttackPower(double attackPower) {4 E; W/ b! F1 v" X0 o1 r
  39.         this.attackPower = attackPower;
    - Q& u( N$ k( W, z
  40.     }0 ^6 n  Q, T; I, _
  41. }% h6 h' m" k0 f
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.+ d1 S2 k4 F* ~' O
0 K5 e* n" T1 W2 f$ }  d, X
  1. // Пакет org.l2jmobius.gameserver.model.battle- a5 B0 ~& f" I( ]1 A( v
  2. package org.l2jmobius.gameserver.model.battle;
    0 ~0 F2 S  q+ B7 A; ]' j; r
  3. 7 j5 [! r* z6 |. ?7 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;' S9 f" W4 W" h3 E# |
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : v0 p( ]/ a7 f* F
  6. * L# ?1 c5 j$ G0 I
  7. public class BattleSimulation {
    ! c  I* {' W+ z4 h/ y. E
  8.     public static void main(String[] args) {
    0 D) f$ ~9 s. b- M2 O) A  z0 u
  9.         // Создаем монстра, f% s! r- j' T. _: z3 o4 W
  10.         Monster monster = new Monster("Дракон", 100);7 o' t9 Q1 n0 z, n) s- n
  11. 7 n7 o# Q+ l/ e( p/ f
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    & `4 L9 Q5 n" M( V- M
  13.         monster.setState(new AggressiveState());
    7 z/ J& v* a! P5 U0 k
  14.         monster.executeState();
    7 x8 [! Y+ F  i! d9 U: {1 L3 h/ E
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    5 c6 ^) E2 @# t( T+ v  x3 g0 H
  16.     }
    ! W3 A, C1 w! G; g- l
  17. }8 B( f* i7 g# C: d& O9 T
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ t" ~0 R( V0 e2 E* dЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
% t9 g6 c1 z5 v3 D" z! Z
  o! b+ `8 p. O* A3 h# _$ I  E
4 |) Q7 [- e2 D8 m" |: {( ?
( Z7 H+ q/ x& X3 \: J2 X
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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