Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
; N1 ?/ g) z# ]' M6 J# i# j- X  O$ K- [- i1 @

3 `# s/ M! y- e. Z5 g& TЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.5 Z) B+ Y  H$ u1 q
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!- Q) ^+ q5 U/ `; ?4 Z
Астралия ?
. Z7 c+ K$ I( J. b; _, c" U
( g; k2 x6 N: P: V7 R0 I& Z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!' _1 U0 [# a# ?/ _) k8 _0 b
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
7 w4 P: f2 @7 Z( w
% K. p/ j6 v; a$ u) z/ Q$ [
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
2 I1 v& D" _4 Y) E2 K) c. X
AlexCoder опубликовал в 2024-10-16 18:318 y$ k: e0 w, x0 c! k; ]& y
День добрый!( h0 E) R  d6 D
В статье описано взаимодействие игрока с N ...

# b! ~$ v! I; VДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. o" c& S1 u/ v1 {: g7 d( D. G
2 R) \8 e5 C4 j# [4 P% `4 {9 FЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
& |0 h  q1 Z/ H% b
% x$ P+ f! V, SШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 N( H1 x/ j" d3 _+ p

) C$ E. R' Q% F; J0 ]5 \+ \: k0 p6 w
  1. <font color="Green">// Пакет для состояний монстра</font>" ]- V' ^; W) P  S) J7 |  N
  2. package org.l2jmobius.gameserver.model.actor.state;
    / I$ t  A" E# o6 ^
  3. <font color="Green">
    9 r" `6 }& w* p
  4. // Интерфейс, представляющий состояния монстра</font>
    & x. I4 s. V" d. k5 H1 n  H: A
  5. public interface MonsterState {
    $ j: U% E' Q  L2 E7 m& B$ H0 d
  6.     void handleState(Monster monster);
    : c% D+ n% {4 r
  7. }5 M4 q' E4 m' ?+ `# W  q
Скопировать код
5 F. j# b+ {, \6 R' ~
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) R0 _# H; L$ h* u" v& Y+ ]& t. z# e- v  Z
Класс для начального состояния монстра:/ i$ V( H5 `4 \
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    - D2 \! i  `; m5 ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' l4 L( }$ X0 L$ W) b4 N" A

  3. 7 M6 L$ F6 I. M6 b8 \8 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - _) U0 S- a8 L. {4 D; O

  5. " a8 v1 z% y! _  B' r, j  T  E5 }/ u
  6. public class InitialState implements MonsterState {0 V" E9 A& V7 A9 g/ Y  m! k
  7.     @Override
    0 B8 A6 i+ P1 n# b& h( Q
  8.     public void handleState(Monster monster) {
    ) y; |1 r8 G% Q2 l
  9.         // Начальная фаза боя' Q" V0 |' a; i+ Q3 Q: Y; H! \% q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * \7 s/ c- z/ `* _5 h" E0 o  w
  11.     }
    8 y* P+ v9 |# R7 B% K" T3 K
  12. }
    8 S8 a; j; e5 W! }
Скопировать код

3 Z+ N0 l2 l0 t# e5 b$ f4 _' ?" g+ w4 s9 D* a" a1 c9 z
3 q1 h6 k/ X8 M3 b* Z; f  K

7 k, j2 }, X7 U# G
& y# a, @1 n2 J" z
9 x$ V. g$ {1 [+ k& a" I$ O" o0 }
% G4 M# g! x2 k2 u2 J" n
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ K( E$ N0 k$ Y: o. n' f; P
$ ~6 P& M8 i: Q& Q$ F0 ?( t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 y- N+ V* V- l* ~/ r: t& E* r
& b5 }  g- Y( ~* iШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' D5 n' ~6 g8 n+ r: H/ Q* C9 `2 `9 l, b
/ U0 t* v3 O8 M8 P
  1. // Пакет для состояний монстра' @8 k: f: O" _/ R8 p& F
  2. package org.l2jmobius.gameserver.model.actor.state;
    * Y: h, ~/ G$ O  J1 m* \! G( E

  3. ! h8 a" K% P( O
  4. // Интерфейс, представляющий состояния монстра
    2 z9 }' z& T* @, j5 R
  5. public interface MonsterState {
      c$ a. n# G0 O7 {0 e! H
  6.     void handleState(Monster monster);
    - {2 I. r, h6 \0 S$ T7 h
  7. }
    / U* k+ c2 Z1 j7 t2 V. c( U
Скопировать код

$ ~  _0 f; P2 |- _' o  nШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; x* [" z* D% M: ]+ |& D; `9 G
6 f4 u+ ?  L& R$ G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% O! r- h- {" y2 n2 b, P
- O% z2 m9 C: e: Z. T, m
Класс для начального состояния монстра:5 Q5 x  Y" X3 _) a( a% f3 T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / }4 ?) X; Z+ p
  2. package org.l2jmobius.gameserver.model.actor.state;  @- N0 w3 t+ g& S, c0 n0 _* W
  3. # u7 U, @2 V/ |2 v- |$ H5 j! l' ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! U# L2 {7 _5 A; ^
  5. % `* ]+ x' n- o* p7 Q! m4 j" m1 R
  6. public class InitialState implements MonsterState {
    2 G' N, l$ m. u" j9 q! K( Q
  7.     @Override
    % h- F0 ]! w4 {; D1 g6 Q! x+ K
  8.     public void handleState(Monster monster) {3 z! j* U- ]9 u# @1 {: P$ f9 D8 p
  9.         // Начальная фаза боя
    6 \+ }1 t  Q# N1 B6 b# \  p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 v; S  s7 H" R! c7 l
  11.     }
    4 Y* T$ r" ?! ~8 {
  12. }" e! e5 w/ T' u/ v$ y2 p
Скопировать код
Класс для агрессивного состояния монстра:- @2 a" u: u4 X' u: L# g" ]1 R3 ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 d& M0 Y4 Y8 h
  2. package org.l2jmobius.gameserver.model.actor.state;
    * |, ^" [9 Y# d$ }) ]5 B) W

  3. / d. d9 n+ w( |" B* W
  4. import org.l2jmobius.gameserver.model.actor.Monster;) X' e* q0 N3 `; H/ `4 Y' [

  5. - _; X# a0 J- s5 ]- i/ F( K) V: f
  6. public class AggressiveState implements MonsterState {
    + R0 G& V3 I8 u/ l9 u4 w
  7.     @Override
    8 R. `9 H1 d+ {8 Y% R/ j( I6 c
  8.     public void handleState(Monster monster) {3 p, O1 I0 X; K8 d4 ]; q
  9.         // Агрессивная фаза боя
    0 W* U+ V! z. ~2 r+ }0 O1 _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    & Q, f! u! \8 x" X/ Y% i
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    2 z2 `7 j% `+ k
  12.     }
    8 R: W7 ]8 t) J2 Z
  13. }# U+ n7 H2 Z0 A* y
Скопировать код
Класс для финального состояния монстра:6 k" @1 c' G9 A2 L/ q# @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 E. {  K9 L! q
  2. package org.l2jmobius.gameserver.model.actor.state;* ?3 V+ I' y. {$ ]
  3.   H: B* ?6 h2 @' w" k9 l" _2 D7 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ r) @  Y7 y% N3 y
  5. 1 a7 d# @- \. h$ _: z
  6. public class FinalState implements MonsterState {) N9 w, ?+ i$ f8 T7 t3 h
  7.     @Override
    - w1 u3 \# [2 n8 t1 l
  8.     public void handleState(Monster monster) {1 g5 D' f  t/ h' [2 \9 y
  9.         // Финальная фаза боя
    : {- k4 B0 w% B, Q' }8 r, ]
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    " Y/ q/ N' l, F( E; h% W
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' H2 b1 F/ i) d% N
  12.     }: X, S' i# W& j) L( ^' u- S. a+ R! y& t
  13. }. }) ~- y& m. }: b. x3 D1 s/ n
Скопировать код
9 Y$ A+ J: T3 U( _) f; y2 V
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
8 h3 \9 R# \  W: i
  1. // Пакет org.l2jmobius.gameserver.model.actor; P8 W5 P2 [5 U' [  j7 @
  2. package org.l2jmobius.gameserver.model.actor;0 d3 G8 O6 _% e; n! g% Z4 s

  3. : Z! U8 M8 ?# z4 r. G6 ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ A* u, I5 K& x% G
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 T' i/ `! @1 z0 F  Z: Q' Y
  6. : h5 k! A) y6 D# S, Z
  7. public class Monster extends Creature {
    8 [- T" z. x6 {# q9 j. g/ [  L# e
  8.     private String name;
      `: ]2 u9 A$ a9 ^/ t6 k6 f) ]
  9.     private double attackPower;( `! `& n, I6 {" W, _( k
  10.     private MonsterState state; // Текущее состояние монстра
    ( L/ w& a# u. s8 L3 w1 ~

  11. ' I* }; y; y. \4 ^( L5 t
  12.     // Конструктор монстра
    8 Z4 m8 X- I5 w% O
  13.     public Monster(String name, double attackPower) {. S' D  i7 \/ K7 C3 ]& Z
  14.         this.name = name;
    4 \% G  R5 A9 I9 J1 O
  15.         this.attackPower = attackPower;1 l% y) Z* D! T
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 l3 w  k4 B& [7 _+ O0 F
  17.     }
    ( h4 d- O3 @# a3 S$ u) F# B

  18. / B# M+ d) Q! G9 j$ y
  19.     // Метод для смены состояния
    $ F( ^0 P6 U. V
  20.     public void setState(MonsterState newState) {$ g+ M, @- x8 J
  21.         this.state = newState;% U" ~) }1 e0 n$ E
  22.     }
    2 \& b5 [0 ?9 H0 L! l
  23. 0 O8 i$ c: f1 ~- w& P
  24.     // Выполнение действий на основе текущего состояния
    ( r5 v: u" ?8 l  E& A1 N! f- E
  25.     public void executeState() {
    3 A. @" |& N0 F2 ?
  26.         state.handleState(this);
    5 j% a4 v2 ?: l( z9 R9 T
  27.     }
    0 n/ b- \, n( }. @$ v
  28. + Y& ]7 ~5 k! ]' S9 ?2 f
  29.     // Геттеры и сеттеры/ `2 U+ E$ u  i% P7 y9 G
  30.     public String getName() {4 F' k9 ?; |+ g' B  l, A
  31.         return name;- Q* J5 p( Y6 N2 g
  32.     }' b" U' j/ G1 ~/ d# c; w

  33. + e0 A& j- w8 V  o$ V' C5 ?6 e2 }
  34.     public double getAttackPower() {
    6 i1 V% c" F2 T" W
  35.         return attackPower;
    3 N$ e* i, O- |  W1 Z
  36.     }3 F( a3 ]  m! e8 F) Y8 ]; Q' C

  37. / S! i0 }' w) i9 r
  38.     public void setAttackPower(double attackPower) {8 L9 `) I' o9 C: `5 J) C
  39.         this.attackPower = attackPower;
    0 ^& u# o5 i+ Y8 H6 H
  40.     }) m5 \3 x& y  ]1 G9 {: Y' Y$ r/ l
  41. }8 K& M; {. `% g0 ?0 ]2 `6 l( T
Скопировать код
& ^$ R. n* E9 h7 t" C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
+ F" G* C7 f: I( z; n7 X5 J1 R; H( r- q: Q- ?
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & k0 ~% {7 L( @; p
  2. package org.l2jmobius.gameserver.model.battle;* k( ~7 ?/ ]- [

  3. ' z, P& i5 H" z" k$ X3 f9 i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + @# W5 m. i& M) M
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ x7 }- _2 _9 i" f" r
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    2 }9 l, q7 v8 |6 @

  7. - i/ n  i. Z3 f, k( }& B# `
  8. public class BattleSimulation {* I# ^- ?# j: V- b6 N4 u% W' j: X
  9.     public static void main(String[] args) {/ F* i% x1 e: h" E% U4 T3 c
  10.         // Создаем монстра с начальной атакой
    & ^7 r# j3 q4 V
  11.         Monster monster = new Monster("Дракон", 100);
    / a# k) a: I" o8 V0 e4 Y
  12. / q- ~& ]8 y! L& C- R, V
  13.         // Начальная фаза) I  d8 z" _: G  L; ?
  14.         monster.executeState();
    + y2 K9 F1 r# g  S, |/ h

  15. ; K9 R' }, |0 ~6 l
  16.         // Переход в агрессивную фазу
    0 {4 K  Q9 r, U3 {: J" a
  17.         monster.setState(new AggressiveState());
    ( ]. X5 q' f& o8 y; d! s9 |
  18.         monster.executeState();
    - {8 s" }3 j6 Z3 W% P$ ^5 _" n$ Q2 e
  19. - G: I( y- Z7 @' G- B* e" P0 o
  20.         // Финальная фаза
    & f  e+ h3 S; }! P4 u* S9 y
  21.         monster.setState(new FinalState());
    3 m: V# l# s2 l
  22.         monster.executeState();6 N* W+ _3 z3 R" n2 T  r% m
  23.     }1 P7 m2 _$ \# b% W8 A' {
  24. }
    6 D, }" p9 v! a
Скопировать код
, [0 v* G* ?+ I1 K8 s/ D
Комментарии по структуре пакетов и классов:2 {  s2 C9 H2 o) {) n- }
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    : ]( ^% ]4 P8 l, M: s
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. {3 t5 `5 U, C- OЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' q/ N4 \. M8 S' f( @. m# \' z. e

( x# t: ^) \( o' L, d# q( D1 p, Q4 \4 r) X$ z3 Q# T: ?
* y. {7 e# m; r' I3 I) U2 H; [

7 @  s* W1 Q6 Y1 q4 r# h8 }, f! e  M" y8 u! d4 d

" S+ Y- v; o) }& \
5 r" U" {# X; |7 s4 R! o; W) p3 n
- z; j$ k3 n1 O' S+ e0 \& a* W# a% Z/ q7 }

) p4 o, V- e( |
. y6 z/ v- k: f( ]( Q' B/ u
. @, u# s" d+ z' x% Z0 G) S$ N, I6 b% p" X5 `
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04( m/ n; L; D% ~% ^0 p2 J
Для управления сложными взаимодействиями, такими как  ...
) }, M: M% [+ W
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ t- M7 _0 R. c- A4 I4 K, K% wОтличный подход! Использование шаблона "Состояние" де ...
& M2 X' V# G, ~6 `& y8 T
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.- T) D4 X$ S% {- {0 ]* `

& X# n- S: Y& S) _. a2 GШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя." A3 W6 z' |/ a1 k% q# h! o
" g+ K4 q$ n+ h; h) d+ l7 X6 [
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 r  A( |$ f7 p8 h* S# B- e
  2. package org.l2jmobius.gameserver.model.actor;
    7 y' _8 B+ N3 p. z7 w$ A7 l
  3. ( D3 }- ^) k) w% j9 B
  4. // Перечисление для типов атак) Q3 X9 s" ?) o: d- h9 h2 S
  5. public enum AttackType {
      c% \# L6 M+ u  U; v
  6.     PHYSICAL, MAGICAL;
    & d2 h" C, k3 f2 e8 N* I( k$ s
  7. }0 H' Z& ?: V0 s4 Y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.. x/ ^, j, ]/ Y* K4 Q
Обновленный класс для агрессивного состояния монстра:
9 H0 _( x+ G! R
; X6 d% @) S, i& w9 ?0 V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) v6 P5 w4 c/ h7 S6 h
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) S3 M6 M( m& B' Y9 V* l
  3. - A; f/ w+ m5 j8 `9 T4 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . ~6 w! e3 o4 G+ x) T- G) C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    % j( q9 Z3 F, Z) e

  6. 2 M( U4 A# a3 J' e5 `! e# A+ E
  7. import java.util.Random;) Q' K' s7 b& o- M8 z  D( B

  8. $ e6 |+ B; l. J6 k* k
  9. public class AggressiveState implements MonsterState {+ ~0 `9 X9 l; r. P, y
  10.     private Random random = new Random();
    ( Y9 k" w; ~' W. [% {8 I* B, x

  11. ( z! I- q1 j. l& A' F3 v
  12.     @Override$ h+ w: g! G  K% }
  13.     public void handleState(Monster monster) {9 o6 r8 n  ~# O" }7 _
  14.         // Выбираем случайный тип атаки: физическая или магическая
    , F, E2 ]7 `$ [. [' r! `
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ' x- ^2 W: j$ f  P. \

  16. 0 b/ r! `. u7 Z
  17.         // Логика для агрессивной фазы боя+ X1 b' n2 P- b" }7 o2 w
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 0 O6 X3 ~; i" X" _  S
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    * ]$ I# Y. o0 l  D8 i( B
  20.         . l6 d7 D! x) g( I
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, ^1 W8 n4 I% F
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;2 N  W: L' M- L3 e: e
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);! u* _# d( e; ^7 r2 a
  24.     }
    - \, }& K( _* E7 L: A, I
  25. }
    ; i! C# I4 y- H5 l. k
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
8 F% }( k9 U" Z, `% C/ `  a8 h& k
; N1 d- o( k  Q. H7 [
  1. // Пакет org.l2jmobius.gameserver.model.actor
      ^/ _& O) y0 T; g' U9 D# p# T# R2 H
  2. package org.l2jmobius.gameserver.model.actor;
    3 ?( A, g+ J' O2 X* M$ x

  3. 9 i5 j; ]# \+ o; r/ G* Z' L
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 W/ |1 k2 j4 v$ T, E
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( ~" w! F, |% p
  6. / h# Z- M- G+ A
  7. public class Monster extends Creature {; L% c$ w% e3 `
  8.     private String name;: W8 }$ B2 p( `; W0 M0 |1 v- o7 v
  9.     private double attackPower;# E! r" a5 l4 I7 N% k+ D
  10.     private MonsterState state; // Текущее состояние монстра
    ! [+ O9 V2 P' q: r% M3 ]' K

  11. & X7 g8 s& g- v5 |2 I: J
  12.     // Конструктор монстра/ ]0 ]( [/ n: R( K5 T8 |! J
  13.     public Monster(String name, double attackPower) {8 J2 s9 ~) E3 V( r
  14.         this.name = name;
    1 v5 T# ~" H4 Y6 I5 W
  15.         this.attackPower = attackPower;8 |8 {; `3 ?, C6 u
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    2 p! `. _* _* h2 X# |
  17.     }
    ( T2 l' h6 Z8 K% O
  18. & H9 _& J- }$ e4 b1 ~) A
  19.     // Метод для смены состояния* ~9 b% q6 A/ m# ]3 m4 |+ _
  20.     public void setState(MonsterState newState) {
    0 v0 s, Z8 q+ X; y! ~
  21.         this.state = newState;
    : ]* p4 [5 x7 e  E
  22.     }
    : C; v' p/ i) O6 \" K
  23. 7 p9 S5 M% ]1 Z+ k" @* w+ E
  24.     // Выполнение действий на основе текущего состояния
    * d% d  ~9 |- O* V& u9 [! c
  25.     public void executeState() {
    8 q" k. ?$ Q+ R2 S
  26.         state.handleState(this);% z1 a% A( q7 R9 f/ S( Y& C2 o
  27.     }' U* f4 k! X* @5 }/ `' A" _

  28. & V. W8 Z9 X# I
  29.     // Геттеры и сеттеры, l$ I" F  \6 N. I  o* |3 N
  30.     public String getName() {6 K5 K/ ?0 r5 e- r2 K1 k
  31.         return name;
    , P! ]7 l9 S& e7 r
  32.     }5 i3 S+ b6 H& i' T0 P; R
  33. : n9 N! I! n' Z3 T3 {
  34.     public double getAttackPower() {
      T1 w* [" M# u0 P
  35.         return attackPower;5 ]7 c5 P3 k$ e2 f8 j1 l* O
  36.     }: |9 L5 I0 R3 |8 B' p0 D0 i/ X. B
  37. + u1 O3 n- Z+ X7 U5 T: h. q
  38.     public void setAttackPower(double attackPower) {
    4 ^+ _* D. j0 p1 J7 x: X4 d8 X
  39.         this.attackPower = attackPower;5 m, g$ w2 O1 z8 J( S% J: M
  40.     }
    9 b1 v0 K9 G: X
  41. }4 d% P% e5 {* ?% O% M
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.* e* @7 n+ B7 y4 x5 t( \
9 c+ M3 l+ W- Q
  1. // Пакет org.l2jmobius.gameserver.model.battle8 s' u) C8 f( _. ~8 G) u8 ~: f" ]
  2. package org.l2jmobius.gameserver.model.battle;
    6 N( B; |# \- ?

  3. ) b$ ~. j( q; e! `; D2 O; B: {& n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 L4 }* U' m3 K8 x( r& v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) ^: g: z% L+ ~$ T- H9 z5 R
  6. 2 j0 j5 `7 k$ q8 ~( i. m
  7. public class BattleSimulation {/ W6 |7 G! l0 N: w5 T
  8.     public static void main(String[] args) {
    " a; _/ ?4 K$ F6 [
  9.         // Создаем монстра
    - N' L; _! h' ~; @9 s! Q6 ?5 }
  10.         Monster monster = new Monster("Дракон", 100);, ]+ ]2 m' T4 ]+ M$ \6 `

  11. - U8 X/ g9 z; F
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак7 {) S6 x5 u  @  d" d% L
  13.         monster.setState(new AggressiveState());- |) z( c. L' H% O# C: @% i
  14.         monster.executeState();
    % o6 Z* a4 n3 e# j1 T
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
      x7 d: Q' X& _2 W9 w% k
  16.     }
    7 A, n- P- j9 p0 j" t
  17. }. x8 H, e! D, k5 a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 I; p' t+ k0 E3 M
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
* ?0 f/ C; Z" k8 u5 P+ E0 E& A2 q* X4 a, F* e( ]" k
: s. h+ k- i0 o3 Y) R

" X0 ?5 p7 f7 i! d# i2 T' o4 f. j9 W
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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