Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
3 E9 r  U% }7 s9 [9 y
* }- R8 p% }4 ~" o8 O/ x$ U
% R" F  A0 {" o; d/ G# ^, R
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
  o7 p0 c5 A6 a+ {Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
0 k+ K$ w9 F* v% F( \Астралия ?
$ x3 [- z( J/ U' H0 A( }+ m9 C, w! B( Z; o# d

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!+ u/ E. v2 ~! }: M- ]7 |+ O
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ n7 p1 V0 d. A
7 d7 D5 {4 I8 [
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 x( w, P: O# z( W+ j$ H" M
AlexCoder опубликовал в 2024-10-16 18:31
/ W( ~+ V3 F0 o: HДень добрый!$ X& N' u& L. k# f! a
В статье описано взаимодействие игрока с N ...
+ K; X1 Y7 p& t
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). : C$ V9 a8 M- |4 Y

5 v+ i2 N: E9 V9 IЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: N3 F1 K0 e/ H

4 f& R9 d. @8 v% T  F3 ?# P1 CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, C8 e) N; g" a1 I7 u( \6 y# t& A; w4 A" f; j' b# F: u' Z
  1. <font color="Green">// Пакет для состояний монстра</font>3 ?3 ?0 f8 ~; L  X
  2. package org.l2jmobius.gameserver.model.actor.state;3 B( \3 ]% l5 L4 G; `# p& L. l
  3. <font color="Green">
    ; `9 ?; D& N# e$ p0 Q7 Y4 ^
  4. // Интерфейс, представляющий состояния монстра</font>
    . x4 N; o& ~: ^* @; b& g
  5. public interface MonsterState {
    7 q+ m7 `* @' {7 T8 h
  6.     void handleState(Monster monster);' X; |& I4 Z7 W8 m
  7. }  e& _- Y% W( m! t
Скопировать код
0 O+ _' U( c2 a3 a' I5 n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' H. o- b7 b6 b$ ~6 o  P- z1 d/ X, ^
Класс для начального состояния монстра:
7 M+ y' E5 U* M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>! d7 t# Q& M5 o, |8 b8 ]
  2. package org.l2jmobius.gameserver.model.actor.state;' X- }; h- n6 |" I1 J, y
  3. 4 j6 v4 d/ S9 \: C) f" @: |  {
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & W" e1 b& m; x' `/ H* v

  5. 0 Y( V0 ?- |& I: P' b, l* g
  6. public class InitialState implements MonsterState {9 J3 k% m& ^/ B/ j, F) v$ t
  7.     @Override( I6 w( g4 F8 Q5 {) C7 K
  8.     public void handleState(Monster monster) {
    7 k' `0 [1 L( P& j0 F# z3 A
  9.         // Начальная фаза боя4 q+ e/ f  e! L+ ?' w& m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* [1 n; y2 s3 f: `
  11.     }
    , t, k+ s4 I1 `
  12. }
    8 w& ?+ Z; J8 S% B+ Y- ?7 O
Скопировать код
4 k' s# Q: r( C9 D: W

" n$ p& }  H) l' l0 _# k7 Y% _/ W  A4 J# l" i

% W2 d2 f: I/ c( M7 J: F0 F( \3 r# K
. l. X; B  t5 q: C  N
' j; g4 ]8 i6 {0 E" l8 N
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
' n' `0 L) Z6 J0 v
6 x0 J( _3 O3 z8 m% C6 i, l' ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  W/ q: p  M7 p. X9 r$ }& _
& \" W" O8 g' XШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 Z9 A6 V0 ^6 v7 n' ]

7 g9 v! L) q1 C2 f. y* d- W
  1. // Пакет для состояний монстра
    0 C! B! U( N( {! A( I* p( m
  2. package org.l2jmobius.gameserver.model.actor.state;
    + s( @% ^6 \" d: D) \
  3. # R8 u8 w. P& H* y
  4. // Интерфейс, представляющий состояния монстра
    5 |; y4 r( i  D; B8 a7 e  `6 \
  5. public interface MonsterState {
    ! X% p# s2 t, E  I' G4 A( }8 Y& ^
  6.     void handleState(Monster monster);
    0 e. o# [* S# o0 A4 C
  7. }
    , V( d# V1 C7 }3 ?& T: H5 o1 [9 U
Скопировать код

2 o9 Y( i6 d& e- u% \9 l/ {/ ~Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 p# |, B8 \. p5 g& b- i; H
9 i* K. U/ \! f; T/ H  k8 n
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ b4 L0 l' ^1 D9 z% P, S  a, Q8 L6 A1 O! k8 J1 W/ ^
Класс для начального состояния монстра:; b9 Q" o* q2 D1 f5 b% `2 F3 {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 \1 p" r1 Q& ~# B2 y% D2 u
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 m) j, I* `2 @- m5 n( a# u5 U% A4 ^" I

  3. 0 M1 Y8 q/ T! G
  4. import org.l2jmobius.gameserver.model.actor.Monster;# O8 ~8 B8 t! N  }

  5. 0 G, u( s! _2 T- c  c  D7 ]
  6. public class InitialState implements MonsterState {
    0 S1 q) |0 K7 t
  7.     @Override: \1 q, k1 [3 I& O8 S# c
  8.     public void handleState(Monster monster) {) j5 H9 E* ]: m; i$ E8 X+ k) p
  9.         // Начальная фаза боя
    ' q, v% J% [7 h
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    2 D$ G9 M& V1 w+ Z+ }
  11.     }
    0 I* n% s% i/ F. o
  12. }/ w" l( f$ u; E
Скопировать код
Класс для агрессивного состояния монстра:0 c! ^; O1 V0 p+ t2 F. a% x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 ~$ l  A" j! ~0 ^! G& K) ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    , ~0 E1 z4 I, E" C

  3. ! v: n8 q$ u$ o( \2 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;' Z; q% G3 ?# L- G
  5.   _9 ^0 r2 F+ _& U  i
  6. public class AggressiveState implements MonsterState {) d$ b! R- y9 v: y5 b* o% ^
  7.     @Override
    - U. ?  [8 F# Z/ Y: s+ m# A3 ?. ^
  8.     public void handleState(Monster monster) {
    # o% U3 V+ v9 l2 F4 l
  9.         // Агрессивная фаза боя
    + x5 D$ V9 |8 U6 N# w3 p
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 D( ^) y( k" n8 a) V1 z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& S. P; e% a' o  ]; {7 D
  12.     }' p" O; W$ i& t- J. h( w
  13. }' y! L7 B+ d  q9 U2 t* s
Скопировать код
Класс для финального состояния монстра:$ z4 U' y: |: |" ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    8 _" S! A% y9 J7 [
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 ^9 C3 c& y, b( R

  3. 5 o. v7 J# S3 ]# B. A9 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 S5 P6 E- v: S, T# }

  5. 2 Z" |3 ?5 o* C5 D3 D
  6. public class FinalState implements MonsterState {
    5 l/ Q2 r$ W3 x1 H9 x
  7.     @Override
    8 \; o+ _) A2 ^
  8.     public void handleState(Monster monster) {
    : t/ @4 Z3 O8 e. m2 |
  9.         // Финальная фаза боя
    1 D: V2 t" X: k+ V& G
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");+ m- i8 i# r% z1 C# c4 q
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ) ~8 m4 u; p8 l/ f. q
  12.     }( _1 r' W. y- u, p/ A
  13. }
    , D! r. b& D5 D# R
Скопировать код
0 ?; n4 a) N- J' L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
  F8 |+ Z+ N" c" Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; V* B* m' a* Z+ p$ O+ d# o
  2. package org.l2jmobius.gameserver.model.actor;% K7 k9 `+ \& m5 s" [- R
  3. ; P6 S- `  g& D; v! e; J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 w8 R( I7 J. f5 {2 Z$ }
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, w$ \5 D/ y; a" z5 m
  6. 6 o) }4 O7 S7 i4 m6 c$ R- }& S! O
  7. public class Monster extends Creature {3 {, ~6 Y5 Y& B6 {0 \
  8.     private String name;% v7 g, S' a2 ?4 X. I+ z: `
  9.     private double attackPower;& S; H. U0 ^: M8 m; J' l: G  E
  10.     private MonsterState state; // Текущее состояние монстра
    % j% c- c  W+ `; q0 `' G5 E1 ?: F
  11. . n! }( T2 V7 D& P, P. g
  12.     // Конструктор монстра6 ~% y! w& Z* B6 }* ]+ K% K6 m
  13.     public Monster(String name, double attackPower) {: m1 r5 Y/ @) ^5 t
  14.         this.name = name;+ m. J* }! b% O2 o$ V
  15.         this.attackPower = attackPower;) P1 V6 l8 w6 v# t" f
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние; P6 P0 T6 a) V( \1 L% R) E% Y, {
  17.     }
    0 s; t- m9 p8 w
  18. / R# y3 U/ R% M6 D  B* T& U
  19.     // Метод для смены состояния1 M/ o5 x4 \! M* o
  20.     public void setState(MonsterState newState) {' f8 N6 {: ]! Q; E8 q9 n
  21.         this.state = newState;
    , i7 R. k# L+ h0 o6 q/ K
  22.     }4 p3 @- A( M# c) j6 W

  23. . I  F* ]) w9 I( r6 a) |6 ]5 U
  24.     // Выполнение действий на основе текущего состояния
    3 _2 }4 i3 o0 D* @
  25.     public void executeState() {/ Y' L$ A& M  b+ z  c
  26.         state.handleState(this);! n+ a; |1 ^2 q
  27.     }5 Q/ t: h+ s. r/ t# N* I3 c* B: P

  28. ) U+ H0 j0 s5 I
  29.     // Геттеры и сеттеры
    * P7 e5 n, h! N6 B6 _
  30.     public String getName() {
    3 E* g9 w+ `$ C. D9 N: Q
  31.         return name;
    ) t" b; u$ e: F6 p$ s
  32.     }
    / l; G) p9 D3 y& W& _( L; W

  33. # Y4 o1 l5 ?, B0 f! H
  34.     public double getAttackPower() {
    . w% y' L/ n" p6 [5 e+ R) G  g. A
  35.         return attackPower;
    , C+ h) o* P/ }$ ~7 N2 b
  36.     }
    8 c+ c% x! r2 `& B; H
  37. & W# [0 m4 O0 w
  38.     public void setAttackPower(double attackPower) {% R* b$ r( C% \* i- y, L# |
  39.         this.attackPower = attackPower;+ p7 a6 Z7 _# q2 n' n6 O7 u
  40.     }
    & H) z+ z5 W  \# l
  41. }
    6 a; {+ A4 p3 R% Z
Скопировать код
% t) i6 n2 o. d% t
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.$ R7 b. {$ L: A3 ~; A8 Z
" y7 ]; M5 G% U. h+ D6 {
  1. // Пакет org.l2jmobius.gameserver.model.battle* n1 C- |& P( G1 D6 p% `  q: k6 ^+ f
  2. package org.l2jmobius.gameserver.model.battle;
    5 V( \6 h, {9 ^1 l3 X6 i- W

  3. / c' p) b3 d' Q' f
  4. import org.l2jmobius.gameserver.model.actor.Monster;  C% {" P! w( z1 R, Z  o2 ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; \9 W! d7 w0 O
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' z  g3 b. t6 @
  7. ' l5 `; b" m$ T6 s
  8. public class BattleSimulation {; g% p6 b& q! \
  9.     public static void main(String[] args) {
    6 F3 D& _; f1 i2 s5 n; {
  10.         // Создаем монстра с начальной атакой
    : `" A2 B! w' ^" h, y! l( D* W2 S, _9 q
  11.         Monster monster = new Monster("Дракон", 100);) M0 U$ Y" F! v. ?5 G! v# X1 u

  12. * W0 S+ [/ U* {* C2 t
  13.         // Начальная фаза5 i1 R( s; }8 C8 ], e8 _/ t
  14.         monster.executeState();+ v6 F# y/ |/ I0 ]* Y7 s: Q0 K) D
  15. * A+ R4 q5 g# C4 E% u& t# w# c( [: `
  16.         // Переход в агрессивную фазу: ~+ F& ~# u) t! u# J/ V4 v8 b
  17.         monster.setState(new AggressiveState());# Q$ ^1 C( V, A3 C/ ?# C# x
  18.         monster.executeState();  r8 b" }  b3 W: _8 x

  19. 8 q2 U7 o3 z, e, t) I4 j9 W7 O
  20.         // Финальная фаза& `  q; b- l7 w2 V: M# k
  21.         monster.setState(new FinalState());
    / F% r+ V1 j5 y6 U4 {0 F  U9 A
  22.         monster.executeState();1 F% I, e6 {  r
  23.     }8 ]: e' M8 e/ Q2 }' l) T
  24. }
    4 ?4 M0 ~/ v3 @& v. Y3 d
Скопировать код
+ z2 A6 W! F& G  p  ?- G
Комментарии по структуре пакетов и классов:
/ d# M. U1 {8 B' f; K7 G( }% p
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.( c' R+ v9 [( G7 z) y4 _
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 _/ A0 u  Q: ]" @# y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ L0 F# `7 x. ]$ e8 y% Y- a

! a" o- t' T3 f* b- O6 R1 O, X7 {- S# d
+ W% M; J! H4 s$ @: Y5 r* A0 A: j
# X  s! |" D3 f8 c5 b0 m* o
: O! u  W' G: N) G: _) g  e. n

( w- A  R9 t+ G5 X% u  I: q7 }, o/ {7 W: z
, g/ W' D- e& C+ ~
- M  B4 Y( e# j2 a

" N  k2 F2 S, i2 ~& n: a5 j# V0 |, G. I+ x1 l  f

' m6 A9 s) K* ^) `( T, r, Q) ]- m- p2 F! v

0 ]* C1 j" w7 @, z' {
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
$ u! C3 n" H# v4 @( E/ O" aДля управления сложными взаимодействиями, такими как  ...

# H1 D4 M2 [/ s) z! tОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21: I$ j6 V3 k, {6 n) ]0 d3 _9 K1 ^
Отличный подход! Использование шаблона "Состояние" де ...

4 u; ^0 b' K% v7 B4 `) U: m% V  c, xХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. J0 y" y8 T0 J
( Q5 y: H: O1 E; Q, _Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.( s+ L- u8 ^, x& C( l) T
2 J: o/ @6 O  m. n  O  b' {
  1. // Пакет org.l2jmobius.gameserver.model.actor$ V3 L6 {7 Y8 O0 c& R" p+ |' @
  2. package org.l2jmobius.gameserver.model.actor;
    9 }3 _" y0 ]% U' j

  3. 2 J3 I! e, P; Z5 r, ^
  4. // Перечисление для типов атак% n( W) c5 `" W9 I: ]" e) s
  5. public enum AttackType {1 Q' N+ L4 a1 m
  6.     PHYSICAL, MAGICAL;
    # ?# O, ?0 t# U' D  q
  7. }
    # _4 r  ^9 f0 R+ A8 |) N* j
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 |  w$ h1 G6 Q% A, p- eОбновленный класс для агрессивного состояния монстра:/ g2 L7 C# i7 m6 J" V7 N) Q: o

7 y8 X4 G$ ]) ]5 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( l; h. u) Z) \
  2. package org.l2jmobius.gameserver.model.actor.state;. ~" m2 |+ t3 K  U1 B
  3. 9 r5 o1 P7 l  U9 L) B% P7 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( T0 i4 P: m& P2 [) J$ h3 [7 e
  5. import org.l2jmobius.gameserver.model.actor.AttackType;1 @- L" F) O4 ]6 {

  6. " s/ i1 ]5 \& a/ {+ a# k: G2 \5 ]
  7. import java.util.Random;
    % z8 h& I' v6 U' |: q7 P; B
  8. 0 [. O0 C6 M4 e
  9. public class AggressiveState implements MonsterState {6 m3 X  h2 X2 x1 Y3 n
  10.     private Random random = new Random();
    8 g9 ~+ a. G, e. k: h/ |

  11. 4 W; m2 c/ e+ e/ f8 g% Y
  12.     @Override
    3 Y2 K$ I, f& v4 R
  13.     public void handleState(Monster monster) {
    3 J5 z3 R- m( z+ K( H
  14.         // Выбираем случайный тип атаки: физическая или магическая; h  s1 o8 e, X* r3 R  W
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    8 U: j: Q: U2 h0 N
  16.   d& A: y: d6 q: {6 t9 Q) x
  17.         // Логика для агрессивной фазы боя
    3 C9 }: w+ @4 |
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " . P9 K, Z( }6 N2 j( J
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    % }* X% C1 }6 W# m* F  |9 v
  20.         4 U, l9 @& l2 V) q) I3 j! k# J: ~
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , B3 ?" A# R7 ]
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;1 x6 N; P) Q( ^) W$ L
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ! X( l  u0 a/ u0 s6 [
  24.     }% ]9 q7 [3 V2 v
  25. }: l7 i; x2 C! p' W) v2 `
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки6 ?  U& y; B" N; G
9 J, V  t2 z9 R
  1. // Пакет org.l2jmobius.gameserver.model.actor. v  i+ A9 |6 M2 R& m( b
  2. package org.l2jmobius.gameserver.model.actor;
    3 E2 q! }6 g  @3 P

  3. : u$ F2 z' S1 B1 M$ f+ _( h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 _/ o5 k1 _" \# L0 ~) \8 R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;5 k% f3 V; @0 N5 G0 |
  6. 2 W4 {' e6 |* n# f1 {; y
  7. public class Monster extends Creature {8 p4 m: x# U$ e' v/ x
  8.     private String name;8 S* T) I4 V& F8 c
  9.     private double attackPower;- N) n8 R' D% V4 y) N% y
  10.     private MonsterState state; // Текущее состояние монстра0 ]/ E0 j: V) ~& W6 W, P+ B

  11. : e$ b7 T) @. T
  12.     // Конструктор монстра/ j4 l! U3 Y9 g7 S% H
  13.     public Monster(String name, double attackPower) {  B/ f6 x1 o0 Q* b0 t/ y
  14.         this.name = name;
    6 o: x2 Q3 T4 C9 l+ G) J4 i3 Y& ~
  15.         this.attackPower = attackPower;! p/ y* Y2 b0 t6 j$ Z6 V% L
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию% {% X0 \, O/ V. N, s: r6 c- M& \
  17.     }* i& e# p- W1 x, s* V9 R1 L

  18. 2 y+ C1 s$ a2 _" m6 g. ]- z
  19.     // Метод для смены состояния
    0 R, C( L$ w) \* X0 A; ]
  20.     public void setState(MonsterState newState) {
    6 n: Q+ U" z( H( a: X' s
  21.         this.state = newState;
    6 k4 [8 W- o' \* }  S
  22.     }
    $ v2 [9 N1 G  {7 I5 D: i6 s  [

  23. ( y' b8 q* P  A1 D: a
  24.     // Выполнение действий на основе текущего состояния
    ( p% Z) n5 ^- R, I& k) C
  25.     public void executeState() {3 F: Q0 B- Z) h; S; L$ N
  26.         state.handleState(this);" K/ m: b) J1 U7 ~) {, @
  27.     }
    # ?; P; C2 z8 b$ A3 o' P
  28. % ~6 a, J; Y+ \1 ~' r
  29.     // Геттеры и сеттеры
    , K2 r, E. i! Q8 y
  30.     public String getName() {% D; S( b0 K5 N/ o6 i" w+ P
  31.         return name;
    9 b0 L$ I* _8 `9 v: Q
  32.     }! |7 @( ~- I! Q% K" T$ `

  33. 6 d( T6 }- @: X, q% n+ f
  34.     public double getAttackPower() {
    . I! v' a0 m6 w! z1 J
  35.         return attackPower;' }$ {8 `9 R0 d+ Y
  36.     }9 u: \: |3 W: G
  37. * q, S3 {1 Y1 o6 m! Z$ B
  38.     public void setAttackPower(double attackPower) {/ L& v* e0 c1 v
  39.         this.attackPower = attackPower;
    ) ]4 C$ {* i4 J; ?+ r
  40.     }
    7 a8 {6 c! K. G- G1 G2 U# ^+ F
  41. }
    1 y1 B; w) A- X( {' L
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.& c% ?4 y8 K# N( j

/ x! g4 Z  Y5 r+ L) D- m8 Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) Z& X2 s2 D( m: m0 u% n
  2. package org.l2jmobius.gameserver.model.battle;( O; z6 {, b$ W0 X! }) X( T

  3. 6 V' |. i6 I+ U0 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' v9 q& v5 C* @! K. G, s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 d- f' T3 P5 O% `4 Z

  6. # @! Z9 p! E  }% \' p- B
  7. public class BattleSimulation {$ [4 _: L! }5 `" ^1 ~
  8.     public static void main(String[] args) {
    : f, R: H6 H, d8 F: t8 E# O
  9.         // Создаем монстра) w3 d, u( Z0 N6 D/ [& r; j6 g
  10.         Monster monster = new Monster("Дракон", 100);
    + e( @# J$ @, a* \8 A8 x
  11. , j+ k# R: j( a9 n/ ]+ C; a  `- a$ ~
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак% m# t8 X- r5 P5 ~6 `: K
  13.         monster.setState(new AggressiveState());
    . y! l: Y5 n( B* S5 Q& D' f
  14.         monster.executeState();
    2 D% f# P* N% g& N
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак- F0 p  `1 ^0 `9 H
  16.     }) O0 v) I* O+ z
  17. }
    7 R/ f3 r1 M- L* l) c8 O; L
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
1 {+ l3 I& I$ ^# j  D2 BЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
! l9 j/ |1 i5 A7 B5 Y* \3 _% e" j9 d) ]/ S6 M! _, b# M$ p  C, }
" J: Y+ a: m) i, O
% `# B1 m* J. a% a; ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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