Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
% a% c5 W4 f7 U7 O$ i7 N& Q3 x; n1 i( P8 z2 f8 u5 v
' Z) s3 t5 H  [- g5 z
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.$ y9 k3 T' c5 X* C4 t6 n
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!) j, \) q: u) ~9 D' C4 t8 y
Астралия ?# ]6 `, t8 n8 v+ j
) T/ [  S: O. ^

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
0 e+ `! M/ Z8 eВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 c3 x! U; t+ U* R2 v$ ?! y. Z" ~1 B% F1 M7 O/ n$ h" ~
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 : J/ R2 _, Z" K+ s( r
AlexCoder опубликовал в 2024-10-16 18:31* u- r7 |0 R- r
День добрый!
0 K; R! U3 g0 ~& X2 b2 JВ статье описано взаимодействие игрока с N ...

# B0 H2 r3 g8 f; a+ P1 B5 XДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
7 X- A) K8 c0 k4 W7 B! k' q
- ^. G$ H( F2 L$ RЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) s* |6 n$ h+ v. Z2 G- D

! U7 O7 @8 k1 n0 O0 S. E7 bШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; \7 a( `/ X( U8 i6 n# ~  s
  W0 o: _1 m! L' P3 q& {- `
  1. <font color="Green">// Пакет для состояний монстра</font>
    3 [8 {' P* ^- q; w2 p" s9 _* ^3 g
  2. package org.l2jmobius.gameserver.model.actor.state;# I  \: q- @! w, g
  3. <font color="Green">/ d" c( p5 X4 d/ b4 _
  4. // Интерфейс, представляющий состояния монстра</font>
    / Q- i5 c9 P2 D9 `: \% r1 Y8 t
  5. public interface MonsterState {0 K' P$ J3 R/ ^8 C& k) }- M3 f
  6.     void handleState(Monster monster);% N: A4 t" }1 P9 P% I
  7. }
    , L9 ]1 L- s/ I5 ]
Скопировать код

# t! T' k% G  p, @Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 W) @  p) A* m* M* ]5 k% @' u( F  [0 O6 w
Класс для начального состояния монстра:- f$ ?1 i  i# L+ p( Q8 N5 G; @
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>  ]. Q  e2 l" b- S9 E% e; D
  2. package org.l2jmobius.gameserver.model.actor.state;
    / d) e2 K' P" J7 D( u2 Z

  3. 8 ^9 f* T4 S2 H/ q
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 r/ ^6 ^6 M& j. n6 l

  5. * P  y/ @5 S$ y2 O  b
  6. public class InitialState implements MonsterState {* V9 S0 i3 `) _
  7.     @Override
    % o* j( ^: V6 J0 w# S
  8.     public void handleState(Monster monster) {
    7 g7 z7 p+ T" s$ r# `
  9.         // Начальная фаза боя2 n' c& O! X/ C0 G/ {6 \5 C/ }1 M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");% g' |% d7 |) n7 G/ \9 ~# j; i
  11.     }/ l" R3 U8 J' Z  K4 s
  12. }
    , w- ]- C& I1 t! @6 n( [4 \/ W5 F
Скопировать код

5 S0 I0 t' j- k7 q* X/ O2 }9 C$ a. N9 T1 n

  g5 z% Z4 B6 E. s* e) j2 P5 x6 r$ U4 h- n5 f
3 B3 p# d. y# e' @! ]+ Z
" b8 P* ]$ v: j. Q) ]; \7 F  h7 V

; [7 ]1 {+ {! T) M# i4 A( H
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
  o2 ^0 Q8 Z6 R; V1 \" J/ |# {. G- g( ?0 }+ w1 V3 u3 T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" M- P# N" X' {& b) E( c9 E* P
) Z- j+ H5 ]/ Z$ {- B, M, ]; e  c" V. wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! Y* W9 @* f4 K  c
; b2 j9 X4 @$ l8 n0 x
  1. // Пакет для состояний монстра
    % t4 ?- s' S% s3 s" P$ L0 N
  2. package org.l2jmobius.gameserver.model.actor.state;0 ~0 |4 w7 m9 |3 C2 I- ?2 K  U
  3. ; r$ k) ~% `- ?$ m
  4. // Интерфейс, представляющий состояния монстра
    ( s/ M1 S/ s: _
  5. public interface MonsterState {
    ' C! W$ e3 [& N: g3 j
  6.     void handleState(Monster monster);
    ' ^7 B6 A( f8 K! f8 n3 L
  7. }9 ]/ _% q$ G# t5 \% N
Скопировать код
/ c$ f) A: b+ `+ E
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
0 d. C% z. E& [- q/ f" y& |% Y  m6 Q! v, l& k
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 J9 t/ ]1 q6 [/ W- b! y- m8 ]$ k2 B5 }, H
Класс для начального состояния монстра:
% K# ?" D5 _4 n' o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; x+ z- J9 Q0 A/ R, y+ z
  2. package org.l2jmobius.gameserver.model.actor.state;
    % N) w5 E9 w: r* F$ o( I# j

  3. : n9 J. m- U" M" |  m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & U4 M8 A: @. x/ _: s& @0 z
  5. 6 H" V( G7 D( s
  6. public class InitialState implements MonsterState {
    7 e- s: c' M2 n% O! b# ?) E
  7.     @Override
    * {/ `( d. w  }2 A
  8.     public void handleState(Monster monster) {
    $ H  Y3 Z1 B; ~) G. [- f. v- a
  9.         // Начальная фаза боя/ Q) N1 `/ R$ z3 ~& ^) m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# p! ]/ x% \8 H+ [8 C
  11.     }
      I, ?! K2 h" g  g9 u1 G9 ^
  12. }( W1 D: I) @' q! ]% [" q4 N
Скопировать код
Класс для агрессивного состояния монстра:
# _) I+ P& ^. ]! x  Z; p% Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, G, k9 H& Y* O) O/ I- U
  2. package org.l2jmobius.gameserver.model.actor.state;! c* P, `3 d' j( H( q
  3. 8 ?  t! C, C2 M: E7 g* `
  4. import org.l2jmobius.gameserver.model.actor.Monster;% c, H% }  Z1 i/ N, I" d7 L
  5. 9 f  ?7 W, c/ Y# Q% v! U* q
  6. public class AggressiveState implements MonsterState {
    - b& ~9 U. ^' f* z2 j+ u# n0 b+ K1 K
  7.     @Override8 K- l9 h# _1 s* y9 j: O0 O
  8.     public void handleState(Monster monster) {
    ' G2 q8 @0 q  `% I; Z
  9.         // Агрессивная фаза боя5 J! ]) [) Z: T8 i
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 S* `0 n! T: n1 Z- h' @! T
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки6 s% y2 u; l2 H0 s
  12.     }. l! o8 ?, K7 i  v3 O! E* N1 `, W
  13. }
    . @: y, v( u" }/ |/ E/ `
Скопировать код
Класс для финального состояния монстра:
, A! d( E8 ~0 }9 K3 v, D% i! x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , b) M% J7 {2 [
  2. package org.l2jmobius.gameserver.model.actor.state;: [+ ~/ P9 J, k/ m+ q

  3. " r0 Q; @) t& l% L* |% q5 w* R! J
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 y+ m# o1 V. r6 e. w9 K
  5. $ M2 o" O' F: S- M- M( s# k6 y
  6. public class FinalState implements MonsterState {' E* x" r3 C) f
  7.     @Override6 p. B" \2 H" q) f6 _! X
  8.     public void handleState(Monster monster) {
    $ b( n! `& _2 J, h5 r
  9.         // Финальная фаза боя
    - k( E6 `, t1 }* L/ V. }$ d, Y- g
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");1 S' o4 D  T* F. L; V
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" D3 z2 Y' q2 U
  12.     }
    $ q' ]; K  V' r
  13. }2 l6 |3 V* m3 m9 L6 ]$ A
Скопировать код

' j9 B# h9 _# X; WШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! Z% D0 P5 U) q% r; P
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . R8 X+ i2 U/ M* x/ R7 @2 b
  2. package org.l2jmobius.gameserver.model.actor;
    ; w5 [9 n9 c2 J
  3. , k# G3 a$ U+ `9 X; ^# M% _1 S7 f! Q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    # U4 i3 Y2 i- R- i8 D  I/ F1 b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) K* P% B# K, O! I

  6. 6 U0 e1 C( h( j1 p/ O. f7 r- o- ]( F
  7. public class Monster extends Creature {
    : {. `1 I0 G1 j+ u
  8.     private String name;1 x9 f+ I2 o& V$ P! }9 I
  9.     private double attackPower;
    0 A5 y! E# }6 S- N/ i
  10.     private MonsterState state; // Текущее состояние монстра
    ! q  n, p6 }7 u6 c* n

  11. 7 p1 Y) m8 [1 _' `
  12.     // Конструктор монстра- v* j9 Q* `: p& S
  13.     public Monster(String name, double attackPower) {
    ; s6 H+ ^( c# [
  14.         this.name = name;
    4 s; O9 g. {; j7 x" t: P& ]
  15.         this.attackPower = attackPower;
    * i8 T, Y* |5 X2 S
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние, M; X: v5 g& L5 V/ q' m2 Z* N7 }. f
  17.     }
    & N6 F1 K& y# }- }( W
  18. ( C7 v7 J5 B4 f0 K
  19.     // Метод для смены состояния
    : O" z7 Q- \8 B: i+ x" G+ ]3 S/ I
  20.     public void setState(MonsterState newState) {
    # g. W2 h9 D# K. Y1 l* h3 v
  21.         this.state = newState;
      D5 d( ~; x' T8 @
  22.     }
    + P! o$ K9 P6 G: b* }; J

  23. " O- y4 f. m; _
  24.     // Выполнение действий на основе текущего состояния
    ( ~: M* d1 K1 V( M
  25.     public void executeState() {
    % }: W( V, h/ O1 i' U
  26.         state.handleState(this);
    " c7 n& u$ N& U# [- E3 H
  27.     }
    . w) s) |, I" ^/ ?) A% k
  28. 1 u& f% U( c) Q2 u  K% T- D
  29.     // Геттеры и сеттеры  }$ ^% a: J5 u2 j/ q
  30.     public String getName() {( q7 w: {: h: z% r, n- X
  31.         return name;8 e/ s2 w5 D* [+ \$ n8 `3 Y
  32.     }
    ! K7 r) _& }0 Z3 u' \5 O4 A

  33. & y, ~& H) U' `. T+ R) S; i
  34.     public double getAttackPower() {' i1 E& |8 Y. [5 Z7 q. V6 c1 }
  35.         return attackPower;! r+ J% }: w" _
  36.     }
    - h' ]: F1 p  Z- Z+ |: V

  37. " [, K- ?8 u' m8 J% g/ w' o& B1 @
  38.     public void setAttackPower(double attackPower) {9 k" ~1 H. S+ E6 I6 C) m
  39.         this.attackPower = attackPower;
    3 w" J1 w0 ]% i& J
  40.     }: f+ a* G$ T" a$ |( D9 a# j
  41. }
    + F+ X" e8 F+ W$ r6 ?* T! D
Скопировать код

& Q2 n& Z+ v  v# g2 b( SШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.& r  `# v( ~& ~5 ?. u, r
8 C/ L% N/ W6 I; U* M9 a" Z
  1. // Пакет org.l2jmobius.gameserver.model.battle- ~3 F6 S. P: h1 H  t2 U
  2. package org.l2jmobius.gameserver.model.battle;
    3 r+ N7 [5 B7 R, Q& i

  3. $ ~: O$ Y/ s# H1 L. Y: p  G4 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;' A" Q$ o# \3 M5 C; b3 I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    # b, _$ e' j4 s7 v
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;3 S) a- Z4 S! J6 c3 b* s

  7. 0 p- O( m2 L8 b- L! v. E4 b
  8. public class BattleSimulation {
    , H' z5 p- U5 F: l+ {# w& H
  9.     public static void main(String[] args) {
    9 _5 p* ?# T: H4 @7 U, i( W% ]1 b
  10.         // Создаем монстра с начальной атакой
    3 c# P: K) F1 n& |/ ~' ~% `- P% H
  11.         Monster monster = new Monster("Дракон", 100);
    2 J3 C0 B% D7 b

  12. & K& v# d1 U0 q5 ~
  13.         // Начальная фаза! a1 b  C' i& e4 A4 L9 ]2 _4 V* `
  14.         monster.executeState();4 q# `  g. }7 p7 G" w3 g
  15. - X1 H: Z$ }. O
  16.         // Переход в агрессивную фазу2 Z6 r8 W6 b: Q3 I* _8 ]
  17.         monster.setState(new AggressiveState());
    ! f# j# G. U% Z+ K
  18.         monster.executeState();/ A$ h7 Y# e8 w, _

  19. / ?6 {" g+ Y8 U1 C" @
  20.         // Финальная фаза
    ; r! A( m, s7 V8 `3 e) f$ ?$ T
  21.         monster.setState(new FinalState());% d9 G, f6 h% \
  22.         monster.executeState();
    6 }; S9 D$ S5 K7 [: p
  23.     }' W) R& ]- |3 y
  24. }" ]4 y8 a, g* P& ^9 o
Скопировать код

* o# ^: _4 X: w; C, L$ BКомментарии по структуре пакетов и классов:4 `1 \4 k! }9 W  Z
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    5 f2 }3 L# w, O0 @: I9 m
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. q" m  }0 X9 G% H. VЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 i% d$ s0 B0 o* `  s  `9 v* s, E( v

3 a9 v6 B& p/ D. i. ]
& }, M& C( @- p; i0 D
3 F- [9 j& d" k! M$ k3 {" L1 f, B. k6 \* N! |5 P9 i2 s8 |, X9 }
% T; L5 _  \0 g  h5 [/ {, W: K
7 v, @# a# c5 Q! |) f; I' @6 c
$ y6 k. K0 `- W! H# _
6 t, G! q1 X# j. y6 z
. j  r" W; L# F- ~

% h: a4 f! e7 S
" D  y) a( x% Y. F# d! h  c$ k0 W! ]; `  z, ^. R) ~
( n  C7 X) A, X$ e

2 Q4 u; F# c9 P! \
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
. O7 _4 s1 }7 Y; [: y+ U4 j. ZДля управления сложными взаимодействиями, такими как  ...

6 ]6 j5 D) L: c# ~Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ o& C* v" J* l, L- H- L5 l4 Q7 x' O( ZОтличный подход! Использование шаблона "Состояние" де ...

" K# s6 ]  c" R( r, @$ B* F$ xХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
  P9 h; t. C/ U* G7 P; M6 C1 ~7 ^# ~) ^, f2 e0 r: P
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
" X; {4 ^0 J2 r. {+ K0 R7 r: |
7 |6 \% ?2 x4 b% Z% T- d8 l5 A
  1. // Пакет org.l2jmobius.gameserver.model.actor4 O7 }, _$ Y9 U) T( F& m- }2 t# n( u
  2. package org.l2jmobius.gameserver.model.actor;
    ( K8 F6 d" x! j. m
  3. , [* Y- q) U+ d/ U; S& P
  4. // Перечисление для типов атак
    / B! b2 R: t* e: A8 v1 S- f
  5. public enum AttackType {: b3 p* X! ~; L( v7 R* P4 ^
  6.     PHYSICAL, MAGICAL;
    + X5 r! Q+ v" o! m6 }' f
  7. }
    ; P( P8 D+ ~+ @5 X# C) i' ^
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.' B0 C5 p1 e  G; M
Обновленный класс для агрессивного состояния монстра:
! f  n! ~/ x! [. Y' Z/ x7 w
. Q( A+ ^1 v5 W  p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state+ z; M2 x& b6 C. p
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ {+ r" ?/ i0 D8 [  d

  3. 7 n2 x% j" X- Q" C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + O" `( [' @6 _9 {9 l
  5. import org.l2jmobius.gameserver.model.actor.AttackType;) K2 S6 r0 j  `" v0 r
  6. 2 _+ @5 k9 G6 E; ]
  7. import java.util.Random;8 z' R" W) f. @- ^" t  d) x' B& v
  8. ( v, W6 ]; @. N
  9. public class AggressiveState implements MonsterState {
    # H& ^9 m/ ?( x+ X" O( m: x
  10.     private Random random = new Random();" J7 \, G& s9 j, N6 a. h2 U  L

  11. : \/ n! d$ y6 c2 D+ V2 H2 V, z
  12.     @Override
    ' k6 u/ O8 _" X- R3 G, v4 t
  13.     public void handleState(Monster monster) {7 k: N" j5 D- k- u
  14.         // Выбираем случайный тип атаки: физическая или магическая
    # ]& M1 B. m' C% R$ d4 g, J% d1 n
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- j& w/ X1 v" w/ X* V

  16. 4 Q5 J( z( O% n" _
  17.         // Логика для агрессивной фазы боя* p& c/ A/ r8 T' t. Q% q+ y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ! ^, r+ |5 \, r1 j# a6 \8 ]
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    9 e) C- b: N3 e4 m
  20.         ; Q( u: [3 q6 M: f. V& p
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - v' N% S  c7 b& s6 L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    6 P' @& w% N; q  m9 ?1 W3 d" X6 z
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);' A( j$ a% q( K5 s
  24.     }
    7 V9 g, p$ L) D( r
  25. }
    * n1 ?6 x1 K5 |' `- G
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
; D' ~. y% s' J9 Z
- Q) v+ }2 E( Q0 l. L
  1. // Пакет org.l2jmobius.gameserver.model.actor# B5 i5 ?3 M, W: m6 B9 E
  2. package org.l2jmobius.gameserver.model.actor;% Y5 F4 R0 }3 B

  3. ( ^$ p" J& X4 M' J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! g% y! x* [9 C; a3 L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, G9 h# Y5 }4 y7 M  j  H: l3 b( Z6 h

  6. 2 u/ n$ F4 u$ Y* e0 S4 f8 L
  7. public class Monster extends Creature {* ?' H3 l5 y6 K* ?! O2 h8 ^
  8.     private String name;
    " C' R. u6 H) u* H* ?: R# @
  9.     private double attackPower;
    : t9 S# x' K0 F. r
  10.     private MonsterState state; // Текущее состояние монстра2 Q2 t% W- x. |6 B

  11. + [1 g0 e6 d& o" Z1 T1 Y$ D
  12.     // Конструктор монстра! [& a, j6 t1 _  Z5 v
  13.     public Monster(String name, double attackPower) {5 B. D6 J* w% z2 f" `  z
  14.         this.name = name;7 _; }  h' _: v# Z' e
  15.         this.attackPower = attackPower;# `8 F# t% `5 L5 K: W; v: _# X% J( K. D
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию5 F! G) r' n# V: f5 g& h9 _/ [9 V
  17.     }
    ( n0 ~; t9 ~- T: a7 Y1 b

  18. % x. }' {- Z: R5 G7 q+ P# z- z
  19.     // Метод для смены состояния3 F0 `$ q6 |6 Y+ c0 n( e. v) P
  20.     public void setState(MonsterState newState) {
    ' |4 f: Z+ w7 m5 |' G! l. O
  21.         this.state = newState;
    , K: S6 U1 o2 q$ |, ]% W( f
  22.     }
    5 o" H4 v& Q$ R( K  W; n
  23. 1 O( w7 e- w7 Z# c, r! a) K/ R
  24.     // Выполнение действий на основе текущего состояния
    4 {1 x4 ^9 o7 A  A7 h
  25.     public void executeState() {
    1 y5 t! G' h5 ]5 X9 E/ F
  26.         state.handleState(this);/ c; e0 d3 k/ q/ n7 w
  27.     }- g- k/ V" v: ~4 Q5 T" k
  28. ( H- H8 ]0 l& p+ `' ]
  29.     // Геттеры и сеттеры! H1 P) T; w6 V6 L' W* x
  30.     public String getName() {7 Q1 e* Y' m* F+ v; W' _# v
  31.         return name;: q1 t' t$ E% A2 J8 X7 W( s% N
  32.     }
    # W( G1 v! M2 r% }2 ]
  33. : Q2 V0 {* S2 e7 `- @$ g
  34.     public double getAttackPower() {; S. _% K: x9 T8 m, z& _/ |
  35.         return attackPower;9 W' G% m9 H! Y3 r" J) R
  36.     }3 Y- d% q, ~% t) y# l$ k) S

  37. 4 d5 q( q2 I6 q8 {- ]- L# M
  38.     public void setAttackPower(double attackPower) {
    * p: U# s/ \7 ^- U5 m$ O
  39.         this.attackPower = attackPower;
    2 M9 W* V; g; s' K" j- |! j! U
  40.     }
    6 c! x- X/ v+ _5 l( A6 Y" J% V
  41. }
    ) Z; M) p8 ~: s- E! ^' t( z
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
- _' k& j& p% L/ S) L+ Z) h
+ P5 d( y6 D  p
  1. // Пакет org.l2jmobius.gameserver.model.battle. y; j; `7 k/ e! O7 @
  2. package org.l2jmobius.gameserver.model.battle;- G7 L1 \+ v" |4 e7 ?; _

  3. 1 t* G' h. R5 [6 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : c! d6 T" m2 M. }. C8 I! P) g# X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& f! |5 |" b, E9 ^# v
  6. , J, U5 F" m1 C, l$ l
  7. public class BattleSimulation {
    / E- ^5 F, k; m' H+ _4 A( ], u: U1 o
  8.     public static void main(String[] args) {
    # K) {5 z# `4 I& }2 F
  9.         // Создаем монстра
    3 y5 K! V* }3 V. B0 Z  J* m3 U
  10.         Monster monster = new Monster("Дракон", 100);
    # z5 [; N: @# }, _7 l8 \

  11. " N5 P1 S$ L& F+ }5 o
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак3 Q& j4 ~0 q. D# o
  13.         monster.setState(new AggressiveState());
    3 u& a" T% w" T& T. K
  14.         monster.executeState();
    . K, J: G' n: Q7 y4 K( y( c
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак! T  O* D5 @: y
  16.     }
      s- C7 N" r2 W9 p
  17. }9 {0 s% t! {3 ~# e! P) v
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.4 ~7 C) N( d: ~# T* B' K% O- _
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
7 r' D2 J! B) Z5 E7 ~( \- P
2 |/ Z( g  Z& c- W/ F( R. V
- @6 w$ N" g: j" n1 E( y" u
; P$ j* c; u% X4 g' B
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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