Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
! ], R1 U8 _; T* Y1 y( ]
9 G1 Q* X: E1 j* V
3 y! F% F9 \5 _
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.' k4 m' w7 G9 p: d2 Y! f/ F
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
. _/ i" o- X/ @8 a$ }3 ?7 RАстралия 🌟
, {' T+ U, n2 x( X) O0 {( m5 X( |% z  {0 K- X

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
' F9 j( n& V; {8 m: s& ]5 oВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?& o8 C! M% ~0 y3 G
( A; f- W; _; V9 _+ P/ x
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
; W, V2 i4 W4 R* m
AlexCoder опубликовал в 2024-10-16 18:31* i! c+ ~" l" v& \9 M! M0 t: z. O
День добрый!
  p, k7 l1 i) i" ?В статье описано взаимодействие игрока с N ...
/ Z' V0 Z; h4 ~, u! o1 v& |
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& S3 `2 M  o: Y/ G$ G$ g2 A+ C9 X* j3 k6 R3 f
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# Y4 U4 i1 |& W) e1 e% M

1 o5 h; x3 @, P3 n+ vШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- v% k6 e4 C7 I$ u: s( P( q5 n

* J7 C5 @, J/ Y- g! A% d* [
  1. <font color="Green">// Пакет для состояний монстра</font>/ y( X) |; L4 e5 ~0 Q# o% K
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 N& \! o6 g/ ?% }" I
  3. <font color="Green">- p- Q5 A  r) p; J/ R+ K, x
  4. // Интерфейс, представляющий состояния монстра</font>
    ; h3 z$ z+ H- G
  5. public interface MonsterState {
    + d! I# ^1 C* h5 Z$ N- g) U, A
  6.     void handleState(Monster monster);
    * v8 N/ b* W( I
  7. }
      X% _1 {) \+ s- c0 C& C$ }
Скопировать код

: H. e# }9 d, N8 |" p* z5 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 [2 s+ U7 Z7 Q- [* e  R4 L% |
Класс для начального состояния монстра:9 o5 Q8 \& ~0 a# v" {
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    % A' n; k+ s2 s3 \0 g$ Y
  2. package org.l2jmobius.gameserver.model.actor.state;: c; x: f  ~* A$ u9 T6 ^" s! x# a
  3. ( i0 `! f9 v8 H* K
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ }1 K8 x4 K" _& Q3 z
  5. 7 D: r/ F% ]- T. V) m; I7 I
  6. public class InitialState implements MonsterState {
    8 C- o9 b$ a4 d5 O
  7.     @Override
    & g! T; I* E3 C. r  c% K7 H
  8.     public void handleState(Monster monster) {
      I0 Q9 `& a7 f% p6 }
  9.         // Начальная фаза боя2 O) k  Z0 v$ a6 ]
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ; s% L5 ]' L7 ]! g8 m
  11.     }
    8 C9 }4 L3 h+ D. z2 {' w
  12. }
    ( K( r: e2 r! v" S4 K
Скопировать код
4 \0 `8 F  s/ C1 ?( n; X

9 k) B/ T, a4 T7 @( z$ L, o: Z- Z! s" Y, f' e& N
" @3 U- C) M# u( F

  M. n; {. Q+ P+ P! w# w4 Q& S
! Z, `  ~' K& [$ m& @: m- {5 C7 d9 }
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 r4 x& I  l( q$ Y( B' N4 @

: l7 {# A  l+ O0 C  h# ZЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. i* X, J" e2 \0 P8 b1 E* j7 B6 v+ l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! q; n* j9 @0 i4 H! E' `, @

& T  Z" c  Y3 |" y3 Q" x* s
  1. // Пакет для состояний монстра
    % d) W* T0 ]: [3 h
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 P" U$ _$ M, h/ S9 \( Y
  3. ; O) {2 s, n8 f; t* N" r! b/ x, ~
  4. // Интерфейс, представляющий состояния монстра0 _6 E" L- g- j1 ?, T
  5. public interface MonsterState {$ j8 g" `& w9 U+ A
  6.     void handleState(Monster monster);! p. z& p* B) N4 w5 g; }: q
  7. }  r5 R. ^3 ^. t& Q
Скопировать код
$ _$ R( X4 x+ A4 R
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 I8 ]# \. j4 c0 \9 w' I

4 @! H4 Z4 K1 {+ @Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.$ T5 t5 s& W8 J0 V0 Q' V2 |
# V( J5 [( u8 b: i) Q( U9 r
Класс для начального состояния монстра:
6 i( x9 B! N. E* y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& r$ i) ~0 f7 j, V" F) T9 ~3 k
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! `) X7 l2 D" K: V: Z3 Z( S, v1 T" i
  3. ; X) a% K8 }2 g" x! W
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 C$ y- r* {% |' ~: ~5 `1 R* f

  5. ; z+ N- b1 L; d
  6. public class InitialState implements MonsterState {( b$ P( m, q% u8 B6 J. B( y: V4 y
  7.     @Override
    - z# L! A! u; V8 T" ~
  8.     public void handleState(Monster monster) {
    / h; e) z' {: i$ [! ~/ L: e/ r
  9.         // Начальная фаза боя; v% t* M# s- `: R2 m3 |/ L. ?3 b
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");4 c3 V3 L# F* r4 T: Z5 p6 E
  11.     }8 [1 }0 z# P1 h' |
  12. }
    # t. X$ A% q3 K6 Q
Скопировать код
Класс для агрессивного состояния монстра:7 @4 m4 V( F4 t* @& D% Z# O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 N! ]5 u- B! w" x) c/ a- V$ \0 }
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 G( Z  T& ]; H3 f" G( Y7 ~

  3. # N& J: I9 w( `
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      D+ }3 y& p( ]% x' ]: E9 d0 a

  5. . {! K# t4 _3 h$ ?+ `
  6. public class AggressiveState implements MonsterState {8 B2 G" B& \# _4 S) Z3 v, f2 T
  7.     @Override7 Y/ ?$ v, }* q3 O6 [! {% x
  8.     public void handleState(Monster monster) {
    - Q9 [9 H0 M) K# s# y% [
  9.         // Агрессивная фаза боя
    ( j( c  H+ A4 C/ i2 J9 `. u
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , k9 C/ x+ B' M# r' H
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; ^5 `! Y- j' Y# R" }
  12.     }3 V; R/ W! O+ e$ H
  13. }5 H# x- f6 p' z( H5 O- Z
Скопировать код
Класс для финального состояния монстра:( W* w( H( u5 F9 @: ~& J9 [! n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 G% M" i5 q% m% J+ _9 l
  2. package org.l2jmobius.gameserver.model.actor.state;, H. y$ t& p7 J- a

  3. 9 ~7 n' Q; m" S: J9 M# F2 j* z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 h+ D- o& K& D1 u+ o
  5. ( {% ?" R. S& \7 ~( L
  6. public class FinalState implements MonsterState {
    # B7 K! q  l( F2 U6 u
  7.     @Override2 Y0 j6 L6 R- W) q% B
  8.     public void handleState(Monster monster) {4 P' J1 o9 c2 o/ O6 B0 m
  9.         // Финальная фаза боя
    , P# y4 B( r9 |$ p9 T/ ?4 g! f
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    6 }$ I* Y' V' Z+ H' E
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* a+ r! V5 T1 Y, L2 i
  12.     }
    3 ]9 C9 b, N' V4 P' F
  13. }
    * |, J; ?5 l# f( t; a8 }" e
Скопировать код
3 c+ H9 w0 t" U# t; ]
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
" K+ O0 M$ e" v% m% g3 r. m( T* Q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ h* o! K! w) H( r; W8 Q
  2. package org.l2jmobius.gameserver.model.actor;2 p1 T2 z: C% Q, S$ R& b4 M' G

  3. / B& \7 o0 s* o; j- |3 `( }- o, T
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 I) G% h  W. y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 H, V/ }, m5 q0 A5 Q3 G7 k
  6. * `( M$ f5 D+ a$ v1 N' V
  7. public class Monster extends Creature {' f/ l$ u% U5 P5 U7 M% r8 U9 @! s) \
  8.     private String name;
    + C- u, H9 n- H  l8 ?
  9.     private double attackPower;8 M% e2 A8 \  {% m& a+ Z
  10.     private MonsterState state; // Текущее состояние монстра
    / h; h- h- _$ |1 g4 m/ @

  11. % z0 K1 `: S& W
  12.     // Конструктор монстра8 s& s8 {) }( c8 f, s
  13.     public Monster(String name, double attackPower) {
    7 V# o4 ]3 a+ w" V4 j' h8 O( ^
  14.         this.name = name;9 G/ S( P3 L3 d$ g3 U6 Y$ b6 `* {
  15.         this.attackPower = attackPower;
      }% Z  s! \8 X; b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    & w, S# |9 A9 [
  17.     }& m/ L! G0 X+ v; Y8 X
  18. + ]' w/ Q" u) U& R' n( B
  19.     // Метод для смены состояния
    6 L4 Y; O% ~/ N5 l1 z, j
  20.     public void setState(MonsterState newState) {
    + d' e6 |) X3 ~+ K# {: z1 u$ ~
  21.         this.state = newState;7 b" i- d( e( |; i1 i
  22.     }
    # U( }5 k  @) Z7 S& `

  23. 4 G. }, E  _1 k) _$ n3 E
  24.     // Выполнение действий на основе текущего состояния1 J2 r& A3 o$ D. Q4 _
  25.     public void executeState() {
    & @+ a$ M6 l+ R- h
  26.         state.handleState(this);
    0 f0 p0 W! Z+ L1 @' K  S/ K8 t
  27.     }+ r* I- ~. V9 a: j; r5 c$ ^

  28. + H2 y1 _& t; t1 i! u6 @3 i7 K
  29.     // Геттеры и сеттеры: ^5 A6 p# V$ K" d9 x; `
  30.     public String getName() {# J* x) X8 |! X7 L- Y, J5 h
  31.         return name;
    % f* ^% x3 P/ n7 l' @! U
  32.     }9 u% i  f8 E7 }

  33. ) c% L1 n8 a% ^3 j; p2 j1 x% s
  34.     public double getAttackPower() {2 W7 V9 P0 N0 O' l( x
  35.         return attackPower;# C4 E; I% D; {/ g" V- @" `( O
  36.     }* l$ c/ g8 z1 i4 U
  37. ! z+ C/ r7 Z4 o8 G6 G# D4 q: t
  38.     public void setAttackPower(double attackPower) {$ C- u0 \) n; k" ^+ I' F
  39.         this.attackPower = attackPower;
    1 j  z2 A1 g+ G
  40.     }
    2 k/ _+ y+ w& V
  41. }
    0 x, z: l$ S( w  Z
Скопировать код
. u+ @# ~' E4 t2 q5 e6 J
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! V3 z3 b; J2 D) J# a$ c

* b% k+ w$ ?* R, M( D, e
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : i) l7 ?/ y; p0 ^, O; u- B' v
  2. package org.l2jmobius.gameserver.model.battle;
    9 d, j: I& i; v( W) z" O

  3.   E: p( x4 ^' R% V$ d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , P+ N' Z8 x1 ~2 a5 b4 w
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ( _( L1 K" o) V) K  H
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ; @2 |$ o6 v! Y& I6 d0 t2 ^
  7. 4 {5 b: y! r4 b6 n/ u. N, M
  8. public class BattleSimulation {
    0 ?/ V/ X7 j+ n) M+ U. k
  9.     public static void main(String[] args) {
    + h4 `- ]2 ~& J) ^% L* ?2 H$ z& B8 X
  10.         // Создаем монстра с начальной атакой4 A9 ]3 G' \0 i
  11.         Monster monster = new Monster("Дракон", 100);4 g# f4 J1 |2 l! V3 Z
  12. 2 I. k/ Z4 u9 b" q
  13.         // Начальная фаза, C1 }0 z/ c9 U  A1 o2 ~' f
  14.         monster.executeState();
    + J9 ?, K0 z5 Z% T- m1 X4 L2 s
  15. ! c3 }8 \% K" K! D6 [; Z: i! t. Z
  16.         // Переход в агрессивную фазу
    " O& i; s9 _( ?0 R9 H! Q7 e2 h
  17.         monster.setState(new AggressiveState());6 c$ s" |, M& {0 V2 P
  18.         monster.executeState();
    $ E1 s& p% {3 c' }. q4 u
  19. ! c% f3 V5 c# \  ~  T, j
  20.         // Финальная фаза
    ( h6 ?; `! i& E
  21.         monster.setState(new FinalState());
    % x: T9 e- m! g# g2 T9 c
  22.         monster.executeState();
    / c* S9 d3 M, L  N7 y4 O2 e6 g9 N
  23.     }& A: @- A7 p" h" s1 h7 k1 V
  24. }
    0 ]! v& `6 S4 g. b$ l  m+ O
Скопировать код

; J' o9 p  f7 }" A0 `6 \, oКомментарии по структуре пакетов и классов:2 t+ @. q9 R  R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    " [: z3 B5 q6 a* C6 B3 n+ ~3 G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.7 J* F' e, G- z: f$ q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. ~! ^$ N  w! R
! g9 y3 {3 ^! ]4 Y
8 H& D& O, \, V6 _
$ y9 Z+ m6 R$ \3 ^% r" K& {
# y$ g. L6 C5 s! Z5 Y
$ G; T  ^7 O) C1 r3 ^& p5 a6 S
/ j1 d3 i  }: ]6 J
9 e6 \1 N7 q/ y! P* \
4 Y7 H1 k9 V9 S- D+ \( I1 n$ c3 I2 j  v( p* E4 ?' F# ^
. X* d; H/ ^* k
$ r$ E, C0 s% j, o! v
9 J; F, O! L4 o; R

5 z4 M: [# s5 a, g' H" Y3 }
- |2 W) @! r  o& w" A- V
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
! I2 L( s. q. e/ p; ]: O9 B3 iДля управления сложными взаимодействиями, такими как  ...
5 p, c3 o/ j% W+ d6 k
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
, z4 L2 O; Z$ \3 n/ l% r% ~Отличный подход! Использование шаблона "Состояние" де ...
+ ?) ~- ~: |6 j' v- I! U
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии." M6 O+ k8 D5 h& e1 _* {
9 ?1 }; c, |  `( J" g7 ~0 }; v
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
9 n8 i% [; i  v- `1 d/ L
" }+ E7 o$ U, i
  1. // Пакет org.l2jmobius.gameserver.model.actor+ w  H& r: `& C( f' G& o
  2. package org.l2jmobius.gameserver.model.actor;
    ( G8 E5 R9 ^0 m5 u$ L
  3. : B( R/ e8 k# ~# f1 Q
  4. // Перечисление для типов атак
    7 b; v. W# E! Z0 @" c
  5. public enum AttackType {/ R/ F1 x" e' Q
  6.     PHYSICAL, MAGICAL;: Y. Q0 S5 y/ L8 I3 I
  7. }" V% G. D$ N3 Q: f8 U8 H* o  P" h
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.. A( W* }- g, J) @( \+ \
Обновленный класс для агрессивного состояния монстра:
1 A/ U. ]) V4 ^) J
$ O  c$ U% `; r; R& z% i$ r( `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' N/ F: q' @8 P" ]8 G6 h. B
  2. package org.l2jmobius.gameserver.model.actor.state;
    * I. @& T. G% e" L7 f9 e- c5 s

  3. ) N( [& |; d% j4 g7 A/ @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 V( p0 ]# c( {# F. ^
  5. import org.l2jmobius.gameserver.model.actor.AttackType;; Y& l/ f9 ^- D7 F: Y4 z6 E# [
  6. ( s: ~. V! W5 S& ]% h
  7. import java.util.Random;
    3 C/ r+ k9 V1 P" B9 j
  8. " p; Y# p: o: S4 g9 V. u; \$ c
  9. public class AggressiveState implements MonsterState {1 q! z" H2 z# [$ E* l' f6 d
  10.     private Random random = new Random();$ L2 c3 n+ G  s/ u
  11. $ [2 d* e: B# A, `5 D8 c$ m+ \6 h) X3 J
  12.     @Override- b" L; U# {7 z8 J& x- X. n
  13.     public void handleState(Monster monster) {
    # d( V! X5 w# ~& V0 `  s" f
  14.         // Выбираем случайный тип атаки: физическая или магическая8 }0 Q2 g2 C% m1 j0 M4 X* G, t
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;4 E: }- h- b- R8 C: U/ Z$ p# \

  16. 5 Z9 B2 f& f. {+ E
  17.         // Логика для агрессивной фазы боя
    $ }4 S# Y1 R, N( O1 }! c2 o
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ' E) ^7 X1 h0 A, y: E
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");8 Y1 ]) Z) h6 l" M. }1 V( @
  20.         
    $ ~: n8 U2 n" Y/ y/ j! ?7 E$ _" n) r6 o
  21.         // Увеличиваем силу атаки в зависимости от типа атаки; _0 P* b# C: B0 ]- s. J
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* I- h5 j! I- V* |6 x; v7 I
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    . k# N$ P' o6 _4 O  B5 |: ~3 a
  24.     }- E0 h( K$ \6 ?  a7 u" j& S
  25. }% u. @- B3 u' I
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
1 a% q# K- M5 V) c+ ?, G2 `) n& F3 E
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / D0 ^/ w1 F$ G% c8 i
  2. package org.l2jmobius.gameserver.model.actor;; S4 l1 c$ S' t$ e) m2 _
  3. - Z/ S+ p& |0 s
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;; G, m( H* p& w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    3 X; U; D- a+ u

  6. $ j3 v2 _& L: m% K1 e+ C3 J
  7. public class Monster extends Creature {' d% y; N8 N: U1 j0 ~/ q
  8.     private String name;
    6 Z) d( h# O+ D- e. K' S- X' `
  9.     private double attackPower;: T5 p8 R: x8 W3 j& C' N4 |
  10.     private MonsterState state; // Текущее состояние монстра
    # }& m! e& f  N) ~+ z0 E; Q/ ]

  11. & @; \/ ]2 z6 H! s5 `$ V  V
  12.     // Конструктор монстра( ?3 s8 w8 _2 U2 N. D/ c
  13.     public Monster(String name, double attackPower) {" D7 g4 t2 c7 f
  14.         this.name = name;
    * ^# R, i. H& A6 H
  15.         this.attackPower = attackPower;
    7 R* ?; s7 R+ p3 l0 N
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию* Z/ T. a5 _8 I4 K; f2 g. P1 N
  17.     }
    9 j1 k# K- W2 s" K

  18. : |. I4 \4 t  q& R( g. I
  19.     // Метод для смены состояния
    9 |, T1 w8 |: q7 j; p
  20.     public void setState(MonsterState newState) {4 F; `6 e- b9 n# }" c1 o
  21.         this.state = newState;! [; A9 S0 B1 ]1 \9 p0 \, j
  22.     }
    6 ^: I3 |3 n* t9 P

  23. : w' e( ~. N5 Z" \
  24.     // Выполнение действий на основе текущего состояния9 a$ S' p# C$ a4 T
  25.     public void executeState() {9 d# k% i8 j9 s
  26.         state.handleState(this);
    , X4 ^6 z- q& ]
  27.     }6 i- S/ X6 w# k& L! B, R4 [. u- P
  28. ( M' o& j  V+ C' V3 I) g3 l4 c
  29.     // Геттеры и сеттеры7 Y$ E; \" L& ^. }
  30.     public String getName() {
    0 Q5 m6 D" F: r4 Q) h5 m# F
  31.         return name;$ {, R5 H  X* B) q  C5 i. i4 R4 s
  32.     }
    % o  L3 l$ ?. F" [: P( w
  33. ' q8 \2 V0 H/ f
  34.     public double getAttackPower() {/ T& g( c% _0 a  D2 N0 ^3 X
  35.         return attackPower;& ~7 i% S+ U- Z% o
  36.     }
    + w8 V2 z, j; H8 }; c" M, ^
  37. 5 V3 |, {' Q3 n. S; D
  38.     public void setAttackPower(double attackPower) {
    / c* Y% R# i% \1 @& n: |, Q
  39.         this.attackPower = attackPower;' P. K- X+ Q/ ]. j1 A) @% Q
  40.     }
    9 C& \( `9 k2 S# s* n  I
  41. }" D) E- E6 V+ V/ K3 {
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе." I' o9 ^  ^( B7 d+ q" U6 s

1 t- _5 ]  }# E. F4 E, z% b2 q
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) e: Y9 {9 V. U5 k% i1 ~' z& m
  2. package org.l2jmobius.gameserver.model.battle;. r, l: w; Q$ h8 k3 |2 c

  3. , x7 O1 s7 r- D' N
  4. import org.l2jmobius.gameserver.model.actor.Monster;# A: ]' x$ g$ j  d. J: q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    - b: [, w1 w# t

  6. 5 ]' o, j; a( U4 F" I, i
  7. public class BattleSimulation {
    8 |. Z4 Y8 Y1 U) k
  8.     public static void main(String[] args) {
    2 K# L% }4 T2 b5 Q0 Z5 N
  9.         // Создаем монстра' m8 B7 C  [8 X6 y* [7 \
  10.         Monster monster = new Monster("Дракон", 100);' n* L. m$ e# I! G) j3 _- F
  11. 8 T, V1 k, j. F1 X0 t$ _9 Y; j
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    5 R4 }0 g% u- h4 ^4 a  w/ M& F, g
  13.         monster.setState(new AggressiveState());$ v: ]+ J" ~3 r- n# O
  14.         monster.executeState();
    2 b& U$ _3 P5 E
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак" Q9 {% f- @/ i/ d0 e
  16.     }/ z: `% }- h$ D1 J/ ~# `
  17. }6 w% ^- V. s0 k/ w
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
& E5 T- N6 i" f( R6 j3 AЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!+ s1 ^+ d+ z2 i$ _
1 G- |+ z* `6 x2 B) X# X
9 ^  g1 R" F! B& ?+ }: x- P' B+ i
) M& c( S+ P3 ]  I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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