Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
& i& q( M# s! p$ h5 C! k- T( u9 W8 k  s, X  m
4 Z& k4 B& @+ O) E# N/ v9 K
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.- B" |2 N- X) [* ^. p* S, Z
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 j+ t6 Y" K5 h. e: M+ E
Астралия ?
/ z! J3 K3 N3 `
, w; C0 ^: K9 r# N+ X. N' S9 c" @: p+ J

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!- Y% N% V, v  M% C. P
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 P6 C4 D& @& ~9 S; p* B& f9 a0 \0 P- |6 G$ E6 e- ~9 k; i
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ' t( ]2 X$ _: Y
AlexCoder опубликовал в 2024-10-16 18:31+ |* R+ y! M* D' W' T* a
День добрый!
. u( g6 K0 l* ^6 c3 SВ статье описано взаимодействие игрока с N ...
/ C* U8 V. P/ r& y; \  l
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 }# e3 ^: i6 s2 [5 A) {

& ?4 v7 f2 }( Z6 TЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( O; L# r5 F; T$ ?; K/ O
$ ^9 s2 S6 c2 \7 O4 ]Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: S3 Y0 t" O4 [6 G: j% A- X" G! A6 A( n$ N: v
  1. <font color="Green">// Пакет для состояний монстра</font>
    * c- J4 p+ @0 t; ]0 n
  2. package org.l2jmobius.gameserver.model.actor.state;# ?8 `3 b! V5 s' N
  3. <font color="Green">
    2 ^  t; Z: c- M
  4. // Интерфейс, представляющий состояния монстра</font>; I: U; n' a# |( n8 R) K3 p
  5. public interface MonsterState {$ I% f/ d8 p2 f8 E/ [
  6.     void handleState(Monster monster);
    $ [% q9 q( F, L  d: G
  7. }  ^0 b6 A7 I5 n6 P4 Q  G
Скопировать код
6 N% H* N) g+ R% d7 R& ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) ]) Z5 w* r0 p+ ^- K0 O* `2 ^3 o) ]
Класс для начального состояния монстра:
6 u9 V+ t- l* L0 @$ ^
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    & O% n% N- ?, }0 |4 Q) u- A
  2. package org.l2jmobius.gameserver.model.actor.state;
    % B: F1 P1 v2 z2 w; s# b* M
  3. ' p2 H1 J/ z5 Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) r; {, O$ L, I

  5. / L7 O( d" i* A  r" ?
  6. public class InitialState implements MonsterState {( _; H% W; b' A# G/ i! O
  7.     @Override
      F' e; O1 B% {# d& ?  a/ W) Q
  8.     public void handleState(Monster monster) {
    3 [0 o) N4 @9 T" L9 Y. t
  9.         // Начальная фаза боя
    & d: O) l$ k' P
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 [' R* Z: c. e# C' i: c
  11.     }' x: w; X5 C( M5 ^0 ~# t, I7 Q! J
  12. }
    0 F( p2 a; {% U5 N6 j
Скопировать код

- r+ B; [) E2 Z, U* F  `. e- M
5 ]0 \" N+ N# e: @) s' W4 n8 ]3 G! t
) c2 X0 _) L4 I% g' u8 E
1 D& m! O  g3 L
. ~6 Z$ z7 |8 _/ ~' Q3 q2 _
# {; i: ^) E6 g9 W" z# ?$ u1 ~; c* q
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 P+ H5 S& o! E: y4 O% c; I
: @  _' P! e* c+ b8 J
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 n' ]1 d; [# H& |* t' S+ T
& O- ]! o+ T2 g0 }: Z$ r- eШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ e. W! B; i' ~+ S: o, `  H4 x

6 U  |( W) R3 c' t8 a
  1. // Пакет для состояний монстра; D. ^  e" O' T. [5 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 a2 b. S6 Q) @

  3. : k- n% `# ?: C
  4. // Интерфейс, представляющий состояния монстра: Z8 M# u  ~( \( F8 r
  5. public interface MonsterState {
    - Z2 n  {9 t& u3 t# L' V7 Y9 A3 P
  6.     void handleState(Monster monster);
    3 ?( y6 n4 S! m$ z6 M
  7. }
    : o& p7 b, c& x, t) x% b
Скопировать код

0 ?& I5 y* c6 `1 iШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
) s4 U; R& o: k" S+ y1 c
! h7 D1 C4 {+ x% y) U  L8 tЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 M: v' o" F! I  f6 i# ?
/ C6 ^# G2 Z' D: q1 n3 T
Класс для начального состояния монстра:
6 H8 {/ k$ h; K' _6 A4 y# X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " w2 l" N0 g; }2 d, u. A5 M
  2. package org.l2jmobius.gameserver.model.actor.state;
    . D6 S% O& r/ M  `' \. |
  3. - a5 E% r; i3 i* h+ v9 ]/ |( Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 \; k$ j% D' j. V8 f

  5. $ i, r( `4 G8 g2 }3 w. W$ Q% e
  6. public class InitialState implements MonsterState {
    1 i& ^7 ]6 B  }7 Z
  7.     @Override
      b% }, \5 w$ R
  8.     public void handleState(Monster monster) {; v7 A+ o! i% D; f7 [' |
  9.         // Начальная фаза боя# U6 d) b0 W+ ]* o" m2 W& _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( A& j; ]0 ~% H+ r# j  v& L% f. X
  11.     }
    $ {! B! }% Z) m5 C
  12. }
    9 v$ Y, y$ |: Q+ [+ R! c) y
Скопировать код
Класс для агрессивного состояния монстра:! `4 Z4 c, u3 G9 v, I; V: y1 f, L) Z0 {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / C' j5 C0 @  p3 _9 \! s
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' g4 s- |' S) w0 Y9 f

  3. ' T9 X6 [3 Q1 i# j  ]/ P' ]& ]6 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;! ?8 r' e! u0 Y7 p8 X9 |
  5. & E% Y$ j" s% S7 C# S& G3 o* U
  6. public class AggressiveState implements MonsterState {
    & M0 |8 X( e2 i) f  E: D2 o" q! T
  7.     @Override
      ?  M5 A( }# M) V% w: e+ Y+ [
  8.     public void handleState(Monster monster) {* K! G+ x, n/ |. [( |: R2 k/ Z4 \
  9.         // Агрессивная фаза боя
    ! N7 H" ~2 e4 t- ~4 B. }9 c+ m
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");; y8 S0 x0 Q. l0 Y/ R1 W1 h
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки, Q0 @* q( T3 l' G# w
  12.     }9 q8 e4 h" k9 [% G/ B
  13. }, i6 S7 z, o1 q- l, E8 p$ k
Скопировать код
Класс для финального состояния монстра:. N6 [4 ~5 v$ l$ V8 N! X5 h  m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, H* Q! O0 d0 n  g) r
  2. package org.l2jmobius.gameserver.model.actor.state;! I$ c6 C$ _2 V; c  d& E  ^2 Q" R/ [7 E

  3. * N4 f' t3 P2 B; L! L$ k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) Z( y, l3 E4 [

  5. ; M* Q  }+ x2 T& q( z; \, f% b
  6. public class FinalState implements MonsterState {
    . I+ k3 ?* C$ c  d
  7.     @Override& D& M+ G6 N& F2 Z3 P& R
  8.     public void handleState(Monster monster) {
    " C4 H8 ]5 w7 A8 ~
  9.         // Финальная фаза боя8 ~. A0 O- v% P) p% \
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    , T, X4 D5 F+ J4 d+ @
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 Z% C0 G& g* g. p" Y, ~! w
  12.     }# r: I0 r! f7 M# W
  13. }, G9 N8 @) B) J
Скопировать код
5 J7 u, a6 ~+ }
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: ~: p! K3 O( F0 n+ q: S
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / q6 w/ X! g1 Y, _! s9 F- Q
  2. package org.l2jmobius.gameserver.model.actor;  K; q- Y! p1 ]  t
  3. 0 F! I  l9 @1 C* f
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 E' L# u# H+ o8 x1 L* ~+ E
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! g, a0 K) ]: K. |5 K
  6. 1 T( l. F& G+ s! d: Y4 E
  7. public class Monster extends Creature {4 h0 ]3 b1 c& f! D0 h( {& X
  8.     private String name;
    6 e: i( `& N1 d+ ~7 z
  9.     private double attackPower;
    : }! x# W& a2 I* B1 z
  10.     private MonsterState state; // Текущее состояние монстра; {( a8 u  e: t3 J- L% d0 E
  11. $ b0 z, s* w% Q' x, C1 T4 V
  12.     // Конструктор монстра
    % {! m4 }% \, d4 V/ w' X
  13.     public Monster(String name, double attackPower) {* R: R) a& y5 R- N( P' _
  14.         this.name = name;+ p! I- E0 j3 M! E: z8 J
  15.         this.attackPower = attackPower;
    6 ~; V# P* I9 L2 L  K
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    * b/ g1 I5 e, ^6 u
  17.     }9 V& x, r0 ~& L! X3 h! C/ e( J" y; M
  18. - b- R1 [8 `: p% O+ o/ u5 Y( H
  19.     // Метод для смены состояния. F$ q9 Y3 o+ f9 ]; y
  20.     public void setState(MonsterState newState) {& z4 V( p2 S6 i( u8 [! p
  21.         this.state = newState;* i! J2 c0 v, L2 k; M; l
  22.     }
    ' S  a. u% o" r  ?$ B2 z

  23. ! s; N3 Z3 c0 N: B# K% w5 R: x7 f
  24.     // Выполнение действий на основе текущего состояния% g0 K; I! R& \4 a
  25.     public void executeState() {/ E6 z2 f6 }* Z2 o: u
  26.         state.handleState(this);+ r/ ?, Q9 a' n. P2 n' `" S
  27.     }: {% c5 J7 Z) W& ^
  28. / P* [9 v7 I2 M! ^
  29.     // Геттеры и сеттеры. u: J3 E- N+ C/ e- j  \/ y
  30.     public String getName() {
    2 Z6 T$ a; z& ?" r' K
  31.         return name;
    : T- c2 u9 l  j  I: m
  32.     }& U( {5 W+ v" E# y, I2 Y# ~
  33. ) I. q3 v# C# H+ P9 Y
  34.     public double getAttackPower() {! G# E/ Y, E) G+ x- X* J6 ~0 b& a
  35.         return attackPower;
    0 t' ], ^" K0 X: a% ]! j4 x
  36.     }
    + @: O$ l8 L  k- C

  37. 5 v+ [- P7 C/ w8 u6 d6 Z
  38.     public void setAttackPower(double attackPower) {
    7 g! u" k+ t5 l! L6 l! B
  39.         this.attackPower = attackPower;  M: p0 n9 l  d5 n$ a5 q; F' H
  40.     }8 m$ I. n$ X+ c) t# ]
  41. }$ g- _4 z- q  _  i
Скопировать код

, c/ `  O6 a% Q, P! ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* |. p$ p6 g/ `
. x3 `: t4 Q0 b- s3 y1 E
  1. // Пакет org.l2jmobius.gameserver.model.battle7 p2 o  K8 e& T: d: h( R! p, e: P
  2. package org.l2jmobius.gameserver.model.battle;
    : x; Z& c: m( {6 T/ ?
  3. 5 r9 e) l* w5 F0 U# ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 ]1 [: ]0 h  E: k" D" F6 i# g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    + w- V+ ?1 t3 M
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 g! H$ [1 m" y

  7. 9 E! {; a  O/ l+ n) [
  8. public class BattleSimulation {
      K5 B/ T. Z0 Z
  9.     public static void main(String[] args) {
    ) X9 Z+ i" v& {& d0 Y& P/ l0 C: d
  10.         // Создаем монстра с начальной атакой
    $ _2 ~+ P. Y. C8 U; c2 g8 H
  11.         Monster monster = new Monster("Дракон", 100);* `5 t1 }$ n2 g( n9 Y! I

  12. 3 y- ?+ o: B: x: D6 \* F& R0 L
  13.         // Начальная фаза# L! Q5 H4 t2 I" g4 |
  14.         monster.executeState();
    1 |8 |' E) ]+ u
  15. ' x9 h" x) o/ j/ R
  16.         // Переход в агрессивную фазу
    0 q% d. V0 R2 V: i8 I
  17.         monster.setState(new AggressiveState());4 t, s7 W. ?3 N# x" d8 Y
  18.         monster.executeState();
    2 F6 F4 X9 I0 k) [. _' w

  19. 1 w' c$ M0 C# ~6 J
  20.         // Финальная фаза$ `& D- m" }5 `9 E, l6 u) }
  21.         monster.setState(new FinalState());4 s$ G' _4 Z% m% Z
  22.         monster.executeState();% ?; r; ^& d/ @) P: n) G
  23.     }
    # n1 c. E4 [6 ~5 K
  24. }
    / c; P( P7 R6 y. H4 p- a
Скопировать код
0 k$ C  E. j5 c" W
Комментарии по структуре пакетов и классов:9 }! Z4 D8 Z  @  Y& ?: r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ `( U6 w6 R/ Y5 C/ K* ~$ I9 ~
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 g3 r6 }0 V3 s& QЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" _" J4 c# {5 ]
5 P* v( |0 b6 K  j' G/ S7 t2 u" z' k' G
4 L- ~5 @6 A9 n) d

; M# k" t5 K! a: R' @
( V5 J: t7 m. X$ {: H" N* w: F
+ u8 }+ m% p* E+ A6 |* x% ?, h, k9 Z0 b8 J. j" q
% k0 a' @9 U8 J7 X+ H' z9 T* M
# H+ n0 R  H  P. |" |3 H* G

, V3 ?: t$ i$ Z9 h+ z3 p6 y* w! M& K/ ~+ ^  }

9 _& Z6 d" d3 [' S; D6 w; q- ], `& w4 v

* U6 ?6 G5 Y$ `1 p
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:046 s+ R9 i% I) \( S
Для управления сложными взаимодействиями, такими как  ...
! e) R$ X3 y3 E: r3 S: B* e$ K8 b+ u
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
. D3 A0 h; c# k/ \" ^# PОтличный подход! Использование шаблона "Состояние" де ...
7 C2 q4 [3 R$ N2 L/ u9 Y: k0 X% k/ y
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.$ h2 @4 F- w) m

; b2 V3 d  Y9 n/ c0 DШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.! [+ O# O8 s6 K% R4 H7 E% n1 u
2 b( R( E% d2 Q# E5 i( Q
  1. // Пакет org.l2jmobius.gameserver.model.actor9 m% k! x3 h1 U$ T$ L
  2. package org.l2jmobius.gameserver.model.actor;
    / {1 z' [6 F" u( h
  3. 2 V- ^$ ~) a3 u# j  W8 E# N
  4. // Перечисление для типов атак  j# ]8 O  a9 K/ T
  5. public enum AttackType {
    3 v+ O8 Z9 {1 _* Y, C8 G6 Q
  6.     PHYSICAL, MAGICAL;4 M8 Y( v5 l  q# f% E
  7. }
    ; _- C2 W. k5 r' j
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.; |( B: K- r/ Z& x
Обновленный класс для агрессивного состояния монстра:
7 ^* I9 f5 _% l. X+ Y5 F# }: \1 [! [% d5 q, W7 c/ ?& ^9 [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, O4 @- G" F! G* m# o# b9 `
  2. package org.l2jmobius.gameserver.model.actor.state;$ [1 d1 C, {7 V: R' E3 |7 c

  3. , C2 {5 \: ]" k% ]+ ^) n
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ m6 o& ~) Z3 i- z, a- M- |
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ! L" X! U) `- F# N  X
  6. , r0 Y8 r- F& L5 _" l/ v. v
  7. import java.util.Random;( f& ^/ a& X, `! y$ ~) E9 M2 t
  8. + T/ _/ x4 x! j, {$ J
  9. public class AggressiveState implements MonsterState {
    ' k& E( X. o/ p% [9 G, T$ h
  10.     private Random random = new Random();- @$ h+ o% e' E$ T- T6 A
  11. ' f) ]$ p. m, E4 n1 C. A% [
  12.     @Override
    " P4 ~% G! S, Y% O. @. o
  13.     public void handleState(Monster monster) {$ Q5 ?4 A. Q, D
  14.         // Выбираем случайный тип атаки: физическая или магическая" i5 C8 l8 C$ f0 \
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;9 V0 d: B6 l' q7 i" s! z1 Y/ a1 q

  16. # {  y; T& R( H5 c( ~* t
  17.         // Логика для агрессивной фазы боя" G+ Z2 z( A3 X, `7 \: O
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    # B9 j; u2 Y0 p% w8 j% G0 ?
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    # a' X$ ?& t6 u' y
  20.         
    9 z. b/ v; u. L) Q5 `* |: u
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - `* r# T: R( p% x& Q* Z% a
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, n7 `8 u# n, d: y3 k
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    8 H8 ~. r; w1 ~7 e6 K8 F9 B
  24.     }' o, e! n* i& m
  25. }
    0 G; o; q# E9 t& b+ W5 w- O: x
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки4 I4 q$ q$ S$ j5 ~: y, P

  x: E4 {* `4 n5 I
  1. // Пакет org.l2jmobius.gameserver.model.actor  I% R5 _$ H+ V+ a, ]
  2. package org.l2jmobius.gameserver.model.actor;" ]% n! Y# H5 x* y3 b. y; }
  3. - Z: t7 A4 y4 |1 n, W  m! K
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( D' ~+ e( Y; m2 M+ Y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 Y& X  P+ M2 A) K4 g6 S

  6. 1 o0 X% M& l4 G3 t  Z7 l. A" g
  7. public class Monster extends Creature {
    ' G  l8 w# u( @. ?$ p
  8.     private String name;5 i& P2 L' M6 U
  9.     private double attackPower;
    3 s2 {: G* N2 ]5 j7 @/ q
  10.     private MonsterState state; // Текущее состояние монстра
    ' c* U9 L& M+ R$ |
  11. : P' i' q% n, Q. z
  12.     // Конструктор монстра& S% x, [. ~- y- V2 E( A
  13.     public Monster(String name, double attackPower) {
    . ?# w: b! w9 n8 m  ~* N
  14.         this.name = name;9 p5 Y( G/ |) T% b- c
  15.         this.attackPower = attackPower;; D4 p! |* B+ D4 F$ p" L
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию9 f- X- E& I* k+ z2 D
  17.     }
    3 w; {7 A; {, H" E4 ?$ D! p
  18. - j" v7 X" @: v. @; U
  19.     // Метод для смены состояния' {  _8 H' G* R( |; L
  20.     public void setState(MonsterState newState) {1 `9 `! e: R+ B9 R3 ~
  21.         this.state = newState;  `6 i% M6 g+ l& V4 k1 o& Y
  22.     }4 Z4 A* I8 i% J1 W0 \( u6 r+ k
  23. 2 I' k' j2 G, P+ I( r
  24.     // Выполнение действий на основе текущего состояния
    7 J, b; [  [& M# t, y" Y* A9 N9 V8 ]
  25.     public void executeState() {! G# z, c  K: S% x, ~: C! Z) j
  26.         state.handleState(this);
    1 h5 F: K5 E- P  B2 M
  27.     }
    - b' g8 X1 z% y" h$ U5 \4 E
  28. 4 Z( }; Z' t* ]1 I: f
  29.     // Геттеры и сеттеры
    # m3 y  |9 H  z% K* ]9 O  \
  30.     public String getName() {" f2 v( t' i$ M" r9 C
  31.         return name;
    1 e& i2 I7 n* p0 I* o' W5 G4 j; z
  32.     }1 B. _! y& f' _2 i  X& w* |0 L

  33. 5 K0 f2 H! y7 [, n) n1 h+ H2 P% b  p
  34.     public double getAttackPower() {/ Y3 ~* l( P/ A3 j( X; n
  35.         return attackPower;0 m/ Y; J$ c! t4 a3 d* @) l
  36.     }- d# ?8 L4 b) b* n. a6 \

  37. 5 X% }1 Z# [$ H
  38.     public void setAttackPower(double attackPower) {5 X6 Y7 a8 j9 Z7 t, e
  39.         this.attackPower = attackPower;
    3 [; J5 [! B. ~1 U5 g) ^: K8 c
  40.     }
    6 |1 z5 [' w" Q- ~( u( h: r
  41. }
    , b0 q$ }: {  u' B
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.& k: n0 D/ d* J( ?6 |5 T
2 d! j4 Y! N* ~7 q1 ]% z
  1. // Пакет org.l2jmobius.gameserver.model.battle$ t: h4 M, o7 b! m9 }0 O7 d
  2. package org.l2jmobius.gameserver.model.battle;9 ^. G% W* D. ?! N8 m# e5 ]

  3. : X+ e% N, |3 z! J; R- p, s
  4. import org.l2jmobius.gameserver.model.actor.Monster;" u( H  ?3 L8 D6 N( M. ]7 y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! H. ~* g- B: @; c
  6. ; `7 c  \* a# ~& I  d3 ?
  7. public class BattleSimulation {  ?9 u6 O) j- w- V. {
  8.     public static void main(String[] args) {7 i6 b. K& b' W( _0 c
  9.         // Создаем монстра1 y) B! [& y- {2 k' M
  10.         Monster monster = new Monster("Дракон", 100);
    ' L& }& |9 G7 M. x  f, G. X2 J
  11. % ^  |2 i& d5 K9 Y! P
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак/ M: X6 w; W1 ]. V
  13.         monster.setState(new AggressiveState());
    ; y* e4 C* N/ ]! p5 ]" a
  14.         monster.executeState();$ u5 R( b& ?9 m3 r
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    5 o  t. Y' Q7 _1 K: S  m
  16.     }
    9 h: _- }) B. }) }4 i& a- Q& j
  17. }: W( G" B; h( s# U  Q; U8 a' `4 c
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 b; u: {" ]8 Z
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!1 e# r; o6 I' p& {

8 c: e+ e7 D$ F6 M- b& x0 g* G7 _" h0 H8 Y9 j
3 X2 I$ n( c8 z( T7 v: I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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