Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 N! S/ Z/ W5 K$ B
: l3 v- Q$ X6 I) y+ E' {
2 m- ^( a  ^# p5 |& p
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
- F* Z! K& l; l& Z; C$ ^% v7 D/ YЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!2 q$ F( c+ u. B# {
Астралия ?3 @0 v$ P* n$ p& t

( Q) A: B  I3 K( B3 K' ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!) x% H) }  P; a, Q5 z7 x6 K
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ p* c* W( T9 l7 E
# J* _$ n2 r# j; ^; q
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 + ^; c# i  ]: y. Y4 W. E5 ~- M8 S, q7 L
AlexCoder опубликовал в 2024-10-16 18:315 S1 q9 [  l6 g1 m( J+ {
День добрый!
+ |# [0 F( c' D5 Q! AВ статье описано взаимодействие игрока с N ...

7 j+ [$ V- Q) i) t5 s6 \Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 O6 L. ?* A3 e9 d6 `$ R
3 l! x, a" J/ F$ ~' x9 EЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. ~* |7 F1 P9 {. A7 N' ]5 a0 v
  v7 o2 W0 Q4 m
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
+ o0 U7 U  {5 X
% A9 {$ j, I2 d( b/ `
  1. <font color="Green">// Пакет для состояний монстра</font>  V1 Q- U) D& u: Q
  2. package org.l2jmobius.gameserver.model.actor.state;1 a: q0 {- Z9 \) t7 c& f* [
  3. <font color="Green">
    0 k; \, y1 s8 @
  4. // Интерфейс, представляющий состояния монстра</font>1 l( Q2 q0 Y% v) j/ ~
  5. public interface MonsterState {
    6 S( z1 R1 R- h8 ?" z) V
  6.     void handleState(Monster monster);& h1 p8 X* p7 y( r
  7. }' e9 W! ^) K9 }4 V4 ?
Скопировать код

& @( r0 c/ C* m) x* S" w' K* oШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% R5 k/ {- C  r# r% Q5 {
" y. [! s0 ^% _3 V, iКласс для начального состояния монстра:
. o8 T* ^% t6 p$ h9 K
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ! V6 @8 S. I$ w5 n0 P
  2. package org.l2jmobius.gameserver.model.actor.state;$ {: L, {# K6 M' {- [4 M6 ]* |3 z

  3. 1 x% o) }7 H0 V! {$ m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; B& _, U# O( b+ {  O8 T7 \1 V, P7 R; @

  5. & z* m. B) }7 k7 y0 a
  6. public class InitialState implements MonsterState {
    / @! e% G0 Y( _% j9 q9 K3 Z
  7.     @Override9 f4 w# g) d% c& U
  8.     public void handleState(Monster monster) {
    ; U* q; Y; }" S6 R8 y
  9.         // Начальная фаза боя; o* p5 t/ m: F3 M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");% X$ @7 d& ]& v. K& f6 f8 j. p
  11.     }$ e4 \& U# G0 s/ t1 J' J/ F) I1 u7 V; v
  12. }7 N2 }4 Z, D% r! v5 d, Z! R. |
Скопировать код

' o0 L" U1 u) r8 q! M( \) Z$ O( E, \* R5 C2 L4 m+ ~
5 g# g( G; l: M/ V% G3 _( p* b' H

( J( r( y) ^7 g* y% s
  O$ A& c# x9 |" E" u
% T3 r0 x5 O8 i$ o: h6 S4 e
: H9 q+ A; [9 T; x" k! F( z/ Q& t
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * l6 B+ p; {2 |, F6 R

2 l% [& h/ i% b/ _Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
, b. k9 u9 M% {; Z" v+ v. d" m, S' A  `$ X+ N5 M+ g
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 U( I; ?) i/ X2 Y5 Q# v
4 U, u9 W9 \0 U
  1. // Пакет для состояний монстра; j4 T) c$ `0 A8 T1 O; H- \8 |
  2. package org.l2jmobius.gameserver.model.actor.state;
    / n. {- m. D3 F$ \
  3. " m: H' g9 f  @/ L
  4. // Интерфейс, представляющий состояния монстра
    3 C% G8 f3 f$ l! z4 x3 ~
  5. public interface MonsterState {
    2 H4 G9 G" I2 R. `. i% [& n7 `8 @4 G
  6.     void handleState(Monster monster);( P3 C- }4 Y- o2 n
  7. }* _: A) q# R1 l0 n$ m
Скопировать код
* F- u8 ?% V5 L% {9 K  o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
) x( y# d; S) g" P% k
" g: y' v0 W6 w1 ]Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% @. |$ C! w) V
" |( m- N8 a. @% B' o7 WКласс для начального состояния монстра:' s7 e& Q' G- @; R: r& j: K7 G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 j6 D8 T! u% w3 D) S9 n/ X4 @
  2. package org.l2jmobius.gameserver.model.actor.state;2 W) H( R' O! F7 |7 d7 m

  3. 4 Z4 t2 C5 h5 Q! p9 y6 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 f) M$ \. K8 V' \

  5. " K: r  y' j% ^# e& w- B! b3 T
  6. public class InitialState implements MonsterState {, i0 j8 |6 V- }0 J/ G/ k  T- ~
  7.     @Override
    " |) \) O3 S4 F
  8.     public void handleState(Monster monster) {  x' c' J& O" X7 q$ i  y
  9.         // Начальная фаза боя- T- a7 F" m; ]' _4 X( R$ c
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 [* m0 V6 X( b0 N% D
  11.     }
    ' ~3 Z2 {% k9 `4 S4 T
  12. }
    $ q! D3 O' G9 y, [
Скопировать код
Класс для агрессивного состояния монстра:
! D) |- u* N4 h, s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) o* y. b7 k2 w2 g, S6 v5 ]' _
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 T# Z7 Q3 F; f+ _# X0 {' {% b
  3. $ C7 _7 ]: W9 B) q. G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 F4 ]0 k- v) \/ Z
  5. % w, \: @  ]' J% q0 ]
  6. public class AggressiveState implements MonsterState {
    ) s  _$ d! l4 q& M/ {
  7.     @Override% z; l2 H0 D% `+ B  Q  N7 L
  8.     public void handleState(Monster monster) {
    % T& O; Z$ Q2 v# X- q. W. C
  9.         // Агрессивная фаза боя
    6 y/ }; K4 q6 ~% r
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ! a" u: U6 V/ e* {% B( y! L3 }
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ) k/ o4 J* V" D* |, v% v- }
  12.     }
    ; o- _( l( j7 a
  13. }
    & I1 n  M1 E0 j$ [+ E' k' k
Скопировать код
Класс для финального состояния монстра:
3 p. U' S/ ~  m: N4 h( }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state4 K. q, T1 Y! }7 {- h, u3 L
  2. package org.l2jmobius.gameserver.model.actor.state;/ W- o. V+ j) w7 I$ b, M1 I

  3. / z" p" s8 |9 U3 L1 s, o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 Z, I9 E2 x' r3 g8 e. o

  5. 9 h) U) l4 X+ y! Z( c
  6. public class FinalState implements MonsterState {# ]  o: N7 t3 {3 x
  7.     @Override- p0 q+ a4 u1 H9 v8 n3 K' S
  8.     public void handleState(Monster monster) {
    3 A9 p* d: P8 ]* _! I& p9 k
  9.         // Финальная фаза боя. R) L' B# X3 b4 ~& U: q; L
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    " c# ~5 t2 X1 \$ t2 ~+ m
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    4 f( |0 A( |+ L1 C3 H7 {1 S
  12.     }; D' ~/ }% `! h; o6 S
  13. }4 [$ ]. d6 _2 T# |2 F7 ~. _
Скопировать код

# c! ^, V- p: s! zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
8 c, }# F) c  d) y; u/ t
  1. // Пакет org.l2jmobius.gameserver.model.actor" u8 a* ?( b  b- M+ ?9 e8 }( z
  2. package org.l2jmobius.gameserver.model.actor;
    4 y- y4 t$ d/ h7 Z* |  U- w  P
  3. : q3 w3 D* v/ h4 T$ r$ W# ~. t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    + Q6 }$ q3 v% b4 [
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, l2 _1 z: m& F, x9 Y4 R6 k

  6. 5 a! z6 c6 e* ^
  7. public class Monster extends Creature {
    9 g. R/ @) ~. Q" x( G6 S
  8.     private String name;4 @( ?1 y- W' v8 [% f7 D6 y* b
  9.     private double attackPower;
    ! z) Y* U+ m; L8 N
  10.     private MonsterState state; // Текущее состояние монстра
    - E4 y/ J4 i' b2 s9 a
  11. 4 Q( _3 Q5 z6 X9 \2 L
  12.     // Конструктор монстра
    ; I; x* L, S3 W' _1 y+ K
  13.     public Monster(String name, double attackPower) {8 l( K% S+ s+ M, M2 Y4 T/ ~% d
  14.         this.name = name;
    ; B2 `) q( Q) K# v: g) r/ y
  15.         this.attackPower = attackPower;1 D" a4 ]$ Y$ H  |+ z4 G& p
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 M8 J; U8 L9 _$ R7 x% e( O
  17.     }8 C0 K: t2 T+ N" L+ M
  18. & ]" W- F0 c3 B2 B# @) U
  19.     // Метод для смены состояния
    , Q, D$ t, r- x$ O+ n! N
  20.     public void setState(MonsterState newState) {
    8 g- M* q. o* W! |( n. m# L
  21.         this.state = newState;/ ?/ i* d5 |& \3 `3 M
  22.     }
    ) W7 M, {* ]% t0 m

  23. + ]& Q# T; C9 B1 w  \+ f: O
  24.     // Выполнение действий на основе текущего состояния1 B: o4 C' B& W$ ]6 @
  25.     public void executeState() {
    3 L/ ~* B3 l1 Z& k% U) O
  26.         state.handleState(this);
    ( D; r, b- x1 [# I9 x; T5 Q$ N
  27.     }/ w/ ^7 [( E7 t: R3 }" d7 P+ [4 [2 @
  28. # J- |2 t$ u, q: \; E  S
  29.     // Геттеры и сеттеры
    ) [: E: \2 h5 c( h' O0 j
  30.     public String getName() {' |0 J& [/ T# T2 t+ z
  31.         return name;  M; _! K! W: b9 U7 F
  32.     }) V* \& Z% k; ~/ U0 b

  33. ' L; a8 `! |" P) x1 T" U
  34.     public double getAttackPower() {* {. ~; ^* \6 p, n5 l6 Q7 F% u
  35.         return attackPower;  Q: M0 j% @" k1 P+ x2 O
  36.     }
    0 ]* f0 P! ~; I+ Z/ i8 U

  37. . |! L" c& K* g) e
  38.     public void setAttackPower(double attackPower) {
    & c/ G: x1 ^1 Z
  39.         this.attackPower = attackPower;
    ; z2 _- m, W, @1 d9 y$ f* O
  40.     }$ x; c( k" G1 `$ o
  41. }  \  A$ \- u, Q! U% b& T) T& d
Скопировать код

& \& b6 l4 o7 l) k7 x5 o. g0 xШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! W8 H: ~: G; z- C8 J* l* J0 T# G$ h- B
  1. // Пакет org.l2jmobius.gameserver.model.battle% c2 E& k2 ~8 Z* L/ |- J1 O0 t
  2. package org.l2jmobius.gameserver.model.battle;0 ]) s" T+ Q- |. _
  3. 0 q: Q4 o' f9 W+ u2 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 I3 q. l" ~, M8 _3 n1 n/ z/ g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ' E3 _9 E* p) ~+ F4 ^% P: x' I
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;4 N- q, J1 E7 f
  7. 2 i9 w; {: t  @: a. Y$ s
  8. public class BattleSimulation {
    * Y4 X4 i& S' ^) Y
  9.     public static void main(String[] args) {
    ( G( c. p) n# ?9 W% Y  ~/ ]% \
  10.         // Создаем монстра с начальной атакой# X& h% h9 l$ s
  11.         Monster monster = new Monster("Дракон", 100);
    # u$ Z# K" T( ?; b
  12. 8 Q8 p7 o. r& m# C
  13.         // Начальная фаза  c- S- e: r- _7 X
  14.         monster.executeState();/ {+ L  F) h% U5 [: v& U

  15. 8 F. z7 B- P$ X! G' ~7 u7 u* t; j5 y
  16.         // Переход в агрессивную фазу, F+ b5 B8 i- d$ J" a( m
  17.         monster.setState(new AggressiveState());( [# C" b  [/ n7 B
  18.         monster.executeState();
    " K4 o6 b: |  W8 r8 I

  19. , [5 L! P6 X! c8 {6 D9 b- r: }  ]% R
  20.         // Финальная фаза
    1 [/ [+ r* p: \4 X" \2 E
  21.         monster.setState(new FinalState());
    3 q0 M7 P7 h0 \/ q
  22.         monster.executeState();: o' ]& S! F$ r/ K" p3 N5 T
  23.     }1 ]1 s& r# B4 z( D9 p
  24. }
    9 ?/ \  V( T% p% Y' E) T# B4 w7 W7 O3 e
Скопировать код

2 _6 |6 W& P, ~4 P' k$ wКомментарии по структуре пакетов и классов:
3 d: i# `1 @; }$ d( ^  ~0 e/ C. p
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    , k9 z/ M, F3 w; m) n
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.- d7 u* Q8 M4 l: F9 ^4 I1 i
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* v1 @7 |1 S+ W- T6 I: x1 @; P3 ~6 s" ~7 O9 J& f
3 ~: \1 L1 f( L+ N" [, \& ~

4 u! c& w, P3 Q: \3 h% a& x: b4 r/ l: m8 o8 l& X4 i
' L& F. i' h: q# r! M$ j& B& i7 I

" c- \* B1 I1 C
0 v' J  n( j6 O8 a# i: Y# y  O4 ]; H/ q5 |$ |9 m

0 D' @" i! O4 M$ l" ^3 a7 v6 f" j, p6 a& |, K. G: p: t
, f. z1 b6 b0 i7 D6 k0 ^2 q  F

9 X, d! p" G* d% c3 y# |+ S1 V1 X+ W, X. T7 s6 K4 L" ~
9 X, U! u2 E  |. f* p
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:043 X  x0 W( b, t
Для управления сложными взаимодействиями, такими как  ...

4 u8 o5 `* I! B! M0 M1 U# iОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21& a  o+ f" }1 y$ K' J4 R
Отличный подход! Использование шаблона "Состояние" де ...

: y, ]- e# s. W9 r: j5 vХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
- k- E) f: M# ~: B8 @. g
, h, x; Q$ t# y/ GШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; O& t6 R9 {  ]

, @: [+ V+ W! o/ _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ i7 P2 |4 ^. p, K
  2. package org.l2jmobius.gameserver.model.actor;
    ( \- h4 ^' [0 a) c- k
  3. 1 j& q6 K' ]7 O! e$ k
  4. // Перечисление для типов атак
    0 n5 _! R3 w4 y- ?) H
  5. public enum AttackType {; w( O+ w& p+ u  r1 V
  6.     PHYSICAL, MAGICAL;" K6 k: R+ l8 e" S% d
  7. }
    9 L1 v. W5 |. u* M5 d
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
' m+ d* X) I: a; j) v, eОбновленный класс для агрессивного состояния монстра:
$ ~8 b5 S$ A3 {9 @, M; h7 o7 o2 Z; [% l& ^. R/ O; w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & ]/ t2 g0 g* h6 ^% k3 |, W' _4 ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    * K% M; [+ S0 h0 p  `

  3. * q6 F2 k8 e  v9 A# l& c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 n% w6 Z$ H- e& Y1 t
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    6 S8 z/ j& ^- x5 N7 k# i0 t6 i
  6. & z$ O. o, o0 J2 G
  7. import java.util.Random;# Q3 G/ H* s3 J

  8. 6 ^" Q. C6 t8 K
  9. public class AggressiveState implements MonsterState {) O& r. g) o1 Z, `& h6 N  g# ?* G9 j
  10.     private Random random = new Random();
    / r2 L: A& I" I
  11. : Z: E& P) x9 Q( S- ~% ]2 ]
  12.     @Override( D$ A* d7 [+ J  _
  13.     public void handleState(Monster monster) {7 e7 u' Q8 z' z% S% b. W3 d7 B# d
  14.         // Выбираем случайный тип атаки: физическая или магическая- K8 _) m8 E  T: D
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;+ t5 y# X" d, R# h

  16. & D4 J$ ?% T8 f5 X1 h8 R* E+ B- M
  17.         // Логика для агрессивной фазы боя. }: h3 v7 Y! \) _+ s
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 r5 n) H6 H0 q4 b) ~4 [
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    " N9 l/ m5 K/ r8 k2 C  s7 ~0 E
  20.         9 w9 |5 W% N7 m
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 f4 b- ]" t! B/ F5 l! m+ `2 P
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    - O6 b( Y7 k/ f) Y4 x4 r
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);( t& s5 j% Q3 f; ~
  24.     }0 V: k* r* e, M
  25. }0 r8 p  K# d. \( w4 T
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
9 T6 ^& L6 a  M$ d) P' N6 y2 Q/ {0 q: Z5 y* e+ t
  1. // Пакет org.l2jmobius.gameserver.model.actor8 U7 W% Z' @. J" r9 Q
  2. package org.l2jmobius.gameserver.model.actor;* a5 ^/ c# b# G' q2 H
  3. 9 i: o: t+ j$ n$ x5 M& j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;; Z& A( `0 E! n; i' A
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' _0 @  l: u$ Z  Z# u( K: T
  6. : p; S9 m  C5 h+ H" W
  7. public class Monster extends Creature {
    / ^! h& h) z# ~- _
  8.     private String name;
    ( f! o8 ?; p* J
  9.     private double attackPower;  V+ {1 G7 m5 Q" a
  10.     private MonsterState state; // Текущее состояние монстра( a' H; u( Y$ |1 ]; \
  11. # T3 p2 ^3 @* A1 {+ c
  12.     // Конструктор монстра
    $ P9 r+ E1 a: h$ @* d, G
  13.     public Monster(String name, double attackPower) {
    $ I; w# b3 g; \* U: ~; j( _
  14.         this.name = name;' b! v7 e$ W5 R, V' ?: {
  15.         this.attackPower = attackPower;
    ' U( |9 U* M$ T9 m/ L" }* V
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию3 b7 x4 D+ ?' U3 x2 \% F
  17.     }% J- }. u  c2 p. b. w

  18. , \8 F7 E: A) U# f, t, u4 Q
  19.     // Метод для смены состояния
    , K- d* E5 G! O4 i
  20.     public void setState(MonsterState newState) {
    ) A% C) ~3 k' n& r. S
  21.         this.state = newState;3 c% |( u* y8 e$ r# d3 o/ b  [  ?
  22.     }$ [7 r5 x1 _0 Y. I5 h

  23. 3 B* f. k( Z: ?6 [
  24.     // Выполнение действий на основе текущего состояния4 _7 z2 ]6 P& T, n3 S$ F
  25.     public void executeState() {
    % K# ^, F: y3 R% H2 k
  26.         state.handleState(this);! W8 T  b( `, U% i! T# K( P. g
  27.     }
    & c* T% E" G; c* y

  28.   a5 V+ C4 N) t  D' t/ O
  29.     // Геттеры и сеттеры
    % Z( I( ^. {4 L0 F' W" Z
  30.     public String getName() {' g. P0 E# O, ^: ?( V0 r
  31.         return name;
    & Z" \8 K" @3 `2 F% f$ I
  32.     }
    ) \) q! F4 [( f  M7 s  Y
  33. 0 R6 ^( z* r+ }
  34.     public double getAttackPower() {3 F, }/ n: R+ e2 g7 c7 N
  35.         return attackPower;7 o5 Q% ]* o/ `! `) j9 ~1 i
  36.     }8 r5 F) M) p9 I5 r6 e
  37. ; u' s) F/ U) B7 U0 A, A
  38.     public void setAttackPower(double attackPower) {
    ( ?9 t/ o0 a# R$ o
  39.         this.attackPower = attackPower;
    . l. B2 _% g- |  r4 B7 g" l' `0 m
  40.     }, g  k: j* ?* E7 f
  41. }8 Q' F+ v1 F3 X2 a7 A2 C" b
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.* Q4 e: P9 M; x# f8 J5 S9 V
( N" x! h6 d5 \
  1. // Пакет org.l2jmobius.gameserver.model.battle
    * k: o& a; }- j: d1 K, \# i+ E3 u
  2. package org.l2jmobius.gameserver.model.battle;
    ! E  u! v( m; Y7 D
  3. 9 f3 m3 f# {: k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 }% l, `7 ]! g+ O5 m. w
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    / X6 A% U3 c3 f( z/ d; l& J
  6. # m9 \- z! r) Y, f2 L
  7. public class BattleSimulation {$ e9 i$ t/ b; k1 c  {: K
  8.     public static void main(String[] args) {0 `  l! [. ]; d
  9.         // Создаем монстра
    ! f# A% |' R( k( {9 `3 T
  10.         Monster monster = new Monster("Дракон", 100);
    & i5 d1 _" ]1 t% @7 P# |% Z
  11. % f, W* }8 S  V7 I
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    * H! G( R0 b2 ~4 C) Y* {* O! t
  13.         monster.setState(new AggressiveState());- X8 z  |! f" X- L2 G
  14.         monster.executeState();2 l2 @1 V* l6 ]
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак( z# _2 s, b* f! I/ w) R% P
  16.     }6 C  |# S# ?7 g9 u  V1 @$ L+ P# r  ^
  17. }
    ( U2 E4 v9 t: j$ [0 S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
1 h) @7 ^0 u4 A+ A. i. H6 E& lЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!! x3 l8 X: d0 }* C* y, R$ n8 ]
5 I. s3 X0 m' P
- I" k' G1 q  A& w! v  R
+ T  [- b: x$ C: P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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