Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!) K/ Q0 J4 r$ ^  L7 T$ C$ ~
* x. G7 [6 ^$ s$ O! M% _

+ D4 N  X) H+ L0 m/ D$ oЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.3 l/ Y5 E) p" e% f; ^6 E
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!- E- M2 i  F" ^  X  W! ]
Астралия ?
' c- w6 _" Z5 H7 ?6 a
; h0 g+ b; R4 i7 G1 n

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!" T* y  a: q- C5 P5 T# {7 d% V
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
8 a$ F7 s5 K8 D3 X. \! n
# B' u; Q5 ^/ ]
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 1 {/ J$ g5 N2 i( l) O9 j
AlexCoder опубликовал в 2024-10-16 18:31) g1 U; Q% N- _
День добрый!
4 I! {- `. _; \) Q- eВ статье описано взаимодействие игрока с N ...
7 S! O- d" Q/ _9 z( O  ^
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ Q0 u/ B& b9 ]9 U1 J  u3 F  x4 H& s
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- w. O/ x7 e. E  a' Y! F& d

! h8 v) j- \( b- l5 ?/ qШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 U1 @/ \$ Z3 g% r1 ?& R: O- x. w9 m1 v; L1 E
  1. <font color="Green">// Пакет для состояний монстра</font>
    * P2 [, x- g0 N' Z  x
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 j/ z. D# l' W" a/ ~: ~2 ]8 h5 R4 z
  3. <font color="Green">
    8 d7 n: @# e3 L) O/ M+ ^
  4. // Интерфейс, представляющий состояния монстра</font>" M3 D! T( Z- \! t. m7 F1 T& z
  5. public interface MonsterState {
    7 C! ]+ m- P8 x/ \. z/ F8 D/ ^" O' k
  6.     void handleState(Monster monster);
    . Q" _+ y  D* o, O
  7. }
    4 c, l- k  R0 I$ z' O4 i% |7 Y
Скопировать код
0 O, `( k/ Z0 ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя." _- a' n8 |$ P! M
1 L3 e, o9 \% a% B; s% c$ T; g
Класс для начального состояния монстра:- V3 g4 {$ p% `1 Y4 [6 C
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>. l6 p; l1 d' b/ o
  2. package org.l2jmobius.gameserver.model.actor.state;
    " w" }7 A7 O! {! d

  3. ! R" I# ?, y7 c& a3 z- w" F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 [) J' m4 B" e% Y

  5. 6 h0 f; D. r6 i' ~  t
  6. public class InitialState implements MonsterState {
    1 [# t0 b5 E$ ~$ H. x. A( F! P8 B
  7.     @Override
    ' s, n& a7 t% S/ u, j1 G, f
  8.     public void handleState(Monster monster) {1 e# f1 t# o0 Z- G; J7 Z- W
  9.         // Начальная фаза боя
    2 T7 I, _! T  H/ l/ g( S9 u8 b
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 g9 A$ x7 s' l* E$ M
  11.     }1 x4 V$ ~' \; q8 S
  12. }6 r& z' Q" e: q/ _- `! t! n
Скопировать код

1 y3 ^' J" b3 }& ~2 O( `
9 x3 g7 s( s1 L) y) I% M/ `* Q3 o( k1 v' o2 N4 R7 P/ T7 I# ]

# A5 o" e) {2 l+ y# [4 L1 g
9 l5 D* m+ W* E' Q& i
6 G3 y' v# O8 }# b" H# J: z5 ~0 [2 m; A4 W( l; M
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 R. O6 a( J1 {7 D0 i  @
( f+ j0 u# R5 S/ r8 l: w6 S- rЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 s+ C1 \6 a! t& G: B) y. @5 ?
8 n1 O# G( ~( ^4 B( B5 i4 o& CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, O7 i0 ^' r. O1 J) L0 @% h" H" C1 J7 l7 L" k7 C
  1. // Пакет для состояний монстра
    " W3 ?+ w. A  \: y# X, j  S) H$ l
  2. package org.l2jmobius.gameserver.model.actor.state;
    - m4 M) z0 g. Q" q2 x

  3. ( l" b) g* G  j# a# S
  4. // Интерфейс, представляющий состояния монстра
    . k7 D: G7 ]7 e  r
  5. public interface MonsterState {
    : B  k$ s, `! S6 v" p& e8 r
  6.     void handleState(Monster monster);1 z. Z4 m( I3 `0 v  a) |  x$ v
  7. }
    / S1 n1 Q- _% ~% W5 S1 @
Скопировать код
# [, N$ C. `$ m4 p" Z
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
! p& q3 ~: V- y" E3 C
" x. P: P: f3 w' }2 ~  xЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ U1 O( w9 Q( _$ O2 q6 e; o
: M3 A/ ]* j- |* J5 R, n2 iКласс для начального состояния монстра:* v1 \. {$ F, Z6 ]5 Q% D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; s: i$ ?9 W. p1 ?% r1 ?8 E: R
  2. package org.l2jmobius.gameserver.model.actor.state;( x" }7 C$ R  y. R( ?

  3.   I) }/ l( b8 Y$ i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ Y. i# ^8 V; M5 q4 ^1 k& V. \
  5. $ S( A! j$ p/ d* w1 v0 D8 Z: t. C
  6. public class InitialState implements MonsterState {- V1 j7 L6 j. y! n' Z5 e: g6 l
  7.     @Override; c8 o4 U$ J: B* E+ G' h3 f" |
  8.     public void handleState(Monster monster) {
    + g, T- Q/ A' K: n7 M  A
  9.         // Начальная фаза боя
    $ A: Y! t' @( K* E- f5 G) R
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& U8 S% z0 t4 d
  11.     }+ ~. r8 r( n: j' q' n
  12. }* F# Q2 @" B5 N; r  `
Скопировать код
Класс для агрессивного состояния монстра:; P- M, U7 `; M# ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * G; {$ V9 j; F. u6 Y
  2. package org.l2jmobius.gameserver.model.actor.state;3 g$ ]0 X8 G. j. N5 Z( Q- p1 [
  3. 5 W# i; w) E" Q" [4 ^) K0 ~! ^; y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , V2 A  ~( S& I6 _% P' L. X

  5. ( r& T. f9 ]. }; W! s/ j
  6. public class AggressiveState implements MonsterState {
    7 P/ n3 ]  o( U% M0 l* n! f
  7.     @Override
    " A2 {/ m: L. }3 f" g
  8.     public void handleState(Monster monster) {, r0 |" k& r) f
  9.         // Агрессивная фаза боя4 E5 d/ k6 {; H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    / a  w% l/ `3 }5 m
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    5 T$ }4 {$ v& V/ e8 r) B. T2 N
  12.     }  [" A& V0 s$ ?# V
  13. }6 X, `/ {0 Q1 O6 l' ?$ O
Скопировать код
Класс для финального состояния монстра:* |$ i# U# j) z% Z- O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' F2 t+ A$ w4 v, P, S" v
  2. package org.l2jmobius.gameserver.model.actor.state;2 k. o0 J. f+ N- _

  3. & T9 ?7 I  M; b9 V( R# g3 u  l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 B3 C/ c, H6 O5 Z& X2 G" T

  5. 0 o4 _9 ]+ W* y$ I( i
  6. public class FinalState implements MonsterState {
    + C& F- B+ O* Q
  7.     @Override' P# _, v  m# L" }6 u  S. `! {# [
  8.     public void handleState(Monster monster) {
    % s6 i9 p5 O; l" f' i
  9.         // Финальная фаза боя: S, f% Q# l) M4 i6 t% `- }( ^
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    / v2 M2 d( [0 L9 v, [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    . C) R. A; s) A$ U+ S& L( }2 Y
  12.     }2 u# Y! I2 u) j8 p
  13. }% U) L9 ]! V7 j- J
Скопировать код

- S- A; L( n, j' AШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
& F6 Q8 [: A: h
  1. // Пакет org.l2jmobius.gameserver.model.actor* @# t( ^, i& R0 f# g: C7 V- N# Q
  2. package org.l2jmobius.gameserver.model.actor;
    ! ~+ ?: K- x+ o1 |- c6 |7 J
  3. 6 N. d% P4 f# C  y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 ]8 H* s2 o& B) ^0 n' B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 Y* X- ~% q$ D+ S0 G6 ~+ G7 C5 Q
  6. / a! ?2 i# O$ B& {/ G
  7. public class Monster extends Creature {
    + |( D& d8 l% \  a4 d% u; d' w
  8.     private String name;+ q+ E6 b$ V- C) D# ]& n8 T
  9.     private double attackPower;
    , T- O) f& L' d2 T. p
  10.     private MonsterState state; // Текущее состояние монстра; a2 L; ]$ I0 Y" h" K/ \( z7 l( p
  11. $ ?% H  H3 I1 g* v- p3 g) f
  12.     // Конструктор монстра* |* J* s, u: `
  13.     public Monster(String name, double attackPower) {2 r& T: V7 y, D3 @; s/ _2 n  R% m
  14.         this.name = name;7 t1 l9 }$ Z! a2 q  a3 J2 i" P5 Y2 D
  15.         this.attackPower = attackPower;% Y* o+ `5 H3 w
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние8 {1 I( a! S  _
  17.     }
    9 Q, c2 l- Y- z6 `
  18. - m5 \. v. X* q) J+ @
  19.     // Метод для смены состояния
    $ m/ O9 F/ |+ }  C/ |
  20.     public void setState(MonsterState newState) {& U! Z' U( n( k5 s
  21.         this.state = newState;
    " k" _& D0 D; T! T( [9 w. B  a
  22.     }$ G' k- h2 Y; Z1 l9 f0 r5 u% b
  23. 1 r0 q: z- Y5 E# M
  24.     // Выполнение действий на основе текущего состояния# e/ r( M, Y7 M) W6 d
  25.     public void executeState() {" X; D5 L8 k) a* d) S! g
  26.         state.handleState(this);
    ! A$ L) V/ `2 L9 s' C
  27.     }, J- |+ L3 g8 o2 l3 O8 _) \3 w
  28. ' l6 N8 Q7 U8 E7 e0 y# e0 v3 n' ~
  29.     // Геттеры и сеттеры
    0 X$ c) `9 R$ n
  30.     public String getName() {
    : h- p7 I& y8 p) i; l  t1 O- C$ _- ?2 E
  31.         return name;# d& A( ]& |& {  k
  32.     }
    " ]1 F) M3 N4 \3 H, ~) d

  33. . I6 g) |) b* u6 U$ |& T3 d
  34.     public double getAttackPower() {. Z! o0 }3 x/ g; x9 ?
  35.         return attackPower;
    4 d( \; Z" T6 Q- T$ S5 P
  36.     }
    # K3 o0 H! o) i) n+ F5 Q

  37. & }: K; w! U7 i3 [: t3 t3 P' _
  38.     public void setAttackPower(double attackPower) {
    5 c1 K' L, R8 q' V7 c' N# S
  39.         this.attackPower = attackPower;+ L+ x  o, e0 `0 @" U; j
  40.     }- U8 c; y3 q, P. G
  41. }* N9 g4 ?6 l6 B: ?( P" r: E
Скопировать код

3 ]5 {/ o% W7 Z3 m# @# [1 AШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.) C0 g! J& a  X" n

$ z9 U2 ~8 _: k" R$ Q, l7 s
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & m, }) i1 x3 t; h: X/ ~2 O
  2. package org.l2jmobius.gameserver.model.battle;- A; I% _& c3 ]* f5 d' F
  3. ( _1 F& c( O* ?' z4 c' [* F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 k/ A  Q  T. @! `1 p2 X) S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;( \/ |: {. v; _; ?- z4 j. m% k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    * d, X3 T9 z; A  e. Y+ s

  7. 7 j8 c2 k6 h3 f( d2 ]! f4 u
  8. public class BattleSimulation {
    8 ?8 e2 R4 k, b5 _0 n
  9.     public static void main(String[] args) {
    5 c; z: I) r; c2 E4 O4 V$ r
  10.         // Создаем монстра с начальной атакой9 O+ q/ k. Z% |+ \
  11.         Monster monster = new Monster("Дракон", 100);" @4 y$ O% J4 H  V. i

  12. " a8 X5 o3 |5 Z+ r) ?7 w3 O4 ?% B
  13.         // Начальная фаза
    ! o. A- A5 @6 e# M1 f4 E0 S; {, q4 t
  14.         monster.executeState();
    ( K0 u5 Y( w& ]  P

  15. * ^3 b7 J1 y0 v) a# S
  16.         // Переход в агрессивную фазу) X+ a- s9 Z' L  e& ], C
  17.         monster.setState(new AggressiveState());, A$ Q8 Y4 {& g5 J
  18.         monster.executeState();
    4 g: Z/ q5 x; [# S# h, V1 ]

  19. ( I5 j# h( ?, @( I) G
  20.         // Финальная фаза
    ' l$ G% J3 L2 Z
  21.         monster.setState(new FinalState());
    ) K+ k- K* L. O( F" m; x: k1 B5 ?! m9 N
  22.         monster.executeState();: d1 t1 Q# I- k, \. G/ c! I4 K
  23.     }
    , L- ^9 ?4 x8 Y$ P3 w& N
  24. }
    3 u! J$ W% X2 {& ?* V/ F
Скопировать код

; V, C/ W, Q! d5 S- IКомментарии по структуре пакетов и классов:
6 Y: z9 C  ^' b/ u5 h7 a1 ~; X
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ }" [+ n" u0 ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 x2 @) J1 t( w, I* |! \2 F  L5 g0 z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 s& C5 X7 ?, M$ W5 b' Q7 E0 s2 N6 w2 i$ E) W

" f& ~0 F" y9 y* i, A: S2 E  t8 T8 p* w! z1 R
  U$ a! y0 T, Y3 u% z' y( A

5 f1 Z% _7 E3 T3 O. m4 F% P3 H% R$ z
3 Y: |- K% q" S5 l; k( y% L2 M9 W& z7 m# y8 L
/ ^" `1 P& _& ~$ ~
8 N5 j8 n- U" Y1 l: X/ C/ Q2 t

: F! X! R7 ~1 o! o$ `2 m9 H" C+ ?
9 j+ }  t0 P0 a9 N8 ^0 K' k1 e& z

6 [4 y( H( i: @3 U6 P1 t1 t9 |- R7 W* c+ m% T! N& F2 S) Z
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:045 G! T8 k. y) H
Для управления сложными взаимодействиями, такими как  ...

2 i5 i8 Y2 W9 O; VОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
8 x( y) Z1 ^8 B; u/ Z' L& gОтличный подход! Использование шаблона "Состояние" де ...

) @8 Y6 O0 m4 l& [3 m# l/ ~Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. r% o0 k% B0 R# F* n' K7 m

+ R3 U0 J, T- i2 T; u) o) n0 BШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.- x2 s- M9 n& p

. E0 e$ u1 D" z. F
  1. // Пакет org.l2jmobius.gameserver.model.actor9 ^# C5 F8 t) u
  2. package org.l2jmobius.gameserver.model.actor;# \/ [& K' O4 x4 g+ x, C

  3. + ?, e% h+ P  j- ], t
  4. // Перечисление для типов атак
    9 U3 K- k3 {/ _& P9 k4 m
  5. public enum AttackType {
    . A2 Y( j% ~) g+ u0 S1 w
  6.     PHYSICAL, MAGICAL;
    7 N' Q. ?% x3 L6 v4 ^: ^. y; s) c
  7. }% [+ V  L3 e! S# J. i/ n
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.4 {3 ~- s3 h: n2 g
Обновленный класс для агрессивного состояния монстра:8 u, }% ]  p4 n0 S, u7 ]- \

' F/ o- I! e+ Y* e* X) ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 d% R& u8 B4 Q
  2. package org.l2jmobius.gameserver.model.actor.state;$ f7 @+ d0 A4 I5 Q$ @
  3. . P% g& z3 K% a7 ]* \. L# v1 U. D
  4. import org.l2jmobius.gameserver.model.actor.Monster;% C7 W; t% K/ V6 j! w7 z3 M+ X! a
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    9 F  M8 m3 T8 V" m8 A( `

  6. 0 a1 ]: C: K0 R9 g7 y
  7. import java.util.Random;
    $ D' b; L# b3 I! D
  8. 8 O1 a) h) O- x# X1 F
  9. public class AggressiveState implements MonsterState {
    : ?4 W+ y! K0 l4 h: J7 t/ U
  10.     private Random random = new Random();
      A6 r: z2 M2 U- y9 Y1 {, I  j' x

  11. " i9 v7 V2 U" Z/ [+ s, f
  12.     @Override. H" O& `; C2 K6 @( \
  13.     public void handleState(Monster monster) {
    " e" I6 E% O) A9 k
  14.         // Выбираем случайный тип атаки: физическая или магическая
    & m8 Y2 [% q/ S- X# N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 R! a2 G7 k& K: |$ f% q2 X- o

  16. 6 F% w. p1 Y* }8 ~/ }
  17.         // Логика для агрессивной фазы боя! @* A% H- L4 Q& x. B
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    + h: o6 ]- v. v1 A) [
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    4 E! @3 S% {4 X& [7 i) j* a
  20.         ( D- b7 V, C' V9 _
  21.         // Увеличиваем силу атаки в зависимости от типа атаки8 k' I. }  e; f; m& Q
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    , p1 t! Z$ a% ~) _, t( R1 W$ j
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , W4 ?* @8 e% D% d
  24.     }
    ( G; t8 a* m0 R6 A! H/ Y
  25. }
    ' N  ?* W+ ~( V4 r# o+ {
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
- u/ k, c3 P+ U# w  S) X- y/ F& c
  1. // Пакет org.l2jmobius.gameserver.model.actor0 R' i0 e( n1 X" q
  2. package org.l2jmobius.gameserver.model.actor;
    ( q: V1 Q/ I$ g* u( I
  3. , @2 v$ l: e0 e/ H
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 f1 F' j; o8 t% U9 M# [9 @% r
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # q6 X$ W" |9 X$ [% h
  6. / M) ]3 p9 A+ d% k4 i
  7. public class Monster extends Creature {
    3 m: g2 D6 j3 ~9 ]. z( N
  8.     private String name;
    " T, N) }$ z: [$ q
  9.     private double attackPower;
    4 x. M7 x8 ~/ @
  10.     private MonsterState state; // Текущее состояние монстра
    : i% n# i- F( n! V% p3 w
  11. & L7 Z6 P7 b* C9 i0 E) L: R! f
  12.     // Конструктор монстра! Q* L% `4 u! k: w) Y- z9 r  m
  13.     public Monster(String name, double attackPower) {
    2 e' G1 d" n9 S, G
  14.         this.name = name;
    * X/ |2 i! v, S( V  L$ I" N
  15.         this.attackPower = attackPower;
    + M& Q3 {* w$ D  z0 n
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию4 f6 @( C" n' ~0 j' C
  17.     }
    2 m0 Q5 f# k, P/ I$ z
  18. ) \; n( h+ E* K5 T" \
  19.     // Метод для смены состояния. N5 l+ X! X9 d* Q
  20.     public void setState(MonsterState newState) {
    # i6 A7 _6 t7 \5 L  Z+ X$ Q3 e
  21.         this.state = newState;
    ' ]! P4 o: C! G0 U& m' t3 r  S
  22.     }
    ! W3 F- S6 i5 g3 S6 o
  23. 0 a# ?  \% g3 Q# ~, W3 Q
  24.     // Выполнение действий на основе текущего состояния
    + y+ Q  i2 Q1 s/ g  J7 h
  25.     public void executeState() {3 G; T. g  E8 E2 [
  26.         state.handleState(this);/ _3 h8 r. o* K, S; \
  27.     }
      ?+ w" O' t2 R. w1 n5 D9 }4 w9 |7 N
  28. / Y1 b2 U3 {$ T, y4 k- w
  29.     // Геттеры и сеттеры$ H! b; l0 s+ _5 t1 S& |# m
  30.     public String getName() {5 A' q/ m- x! W6 N: e
  31.         return name;
      n/ \2 t$ V! U3 `+ _8 j
  32.     }+ b4 u( F  K' k) r6 `
  33. $ M  }3 c4 c' X/ h+ C3 K' F
  34.     public double getAttackPower() {: W& `  r0 w: x" v% D8 W# W
  35.         return attackPower;# \) D9 f' a9 {/ m% N$ t, O; e# z
  36.     }
    1 S0 K1 w, C  t2 }
  37. / w& `! u1 k: d* e; ~( y
  38.     public void setAttackPower(double attackPower) {; M3 c$ v) \0 n+ P4 D* q8 F
  39.         this.attackPower = attackPower;
    . i' X) `& m& f- U5 D  b+ k1 O1 f
  40.     }
    * b& a- `4 F' m8 T+ z! w/ f+ C5 h
  41. }
    # a: i3 I" t1 |" x9 }  d7 w
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.  c8 s3 e1 z! ^  d3 V
0 m1 W, U! Q8 f, R
  1. // Пакет org.l2jmobius.gameserver.model.battle
    % b; w+ d# b: c+ k6 D
  2. package org.l2jmobius.gameserver.model.battle;( G% |# c+ F  H3 Q. s  s
  3. 6 [4 P, T2 U9 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! Y: C$ z2 W- Z9 E" \5 x5 p
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, `; p3 F) v7 ~: ?' o. c
  6. : w. t  u0 s, w3 `
  7. public class BattleSimulation {
    + S7 n5 y) Q  ?4 G" J
  8.     public static void main(String[] args) {
    - [# ~! o9 ~( J5 n; g% N
  9.         // Создаем монстра
    6 Y1 l# t7 C1 ~  r9 S
  10.         Monster monster = new Monster("Дракон", 100);
    9 I* k: M, [5 _# j# A

  11. . c! c" E, {* G; X- W6 z9 j! l" T
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ) _3 x# T  n9 M' N
  13.         monster.setState(new AggressiveState());
    ( X& B2 E3 l# x4 q  X
  14.         monster.executeState();
    ' C  t5 O4 J. Z$ O9 a' ~
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак, O+ D( z2 }+ w. f' T9 m9 c
  16.     }: N6 }4 q& _! X/ U* d+ \
  17. }
    8 ^+ X; J& P; e7 A2 ]# O( I
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
8 x/ A1 Q% U, Q0 w4 S& VЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
' r( r& \# q) g3 G' b9 f4 P
6 p- y  y2 s3 j: O( ~& `+ o
5 P- d! J2 R/ Y
6 I5 ~* `/ n! x% O1 U$ ~4 E; R3 I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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