artace.ru - творческий сектор

Название: Шаг 3.3: Взаимодействие игровых объектов [Версия для печати]

Автор: Astraliya    Время: 2024-10-16 17:54
Название: Шаг 3.3: Взаимодействие игровых объектов
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!/ B, l- A- [5 R9 d, ?4 O
0 t4 V$ E1 P3 k  m0 W" v6 D3 l
0 t1 g5 W8 J  H. c; u; `
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 u2 U0 z% P. f$ z, @1 t8 a
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
& }1 f, w+ m' A, F6 T( o  MАстралия 🌟
8 e1 S* ~) o& T; O! ?: ?" y4 Z, Y) B4 o. t1 N, P4 J5 o* E

Автор: AlexCoder    Время: 2024-10-16 18:31
День добрый!; Y# W4 z- L& H  c* m$ d
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
+ t8 ^$ A) K1 t: D; }8 N: j" S4 j5 l

Автор: AlexCoder    Время: 2024-10-16 20:53
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
* o: {; }* G% O. p- h6 a+ G
AlexCoder опубликовал в 2024-10-16 18:31* e3 T' N* u, E* g
День добрый!
1 M) v9 O0 a% t5 Y! qВ статье описано взаимодействие игрока с N ...
8 G" d! O+ @/ v" L* z- z
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). , f+ n6 q5 u' F  J: s  g

) z& x8 d" H* h$ m& `7 `Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' H8 K8 ~1 T8 S, e2 F( o+ D5 g5 ]0 w1 N( z: g( L0 w
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  F) f# w0 s' e* G6 t, X

+ x+ e7 C7 ^) o3 Q  l
  1. <font color="Green">// Пакет для состояний монстра</font>
    / e& P0 ?5 _6 }; R. Z5 s$ {1 T
  2. package org.l2jmobius.gameserver.model.actor.state;
    & s8 n! A3 s9 {% m9 i$ I4 Y( J
  3. <font color="Green">% x/ K& ~) ]& I) s
  4. // Интерфейс, представляющий состояния монстра</font>
    + U& O  g) [6 _0 D5 H7 W
  5. public interface MonsterState {
    ( X/ f7 h7 M! u* h& B, A3 M$ L
  6.     void handleState(Monster monster);7 Z2 R+ l2 M  N& h
  7. }* n! f$ `, x) f/ D9 R
Скопировать код
' t  s+ C2 c9 {9 R0 J
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ g& {5 m( A4 Z% n0 C8 _9 r

, u9 a, b& O) S* R  o, }Класс для начального состояния монстра:: U+ G: B  V$ w# N; P
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>1 P: c( d7 Y  A) h) B- Z- a
  2. package org.l2jmobius.gameserver.model.actor.state;
    # B# N8 p$ @1 }6 c

  3. " d7 b- X2 U- Y( G1 m) E' V6 B( [
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      b3 B; Q6 a$ y9 V5 }

  5. . u" @, d7 o8 N2 S* m
  6. public class InitialState implements MonsterState {0 t5 H. v& O9 r& @# {
  7.     @Override; I& Z* ~& ~) ^2 }$ i5 o
  8.     public void handleState(Monster monster) {
    0 R! \3 o5 s9 N
  9.         // Начальная фаза боя
    # H! d" C# w7 x- K
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* G6 [2 l1 x( `1 U5 w6 {' |
  11.     }) j/ ~; y  w1 A, k* {$ k( ], r0 Q
  12. }" b8 W7 x( ~+ h* t* s* n
Скопировать код
: t$ M8 ?' U' `- @+ q5 i

: H# `' G5 L# N0 L
6 j4 G. ~" [9 }4 l  l. P. P: D9 I6 K. H# C' P5 r, R

! T( Z) s- ?1 a% n" b( @/ \. T  t9 q( i1 \, |1 q& ]

4 g1 o, h5 {% O1 L- x. c3 o
Автор: Astraliya    Время: 2024-10-16 21:04
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ w2 D* t  Y/ e  W' U* z9 H

! C/ [: T& Z9 O: p! tЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( k  y" ~; i1 r, f* }) e! h0 {

5 |/ Q* S  z3 jШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 N( T- W2 P: x8 m) G& H
9 N5 r" m) ^# n
  1. // Пакет для состояний монстра/ I+ M# @+ X: y# Z/ |
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 U/ U* D! k' H$ y/ S
  3. $ b1 i. b7 }5 q7 m0 H# j$ G
  4. // Интерфейс, представляющий состояния монстра
    * B- [. U1 ?, F- C0 e( Z- s
  5. public interface MonsterState {8 P' K% q3 |  Z" N& y
  6.     void handleState(Monster monster);! q: E/ w# X/ A  [5 }" e& F9 i
  7. }
    8 O9 k& Z/ V! E! {
Скопировать код

3 J8 q4 l: V9 V0 m2 ~4 c  UШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" r9 E- b4 i6 j- q5 A+ q# G% Z& F  `; i% j! |
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя." w( H) e0 }# @  b; _
0 D) m% w% h/ r& D1 {6 j
Класс для начального состояния монстра:
4 ^5 d) }3 _1 q7 A1 Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( v$ D' ~' U3 t) u
  2. package org.l2jmobius.gameserver.model.actor.state;) L8 n. {; R; F" r
  3. + P' Z! [' V- M: I3 d6 ^2 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 G/ U# D4 B0 r
  5. 3 J% C' b$ c; {: C
  6. public class InitialState implements MonsterState {) e* k% J6 Z% X) n3 M4 J3 g
  7.     @Override' n8 g1 k) R. a6 a2 X' E
  8.     public void handleState(Monster monster) {7 p3 v  h% q; v
  9.         // Начальная фаза боя
    & A) O" T# P# g% u. m" s
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # y* u& ?$ Y& Z& _: Z" d+ w1 j
  11.     }( Y6 h1 i* s( o
  12. }
    3 ]8 L1 ]! U  U. c6 s. s
Скопировать код
Класс для агрессивного состояния монстра:* K5 [/ y$ K4 ?0 v4 i4 \1 a/ R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( I$ u0 z* i8 U* y  u
  2. package org.l2jmobius.gameserver.model.actor.state;: n) A( v+ C: B, @

  3. + N: B) _  l" ?4 {5 k9 `. h% ^- p$ T/ c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # n, _, L( }' W' ^& B- H) {

  5. + ?. g- l" ]! q1 s8 D! i$ Z+ Z1 H
  6. public class AggressiveState implements MonsterState {" h$ |' R) B* f) a% Q
  7.     @Override5 _6 F7 R; [9 f' q) }& p
  8.     public void handleState(Monster monster) {- }( A- h/ \2 p5 s: u+ T
  9.         // Агрессивная фаза боя0 Q: D2 J% C; T; U  l1 S( r& ~
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");6 Q' A8 v- e' l, G  q) C# B
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки- C' @' e9 I) W1 F
  12.     }
    : W$ D! Q4 _5 Q* P: s; b1 O
  13. }
    ) V% v7 J9 Y9 I, A8 A4 P! a
Скопировать код
Класс для финального состояния монстра:9 [, K9 C) S1 ^  h, `( P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 j' f; r- }$ l' e7 Z9 b% k
  2. package org.l2jmobius.gameserver.model.actor.state;" K. S- O% ]5 t) Q

  3. 6 k, G& |7 j/ n! \7 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; z* w$ I4 f' X1 U$ ~1 Q
  5. ! t  v6 ^) n! W9 n0 ?
  6. public class FinalState implements MonsterState {
    . u- Z% l: U+ \% N5 U; K  ?7 q
  7.     @Override( X) |( w0 E" n6 s# Z8 H
  8.     public void handleState(Monster monster) {3 ~3 o2 i6 c  m4 q; |# u
  9.         // Финальная фаза боя# ?! E6 W# m! l& E1 K/ Y* U/ e
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    . D! w, D" u7 P! H/ {
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки4 S  `+ _/ G5 a+ o# \" o
  12.     }! q9 D$ j' W+ c/ O  ]. F* M
  13. }
    ; E0 L2 T8 M5 D; h
Скопировать код

3 E) `# v, }. t, zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 H4 u/ n; K. q- |9 {( v: a& [. ~0 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * h( Y* Y) `% k: j8 W
  2. package org.l2jmobius.gameserver.model.actor;' _, o* D# [1 ^9 j' a- J

  3. 2 E0 N# D. w: L+ k
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    * l% |$ m9 `1 n3 [; g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 A+ X1 m" N+ X; E; f. W% p
  6. , K7 f" G1 f% |7 `8 Z: s, n' n/ S
  7. public class Monster extends Creature {
    6 H  r3 M; N& S4 }, b
  8.     private String name;$ ~. T+ x+ [* d, H4 ]5 X
  9.     private double attackPower;# \1 o& Z+ ~& x! @' r8 g
  10.     private MonsterState state; // Текущее состояние монстра) f3 m* i3 s; m( f( J

  11. ) P+ m$ e7 h4 i% T- I2 [1 Z6 W
  12.     // Конструктор монстра2 x+ `! ^6 U# E/ t) I4 U
  13.     public Monster(String name, double attackPower) {4 y1 |3 ]# ]; f) G! V7 h3 U
  14.         this.name = name;
    ! x( N9 f8 D! t' h! P- h
  15.         this.attackPower = attackPower;
    0 E' t- W5 b6 j
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 P1 c8 y5 E3 i4 V$ n
  17.     }9 y. m& H( W! L2 V0 V( K

  18. ' i% C( N4 e. U3 S6 G1 r- u
  19.     // Метод для смены состояния
    / a* i4 S9 M% `/ }
  20.     public void setState(MonsterState newState) {
    . N# y/ r6 O. V6 j! d7 f% m
  21.         this.state = newState;0 i. U2 i1 `- V5 o: f: Y# |8 v
  22.     }
    9 k7 {# A2 {3 D: F

  23. , o$ Q$ s& [7 o9 }4 g9 M
  24.     // Выполнение действий на основе текущего состояния3 `4 F# H7 T  f' u* A
  25.     public void executeState() {% ^( p5 R1 k. A5 R0 {- `) d2 p5 ]& a0 b
  26.         state.handleState(this);( w- ]3 }: f8 B& R  k9 z
  27.     }
    8 t( a% J% b; m( x1 x# p2 w

  28. 5 B( [1 ]: a  o
  29.     // Геттеры и сеттеры
      K) u% |" r$ N  ^2 U+ Y
  30.     public String getName() {
    8 Q1 ?6 ?# A5 O
  31.         return name;/ G1 `$ f( h8 D* b3 F2 e
  32.     }
    / `. B; K7 t/ s& L3 j8 {

  33. ! t$ d$ A5 \  t( t0 B: S
  34.     public double getAttackPower() {2 u- }0 U0 z& V# F7 v( G
  35.         return attackPower;
    2 S! k& X1 U* |
  36.     }" x- Z  M8 a- Y) U5 p

  37. * p8 C% O% p) A: \# n% q3 t; Q% ]
  38.     public void setAttackPower(double attackPower) {
    6 q/ ?! o; H; p8 @4 Z
  39.         this.attackPower = attackPower;! Z' F# N( e4 N( |" E$ P9 x2 E9 l2 e, K
  40.     }
    " T8 E5 {/ o3 d9 O% ~& _
  41. }6 d; \" I) [4 c
Скопировать код
8 o1 g2 }' n; a+ ]! M3 {) M, J6 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& H4 _+ a" s" f. V
* s2 Z6 M; m( X( V) x4 d+ I
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ' V! r' K9 j! }1 [
  2. package org.l2jmobius.gameserver.model.battle;
    5 r8 I" Q9 o8 U1 J$ c* Q# @5 n

  3. 3 a* Q. K1 M( U
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 J* m( |3 e+ Q4 U8 y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ R' |7 X* B6 \. ?& G" _# J
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % o/ V4 L5 k( [7 s0 r, K5 y% g! e

  7. 1 d7 M8 S* }( z/ B
  8. public class BattleSimulation {) V) |) Y: B; o
  9.     public static void main(String[] args) {4 P) ?# a- t  ~; H% h- x3 P0 ?
  10.         // Создаем монстра с начальной атакой' j, J: d) f+ H6 X# w9 ^0 d
  11.         Monster monster = new Monster("Дракон", 100);0 D5 t; ^! C! e! ], W
  12. 0 U$ ~: J( z, F6 C8 }( T4 v
  13.         // Начальная фаза* I7 }& x9 E3 [- M0 q9 S& e6 {6 e
  14.         monster.executeState();
    # a" z; E0 ^7 o; x
  15. 9 z, Y; a1 f/ n6 r* [8 n& i
  16.         // Переход в агрессивную фазу+ Z4 Z$ G  i. B8 r# `; R
  17.         monster.setState(new AggressiveState());
    6 X2 }: r/ V0 f$ v4 b
  18.         monster.executeState();$ S9 Y7 I5 u! ~' f& l; ~! n' {

  19. " f: H( q) W9 M2 r1 C; g
  20.         // Финальная фаза& f7 R  J; g1 ?' T/ @0 s
  21.         monster.setState(new FinalState());
    ) {- D( ?) g# W6 e1 D8 x
  22.         monster.executeState();8 G0 g. R. R* J0 m% t; Y. |* B( B, L  U
  23.     }
    5 {6 V( D) W5 l, h* J
  24. }
    $ q% }, N2 x5 T; I  u
Скопировать код
. g" x" g9 p* E+ H
Комментарии по структуре пакетов и классов:9 F# ~8 @3 v; m9 |2 f/ D5 o
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ K$ D. Q7 v. \& W6 P9 z( Y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( a% L- Y# |. C& o9 q* K

0 i3 [0 w" X! ~' c% T! ]% B
" m/ q  h$ I5 C; }1 m! i* f
) ?" A/ J/ Y# N5 c; Y$ ~0 W, X6 L5 E/ ~9 m: U; w

$ z# I+ t; F% b/ D
( a3 u5 v: E" B# e6 a4 I. |$ m# K* p# e$ J9 [' o

7 b' x, f. r* L: r
! f# z: ~2 ?* O+ s$ D3 u1 A
  M$ B! X8 o; c8 e( V7 J: A& |$ E) }* S
& u/ Y4 t' {* _3 |0 M

# Y8 B* s% N: v) c( L0 _+ w8 P5 v
% u6 Y* E' }1 f
Автор: AlexCoder    Время: 2024-10-16 21:21
Astraliya опубликовал в 2024-10-16 21:041 f4 Z2 {7 z" y0 f* C
Для управления сложными взаимодействиями, такими как  ...
' `! ?6 O+ z9 P! x8 j  l
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
Автор: Astraliya    Время: 2024-10-16 21:33
AlexCoder опубликовал в 2024-10-16 21:21
- I) H  X" \" @5 wОтличный подход! Использование шаблона "Состояние" де ...

& p. c$ h, C6 gХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.4 D5 p4 [. J! I+ {3 |
: f; L5 N& c" g+ e! O0 |
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
0 o( z: U/ ]4 y' K5 N1 R8 l2 i" P
  1. // Пакет org.l2jmobius.gameserver.model.actor  S+ H0 f* [- z4 p
  2. package org.l2jmobius.gameserver.model.actor;3 U2 {& ~* R( i8 t/ d

  3. 1 m( F7 o6 r7 o9 O6 L3 P* _
  4. // Перечисление для типов атак
    : H1 O  @1 I, V2 l0 ~
  5. public enum AttackType {! @/ v2 A. q# B$ [& a
  6.     PHYSICAL, MAGICAL;: p4 m+ D  X* C1 f
  7. }
    # n0 L( K3 ~1 l
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
0 @% k( N9 `9 rОбновленный класс для агрессивного состояния монстра:
8 ^6 l" L1 X; ^6 \& j# m; v! Q) Y+ ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( w8 w/ D( t! N7 R  z# C
  2. package org.l2jmobius.gameserver.model.actor.state;5 V2 d( m  s) z3 V
  3. ( {% l0 b, p# x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / o# _8 W9 }" B& H4 |0 s" g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;9 s/ F/ Z. U$ H* R4 y

  6. , Y- J9 D7 e) F+ L+ @
  7. import java.util.Random;( ]* Q' D1 v5 N- `
  8. ) e9 L" J/ C" K% T6 g5 E
  9. public class AggressiveState implements MonsterState {; n. a* w& N. Z" y( S$ t" g) r3 G
  10.     private Random random = new Random();
    ' n' w: Q+ k0 V  w& }

  11. / b5 B5 S. h5 u  W! i
  12.     @Override
    9 w. F0 A! |) l
  13.     public void handleState(Monster monster) {
    8 Y- c2 V! G1 ^1 D5 v
  14.         // Выбираем случайный тип атаки: физическая или магическая9 t& y+ N% M8 \8 {5 |% g
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    / s8 C6 G8 `3 n0 M  N
  16. ' S; t9 g: v$ ~3 q+ L, F
  17.         // Логика для агрессивной фазы боя# f# I! |# b5 b- a
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " , L  U" g: e% t+ [% ?( ^
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");1 y$ x" B! h9 H
  20.         
    ) G/ g$ ^9 v5 q! G: w6 R: `9 w
  21.         // Увеличиваем силу атаки в зависимости от типа атаки" G* l3 n, _# J7 S1 v9 S
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    5 n! q- y8 w) X4 G1 M
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    " ?8 s# ]! X% A& d; v0 |! q7 ^
  24.     }( |/ s# c* G/ L. t7 x
  25. }
    ) t! z* G+ A. w
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
' C0 I0 Y: R# B* n) i; Y
* e' F3 K* W2 T' A" h) ?
  1. // Пакет org.l2jmobius.gameserver.model.actor2 ?0 q! L7 b  l' l6 r
  2. package org.l2jmobius.gameserver.model.actor;
    4 |# E. X# N2 e

  3. ( i3 ?  v- U9 z) j1 D! V' n# M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % _% q1 ~* n- F, `& w7 E( h
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;) i" n5 k0 Q4 }  a2 c

  6. ! w0 s6 h9 F/ j
  7. public class Monster extends Creature {& V; X) B9 i7 W0 P+ Z4 `  `! o! o8 D
  8.     private String name;
    ( F4 \/ E# j9 y4 A9 R* s% ~
  9.     private double attackPower;# R" z7 F- ?4 ?$ ~8 l& Q
  10.     private MonsterState state; // Текущее состояние монстра
    + G, o, b  m, B# w2 m% ?! j. @

  11. 2 C6 w7 }5 t) z! t
  12.     // Конструктор монстра  D% m. x. E& }5 K# `5 n
  13.     public Monster(String name, double attackPower) {# \, \5 I" N' Y9 K9 a6 A1 x3 p1 b
  14.         this.name = name;* z: h) h* J0 Z9 Z
  15.         this.attackPower = attackPower;
    5 a/ Y4 m8 z( O, c. {
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 o* z! M2 E% l
  17.     }
    * j% p3 W& @# k8 F2 O# ?  a5 R

  18. ; y: Q1 `0 W4 u8 O, y/ G# F; X
  19.     // Метод для смены состояния1 |  u" Y$ s" d- W8 B2 @
  20.     public void setState(MonsterState newState) {4 z4 e3 a+ ^" n, S& m
  21.         this.state = newState;
    + x: p% }8 ~+ L0 e5 o
  22.     }
    0 P: e/ p" l% M- h. J. Y6 H

  23. : K4 v0 `1 N: ^7 D  x3 ?
  24.     // Выполнение действий на основе текущего состояния8 u4 u4 h% n" f
  25.     public void executeState() {
    + X4 l, J6 `/ h9 m! ]
  26.         state.handleState(this);
    # ^; d$ c5 K% Z: C& E: F3 t% |
  27.     }
    0 p9 O1 g2 Z9 [& a8 x
  28. " M: d: E3 R9 |
  29.     // Геттеры и сеттеры+ f- ^# ]$ z4 N1 t0 w
  30.     public String getName() {+ x4 k; Z0 E* O$ l- f; Y# m7 ^
  31.         return name;: n, T4 u, O! K9 }5 I
  32.     }
    + T, n1 `' ?# w  V3 a, Q

  33. 3 j( m" T6 h% r( O8 Z$ J+ ?! d- a" v
  34.     public double getAttackPower() {; W7 _3 x6 g" V+ e
  35.         return attackPower;8 N% @" C* q6 @* N4 J
  36.     }
    ; q' ]( [$ C* s9 b( C7 ?$ n

  37. 0 }- c# v8 M  r  }+ k
  38.     public void setAttackPower(double attackPower) {+ A9 j+ A! P, }! S
  39.         this.attackPower = attackPower;! B* _, b& B- y; R
  40.     }
    1 a  C0 M1 h/ c, Z' T) ^& e" D1 k
  41. }
    8 b4 P& C8 N/ T3 g
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 O6 i/ y1 ]/ l+ |5 G# I- t
9 H) i( g4 ]- l
  1. // Пакет org.l2jmobius.gameserver.model.battle4 j# g; o: l' }1 R( U0 s; P
  2. package org.l2jmobius.gameserver.model.battle;
    7 u  w1 e6 x( h6 d  Z6 a
  3. ' ^* M1 ^3 m- r( g- P" W: g7 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;' O/ p' P1 B5 m% r# @
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ F5 X- o/ H' k

  6.   J0 j4 G" J, `. I( U. |! o
  7. public class BattleSimulation {- O& K$ D  Z' t: \' z) C3 }
  8.     public static void main(String[] args) {( J  O- Y4 y2 x  Y- |+ @8 W/ Q7 P$ O
  9.         // Создаем монстра
    ' `) n1 Z2 _" z( W! ]
  10.         Monster monster = new Monster("Дракон", 100);8 I1 \. S2 o9 p4 U$ i
  11. ' A# U$ i( }: W
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    7 H8 c. j* Q5 `& C
  13.         monster.setState(new AggressiveState());: x; o/ Y# r) u# M% ?2 Q0 F5 t
  14.         monster.executeState();! w) ]8 v8 w! U) E+ n
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак% ^8 O8 e. s" [
  16.     }
    9 z- m; j6 x: g2 q% |- w% y% }
  17. }7 ~" p- `. _  ^7 j2 F
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, k; ]; B3 n9 \( `) QЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
# C% L6 ?8 j" U: U
8 L' `# G- T5 h& o9 k0 W1 c; j) w$ Z& j1 N+ n0 _- f  ^

6 Y2 ~* n0 L9 x7 T) ^9 v




Добро пожаловать artace.ru - творческий сектор (https://artace.ru/) Powered by Discuz! X3.5