Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!8 x3 T- s8 c* y2 }) b

! v0 g7 k+ f9 R1 D+ Q$ j
' r: O6 I' F: H0 z: o
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
' S5 T& x7 N) I. n" dЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
: U1 k6 a1 V# u2 ZАстралия ?
$ y1 C- ]* E, K( @0 g' t7 ^2 p+ `& B2 |" e4 \

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
5 x  e% b: h* B# i8 YВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?) J8 l9 e+ t% G6 y% X, n$ b

* N. M! o: i! r) [8 I
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 8 V  M, o) M& R! m# {# i
AlexCoder опубликовал в 2024-10-16 18:31' T$ i3 ~3 H- R, j
День добрый!
' K! \, T8 J' I. v5 N1 ^' yВ статье описано взаимодействие игрока с N ...
, y8 W, N8 f% x; K
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 ]3 w; m# o0 z: p% W) a

# T2 Y! H$ E( \& W$ ]! @Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.9 ?2 j' @2 ~5 v

4 W$ |; R% U$ V; D; I* D, IШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& _# j4 k3 }1 [0 H) a+ D* G$ a
2 }% L' I, U' G, |' Q$ P% |
  1. <font color="Green">// Пакет для состояний монстра</font>, N7 B( R, U2 Z% w
  2. package org.l2jmobius.gameserver.model.actor.state;. f) n; t7 Q4 s8 j3 ~3 e
  3. <font color="Green">
    0 t& }5 x4 b& y
  4. // Интерфейс, представляющий состояния монстра</font>
    9 ]4 d) N) c5 B' U5 w) X2 B% e% Y
  5. public interface MonsterState {
    : X9 [3 z9 z* f4 U! p- T- `
  6.     void handleState(Monster monster);0 o& [1 [  U$ A; R6 M0 T
  7. }2 `$ C% i5 {. B2 A) q' d( L
Скопировать код
, t2 i- P1 y% O$ {4 h: h3 f6 k
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.4 v; }6 [- H7 h& p( a8 ~' e9 A
) ?* ?9 \2 y9 T8 ^2 r; V8 c. w
Класс для начального состояния монстра:. Q/ `7 H; K1 C
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    , L) _# s: x6 n
  2. package org.l2jmobius.gameserver.model.actor.state;/ D4 l1 D+ e# `, y0 k

  3. 7 O% i9 n& ~7 c( q& ]' d# w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; T" Y& w+ N! g7 i
  5. 9 E+ ^, A7 w; j" U& x6 I* ^$ ~
  6. public class InitialState implements MonsterState {
    # i3 N7 W2 z2 i
  7.     @Override2 k' y6 A! B2 t4 T; ^$ G
  8.     public void handleState(Monster monster) {
    1 y# c4 T( Q) y, t- d
  9.         // Начальная фаза боя6 v& U/ D8 m' E, m8 B( D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 }) E1 k" w0 u$ [9 d1 Y5 p
  11.     }
    " B$ \/ ?" n# j. y. G4 r# O
  12. }) Q- V6 g$ V+ d" V/ e8 K) Z9 ^0 u8 G
Скопировать код
" u+ y- R2 n1 i2 ?, i; _+ D
4 K/ r6 T( Q9 {/ ^6 K- K9 x" J

7 W6 h( x* G$ ?  ?' y- T) G
: e, m8 I3 ^2 F4 J' n) g
" ^7 i1 ^% s' K1 H! Y& u" B# ^. w- q
& S$ X* B9 ?( l: l) ~$ j; x
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 Y$ B9 ^1 j- s& l4 J; V: j2 ]
4 {0 I; v  @* l4 m0 N+ g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 z8 S& E9 J: \- b
4 S' M. l5 y' N
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., |2 Z6 K3 P7 T/ m- N' T* M4 D* |

3 H5 T+ r1 s; e7 M8 A8 ?5 Q
  1. // Пакет для состояний монстра3 j7 S9 e4 g/ r6 F; ?  N" ]
  2. package org.l2jmobius.gameserver.model.actor.state;- l$ T# ~+ L4 E! t: o% S
  3. 0 T7 ?4 y! k. U& @; Y
  4. // Интерфейс, представляющий состояния монстра
    - ]2 w( B+ |& ~
  5. public interface MonsterState {. Y! ^& `/ R9 ?+ r' j
  6.     void handleState(Monster monster);
    1 `) q& e0 S) T' c$ T9 l8 l0 ~
  7. }
    * M! v, I, t, S! u# ^$ j+ m$ s; d
Скопировать код
7 w( h% `" y5 n9 g$ ~% |7 I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ t+ C; d+ J* ]2 W3 u4 t" {, g( H
  k5 n9 H' l7 R0 A& L% j" f0 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ q' v) ~$ v* E/ P0 r5 t- m

7 z# K! H7 j" f) eКласс для начального состояния монстра:0 b! q1 J4 L2 V( D4 c& J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " b. h6 z% y, v2 e
  2. package org.l2jmobius.gameserver.model.actor.state;; ~9 A- U6 Y8 P4 q) k

  3. ; ~! ^* I( X" V  U: W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . P1 t$ R+ g6 m1 P9 ]0 M

  5. 0 t) h8 }2 b" j+ f3 h7 |
  6. public class InitialState implements MonsterState {$ h/ N% `* d0 T; u
  7.     @Override3 |" y9 b* n8 M, O) l1 h
  8.     public void handleState(Monster monster) {+ m! N4 c, E, r  v, ~( _) o
  9.         // Начальная фаза боя
    : u( [7 P) G# \
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * W: {" H' X; D: n: j% U
  11.     }( U" r" v( R! X3 J1 @! r
  12. }
    1 q  N1 Y& b# w1 M. N2 k
Скопировать код
Класс для агрессивного состояния монстра:
! Q5 \- e  l6 U5 u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 z$ }6 [+ T4 c' e1 i* Y% l/ u/ W
  2. package org.l2jmobius.gameserver.model.actor.state;5 n% B8 C6 T) X1 {" O& X" t

  3. 4 U* [; Q" }4 h) R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + Y( H' C( _9 h3 f* o; F
  5. ' u) J  D# `$ c5 w& m6 T
  6. public class AggressiveState implements MonsterState {8 b2 n2 [  R$ A0 A( a' _
  7.     @Override
    , _2 _$ E% z1 E
  8.     public void handleState(Monster monster) {3 t: I+ g4 V3 Y" y# b; p
  9.         // Агрессивная фаза боя9 p! K; D7 ]3 C' B
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    # f5 `- `& l; s+ D+ ~* g- f
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' p" J  D1 q8 P( C# T; Z
  12.     }( D% G  a8 M  A7 O+ Z6 A9 M  A
  13. }
    ' R2 }& k" b2 M  j  B
Скопировать код
Класс для финального состояния монстра:
, t% Y6 l& U) r# f1 y% Q1 H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 r! S% n( Z( j! c& ^
  2. package org.l2jmobius.gameserver.model.actor.state;" s7 j2 j) X# Y! y" w5 q4 C& v! r

  3. 6 E+ _8 f7 t5 `6 R$ G
  4. import org.l2jmobius.gameserver.model.actor.Monster;, ^, Z0 d$ d2 L9 T! Q, d* |
  5. / l: N5 ~9 Z, B
  6. public class FinalState implements MonsterState {& v9 q7 Q, B3 l+ u+ V
  7.     @Override
    . d7 B3 d2 q' B
  8.     public void handleState(Monster monster) {+ t( c: M# u. G: f* v2 c
  9.         // Финальная фаза боя+ q  z1 V2 m1 V8 ]5 [7 Z" W" B
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    * Z3 `3 [; B5 Q
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    7 q) B1 @4 j* l! G- p% C
  12.     }
    3 u9 b/ S/ l+ M" Z2 y2 P
  13. }* H0 N" p7 ?; {! I, a* ^0 Z! Y. [& j
Скопировать код
% W6 |4 \$ S( C. ^$ N3 f, q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
$ `+ J* k; L& ~2 F
  1. // Пакет org.l2jmobius.gameserver.model.actor; i/ k- b# {- r% r9 X% k5 j# l
  2. package org.l2jmobius.gameserver.model.actor;# H8 G. L$ m; }2 v1 x

  3. ( V1 X3 _) Z2 c( T8 O) \* ~; u
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    8 Q. b# N- }% h( g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;! j3 T: W7 A+ h" b. [, R3 S& B& R
  6. # M3 a' j: G/ k  m& K
  7. public class Monster extends Creature {6 h9 X3 M1 n8 ^
  8.     private String name;
    . R* V- ~3 O" v4 ?- g6 a. l
  9.     private double attackPower;
    ) M; @' l. K% q0 R8 q
  10.     private MonsterState state; // Текущее состояние монстра. y. Y7 @$ T' x' O( L8 X

  11.   z  R5 h9 o7 R' `3 W
  12.     // Конструктор монстра# h0 q; Y2 a8 z' g5 {* l9 c2 k( v
  13.     public Monster(String name, double attackPower) {$ g8 A7 P: |6 s" @7 y6 g$ S
  14.         this.name = name;
    % U; N# g% S$ X. @0 y2 @. ]: }
  15.         this.attackPower = attackPower;
    ) i+ M# h8 |7 K; H' E% ?
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 ~" q2 y3 \6 m3 T& n1 C
  17.     }2 W1 B! }2 }, r+ {, r8 @7 o
  18. 6 m! R5 v( m7 r( t8 c
  19.     // Метод для смены состояния
    $ D4 L( k: m- s
  20.     public void setState(MonsterState newState) {
    & x" o' z; ^  B& `5 d  B) _
  21.         this.state = newState;6 z# ~2 s3 X( G. b" f
  22.     }
    & _' O4 B2 b, u4 h' Y

  23. ! L6 R! ?( t7 c) G( d
  24.     // Выполнение действий на основе текущего состояния
    9 ^) x/ D7 n! Y2 [- }! r
  25.     public void executeState() {+ T+ X" b. L# ?& X. R7 o
  26.         state.handleState(this);, N/ K+ h( C$ K/ B+ G7 o# `
  27.     }
    6 I/ O( M( \4 f1 L" E) c

  28. 2 g  q0 N9 {3 Y9 S# H% f
  29.     // Геттеры и сеттеры2 O  X# y- D( I- m0 }" J* X! T# Z$ ^
  30.     public String getName() {
    / W2 B& `& T2 D  @# n$ |3 \. T
  31.         return name;
    0 X5 c5 f7 j/ U, Q
  32.     }: @) ?1 Q8 z( B: V2 W
  33. ! [" ~7 |1 F5 O9 H& E0 `
  34.     public double getAttackPower() {0 ]2 ^! Y7 o6 B
  35.         return attackPower;
    2 d! s5 P2 S' ~2 s+ G/ S
  36.     }
    # o: `2 n& q' J3 V4 w6 v
  37. - E* \# |" |& \, H8 e; u+ a  t
  38.     public void setAttackPower(double attackPower) {" R4 K/ [2 j1 M9 x- M4 p$ P+ D
  39.         this.attackPower = attackPower;+ g1 {  f- w# X& K/ {
  40.     }6 H# c% X# C) x7 M+ n# f* O# l
  41. }
    ( b1 t- R# N/ {: A" g5 v6 ~" t
Скопировать код
- B5 o9 G$ u5 i5 c$ D( u- S- e
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
( a1 I* j% ~) x  S1 B) t/ z) U! Q* C- I( p
  1. // Пакет org.l2jmobius.gameserver.model.battle* Q# j% G) H5 f- r/ \% z
  2. package org.l2jmobius.gameserver.model.battle;
    1 |: O: I$ K5 C" F8 u) P" T- F

  3. - d# Y0 a- V! w- }9 o5 u7 K4 h
  4. import org.l2jmobius.gameserver.model.actor.Monster;: r% S& {- X/ O* O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % M1 d" m1 Y: q& t. ?! W
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;$ S- C! }9 {) c) p3 B9 e

  7. 8 Y. ]1 H# f4 q5 l3 N8 i& Y
  8. public class BattleSimulation {
    ! f* h6 l. i  i5 c# H9 I3 i) R5 i
  9.     public static void main(String[] args) {) @; ?9 l. M7 Q( {: h8 C+ ?
  10.         // Создаем монстра с начальной атакой( U% E4 b6 A2 _  m  I& c/ G0 S  H
  11.         Monster monster = new Monster("Дракон", 100);' e/ q" q6 F: L( b8 c! K0 G, h3 ?" f
  12. 0 S* B; R8 d5 U  {, \: d1 J, `
  13.         // Начальная фаза9 ~2 D0 y8 K' |/ i5 s  p/ y: e
  14.         monster.executeState();: r' o1 Y& E3 L5 g) M& y
  15. , s5 f' ^! w& A8 X0 M4 e, s
  16.         // Переход в агрессивную фазу
    . e* H; h! k, \
  17.         monster.setState(new AggressiveState());9 J/ u8 S; @& G0 J
  18.         monster.executeState();
    6 H; i* F4 Y4 [% f+ P

  19. * G# e* l4 f$ ?" H1 g1 }
  20.         // Финальная фаза
    : ?( [0 a* _' r: L0 U' i
  21.         monster.setState(new FinalState());$ u, H9 d9 E! G- q
  22.         monster.executeState();
    - p6 w$ T; L  L: I
  23.     }: \# u* J+ W" v' D
  24. }5 e% J+ z9 F1 h
Скопировать код
+ @$ Q7 D, f' C& j" L5 S* I& o
Комментарии по структуре пакетов и классов:5 G6 N$ a: `' `. L& @  R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ u7 t8 {9 g% ~+ M, C; T0 H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.: T( j, v0 p# H9 R4 j8 p
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 t! w+ u% R6 j5 j5 i

" S2 |2 O" g* N; N, x& z
8 M2 a- Q  u- ?/ N
4 u. g- B( L" W' Z) U9 _2 y: O. b- n* [
* A" r* y+ q. g: ^3 h% `7 {, k2 G
3 }% V* x. g. I+ y& a* {
- G; O+ z/ ~1 G% s1 v  Y

0 ^" P& j5 [  C
& K5 w6 ~, O# ~2 V) z$ I; w' r3 e9 r- m3 _
8 i& \. X7 g+ P4 U# D: G& P

3 S1 {/ b8 o2 P& d# g$ Q% t- `6 i1 b8 ]' `+ a( |
! a5 b. L( m2 E; ~+ b. v4 S: d% M" _
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04/ p8 P  O  x% J
Для управления сложными взаимодействиями, такими как  ...
3 o, d! Y! P' h
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21' H8 o% N+ s: z9 K/ E
Отличный подход! Использование шаблона "Состояние" де ...

' {' h1 K- j# `2 `Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.: ]" e7 J! K% o. g& Y7 x
: ]. C8 @  j" k/ O% V" P% X+ ?
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
/ {' R$ {/ p. {' ]5 V% V2 m6 D# N
+ s; ?# b  P! P8 a5 K8 @! @! x; H
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ m8 i9 g# i8 I
  2. package org.l2jmobius.gameserver.model.actor;+ ~2 x* }# _# b4 t
  3. 1 I+ Q+ N$ t, X: U* e. m4 K
  4. // Перечисление для типов атак
    % @( C# D0 K* T
  5. public enum AttackType {# t9 ~$ ]0 S  y, X
  6.     PHYSICAL, MAGICAL;
    5 W/ g3 R$ X4 B' v/ B7 C( e6 t  {( F) j
  7. }+ Z) |4 f" B# ?
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
1 _4 K, y9 {6 v6 ~1 fОбновленный класс для агрессивного состояния монстра:+ H# i' |. n) S5 I3 k5 ]6 t' X! _

( j9 d( @3 O% T4 ~  z/ A' ^6 q, t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. H) I, j" P. l! Y- y" Z
  2. package org.l2jmobius.gameserver.model.actor.state;5 ~" l5 a' |; U* t# X
  3. 7 H$ K1 W1 o7 J% M( V$ X: Z2 l1 B7 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 S0 b$ c& N9 R  _; Y
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ' d( b! E& t6 K& B/ S7 n1 j8 R
  6.   k" o! z3 D% }' C
  7. import java.util.Random;0 C, ^. ?6 q4 x4 s3 _
  8. , }9 `8 J" L* m0 L3 z& D8 P
  9. public class AggressiveState implements MonsterState {
    ; z; p* F# O" M$ ?- I
  10.     private Random random = new Random();, L& l! Q5 Q$ L
  11. / p. M6 C1 [. l% O- J
  12.     @Override1 T3 |( {; \" \$ g9 y: s+ o. h
  13.     public void handleState(Monster monster) {
    ; x2 a1 V0 S3 R
  14.         // Выбираем случайный тип атаки: физическая или магическая3 y6 Z! r1 {" O$ n( q6 B% e
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;: z: T5 o' o- U6 I& g/ [) j& g

  16. 4 d/ r6 J- S& W  `3 H3 ]9 P9 A
  17.         // Логика для агрессивной фазы боя
    ) n9 ]# d* O: }; a# x8 K
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : f& D* Q# F" U; a
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    $ p) ]: z3 _% M* C! A* L
  20.         
    * N$ i# v! x% ]) q# q. ~
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    % h& \$ C3 T& u( x5 ~; A+ V6 t8 w
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    % O6 _/ }/ v0 s. U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 a2 n6 F+ Q, I) n. l9 C' x
  24.     }
    4 }% A' {, l: ~
  25. }# T4 z% X& W) U& h/ y! d2 [# t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. U+ \# b- F# J4 |. v0 Q- m6 q) A$ i" M( ^- _! z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 V* t) D  a9 T, R6 u
  2. package org.l2jmobius.gameserver.model.actor;1 O) g2 p$ U- d6 R, w% S* l

  3. : \3 Q* ~' Y  B; K* _) K1 H2 J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , M4 W/ Y" I1 z2 P- F$ I  h' [) t% ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* ^  v9 Y5 F& d
  6. ; U7 t4 w& Q; E3 \: \
  7. public class Monster extends Creature {
    . X( @  B, K' r/ T1 s8 d: r. U+ x; s
  8.     private String name;( E  P9 Y( B7 p4 l9 V6 @5 i
  9.     private double attackPower;
    : I' t* i) H  {" H5 }7 s) z
  10.     private MonsterState state; // Текущее состояние монстра
    * B$ u0 ~' M! t. s) P' L* g

  11. 3 `9 @/ m/ p2 h3 e
  12.     // Конструктор монстра
    * k  [0 E1 A/ V5 H* Y7 i4 b' Z
  13.     public Monster(String name, double attackPower) {
    / W, ?) X9 r, f& p, _  |8 N$ c/ M3 K
  14.         this.name = name;7 e4 n; A* i" @. @& Z$ J4 t1 }
  15.         this.attackPower = attackPower;9 d) V3 O. N6 l7 z0 a2 m% g: v9 B
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    3 e7 I1 i0 C/ O
  17.     }
    2 C. w6 n4 G  ~
  18. 2 C+ w+ V3 C$ @8 W. C
  19.     // Метод для смены состояния
    1 J- i: t6 w8 W; f0 m, ^- ~
  20.     public void setState(MonsterState newState) {8 X( G! u# G& C5 @* l2 o( o
  21.         this.state = newState;
    6 e( B" @* B" E- I+ `
  22.     }* ~# L# c! v3 p, d. k3 l
  23. 2 M2 }. N& g9 ]' H
  24.     // Выполнение действий на основе текущего состояния
    , N* m( ]3 o! O' M* C3 D$ C
  25.     public void executeState() {6 v$ M$ z9 s9 O2 p" c, \8 a0 q! ?
  26.         state.handleState(this);
    # K$ v: _" L* m, c, W, t; ]% L
  27.     }. R+ R+ e$ }" s' b7 b

  28. ; D+ q2 {9 m9 N
  29.     // Геттеры и сеттеры
    " I9 K: `' p! a' T5 R* p& z
  30.     public String getName() {  c3 e' ~7 ]' {8 I6 F9 ^5 W
  31.         return name;5 F) U8 |0 U4 x4 i
  32.     }
    % f  A! ^  z2 d+ Q3 l
  33. 7 j0 v6 K, r; n
  34.     public double getAttackPower() {' v, ^% ]7 m5 I/ `
  35.         return attackPower;
    8 l+ d) a0 L- A' w$ t
  36.     }) J1 U# t  o7 ^, ^
  37. 0 L" K& K% l/ V& O5 l1 h( o5 `( E
  38.     public void setAttackPower(double attackPower) {
    4 c* \& c% C# `
  39.         this.attackPower = attackPower;
    0 L1 Z- D0 I0 Z% E! j$ k: J
  40.     }
    2 E- Q9 ^) e: {2 z9 c! f
  41. }( u5 F6 @9 W. M# p. c) s% B  x
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.6 P  D: ?/ e5 N. ?" [, i

  @6 W" v1 J4 c4 b
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 `# O( m0 i2 q# _7 v) h! R1 K
  2. package org.l2jmobius.gameserver.model.battle;# J7 i) s- }$ z

  3.   }4 Z9 {' ^5 F- ^+ F3 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . _8 c3 U7 S4 r/ ?5 j/ K
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) v+ y5 t+ m, k( y# C! C- M) l

  6. , G( x; b# g4 Y: K0 M
  7. public class BattleSimulation {
    1 M+ a" N( s2 e7 W' W+ ?
  8.     public static void main(String[] args) {
    % E; L8 A' h) B0 K7 O) _$ _) p" M
  9.         // Создаем монстра6 u; V; L" k0 @
  10.         Monster monster = new Monster("Дракон", 100);! N& n& X8 u, n# V1 r

  11. : X) P/ C! i. E; G
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак1 T  o, J* d0 ^8 i& O
  13.         monster.setState(new AggressiveState());9 d$ m* d! r) a; i# I) Q
  14.         monster.executeState();2 D4 X$ b, h7 A& M7 K! R
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    1 j# S2 g2 b1 E8 I
  16.     }
    - L" s9 Y3 ^9 k& u
  17. }2 x' ]; i: Y! K8 |: s! q5 q. u9 u
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.. a1 @9 }; x( r* k, I$ t0 P
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
, U. {3 M( ~* R* k: n- a* ?# W
0 J, Z! l  W" i- X# I+ N! ]3 k* T
" J2 T7 c* j1 n0 L) g; C: b
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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