Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!! l; _7 U# P* A; K8 E2 Y5 a, b
  y0 ?: C9 p3 o$ O/ h0 w3 I: s0 {

/ `$ N8 Z3 W; s; F2 H* e( f' X7 FЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
  j% v$ h2 g4 c" ]0 yЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!  }6 j$ c  ~; j
Астралия ?$ C6 i" b' X8 c4 P" S9 f$ Y6 _
5 f2 D6 S1 l* ?( B! ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
+ o" |% E/ }9 Q; ^9 d* C! xВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?. \9 g( N6 \8 Z0 _, e* K

  R% W3 |" ]+ _
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 % P. P' k5 x6 |. @
AlexCoder опубликовал в 2024-10-16 18:313 ]) p( v8 m9 F, A4 R# M
День добрый!
) ]/ N! D" J* [, {$ fВ статье описано взаимодействие игрока с N ...

* M( V' d- T- z4 v4 E) \Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). + O  K; d( k2 D' }

; t& i' i, _- N7 w0 i- [  |Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 G6 {; K; L$ t  }
7 S7 v& K2 J5 y8 p; U1 }/ o! {% mШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 t8 u! J' H. D: K  ~

5 j3 o' i# U' ~6 y
  1. <font color="Green">// Пакет для состояний монстра</font>
    $ U$ f' [% `: X) j. ]8 Z7 o
  2. package org.l2jmobius.gameserver.model.actor.state;
    & E# |- [% k  V, @& ~0 c! r" B& w7 t
  3. <font color="Green">
    " ~3 _# ~# a  O+ n; D
  4. // Интерфейс, представляющий состояния монстра</font>, c3 ?- ~9 Q7 Z- n; Q2 l, H" d! q# N
  5. public interface MonsterState {
    4 I0 g+ m% J) {4 a
  6.     void handleState(Monster monster);
    1 ^6 T8 W, N/ k
  7. }
    ; h- T. N) g4 Z' r9 A7 F' _; t! `
Скопировать код

) K0 K* l- M2 |$ \9 kШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 R& h0 ^* H# @/ Q$ z
" C, @0 J$ r1 W1 pКласс для начального состояния монстра:
$ `" S9 m. P! S$ R- Q8 r
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ( [6 ~, G2 R9 X
  2. package org.l2jmobius.gameserver.model.actor.state;$ P* E1 }9 a0 U! X% C3 v$ q
  3. 3 K" W6 W2 j. D) W) K* a: z
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 j& V4 S* H, c1 a8 M5 n
  5. 8 Z( W' ~- U* O- c# X, z
  6. public class InitialState implements MonsterState {: s5 `# G5 F4 C& W
  7.     @Override
    0 {; F& P) J$ b/ y# S. I' I0 k
  8.     public void handleState(Monster monster) {) ?3 o1 j- i" }9 x! u, Q
  9.         // Начальная фаза боя  e' a% ?/ M* R. @' u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");2 I6 A. m2 {' w- n. v: r; r9 v
  11.     }
    . |. x- q" k& V. S! X5 L& V& _- Q
  12. }& i8 j. z7 k! k2 V
Скопировать код

' w( Y# q. X2 ?9 m  \) w+ ^1 k) t0 K7 R7 T, [- x4 o

+ C$ ~5 t5 \$ R  |( _. N2 O
! |3 c; E6 o5 K7 ~+ q9 N+ T# p0 _$ X  K% e

3 N7 {4 E! k1 @
! n# |8 R: O3 W4 V- T( q0 X
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & Y/ w5 q& ~+ @; i2 @

/ l% O6 X+ @6 n: ]0 G7 O0 Q% ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 A2 Z2 i. T9 L$ ~' O! y" _2 h+ s2 O4 g! _
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! o3 Q; K% _$ I# l2 U* o
# k" P4 Q) Y7 @" I
  1. // Пакет для состояний монстра
    6 r1 t& [  G  V9 \7 m
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 E1 Z7 u2 j. n5 W. x

  3. & w& C4 `' H. K
  4. // Интерфейс, представляющий состояния монстра4 ]- y$ v( Q0 E+ v
  5. public interface MonsterState {
    8 u& a3 _% F) `+ ~( F  r
  6.     void handleState(Monster monster);
    1 @- F+ A+ L; L, W
  7. }& G. h, x3 q" m' I4 [
Скопировать код

* [( @" V& B# S; ^! H: q; wШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. " P& F1 `* f2 u

3 I  z% F: T$ h1 d% s9 D8 ~! iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., n0 E, {$ ?- C" {! i, j% e
0 y3 B( W: R, y* {+ C# e" w! T- L% q
Класс для начального состояния монстра:! q9 R! f0 R) ^& x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) X7 [+ _' i/ @( {* y
  2. package org.l2jmobius.gameserver.model.actor.state;
    " n# I! R0 a! W' l
  3. : m8 ]* T! t: {0 J1 {8 ]0 a% \8 d
  4. import org.l2jmobius.gameserver.model.actor.Monster;# X% m) E5 I9 _, R
  5. 3 ]/ d5 I( K' v( u& [6 ]% U1 t
  6. public class InitialState implements MonsterState {
    # k  d# q, H  h- f
  7.     @Override
    5 t" U' O, y; p% O  ^. g# R+ b  J) M
  8.     public void handleState(Monster monster) {! \& ?, [: V" v+ r# g$ A0 [
  9.         // Начальная фаза боя) g6 u* h: r$ J9 e6 w6 W1 \2 d, c$ ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( A) E% R% a) g9 R1 H
  11.     }# c4 Z' X& V$ _+ u# y2 w
  12. }
    & ~/ W. ~. S+ T; K9 |5 Z! E* U
Скопировать код
Класс для агрессивного состояния монстра:  O- z/ f8 O" U8 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" N2 u7 a- b; w0 B0 Z. e! Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) a% S8 Z2 w+ L) z: r7 w
  3. 4 r& R$ O) w9 x# \
  4. import org.l2jmobius.gameserver.model.actor.Monster;, i1 }- j& t# j& v- [

  5. 3 U, B- U, o4 m& h: E4 _: ~* ?
  6. public class AggressiveState implements MonsterState {& y# x2 p8 {( a: C+ R
  7.     @Override
      |/ a8 |3 F" a* K2 U: ]
  8.     public void handleState(Monster monster) {
    , ?$ o. `8 T5 D! M3 m
  9.         // Агрессивная фаза боя
    9 s1 t/ ?/ |+ k* }4 E, y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    . x4 h0 y. i: m
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    , o( p3 U2 ]; G) G& }
  12.     }
    / P, r, {# ]% W9 J9 @5 B# w
  13. }
    2 Z' H( V# U+ n
Скопировать код
Класс для финального состояния монстра:" a9 B# H7 J/ J1 }) o% Z/ c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& o% \, b1 S" Y" o9 s$ [
  2. package org.l2jmobius.gameserver.model.actor.state;$ s+ l  f# }: {8 x# A8 s
  3. % @1 ~5 ?! I5 ?4 f9 n7 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) p! i) M) P5 ^: ^) K2 B
  5. 6 E+ Z; x* k5 M- {: D
  6. public class FinalState implements MonsterState {6 d1 ?! `: e2 M  F& J
  7.     @Override
    ( J& B8 g, k/ A0 R) x
  8.     public void handleState(Monster monster) {' P& _* Q7 g7 E/ P0 E- j/ P
  9.         // Финальная фаза боя7 V  @0 }9 a  S; l3 u! H
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 I8 w8 F4 p5 N- S( Z% P
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки- l" V- j. C( P# c) y/ v; `8 B
  12.     }
    $ m* L! v- X% V; P3 J/ W+ E
  13. }
    . h# \) h. z6 y4 {3 H
Скопировать код

& ^( i# S' V  e$ v' m* G% A8 O( k) ^Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) @! M# E1 y7 J. ]1 d4 c; L" Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 [, c0 O3 m- h$ i* _( G$ H' \0 q
  2. package org.l2jmobius.gameserver.model.actor;7 G# H: R. \2 P% t% E4 g
  3. % q- H5 I; |8 b
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
      k% v& `) P/ q3 g) E
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 q) z( u& p$ v

  6. " d" H: B9 h  m/ a. f
  7. public class Monster extends Creature {
    : B; U3 W! `- w8 ]4 Q
  8.     private String name;3 U. a1 E# u  m* r. Y. G
  9.     private double attackPower;2 o9 T* Y; l& z1 S
  10.     private MonsterState state; // Текущее состояние монстра6 G7 t0 F# C) m0 J. J. {

  11. 0 ^3 ?! E0 {# k" q! N* a7 z2 g. z
  12.     // Конструктор монстра
    # v6 L2 \5 v  L. k) j3 d, k
  13.     public Monster(String name, double attackPower) {* p$ z; D& G/ p
  14.         this.name = name;
    * b6 L8 a3 ~# D' U& H5 q- k" t
  15.         this.attackPower = attackPower;
    $ @# L7 ^' b% T2 @9 Y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ' m, Z$ v9 r- a, F
  17.     }- q; h# s4 p& b  [7 @1 s6 C( ]+ h" b  O
  18. . {* ~$ s/ r  @) g; O4 O+ U; E3 \
  19.     // Метод для смены состояния
    0 \2 n" I8 z) y" Z- O* l" C
  20.     public void setState(MonsterState newState) {
      S0 E, |" I4 ]( |. [# h" h" R2 ]* K
  21.         this.state = newState;! H" M5 `+ S2 J" {
  22.     }3 L3 R, Q: u2 s& U2 N1 {! x5 F, f, J
  23. 7 b, G6 g+ c& b  M; {! Y, e
  24.     // Выполнение действий на основе текущего состояния; V. ^9 V" ?5 V/ E. U, J
  25.     public void executeState() {
    8 M6 G( }4 k5 Y7 Y7 i* V1 y$ \
  26.         state.handleState(this);$ q( ~$ h+ Q( y; }& t) G0 l3 [
  27.     }
    ) ~) j: U6 l2 a7 V

  28.   }8 {1 ?3 A+ Z: M- T' j' ]
  29.     // Геттеры и сеттеры7 e& Q+ l7 C# E, X, \
  30.     public String getName() {
    % G# \8 F& m7 @: |5 ~
  31.         return name;% N9 U, j) N0 J2 K
  32.     }4 f! `# `6 @9 L/ l- h
  33. + p! o7 i$ M, Z$ ^; E9 M
  34.     public double getAttackPower() {
    2 j, d  J7 ^# G6 f' ^( Q1 s* b
  35.         return attackPower;
    ; M3 Q$ ]4 z: _
  36.     }
    6 _8 n8 h3 j6 T1 Z) a$ J

  37. & [# }/ u/ x# Z. }. S1 m; V4 C3 o
  38.     public void setAttackPower(double attackPower) {
    ; \4 X$ N( |* \$ |6 z
  39.         this.attackPower = attackPower;6 Y0 f+ {9 d6 e2 @
  40.     }7 D5 \1 f2 X' f& w
  41. }& P8 @/ H- H4 Q6 J0 w
Скопировать код

& J+ X9 |$ k. k8 hШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* L- l  j% s7 R# l
& A" n0 D$ g4 V4 F( @
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + i0 r; Q6 q1 M" t9 p0 b. ~$ G
  2. package org.l2jmobius.gameserver.model.battle;. V' ]6 p0 H% l3 {/ T

  3. & q8 x& U0 _+ g1 i1 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;. Y, p! p( c- O8 \
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: e. @* d3 g8 K" E8 Q1 H1 [
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    . a8 f" P  B- u) U# j3 B1 q, z

  7. 8 h" K  z0 p6 q
  8. public class BattleSimulation {  h& t9 k4 N- O5 T  C; }
  9.     public static void main(String[] args) {9 `  K1 b# k2 ?! N+ E$ |( E
  10.         // Создаем монстра с начальной атакой
    " R( U% G, v1 p8 q4 ^9 e" x6 B
  11.         Monster monster = new Monster("Дракон", 100);% p# @7 O# ~% P* X8 I$ A8 h" ?! @

  12. * d* Y" m7 L4 v7 ~( r6 w
  13.         // Начальная фаза, l: o6 y4 z4 s; Y, G' y* x' V
  14.         monster.executeState();
    2 M% e& ^' ^; T# @% T. E
  15. 1 H, d2 Q. n3 s' |; K# _
  16.         // Переход в агрессивную фазу9 ]7 P% @$ t, k( Z  h( f  {9 K# e
  17.         monster.setState(new AggressiveState());
    ! `& c5 a2 e- ^6 M2 O
  18.         monster.executeState();" ?1 L8 X$ H/ R0 M; p, Q9 x

  19. : q# i0 i5 V5 [$ l' E
  20.         // Финальная фаза6 m" V3 ~- J- C1 L- ^
  21.         monster.setState(new FinalState());
    8 {/ S. S- i, M+ ^0 q0 r
  22.         monster.executeState();4 H9 e8 Z: F& R  i0 o/ h
  23.     }
    & Z$ T8 j5 P6 D
  24. }
    7 y6 L) x! Y7 H6 C. [1 o2 d
Скопировать код

  J9 {* F* G8 n- r  s  u- XКомментарии по структуре пакетов и классов:) K  ]: x3 [* B% [+ y
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.. a7 f7 N0 o$ o( N/ E
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.+ H: t$ T$ q4 d. E0 Q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 `% V$ e9 n* V4 t1 D
. q1 d7 Y0 L9 _! m0 G
4 o+ O; `1 U. |
( ?+ V5 y) V1 T6 [7 s; h
0 Z* ^& h/ d5 ~
" U: u) ~, l# V: Y1 m1 }! r! h. f" a% H9 v+ d! g+ r
9 o6 \% {7 l, _' e! n+ L

# F, a( H; u& p
  O. x' ^, Y$ t  k8 U# {" H! A5 f; z0 G9 n7 [

; d: a! v+ |: W' L4 g7 |+ w' W. s/ O# {9 o( ~/ e
' t7 j/ P! r  S) N8 l
6 |3 i5 _" k+ p
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
$ b0 _3 N. n! b3 bДля управления сложными взаимодействиями, такими как  ...
' n1 C+ T  L/ t+ q  a7 G
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
2 X; w. F, ?: h9 t2 _5 UОтличный подход! Использование шаблона "Состояние" де ...

0 L3 E4 N; C' U/ QХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.0 ?$ u2 c6 q* r5 u2 y

7 z7 t6 B  t1 Z5 u2 P% {1 I- MШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.5 s0 N/ j9 O/ j2 w/ c# k
% k) i% u4 |( s
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 O% J( a5 z- }$ C- g
  2. package org.l2jmobius.gameserver.model.actor;
    ; B$ V; F4 u. M8 t" P" |6 z( d

  3. % R: e5 J3 Q! C, P5 q
  4. // Перечисление для типов атак( h; n4 W" g- ]) J
  5. public enum AttackType {
    # A# j; l  i( R' M4 Q* v
  6.     PHYSICAL, MAGICAL;
    2 k6 J1 g( k* V3 R' x
  7. }
    8 ^$ V/ {; i# G2 x  t; X. k
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
  @" d* Y0 b5 W  uОбновленный класс для агрессивного состояния монстра:
. }1 U7 T- U0 y+ d/ T$ }! `, D
4 B. E8 w4 j% e" B6 |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' \$ q! i% f( j5 N4 I6 ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! A3 \9 }8 H8 F0 I% z6 y

  3. / t0 b0 x4 `4 Z3 K/ N  _
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 t  t  j9 w! y
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    0 g6 v* k# g( n+ `1 v

  6. / W% T; V, O: {
  7. import java.util.Random;7 y$ e6 c1 y3 Z8 X4 x$ ?1 A1 a
  8. 2 {3 B2 ?" Q( K  S$ l  _
  9. public class AggressiveState implements MonsterState {( q2 q3 j6 ~7 p1 B
  10.     private Random random = new Random();; ]" T6 v* V0 b1 R

  11. 1 }; X$ w1 A5 u6 ?* B
  12.     @Override
      L& B/ E2 L7 K3 h1 `
  13.     public void handleState(Monster monster) {( b( K% K6 P" _# G2 W) ?
  14.         // Выбираем случайный тип атаки: физическая или магическая$ \, g( p0 {) j; f+ j
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;6 c" g# ~5 K$ X, W! l4 ]
  16. / ^( A8 ]( q( ?1 T' z% O5 D
  17.         // Логика для агрессивной фазы боя
    * B# Q' [4 ]! Y/ O9 u
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 5 ?; h3 ]5 K- w6 }: l" v
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    % I& ^. e' D: ~+ Y6 Y2 L
  20.         
    0 g6 H$ n& S1 b+ O; j: I
  21.         // Увеличиваем силу атаки в зависимости от типа атаки4 W$ S. f) ]+ `2 H
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;( Z& q" A" y% Z4 P4 o
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ( T* s0 c4 q9 R9 ?
  24.     }
    ( _  x5 E3 N0 q  B1 l1 l
  25. }- t  R# [- b# ]6 B4 Z) I
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
' C: |) }) f- B& I5 C  V; v- {7 u) l/ X
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * @) c+ q4 O& X8 u! }
  2. package org.l2jmobius.gameserver.model.actor;2 @' j3 v2 b* U, W0 O& M

  3. ' g' Z+ r/ z4 v# A
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & L( _# q' g1 K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;) f& H$ f$ Z; s6 G# c3 T

  6. 2 p, s+ }' ^9 ?6 w5 ~1 `0 d. y
  7. public class Monster extends Creature {
    ; m- ], d. X5 {3 J! ^6 ?0 Z3 b
  8.     private String name;  w+ f; v0 n) c! y: D% q
  9.     private double attackPower;, X1 [3 s' K1 v; S& E7 @
  10.     private MonsterState state; // Текущее состояние монстра: C- n+ a! `& l3 i6 z

  11. - g" ~  w& M* F
  12.     // Конструктор монстра1 J# }) R, [8 G* k/ Q
  13.     public Monster(String name, double attackPower) {0 c0 k4 M  a! u* v" o
  14.         this.name = name;
    5 l% a% P' u/ z. |8 M
  15.         this.attackPower = attackPower;8 ?, t" y% g: b  L( U) |& ~
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию+ C$ d7 K' k8 c3 w3 g
  17.     }  s3 r, ~* @0 }* e

  18. ; I- N0 j# M+ w: W! z& Y
  19.     // Метод для смены состояния$ I# ?- I: g; M: J0 z$ C$ {9 u
  20.     public void setState(MonsterState newState) {
    & e3 w& \7 Z+ H7 ^/ b
  21.         this.state = newState;
    # R. N" v4 H3 G, s9 _+ l
  22.     }2 j. Q. y( R1 x- {1 `: e& t
  23. 6 C& C* K0 R. V& Z0 ~
  24.     // Выполнение действий на основе текущего состояния
    ! s9 ~; v7 {; }3 e) W5 j- p8 h) V
  25.     public void executeState() {
    ( C$ Z, |1 |/ n  q
  26.         state.handleState(this);& p  B- Q6 U4 ?& R% u- \+ y
  27.     }3 S' L& I0 a; W4 ], d0 P

  28. & z3 s" ~8 B+ r0 f  d; C
  29.     // Геттеры и сеттеры8 ^9 h* Y- z1 k  k6 \
  30.     public String getName() {, n3 m; j  ?' e9 C. `; D) |
  31.         return name;
    6 b6 _' T  U, w# ~
  32.     }! r( N2 P$ ^( }  k; k: }# T/ N# H
  33. ' \; G" S, u$ |: ^
  34.     public double getAttackPower() {2 T$ d8 b  J. c8 }$ t
  35.         return attackPower;
    * C6 i3 K9 A. T
  36.     }5 H7 x+ @* _. R# p0 S) c7 {0 T. I6 C; p

  37. 0 R, N8 K7 i) `3 h! [4 t) ]
  38.     public void setAttackPower(double attackPower) {
    " g6 D: B+ K( C8 Y$ h
  39.         this.attackPower = attackPower;  J1 ]0 A* N5 ?3 G* Z2 K9 N8 F
  40.     }
    - X: E' r6 \! M) l+ ]% T
  41. }
    " U: `; U" g! q! O* @! G
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: D5 Q  l4 i) T& D' b" C2 U* P
0 _7 u7 ]' _9 L4 h
  1. // Пакет org.l2jmobius.gameserver.model.battle- w* j; p- V1 d8 _/ P
  2. package org.l2jmobius.gameserver.model.battle;! Q# V# k, f$ O4 A9 b% X
  3. " _5 X9 ~8 V* L9 Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;, Z7 i2 M* v2 a+ y/ h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 u/ D. k4 p- O# [

  6. 4 _  N2 c% b* X) H
  7. public class BattleSimulation {
    ! t4 G3 m- @! ~. @9 D/ C' N! o
  8.     public static void main(String[] args) {
    # E7 G: C' y( C& o
  9.         // Создаем монстра" F9 C) J) X# a! r/ g" L
  10.         Monster monster = new Monster("Дракон", 100);) |9 R$ n' A$ P: ?( \5 X

  11. * L% |4 [* i* V: O
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ) b4 T- A: I4 x0 ^3 j! m0 N1 m7 |
  13.         monster.setState(new AggressiveState());3 Y, [/ X; {2 G- O& @. y- \2 B
  14.         monster.executeState();
    5 z; Y! {( u% ?" R
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ O+ {; |& S4 ^
  16.     }2 x0 G- s$ n0 N% q
  17. }; X1 P! D/ I5 L& ?
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
. x5 h/ T" c, A" d  Y* RЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!  M4 o/ ?, z9 b+ D4 |

, O. B" A4 C' R/ o+ H, t3 E: G+ J+ N
# _, q& ]7 R6 E) F& |3 Y" R8 X" c$ J- x
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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