Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
" \  }& Q# f  q& L% O& G% Z6 J* [9 l. f, a

5 w( W$ A& t( R/ }8 W+ ~Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ t5 O5 Q1 }" F. g5 lЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
2 d6 ?$ n7 b1 i+ A( y6 WАстралия ?& B* e9 }) q  q

7 ^9 R/ A" V; }' e$ z- F

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
. _9 t; g% m2 |- x1 D) j4 @" {В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
1 \% F/ u' f3 ~* ~9 H- d. I( j' Y4 `! D9 d0 I# o/ U, r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
8 B4 P& I4 T( p" h; P: `
AlexCoder опубликовал в 2024-10-16 18:31% w1 Y/ Q7 O* H$ B* S
День добрый!
6 v& I( w: s% a0 ZВ статье описано взаимодействие игрока с N ...
, }, I( G+ C+ _$ o* a. Q9 D3 F3 ~
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ; Y: p* [9 \9 P6 }. R" [* N1 _
! a9 x/ j( G! j, i1 ]" i
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.9 h3 _4 }2 ]7 Z
' s. U7 d# M3 [0 t* T; Z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- @4 f' O# i# o

# O+ @" F: }" c" h$ J; T/ B
  1. <font color="Green">// Пакет для состояний монстра</font>4 f% A- F+ n, G  N& |5 v  l
  2. package org.l2jmobius.gameserver.model.actor.state;: `8 D5 A$ s% P6 M
  3. <font color="Green">
    % h. d+ c$ W5 q+ Y3 I; s, s6 R
  4. // Интерфейс, представляющий состояния монстра</font>
    % @2 B( A' w$ J
  5. public interface MonsterState {
    ' n5 O0 x- {% A  A  U" I* s
  6.     void handleState(Monster monster);; ^5 a3 i0 s$ p* i' Q
  7. }* t, Z; w: s8 G1 b' u
Скопировать код
' S3 m  n, t9 r5 X* h; M' N
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 Z& h# u. M: W
9 H3 [2 ]- N' bКласс для начального состояния монстра:- N5 J& Y8 E+ A0 u/ N9 d& _
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
      v5 W) Y" ?1 }  v5 c6 I
  2. package org.l2jmobius.gameserver.model.actor.state;% A8 Q2 L# I0 D: X

  3. ! v9 a4 p8 o! e8 `. x8 q" P) b
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 x$ Z0 |6 F: B; O

  5. 2 {( V7 w: N6 h# Q1 |( T
  6. public class InitialState implements MonsterState {3 z% c+ h* h+ p2 Z3 y) R* A/ [/ s
  7.     @Override, f5 W+ v$ X; U! y* l
  8.     public void handleState(Monster monster) {6 x! _+ x% {% `- G# ~
  9.         // Начальная фаза боя
    ; F* p; g$ n' d0 A+ P/ n
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    , I& R* ^& ?2 ^7 L7 x5 c2 J
  11.     }& e$ Q1 v. s/ o, d
  12. }
    / r* _" W) F; @( d: `. i
Скопировать код

$ q$ n, U) F  w8 q9 r6 s$ Z9 R% J# z! T$ m

; Y4 ^6 B+ ~+ r* @; F( r0 Z1 z
% J5 d8 L) z* d' g# c, [7 t4 B' z+ R! j! _9 t

0 Y" ?$ H- ~  Z7 W
& R. n/ @5 [9 b7 O$ z2 q: k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . m: K3 m0 E) [4 o  C8 `

  m) B9 j- k3 v) z3 fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ v/ ], x  T0 O6 S+ U9 \9 r
3 t  S3 t4 o& w2 L  b8 }, z1 EШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* Z9 P  `) L5 J: Q+ }, d8 D% K3 R7 v; l7 B
  1. // Пакет для состояний монстра
    + O# p" f" F( ?! ]) p  O
  2. package org.l2jmobius.gameserver.model.actor.state;
    # Y2 N6 ~4 X* P3 J
  3. ' N. z  c9 d* v4 p* f. }
  4. // Интерфейс, представляющий состояния монстра
    : Y$ b" ?! j5 N4 `
  5. public interface MonsterState {2 K, o, w8 ^0 M! x* X, \2 l& }9 f
  6.     void handleState(Monster monster);
    + d, C. K$ V: N
  7. }6 [" ]' N: a7 |' x
Скопировать код
, W3 Z: B( [9 [& T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
$ p3 K# _" {; s3 V+ T
8 H! r1 m- C9 |! K8 S: |/ gЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) k9 k* [" ]& s: U( E# n/ r
- _" w$ p: B7 _5 ~+ }7 f! vКласс для начального состояния монстра:
& b, M1 O( J4 N# Q4 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state+ `( V  d* [0 `! P0 }8 e" v
  2. package org.l2jmobius.gameserver.model.actor.state;* O  l" F- l" j0 r. w! s
  3. 1 R5 D( V: u+ N" S" e: h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 u/ B" s( T, u+ K

  5. # ^) K4 L4 E6 n+ s" D/ O
  6. public class InitialState implements MonsterState {
    $ c/ `( S) d. }3 X* p2 J4 R9 @
  7.     @Override& h5 v. @& h) _
  8.     public void handleState(Monster monster) {
    ' e) ~6 d1 H6 x9 T' j
  9.         // Начальная фаза боя& z; g7 D8 W& K4 l. F9 j+ Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  a( u, y, a! T! v$ y
  11.     }
    - m; O( A7 c9 f1 h
  12. }/ _& O8 M5 a) T, L, F
Скопировать код
Класс для агрессивного состояния монстра:
8 `+ d+ m0 x/ J, \) ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! v+ u& C3 X8 D- V4 Q
  2. package org.l2jmobius.gameserver.model.actor.state;7 `' j4 ~3 n# q. Y4 a' `
  3. * O/ {; g8 T  @# c- ~- |# k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 R4 Z9 _: V4 l9 u9 ?3 }
  5. + g# k( Q) z/ s( @. z
  6. public class AggressiveState implements MonsterState {
    - r$ _  O# D' J; u) ~5 K5 O: ?
  7.     @Override
    ) r& ]' ?1 G# O
  8.     public void handleState(Monster monster) {1 |3 [/ c3 R$ C! y0 i5 f
  9.         // Агрессивная фаза боя6 j0 k# ?8 t/ F/ J& Q3 e
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* C4 X# J8 t( T) }) |  v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ; K) d4 o9 U3 u7 \
  12.     }3 Y, M! W3 S" o4 b: z$ x9 V. K7 F7 @
  13. }
    9 P  J9 [* S) k7 V, R" g2 \
Скопировать код
Класс для финального состояния монстра:
- E& |1 ]' r" F3 e2 Y) [0 Q3 i% o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* b9 b$ {: u; O1 e
  2. package org.l2jmobius.gameserver.model.actor.state;" ^+ z: i( z4 Q" b8 T- }' e
  3. . F. \# z; O5 g2 q5 x7 @9 D2 V1 S
  4. import org.l2jmobius.gameserver.model.actor.Monster;- _5 J, v! P( A7 w6 X

  5. 8 \- z" z; ~' f" N3 m
  6. public class FinalState implements MonsterState {
    ( n$ g8 M5 l" S9 ?
  7.     @Override- D$ m# d. x1 ]
  8.     public void handleState(Monster monster) {  D) {- a' S8 c& z3 Q8 ^
  9.         // Финальная фаза боя
    * Y. L; Q* v0 H8 Y( f8 O
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    2 s, H7 s9 u; {9 O0 h4 o. M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ; H# x& L/ f& E" B- s  I  E
  12.     }
    / y% k7 }$ p" `
  13. }) K) t# v7 P; h% w
Скопировать код

: ^+ Y1 k/ g) @9 R4 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., S: x& z% Y- w# S
  1. // Пакет org.l2jmobius.gameserver.model.actor0 j# ^/ N/ E% p5 J, @" X
  2. package org.l2jmobius.gameserver.model.actor;
    . O0 K8 I! v& t0 i" u0 C' B" H

  3. $ F2 B9 B2 L$ [' K- i9 D8 `
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 L2 q2 ]$ ?8 A" K7 U1 @7 L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 ?9 |- F. N* r, m! L
  6. . K$ _* Y4 H9 m6 q) r7 t$ ^
  7. public class Monster extends Creature {
    1 e8 a: M' V; V  s8 h$ D" k
  8.     private String name;: f: `- [0 t+ Y# U
  9.     private double attackPower;
    ' ~* Y3 t' F7 p- y
  10.     private MonsterState state; // Текущее состояние монстра
    1 R! K3 v5 e$ F) t

  11. . j" Q! B0 S& Q* C* E8 Z
  12.     // Конструктор монстра% d  Z2 O& P6 s  f/ R. d
  13.     public Monster(String name, double attackPower) {
    # k$ u2 s  A- R. \2 k( T
  14.         this.name = name;
    % W2 N' j) e: d; D1 T% H# u
  15.         this.attackPower = attackPower;
    9 t: \% m8 N; N3 Z8 R
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние: D$ W( a# H$ [$ V2 m* C- T& J3 i
  17.     }
    0 O, [* c. [! K/ _) }. s" ?
  18. , F4 J; T9 J% @- @. d
  19.     // Метод для смены состояния
    " n& f- y( n2 o3 S: E
  20.     public void setState(MonsterState newState) {1 f1 `5 A# [' C
  21.         this.state = newState;
    * T( L- C# D4 n: H8 |& Z
  22.     }
    9 h, u/ L  X* J
  23. & N' b1 c) b# [- W
  24.     // Выполнение действий на основе текущего состояния- r! x, Y+ N4 Z- k& Z) Y3 A* L
  25.     public void executeState() {
    % r7 ^- h  d7 M- j! W  I
  26.         state.handleState(this);
    : `- ]* Y2 r9 c! T% P  {
  27.     }
    ( \1 I* a) K5 w, \6 R$ t
  28. , K" o" b0 b  F/ J
  29.     // Геттеры и сеттеры/ C5 r7 w9 {$ B/ \* e/ N: C( K
  30.     public String getName() {& B1 s- X, U' X/ p' l, u
  31.         return name;
    ) P5 b8 C+ b3 S) m6 y/ q1 b( q; b
  32.     }' B) n) ~7 v8 D; u* t" a6 Y

  33. " _$ Y( z; B" {4 |6 j2 ^  ~8 m4 X' o
  34.     public double getAttackPower() {) G9 W5 U1 w* Q2 l: q
  35.         return attackPower;, N$ D7 P* q" U4 O2 I$ C- B! P
  36.     }
    % x- g- G; a" Y
  37. 9 a6 k, m3 N0 q
  38.     public void setAttackPower(double attackPower) {
    + R( ?  ]9 n9 s) j5 W0 B- c
  39.         this.attackPower = attackPower;3 p) l4 d) W3 g& g
  40.     }
    * }0 Y2 q( _; ?, q# _8 y
  41. }
    ( \& o8 j9 `& x7 O. `6 f
Скопировать код

- n( H1 _" V/ P8 jШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.' b/ J5 o4 A4 {# E% H9 [; n

3 u% @% R: r( a0 O6 u
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) g, K+ l4 B3 R5 N5 ?
  2. package org.l2jmobius.gameserver.model.battle;
    ) X  j) `+ b5 |8 N' J7 D' v

  3. 5 X" E, s5 O7 C. O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 F: k0 x0 h% d& b  C* f
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ' z8 c$ u5 d3 L3 N" z
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    * ^; L: f+ g4 A1 e5 X3 ^

  7. * m1 R  ?, u, h9 m. h
  8. public class BattleSimulation {
    ! a, Q: }+ k8 g
  9.     public static void main(String[] args) {% w3 A& h* i( {  u' H, ?" S! k( c
  10.         // Создаем монстра с начальной атакой0 n! P+ j$ F$ h3 j8 i* }
  11.         Monster monster = new Monster("Дракон", 100);
    & _" i( w$ B+ L  ~
  12. " C8 L1 {$ B$ n# N
  13.         // Начальная фаза
    6 m( g, {: L( ^8 ]. f
  14.         monster.executeState();
    7 L( D+ E" b( @% b& ~5 ?$ v  Z
  15. $ z4 c/ @0 r# v. _$ o8 ^2 S
  16.         // Переход в агрессивную фазу* @7 t& ?( Z- \7 ?0 X
  17.         monster.setState(new AggressiveState());
    * A" `. U. [3 T* d5 V  ~3 [* g4 p: a
  18.         monster.executeState();# L+ K6 J- W, s+ A6 F/ e; E

  19. 2 n- p/ V* F2 ^, u# x* c& E3 d
  20.         // Финальная фаза, I2 P$ j1 u: M" ?
  21.         monster.setState(new FinalState());
      y! c! F, Z8 |8 l2 f
  22.         monster.executeState();
    ! p) [- F: A# O8 d  d
  23.     }
    + R/ g  A! I5 u1 V$ k5 z6 W: \% U6 Z
  24. }7 D9 {2 b1 h5 i
Скопировать код

% m6 L3 @8 I6 PКомментарии по структуре пакетов и классов:- p1 `% B3 ^% ^
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# c0 u7 l% q- u" J
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
! T0 h+ T# ?$ CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 d- V7 e8 N4 |4 T
% m& m) _+ a8 h
: S4 u- C  W) ^

/ H% z1 U8 m, `6 b. K- ?
) ]5 }; t% b6 L& u, C1 p* \! }6 S8 R) t: O
$ B7 }" k3 k- u3 T  q0 E
0 h' L& E- D5 z
3 U) d8 [  ]! B5 @

( L9 {9 Q6 X; C% Z2 G. m
+ p1 C/ G" C9 o5 p+ h1 C2 I
9 o" Z' ?6 d5 B; ^; a. s' L1 E5 Z$ O+ U

" I# Z; X+ Y% H* M# m: U
0 }6 h* n* ?& e9 ~5 |5 H' X
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' S4 v- P. n* f! `Для управления сложными взаимодействиями, такими как  ...

* C" X2 o; N8 k1 V2 YОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
; W  ]0 W+ U6 Z5 j- UОтличный подход! Использование шаблона "Состояние" де ...

8 X3 k7 v! D3 a$ T1 @2 mХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
2 b5 r+ n; J) a
7 ~% q! ?! y/ PШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: i" M* Y- F, g- ]1 ^

& O) z) f9 r( f, |, S
  1. // Пакет org.l2jmobius.gameserver.model.actor2 g5 {2 n5 L/ h" k+ S2 V
  2. package org.l2jmobius.gameserver.model.actor;0 C8 o8 k  M9 p, `! \& r
  3. % B5 ]1 J4 q3 j" P( u4 x
  4. // Перечисление для типов атак) `& |: l7 r( |3 A& v6 |2 ]# r5 @% \
  5. public enum AttackType {
    # p: |0 N; F" h7 T6 L- x
  6.     PHYSICAL, MAGICAL;
    - u9 x6 n( s; l' t& @! v% K
  7. }* R! l; Z, V) C+ K3 }% C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.! `+ q! ]; @3 l% c  \
Обновленный класс для агрессивного состояния монстра:  Z% R5 \2 C: K- O
9 W; @# `1 Z- l- s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' h* t1 L6 L2 D& e
  2. package org.l2jmobius.gameserver.model.actor.state;! r. A& E) ~3 H/ M$ x' U. s

  3. + `2 O  Z- r( ~, y; G7 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 x& r8 k+ Y$ Z
  5. import org.l2jmobius.gameserver.model.actor.AttackType;: d" v' @6 x& h5 d* K6 ]( l0 R9 O

  6. 7 K( ]- A# z( M' m0 k! Q
  7. import java.util.Random;
    & }/ |. l$ ~$ z0 |) }* w4 P2 c( c
  8. ) o) n) {# i1 |5 L% r; T& Z. K) _1 @
  9. public class AggressiveState implements MonsterState {
    9 E0 q- ~( O) b: T; o3 q1 I# W. P: v7 i, k
  10.     private Random random = new Random();
    - u5 c6 ]: u5 O& ]1 ~2 D. z
  11. ) v7 G9 b+ e8 k1 ?+ u7 q! ^* @8 v$ |
  12.     @Override
    : I6 s4 V( Q: u! n" H. ^+ y" ^
  13.     public void handleState(Monster monster) {+ _$ _% x3 {3 b- r; i. x. B( T
  14.         // Выбираем случайный тип атаки: физическая или магическая
    , ?$ y' A! _2 s
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;4 E" m3 b0 h" b
  16.   S- q3 ?. I* M6 @! _, b9 i( \
  17.         // Логика для агрессивной фазы боя3 [/ p) P* O- C$ m: ^
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 a0 k! ~/ m9 ?0 y- Z3 V/ L9 n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");. Z& ?* H7 I0 V  y" U
  20.           J2 _8 o) @+ N+ [7 Y% Y- b. q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  ?' @* e4 O: S  ]; v, y$ r
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    6 U; n$ h6 d& v, O9 T" i
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    - h+ w4 S! P% Y, ?- z4 R, o% T6 C
  24.     }
    9 C: P. O6 D  T: `
  25. }% L6 L# C( y' ~/ g  e' J/ ]/ c1 N
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки" q( @/ U+ n$ |. ?8 f

- J* L( f* q. N0 i
  1. // Пакет org.l2jmobius.gameserver.model.actor* z1 V3 d% e9 }3 [" _
  2. package org.l2jmobius.gameserver.model.actor;
    , u. C/ ~4 N3 {+ O4 n
  3. 1 b) t6 t$ W2 f% v
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
      m) x1 X* B7 _3 w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
      Y7 S- K& f5 v- ~5 I+ {* U
  6. * B+ d' I1 i$ k# U, `" f
  7. public class Monster extends Creature {; }% ?9 x. e1 k8 P) t: O
  8.     private String name;9 B/ l* ]( \9 z, S
  9.     private double attackPower;
    ' B* U# l. b8 W& m! I
  10.     private MonsterState state; // Текущее состояние монстра% P3 ]- F( o/ Q" o* F
  11. & O! z, S; h2 \+ a- n/ R9 y
  12.     // Конструктор монстра) I. l  |% @, q! |/ C
  13.     public Monster(String name, double attackPower) {' F9 W. q9 V. @  N. D! n/ d$ Z7 T
  14.         this.name = name;' f7 \9 _4 u' ^0 e$ _6 T7 p
  15.         this.attackPower = attackPower;, d" v( Z5 U: O2 _
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию- V, B) M& w  U2 \; P, G/ \. ?7 u
  17.     }0 G& L# w# I) I+ y+ H5 e6 ~, Y# g

  18. / I  g$ ^2 H2 w( }5 n4 S- \
  19.     // Метод для смены состояния6 H6 v- E* K% l- ?! Z+ Q1 b! y
  20.     public void setState(MonsterState newState) {' Y- a% K4 X9 X7 ], z9 n- k
  21.         this.state = newState;' K/ z. S) ]9 ]# e2 S
  22.     }- X, T6 f, I' L" m

  23. ' L; F# j; u* }) i9 d" h" m
  24.     // Выполнение действий на основе текущего состояния4 s( P" ?0 C6 Y7 {+ g
  25.     public void executeState() {6 d: \" ?' V1 n& ^
  26.         state.handleState(this);# ?0 z1 s# H9 c& a
  27.     }
    8 W5 Y& p3 r  I, Q  ?

  28. / t0 X3 E# a3 E3 C
  29.     // Геттеры и сеттеры% @" q& ?* x! ?$ r0 b: P8 C
  30.     public String getName() {* W* Z, X  `9 k
  31.         return name;. G* O' H/ ]& T: D$ K7 h' G
  32.     }
    ) e- ?  S* C# J' d* V( d8 g- N4 n, H

  33. 1 O: y. v2 _4 p( ~2 N4 I
  34.     public double getAttackPower() {1 Z5 ?* b$ c( F$ K
  35.         return attackPower;% `, w8 X6 G' N1 s3 C
  36.     }2 d- L$ \- w6 a6 b; C

  37. 2 `2 ]- D4 Q6 E. F1 P$ H
  38.     public void setAttackPower(double attackPower) {
    ( V3 n; U, o' ?* J! u. V# \
  39.         this.attackPower = attackPower;
    ( }$ Y5 N8 R' R$ y
  40.     }
    3 {3 S% _! t( T' b# j6 x, B- n
  41. }; ^8 ^* c% Y, H
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
0 o( |  r( G3 d
$ b& V* q4 [4 ?1 d  m, [* a
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - |2 n1 W) W9 F' D8 ^+ h0 _
  2. package org.l2jmobius.gameserver.model.battle;
    ( C' o6 ?4 d( M$ m

  3. 8 T/ D: @+ ^1 M5 D( i
  4. import org.l2jmobius.gameserver.model.actor.Monster;# i8 ~5 u/ a1 I/ n5 I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ d2 U1 o2 _3 q8 E7 j  q  M

  6. & X+ Y! \0 ~* a
  7. public class BattleSimulation {
    7 @4 _" Y. d8 N% Z
  8.     public static void main(String[] args) {
    2 Z- R0 g# N$ J3 T- d
  9.         // Создаем монстра9 \; j3 b& Z2 ^7 {# g
  10.         Monster monster = new Monster("Дракон", 100);
    * ~" q% Z6 b  w

  11. / A% d6 F( o% P# C1 w8 J: b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    $ O2 |& Z  x4 A1 Q2 o
  13.         monster.setState(new AggressiveState());* |  ^7 d& F7 V0 Q" t
  14.         monster.executeState();
    1 W; Y/ {; M3 P: R* |1 `; c& V4 ]3 `- s
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    - k( |9 }8 ?9 ~: b; v. Z( A4 }
  16.     }
    8 P+ p; Q, U% M6 z
  17. }4 W: P- \# |  i/ |2 l; G/ l
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
! x9 u4 X7 D+ HЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!- c; y% q4 e+ L+ L1 k* B
' t( g/ e* a+ N: w" A

$ ~6 x3 B7 P6 L' _0 d: i6 H
1 F* G- o. [. X" A
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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