Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!# V: O4 ~4 ]0 E; ]8 q, A
' w' I1 ]$ Y$ s# g% e/ s9 C

1 B: t1 S  _6 R$ }Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.' S4 e6 i! H) e8 z. F) D( V
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!. F0 _- |2 F; {$ X; _
Астралия ?6 J+ N; o7 K( P9 M* K, D) o
0 w' ~9 F+ h7 b# g0 S2 D' c" R* n

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
5 v5 a2 U2 |# {! H& tВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?" _2 M, F, n7 U( z5 \; S" x- ]
( W/ S9 s* X5 n; v7 V* R* t' ?6 p
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: |1 C  u0 A4 ~; I4 @  g  j* O
AlexCoder опубликовал в 2024-10-16 18:31
3 i* n/ y+ E# a' v! DДень добрый!4 \9 F: K3 f$ s" j4 p# B- i
В статье описано взаимодействие игрока с N ...
4 R# G$ n2 G0 x0 t/ E3 d
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - t% o( t1 n( {- T* g+ g

% V- h/ x/ U# I1 ^" L7 A# mЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. `  Z) ?8 ?( S" p/ m

8 v) t$ n/ X4 }6 U9 _- J6 x+ w- WШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- J7 D) h5 H3 r! \% l, m$ t; D7 R. Q
  1. <font color="Green">// Пакет для состояний монстра</font>  m# \2 N% L! w7 I" b
  2. package org.l2jmobius.gameserver.model.actor.state;
    , K, J6 a) ^3 _' D  u
  3. <font color="Green">
    9 L( A, u- u' n3 ^8 P$ ^
  4. // Интерфейс, представляющий состояния монстра</font>0 }+ ]0 ]3 D; i; x4 C3 }
  5. public interface MonsterState {
    ' Y2 v4 U4 e4 Y6 y- @' e3 o0 F2 m4 J
  6.     void handleState(Monster monster);2 {4 \! \( G  l3 h" L
  7. }) Z- Z# k+ E5 A7 B1 \
Скопировать код
2 Y8 k& X7 F; t2 F% \( o1 d# b* ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' [4 c# A( V& p0 S
( U" N4 i( e; Q" I% g# ?3 n
Класс для начального состояния монстра:
7 p( N+ z+ @( h) ^6 M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    - ^( g9 C* n# V2 H
  2. package org.l2jmobius.gameserver.model.actor.state;( l9 B( L( W! x/ V( }  x* N* S6 e

  3. ; h1 r% R0 D  y. S6 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) I4 _/ U8 G' s$ m8 h& e

  5. : Q7 R6 e6 `/ ?) x" a$ _
  6. public class InitialState implements MonsterState {7 O2 R- W/ c% v4 m  b% m/ `
  7.     @Override( @6 p0 X. b5 S4 l: y7 w+ a% Y
  8.     public void handleState(Monster monster) {
    / `' X' e  ^$ e& G' D: h% Q
  9.         // Начальная фаза боя( R8 i3 m& a2 f3 z, Q  q, E! R: J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 w6 b0 z3 }6 R& I/ T! Z0 \
  11.     }
    $ d% c. y! ]* @5 M' L; G/ i& V
  12. }
    ) M# X" z* A( l$ H
Скопировать код
( B7 t0 x6 ]1 Y% b+ h! J) {

5 X7 O/ ^/ h: m. T. o1 G6 q5 t1 U+ M0 x8 ^3 Q

( ~  G. w" k9 E. s& ^% ~
% e- i2 |) I! h; A, }
3 C' P: j0 k3 u9 }  n- ]$ x
8 e! i5 C7 I% p7 d- \2 A. @$ S9 |
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ j4 @: ]0 N% u1 i
* r8 s! f& L  l4 l9 O5 Q8 S- o& U* RЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 i% N# D# R0 n: }
* y7 u  V0 c+ M7 b0 h( ?4 d
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' L* W0 a8 h0 X9 W4 S2 X

, u/ A4 x. [$ _
  1. // Пакет для состояний монстра- q  Z+ H0 }/ Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) y3 q" }' }$ J) A3 t+ x0 M* \% |5 y( j
  3. 2 q5 X) X" z+ l; q9 s4 F
  4. // Интерфейс, представляющий состояния монстра
    . u+ Q" L: k  b2 h0 t
  5. public interface MonsterState {
    * U1 q( O  r, O" e( s
  6.     void handleState(Monster monster);
    " t- e, Q7 f1 P8 ]; b
  7. }* O/ W- y$ |9 v- Q0 J
Скопировать код

+ A9 ~& K! n& m9 N% }9 tШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
4 K2 D; ~8 M2 o* |9 J6 W6 p/ T& Z( w& h
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! M6 I  u* [  P  \3 q

, e3 F( [# G* D+ b+ P0 p+ d, {& OКласс для начального состояния монстра:
- [/ B0 L2 F4 U: ~- D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& U# f, |5 A5 H- n4 ~/ I$ ]
  2. package org.l2jmobius.gameserver.model.actor.state;" I( w4 ?+ j5 X5 w0 l
  3. % P% s3 ?* j/ d3 r* Q+ Y( J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 H0 W5 k# V* x2 Q$ X7 L# s# Z
  5. - M/ @  [/ b, X2 v) i
  6. public class InitialState implements MonsterState {
    1 X$ V& L) U, x, g
  7.     @Override
    4 [7 K) l; F! q  I5 _
  8.     public void handleState(Monster monster) {
    9 L* Q$ P* H" l, y
  9.         // Начальная фаза боя1 a5 U! |+ E- r2 _, x$ I( f; g
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    - D* m3 \9 @! D3 M% Y
  11.     }, ]4 d+ V7 w2 f- z. U
  12. }& [: h+ x& T0 l
Скопировать код
Класс для агрессивного состояния монстра:
3 [+ n: ~3 z( v6 O- O! t. L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- f! w) i7 I9 F
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 H( t! h4 _8 V1 b$ _" b
  3. 1 `! F9 l# A% y9 J; F7 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 e# Q2 V& H9 _8 F- Z1 x. O+ q

  5. 4 j9 U" c, J7 I0 \
  6. public class AggressiveState implements MonsterState {$ L. R8 I+ k4 u8 M! N# Q
  7.     @Override
    ! h; K- E% V0 p# w7 x3 O, T7 p0 o7 n
  8.     public void handleState(Monster monster) {
    : |. D  E% U+ A: M( {
  9.         // Агрессивная фаза боя- U* h& ?: @+ R' }+ H6 X! {
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");/ {/ Y. z( K1 ^3 z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ; F& {+ [: C6 q! w, [; n8 {
  12.     }
    8 W- d# r) T8 h2 C7 ~/ J+ b7 ~: g
  13. }* u3 r3 P: ], s, s. d8 z
Скопировать код
Класс для финального состояния монстра:
% u/ H$ R- [% c* s0 T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : O5 r/ a- @; u; u0 e
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( k3 ?- L, b' h3 l0 O
  3. & ^( G* z, S+ C# f# H
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 q0 V2 j2 E- T7 e9 |7 v) H6 Z

  5. % ~% S' i& @5 T9 I
  6. public class FinalState implements MonsterState {, n7 u; T5 v8 {1 G
  7.     @Override* L2 O9 _5 d4 F! K+ \$ Z, B  B9 |9 B
  8.     public void handleState(Monster monster) {" g, W8 [. h& k) j: l" G) K
  9.         // Финальная фаза боя
      a. t& E' I% Y( Q/ r& P8 m! o4 g- d
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");3 x- P) |% A: r
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# Y5 @8 u1 y6 D# n4 X6 r
  12.     }
    # v! ?  z( F+ ?& P
  13. }7 b! d) H# t, l
Скопировать код

* l) K4 p2 K: \4 I* {) K, w6 d: XШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* `1 G4 y, y4 G! @: r
  1. // Пакет org.l2jmobius.gameserver.model.actor8 D# P- B7 N# M( h
  2. package org.l2jmobius.gameserver.model.actor;
    # G6 K* a$ K' o6 L- W

  3. . ?+ ~) h2 y8 |0 f: q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    $ P: ]& Z6 t; p8 H& \7 n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;) M9 ], H5 f# l; {4 P

  6. ! [9 b& S7 _& u$ `: G6 v
  7. public class Monster extends Creature {% N1 w* k" O$ G2 E
  8.     private String name;
    2 \' `) _; t; i5 E) {% q6 B3 k( W8 \
  9.     private double attackPower;
    " J- E7 k2 `/ Q! n! E. s. F
  10.     private MonsterState state; // Текущее состояние монстра
    ' U. d8 d/ Q8 z  `; o: i

  11. ; u6 ?4 K4 b% n) C  Y. o! ^
  12.     // Конструктор монстра/ k) @: @* Y7 O' s
  13.     public Monster(String name, double attackPower) {
    2 x4 S: i8 Y9 O1 z, Z
  14.         this.name = name;6 e' d9 ~% f2 Z6 W' V. U" O
  15.         this.attackPower = attackPower;$ }/ O, ^- Q8 C" u) ~
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние4 Y9 F3 O. s% Z7 j2 \' L5 c1 z
  17.     }
      V2 Y, T! G$ X. r' t5 R1 G

  18. * J% P1 E$ c* c4 t4 A
  19.     // Метод для смены состояния& h1 q: ~) ?; ]: s8 }
  20.     public void setState(MonsterState newState) {* y4 x) O5 F* f* H
  21.         this.state = newState;
    ( {( B* w- C' i
  22.     }$ u; X2 |6 S( p6 \! y

  23. - |" e, S4 H) u& s  U! C
  24.     // Выполнение действий на основе текущего состояния
    0 g7 S* v: B) n9 z
  25.     public void executeState() {
    4 {9 `2 q6 l, Q, a$ q9 f- p/ M* C
  26.         state.handleState(this);
    5 Z" }9 S- G6 Y. `% t. h
  27.     }; Y3 }2 @' O& n

  28. + j, v; J7 a! v4 C2 c
  29.     // Геттеры и сеттеры
    , ^6 e" y, O. {. i# ?; k- `/ p- J" H
  30.     public String getName() {! y6 O9 q. [, z% x+ j6 I
  31.         return name;) ]  r% f) `; B% D8 ]! |! y$ e& e
  32.     }4 I. V* v& b8 N3 d5 D

  33. 6 W! d8 n" F9 \
  34.     public double getAttackPower() {% O9 r( l  ]/ O, P$ z; B
  35.         return attackPower;5 h' t* i  ?& v* k0 L: D1 @
  36.     }: z# ~* p3 M$ J2 q8 j' d4 K

  37. . u9 ~8 w5 T& q# h5 d
  38.     public void setAttackPower(double attackPower) {( O6 r3 N6 W' T6 n
  39.         this.attackPower = attackPower;+ l9 }0 w( y, `' [; q5 A2 V
  40.     }
    ' e2 U4 @5 n8 J, [
  41. }
    0 P7 y) z( U. G) T0 J3 L8 v
Скопировать код
  G; r* }9 ^2 F9 C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
' Q8 d' a0 Y3 d8 F# C7 E% l+ V1 M* @2 J
  1. // Пакет org.l2jmobius.gameserver.model.battle/ }0 P: n: O% u% b
  2. package org.l2jmobius.gameserver.model.battle;
    # p8 v- L7 {1 ?8 O7 K, R

  3. 7 c- e6 L7 x$ `( l' I5 C( }: {: u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + i: }! s( Z! G0 P0 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ w' Q4 t% L8 c" L+ Z" @) K
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    2 W# q, _0 l7 K0 ]9 Y
  7. # o  O, t) I9 f3 V: c2 U
  8. public class BattleSimulation {9 X5 b# H0 v8 i7 \
  9.     public static void main(String[] args) {! B% V5 r' J. N& U
  10.         // Создаем монстра с начальной атакой3 h. W: l$ j1 S3 K1 s, ^* x6 k
  11.         Monster monster = new Monster("Дракон", 100);
    0 M: s( _% r4 y0 ~0 d7 ?  s
  12. - {, a, P* G' l2 Z2 I3 g% w
  13.         // Начальная фаза; a% B: C8 l+ v, R# C; X
  14.         monster.executeState();
    * W) j  k; a+ X" p' h3 {) S

  15. 0 r- K& R2 x  E- q% E7 ]. H! n
  16.         // Переход в агрессивную фазу
    8 A/ h; u. G' r& r" j
  17.         monster.setState(new AggressiveState());
    2 H, ]- m% g5 g6 G1 E/ \% @0 |4 R8 G
  18.         monster.executeState();( t6 ?6 x, t8 R  u7 `( x6 o% a4 R: s

  19. ! t" h- R5 j" o( x
  20.         // Финальная фаза& o- [9 V/ f3 k' I
  21.         monster.setState(new FinalState());- I, U/ A" O, C
  22.         monster.executeState();! g2 d+ \0 }' w, v
  23.     }/ V2 x2 [& U: P7 y0 o  c
  24. }
    1 C( A& J9 m% s: f7 r+ ?- n
Скопировать код

4 `! M, ]2 v& q& k( U) Q9 `' ZКомментарии по структуре пакетов и классов:
2 }+ S% g; c& q# _0 @
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    3 L. u' F" T+ [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% v0 A- T- h/ _0 ]0 M0 u/ EЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ B$ J4 z( B" J- n

, }! E: ?3 E+ r; |  x* z; }! \3 ~* y5 T6 U# D$ Y' ]; m6 d4 }4 P: D  G
# |& d" A. y8 K& S
! X/ o8 n/ j$ i+ M5 o: k
$ ], w- p6 K+ J8 o. R

1 {2 O7 }8 ]" V4 K1 B3 F# V( C9 I
4 Z' _, s" `3 x% a  @! q$ q1 F+ E, y8 X$ X3 H9 C0 W% y
; h( P+ I5 |" m% w

2 |/ M' Q$ Z& N* k
4 d) M; w  F' j2 |3 q
8 p& B; |- d/ I: O  c' j: W
% q) J; Z! ~! s7 H: a. b. g8 I' E- h- Y
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04- k' {5 h( v+ D
Для управления сложными взаимодействиями, такими как  ...

3 R2 j: v6 D1 `4 s6 Q9 c$ ~Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21. K( g& H- D& o: b
Отличный подход! Использование шаблона "Состояние" де ...

4 Q8 t- g4 a. ?! ~Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.' X# W8 G4 x6 u' S7 a$ n- Z& l

' G9 G  F  O: p; L: c( h+ uШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
2 m1 R9 p( ?' y1 k0 D
0 o" @9 M" j1 _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 k2 O; M1 l$ r2 u8 X, `
  2. package org.l2jmobius.gameserver.model.actor;
    : L" ~: v3 o" C9 ?' ?& u: f

  3. ! _( }3 o9 ^4 D2 n; p) d" j. `
  4. // Перечисление для типов атак
    ) e: A+ N) n1 k+ k8 ^$ ^- w# Y  f
  5. public enum AttackType {) o% Q9 [, I- R6 r' }
  6.     PHYSICAL, MAGICAL;
    3 i; P0 c1 \* b5 S, P8 K
  7. }9 v2 ^1 `( \4 \
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
% D7 M8 ?3 z6 @7 L" KОбновленный класс для агрессивного состояния монстра:
0 y+ r2 @% X, t
1 G1 e" G* C' z. d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! V& U  Z8 x/ D- t
  2. package org.l2jmobius.gameserver.model.actor.state;
    - f. p& c; M' j
  3. & l1 R% H; q! Q8 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;* b+ w. Z. W0 O* a, n# C9 m
  5. import org.l2jmobius.gameserver.model.actor.AttackType;7 A  F# E7 ~1 C( T# C# u
  6. . g# Y4 w8 o3 h; q
  7. import java.util.Random;; }% W* A, E. n2 N( y* ?% G

  8. % O1 F: y% Z3 ^) d$ h1 s+ ~+ K
  9. public class AggressiveState implements MonsterState {9 b; P' y! l6 K  ~: @4 `
  10.     private Random random = new Random();
    - j( z1 J! X) X/ L4 F1 Z/ V
  11. , g# Q1 l! M& T) `0 C- R: u
  12.     @Override
    ( z( C0 v& h; r# I+ ?; A. p0 I
  13.     public void handleState(Monster monster) {
    * I. t2 O! w! x# s5 Y- C% l9 C& S
  14.         // Выбираем случайный тип атаки: физическая или магическая6 |' b* d% Z4 L0 r; u* L
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    & `/ ]1 ]" B% N; S

  16. / b7 `" D4 R' \* V- M
  17.         // Логика для агрессивной фазы боя
    / G& f2 y3 ~* t' J9 h
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ) D8 @& q$ O. f, D! N. r/ o6 b
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & a+ n5 q5 E1 f7 ?
  20.         
    : b' @3 N4 B7 q1 C* k+ c, Z7 e
  21.         // Увеличиваем силу атаки в зависимости от типа атаки9 S1 S+ Q1 {7 L2 Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;3 I- E8 Y3 S7 k! K/ t, C( O
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    * \; W: c( M' x1 Q6 T# }: u
  24.     }
    - m* D& F: F3 w- D4 F7 b$ Z# M
  25. }5 d/ F0 f+ t# w0 L: H. b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки& [6 x* G; t6 U) h4 y/ o  c% v" d

% B& Y& c! M5 h* }& V0 Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ! j4 y6 t6 }3 K
  2. package org.l2jmobius.gameserver.model.actor;8 y% O1 H" ]; L, A1 ]

  3.   W6 P" X. G$ \; Q$ ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;, C0 C  N$ I& W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 y. t( s) s* W% c
  6. 8 @* m; P# k- m% f2 f
  7. public class Monster extends Creature {+ ^. }: h% a! t. y: K
  8.     private String name;
    : b7 C" r, R7 w# n
  9.     private double attackPower;
    ! ^+ w% j: f& c$ f) ~" k7 l; x0 o
  10.     private MonsterState state; // Текущее состояние монстра
    ( O$ `7 M0 `) e: f$ y
  11. + ~  M! P  k0 J- r- V2 j8 p  n2 M, N
  12.     // Конструктор монстра9 }/ q9 p+ o& q: g* q
  13.     public Monster(String name, double attackPower) {
    5 L. p( k' k. |
  14.         this.name = name;" Q. Y3 a3 }5 ?
  15.         this.attackPower = attackPower;
    ! M( D. E4 x8 R: n
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 J+ O+ p5 u4 W% k, `9 }
  17.     }
      A9 ?9 t: T7 Q. E. l

  18. + Z& D) Q& N! V) R$ O6 M+ |
  19.     // Метод для смены состояния
    - `* `3 E6 [( w8 o( c& k1 [3 ^
  20.     public void setState(MonsterState newState) {
    . i  c! j+ }; t* d4 }1 r& C
  21.         this.state = newState;) k3 x( I6 g8 R: H2 O
  22.     }
    / \1 I2 V, B, I  d4 N& X
  23. 0 z4 a: q& t: F/ G6 N2 B2 [5 k
  24.     // Выполнение действий на основе текущего состояния
    , E+ e  c% O- B8 x
  25.     public void executeState() {
    5 e! p  z/ ]3 d( a
  26.         state.handleState(this);  P8 f; s* q  g* e4 V  W7 N' M6 F& h
  27.     }4 R5 }1 q& v5 u

  28. " d4 ~+ p& p8 `- C2 H3 D* i
  29.     // Геттеры и сеттеры
    + y8 h8 _. K9 m! a; ~- K
  30.     public String getName() {( _0 U! w4 ?$ m, i4 z$ `
  31.         return name;$ Y7 L* E* L: B! B$ Q, I0 d" ?
  32.     }
    : |9 z, o( ?( C
  33. 4 u+ w+ n# i5 a/ w+ x
  34.     public double getAttackPower() {, K% _9 u3 e. V* ]/ X
  35.         return attackPower;) y- V0 Q, n6 s0 N$ \5 Q# f: G
  36.     }
    + a) }/ Q8 `8 q5 N  _6 j: P

  37. ! h1 P; W* U  b: d& |4 k
  38.     public void setAttackPower(double attackPower) {
      a3 C6 r9 ~; M7 p- L, Q; P, ^7 |
  39.         this.attackPower = attackPower;
    & |7 R8 ~* Q% k7 D+ j% I# Q1 E
  40.     }- D4 y; e  D. a4 U5 X
  41. }& P0 r8 R: v; W; }+ J3 z! N
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
; Y$ `3 O. @, l% q% m% s- }
/ R* e; l. [% _
  1. // Пакет org.l2jmobius.gameserver.model.battle
    7 a7 w! p  x" _; a
  2. package org.l2jmobius.gameserver.model.battle;/ d# F, L0 U& C  T' ~) S7 J2 a

  3. : \& Y; `: n5 M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % @$ ]7 P. F& ]6 @" O9 C
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % q" G0 Y& b+ g0 G
  6. 7 }* N: @: `/ g( ?7 j; w  e% i
  7. public class BattleSimulation {8 R; v2 b8 b& ?& m1 n  ~
  8.     public static void main(String[] args) {
    ' @4 c4 ^3 ^5 J' c# ?+ N- Q" H
  9.         // Создаем монстра
    ; Q3 y$ }' [+ [2 s3 K/ X
  10.         Monster monster = new Monster("Дракон", 100);
    ' F6 k' r" S- k4 t4 d
  11. " n# G& [' K3 b0 J/ u- q
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 \# K% P0 C$ L
  13.         monster.setState(new AggressiveState());! p* P7 @& X8 F+ Z+ E5 o/ V
  14.         monster.executeState();
    ; ^: `4 b+ [" O2 d( G
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 Q/ F; v4 _7 J: O6 \
  16.     }
    . D+ d2 o) g- Q& y# }/ ~- p* n5 J. v
  17. }
    ; h/ l) s9 ?# K1 [# Q
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
  M4 }/ h0 `" l+ CЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!# D* P0 T0 `  @3 W4 R2 v: c
, ~5 b. g, o# l  B( A1 ~6 ]
2 S) I' b  x% H

6 a+ ]! v) k6 z/ u8 O6 x% _% }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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