Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!. Q( t: N: b1 u- p% W+ \% z

) o! P1 Z8 T" d& n7 T# V- t

* K1 _+ g8 P5 B/ j! F' vЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
- \& _. |. D$ Z1 NЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) L8 C  m4 t6 P* _; K5 FАстралия ?
5 X0 d$ u) m3 r& ?+ E; H1 G" v6 c' R1 C+ S

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
( {2 p8 D5 F! a. Z5 K7 w( k* JВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
: J! H3 F* R* A/ U  y5 Q* L& a
0 F- P9 ?% K7 r. y% z
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
3 f* g- |- k8 O  ]2 T4 A2 u
AlexCoder опубликовал в 2024-10-16 18:31: n) j. \$ s1 g/ c6 D
День добрый!
4 Y! k7 x' N6 O! E6 WВ статье описано взаимодействие игрока с N ...

4 a) q& s) `5 ^Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 |- L6 g* e4 D: t6 N+ l/ g9 }

4 C5 W; c. J9 C3 FЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 d/ o) p9 [, Z2 ?6 O
% k' c! K' b8 O8 i5 g
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., T5 s! |. g5 {' Z) V3 ~
% g. W5 E% I  I9 d
  1. <font color="Green">// Пакет для состояний монстра</font>
    % N, n$ k3 n" ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    : l% C. ]+ b& F* n, l# _
  3. <font color="Green">
    " [7 m6 Z0 t+ \+ x& _
  4. // Интерфейс, представляющий состояния монстра</font>  x4 D+ w4 L) i% w4 A* x  ^( N
  5. public interface MonsterState {' ?% w: P# ?2 k# I% J1 q
  6.     void handleState(Monster monster);4 B7 Y! Q2 E& V3 c+ R# `# P
  7. }; D: E: `7 G) a7 O$ m+ |
Скопировать код
( C2 @- _  ^  c7 Z- ]0 b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 `8 \/ S* e3 S# v
5 T* h5 h; }. o1 z- M& IКласс для начального состояния монстра:
$ ~  a# D7 A. d- _2 c
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    1 B+ e# V1 e* a" [/ `: e3 W
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 }1 ]/ B; L, [1 z* q/ ~8 M7 S! Y! N

  3. 4 K. B- i) u: s
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! q* c# K/ ]0 V- \0 h8 s
  5. 6 Q$ E) W4 W  P$ z& C
  6. public class InitialState implements MonsterState {1 f5 g  H- e! k$ d. c/ S0 ?! c: l0 P
  7.     @Override
    # Z9 x, i7 ]3 l
  8.     public void handleState(Monster monster) {
    3 O. W  h% l. U9 h( n. d2 ~
  9.         // Начальная фаза боя# T3 z# }+ g) j2 p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    . v, k, ^+ f! ~
  11.     }
    - S$ K$ _( ]5 h7 W' R" m
  12. }
      e- g; v+ a7 w: W' c1 g& {
Скопировать код
$ d- D. `0 ]" [( ?" B: m
" W6 {, X. _- I, O4 _0 N9 i
1 K1 _, |; Y3 l, R  s" B

# i) Z0 V' y/ F) n' ~8 r) \" K# {) ^4 c! c. b% N
" E& r7 ^- w2 `5 R
  I* t/ k& J4 s
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 `) |' [3 e. _0 V7 C8 Q9 f7 W- z7 Q% G* v$ v! C0 \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.7 D( I5 W6 X$ k' @' f) }. M, D7 W

$ V/ q3 J1 \0 f1 S5 s5 ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ c+ |* m2 m. d
8 _7 w  f, z2 ]
  1. // Пакет для состояний монстра$ d' j* ]& L" F9 R( f
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 n5 N9 I" {; G/ s" l* y& \

  3. # Q2 V8 p- a1 g5 h$ s4 f, {9 a
  4. // Интерфейс, представляющий состояния монстра
    ) t% i3 j9 Q5 K4 }) b) p
  5. public interface MonsterState {
    7 O+ a! B5 P. y3 z' I* F$ E
  6.     void handleState(Monster monster);
    ( _1 f3 V/ \& r% w/ Z
  7. }, M& L1 _* q! L
Скопировать код
% @% K( O1 e% V5 r$ p- y  X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * D) p8 i) Q( j9 B9 @* ~8 ?
2 m7 v3 ]8 R$ F
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ g4 ?. s: s) g3 y! L- y- Y$ r

4 }2 Y- I) ?; FКласс для начального состояния монстра:+ w) s( _; J  p! h6 o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 X& v1 q' e/ f( Y$ }" T- t
  2. package org.l2jmobius.gameserver.model.actor.state;) s0 R( j7 f# M5 ^* v8 P
  3. & U, t, J2 T/ |: N8 |* L" ]6 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " y, R! h6 v* N1 Z. l

  5. , d) ?% P8 O( |. c# F% D8 W
  6. public class InitialState implements MonsterState {
    ( n$ c0 \' t' i( s5 x
  7.     @Override: A) f' h% C0 t
  8.     public void handleState(Monster monster) {
    . C0 X8 ~" J& }  ^, k8 L0 j3 r, S
  9.         // Начальная фаза боя7 e" n* w! o. I6 u7 Z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& `# i. v9 t9 c9 k
  11.     }; H9 c5 S( {7 s& K) g
  12. }
    , Q% b; O$ |( ~) J4 m) F$ L- i
Скопировать код
Класс для агрессивного состояния монстра:
9 v/ ~" J' {, e6 S4 n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 q5 X: k5 o0 @3 e
  2. package org.l2jmobius.gameserver.model.actor.state;2 d* b3 F  o) ]0 |3 @; C0 [
  3. . _6 V4 ]1 }5 R; I8 ^6 ?5 c" G9 A% d) a" V
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 q: p( E: m& s$ @# ?+ H# ]
  5. ( e- L8 p2 N( q. _- N" D" b( n
  6. public class AggressiveState implements MonsterState {
    & c0 j7 H7 `0 |0 ]
  7.     @Override: e5 ?2 h# e& T, v
  8.     public void handleState(Monster monster) {& x- V) s" E9 K0 |1 w
  9.         // Агрессивная фаза боя5 d+ m6 p+ d4 h/ E3 g' k, y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ) e7 @) ~3 @" z8 S8 ~' ?  \/ @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& g1 k3 i" K8 u; r* L# ^$ m, H
  12.     }
    8 g* v: L( [) |# ]
  13. }
    8 O) l& U8 X* D* r
Скопировать код
Класс для финального состояния монстра:
6 O; m2 }" [5 f& v; T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! b2 g2 {) v% _  K
  2. package org.l2jmobius.gameserver.model.actor.state;- J1 I3 d- {6 N' y
  3. . `; a* i% j3 d& i( j& R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / b# }+ }! s% i7 p5 J! r. T
  5. 7 E. D0 B8 B3 _2 N6 s; [) m1 r, K+ Z1 ^
  6. public class FinalState implements MonsterState {* t/ l% Q# }$ E# I  I) B
  7.     @Override2 w' U& g9 S) ^7 O, |8 n; t1 L* K& @
  8.     public void handleState(Monster monster) {
    0 U) W$ `$ h( i
  9.         // Финальная фаза боя
    4 a; s0 T- I2 L5 c' y4 m4 q. X
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");2 k% ]$ s! a! u. Z/ p5 q- L7 d
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    & N2 x- n* k( v8 F$ p7 n1 {
  12.     }( Z/ c: t# }5 l6 Z7 e
  13. }
    / _7 h- v! ?2 L; R* a
Скопировать код
+ |$ R7 K9 [0 s" L1 q
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; f$ a3 E. [' p% H& R8 H9 n
  1. // Пакет org.l2jmobius.gameserver.model.actor  w* H' i/ f) `5 \+ b: M
  2. package org.l2jmobius.gameserver.model.actor;; a  R  ]* I' G4 B6 J- o

  3. 7 n. Z1 y6 W$ d/ _' g# ]
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % `8 c: a- O, ]8 {+ S7 Z( ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: z8 i! a" r9 e) _) H

  6. , k- h- ]& _. J5 g$ r: T# ?3 |9 J4 _
  7. public class Monster extends Creature {
    * q% t8 e$ o: ~% a) f# W9 v
  8.     private String name;  G8 }9 ^4 V" e
  9.     private double attackPower;
    / u& ?  v& g1 S' h; f2 N
  10.     private MonsterState state; // Текущее состояние монстра
    + T3 j* @' y# ~8 @" l0 h, Y

  11. 1 d& [+ V3 U+ E% ?9 U0 ?
  12.     // Конструктор монстра
    % v3 T8 s; A* A. o$ _- N
  13.     public Monster(String name, double attackPower) {2 q2 {- Z0 g$ u* T! Y% J  Q3 A
  14.         this.name = name;
    ) R7 M' T% c) i; T- Q9 v
  15.         this.attackPower = attackPower;  f3 e4 G$ y& {% U& Z5 t- K: N8 R
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    , j0 s# a# ~/ Y2 I4 V
  17.     }; Y: e  v2 i% S* [, l0 |
  18.   R( \* M$ K: U7 t0 E+ K0 ^: A
  19.     // Метод для смены состояния
    " Q2 h. |; Z  ^( G4 X  Y/ K
  20.     public void setState(MonsterState newState) {
    ; Z" A( U' x  q* P8 R: Y7 I9 |) L9 X
  21.         this.state = newState;" E7 ]& Y3 J' J4 b) w3 |
  22.     }
    # ]. V' }/ n* R4 {$ z
  23. % r1 \; T# A0 B
  24.     // Выполнение действий на основе текущего состояния+ W- p3 Z9 ~  k) Y  l: {7 K* p
  25.     public void executeState() {% V6 l+ R8 Q0 M( F
  26.         state.handleState(this);9 \4 c5 e: z) G/ J
  27.     }# ]+ s1 R4 i5 g  e. n

  28. + Q/ u4 A: I4 q9 S4 t
  29.     // Геттеры и сеттеры
    6 j6 K) P! `* P; g5 a2 u
  30.     public String getName() {
    + h9 H/ G9 q! ]
  31.         return name;" Z1 f6 ?, F: c1 `  X; c
  32.     }3 m4 |" Z9 a) @" }* Q' q- G
  33. ) A7 s( c9 i0 V/ g
  34.     public double getAttackPower() {. ]8 h7 ?2 \, T' g
  35.         return attackPower;  o# T& d* U) P% @2 O( {
  36.     }- P8 H& `( O( \

  37. * v$ \2 L& T% J+ R4 v0 V1 ]' c
  38.     public void setAttackPower(double attackPower) {) U. D/ L. B* h% K! G+ i
  39.         this.attackPower = attackPower;
    # C, `5 A+ z$ T( ~+ L% w
  40.     }% h; j$ s1 v6 l. ^# f
  41. }+ W, d: z6 [9 r: z1 F# Z& o: v
Скопировать код

5 V! R' Q5 Q, T$ \" VШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 S5 U" D1 n; A9 h# q
; M7 Y/ f: N1 s  W" O
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + ^5 p" B' ~5 R& v  L
  2. package org.l2jmobius.gameserver.model.battle;
    # l* T" s  h2 g5 M5 k6 L

  3.   A3 x, \4 U1 ^3 C% b
  4. import org.l2jmobius.gameserver.model.actor.Monster;. ^4 r: t* p( s' X6 N8 z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , N! U; _! W  i2 g+ X* q
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;% F- Z- r( \# [1 ]7 ^: q
  7. 1 O1 v* x% H; t% B. b2 F
  8. public class BattleSimulation {9 s" x3 n. C5 |* `  U% @8 x
  9.     public static void main(String[] args) {
    1 z9 X' j$ B7 N. g8 G: D
  10.         // Создаем монстра с начальной атакой! l8 o4 [4 [. m* w$ \& x/ M
  11.         Monster monster = new Monster("Дракон", 100);! f( w: U# S& q; i* S* C

  12. ' F4 H* r* g1 B( @9 b  K/ N
  13.         // Начальная фаза; @" y& X/ g2 `4 X" V- z4 |
  14.         monster.executeState();; y9 M/ s$ ~( @2 ^

  15. 5 g7 e/ h4 P6 w6 X; R/ p, }
  16.         // Переход в агрессивную фазу" b: @- C. ?& W% e
  17.         monster.setState(new AggressiveState());
    + [% m, T& M2 q, Y
  18.         monster.executeState();
    $ [! X" W5 F5 E9 r

  19. 8 T) C! r" W; X( q2 f6 D& Z; G# H8 V
  20.         // Финальная фаза% R4 G( s/ n8 R6 A+ G  s
  21.         monster.setState(new FinalState());
    : l7 @) c: M& ?7 m0 V; E0 K
  22.         monster.executeState();, a( C, o2 ]" i& n
  23.     }/ B/ J: M* b4 [/ ^4 H% [- t
  24. }7 l, o( b( ?: o: J9 n3 Q
Скопировать код
; Q9 ^- K' N! Q5 ?. y% w- L
Комментарии по структуре пакетов и классов:
+ P' ?) E# L+ E3 I5 j1 [
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% J, B$ R5 x7 p& D# a- c
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
- ?; W( R1 P& i! oЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' ?3 h" x4 z* I8 j2 ^
/ p  U+ j7 l1 w  `: R7 E7 M1 ^3 i, u" v. m1 k
0 V# K5 b: ~5 w
; V; F% R4 G' K$ g2 f3 [
" V5 I$ v0 b2 @& a0 E' j* ~
- z# _3 K2 ]/ m& k- R
% o- ]9 L( D0 h1 u( ^
  ^! L4 k, Z  E& c/ c
* S0 C- O2 e0 M% E0 c7 h

$ }: M, \7 y+ n; R* x; k* I: s* x* z: i9 R3 u9 P  W* O

% `" E2 }* k7 `; l9 P
2 B2 G8 h1 j3 U
3 E. K4 _  D4 H# g+ D4 v
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
, V, E* x7 a' P* R; Y: c) M# ^Для управления сложными взаимодействиями, такими как  ...

4 f" M: h- J6 \) R  CОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
  D1 S: p& X3 |4 N; x3 vОтличный подход! Использование шаблона "Состояние" де ...
6 N0 h2 \, J, I! T' [! W  m" r3 t
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.2 E% A( \' K- Y+ m

7 [4 c9 Z- G" s# d6 aШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
* i1 ?9 f, u. f4 X: p8 N) m9 k, K6 s% j- Z1 H  p+ j7 n- c% _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 C3 @/ s; K  L9 q
  2. package org.l2jmobius.gameserver.model.actor;! Y1 K+ M% j7 V- v1 t+ g

  3. - ?4 u5 N9 s* O4 n& D1 j. X) d
  4. // Перечисление для типов атак1 S' W* t, e/ R  \( g" c
  5. public enum AttackType {# k2 R" H" \( ^& l8 W
  6.     PHYSICAL, MAGICAL;
    - d2 @9 N1 {) y, m6 V' d
  7. }
    8 t0 Q# ?% c& O; ]) Y8 g7 ~# R+ U* O3 Y. V
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
- X& v( U" i% A5 l2 @2 uОбновленный класс для агрессивного состояния монстра:
0 j* i3 ?5 m* \6 ~$ M. i, S5 M% U( C) p4 a! k% s+ u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 p- p' q6 [( s
  2. package org.l2jmobius.gameserver.model.actor.state;
    * c, ?( E6 A- F: s

  3. : v0 w; K: P/ L- }- d9 I/ _
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 i% ?5 |7 j8 @( v' R- L2 C9 |
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    0 A$ T% @) [" N7 ~# [- _" E
  6. ; ~/ N7 V: g1 k
  7. import java.util.Random;; i: w1 X4 P2 s; p: k- _

  8. ! f, `: T  Q* n9 t. P* m0 v# A
  9. public class AggressiveState implements MonsterState {
    & T, K$ ?  v' }8 ?
  10.     private Random random = new Random();  U% f! a9 r- Y( W0 N* k' p" l1 L3 I
  11. - c+ B& y  O' p$ q/ s
  12.     @Override7 L* p8 q! q7 X
  13.     public void handleState(Monster monster) {
    9 `& y: B: f! l& @2 {
  14.         // Выбираем случайный тип атаки: физическая или магическая" |+ l* l2 I# g# I6 p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    $ {: d% i8 `, F) F

  16. , q; Y. q0 r- ]
  17.         // Логика для агрессивной фазы боя) R8 \& W  U* D0 m5 u
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 x% x  k/ C5 N- \9 v
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");' r* k4 F# A* F
  20.         
    4 Z% V4 ?6 o2 Y& m) C% i' l
  21.         // Увеличиваем силу атаки в зависимости от типа атаки6 Z+ x3 W* a" f8 e0 z8 [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;" S* m+ x) h6 a6 v. U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    & B7 x6 C* W; r9 y3 Y' |
  24.     }
    7 O! A  t% \& o' k' h& [
  25. }# ^+ c; ]6 `5 ?, X& \% l/ A
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
* K/ J: c( s1 U" L% B" m# h
4 y4 F* B! y6 c7 J( h
  1. // Пакет org.l2jmobius.gameserver.model.actor" O& h. Y0 t* z: r) n. C
  2. package org.l2jmobius.gameserver.model.actor;$ m2 E! V6 y8 z! P& G5 X4 x: O
  3. 3 }3 U% ]" Y$ @
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;) I9 g' x, H8 Z5 o
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 ?& W3 u8 z3 m( U
  6. 8 v/ ?) e1 Y7 b6 G: j9 l
  7. public class Monster extends Creature {
    0 M. j* F$ T+ O" b9 H; U
  8.     private String name;' y! O$ a! H2 F" l  r8 A( e
  9.     private double attackPower;9 U2 t# r) L. Y& U2 Z) P
  10.     private MonsterState state; // Текущее состояние монстра
    ' `. h; `7 p$ Y, W  O/ r3 h6 u
  11. 9 L  t9 N5 Y4 T4 W) @7 k
  12.     // Конструктор монстра
    " D( h% t8 Q1 R) R3 @: v0 V; ~8 n
  13.     public Monster(String name, double attackPower) {
    . }2 Y" R7 Z+ J: m# M
  14.         this.name = name;
    3 g& H- N3 q! L2 e/ U. m2 O) T
  15.         this.attackPower = attackPower;. P# f# n" Y, n7 M9 M* u
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 m  _# D& b/ ?( ~* W1 q
  17.     }# j3 X4 k' P! ]8 r! f6 v0 u
  18. : w. r  k- M- s* Y2 X
  19.     // Метод для смены состояния
    6 X6 t/ V& W& [: S! i
  20.     public void setState(MonsterState newState) {
    $ a! y! j1 p/ i, z
  21.         this.state = newState;7 D6 s5 ~0 u' _# }$ i
  22.     }
    4 h& l) H: E: n" G

  23. 0 C3 g9 z0 f$ I
  24.     // Выполнение действий на основе текущего состояния/ b6 _7 O$ ~) X
  25.     public void executeState() {" E' c4 ^1 O6 g: Q
  26.         state.handleState(this);) P( P) a8 N: B5 n' D' U% j. L+ w
  27.     }" o. `( ?  q; t! i: C6 E% ~. y
  28. * H$ \0 Q7 }& [4 |
  29.     // Геттеры и сеттеры4 H8 @, ?3 b! q0 W
  30.     public String getName() {
    ' \7 N- q6 j" f
  31.         return name;
    ( T: ^1 p8 ?6 }2 J6 {) _7 X" h
  32.     }, v' r2 N* e. q( ?4 d" V
  33. 7 G& z6 k! v7 n  z$ C
  34.     public double getAttackPower() {4 l! d1 b" h2 L) S1 l
  35.         return attackPower;: R  F3 h7 N: f6 b" E
  36.     }( v4 v- ~! y! ]. I) Z+ M% `: A

  37. - i" x  S, }1 Q" m3 n
  38.     public void setAttackPower(double attackPower) {
    : ?0 y* L$ `% w0 Q
  39.         this.attackPower = attackPower;
    $ B7 D* M; H6 H
  40.     }) M1 y  e; h2 h' w6 S# R: o# v
  41. }
    ! b2 D; O* P# P
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
4 {5 L; d2 k; x9 M( b8 }$ A, b3 @. p' r/ W; `" \
  1. // Пакет org.l2jmobius.gameserver.model.battle
      K8 U  h% p/ E5 E% g( h: p* r
  2. package org.l2jmobius.gameserver.model.battle;
    4 q  ^$ Q! g8 g3 `

  3. ) C/ m2 s% V% O* v! ~4 {, h0 e
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ p- H: Z% m# n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " ]3 Q3 ~5 V& ]7 O& U

  6. 9 d0 V! ?: `% \2 x: m8 ~$ A1 y) G5 X
  7. public class BattleSimulation {
    # K; p/ v: e9 n+ l% K2 |1 k1 Q
  8.     public static void main(String[] args) {4 U7 X5 {5 J" F
  9.         // Создаем монстра: J" |  t2 e% r' f' k0 `2 ?
  10.         Monster monster = new Monster("Дракон", 100);
    ! R  G! d3 a3 D$ T4 U* j# [4 Y
  11. : D4 {' c" c3 `, y
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    $ r! B3 O! m3 l
  13.         monster.setState(new AggressiveState());' Y9 v& c4 \# C  ^
  14.         monster.executeState();
    ) L( @, m) m" a2 b0 J- |
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак$ B0 k! |* s/ }7 S
  16.     }
    3 M% U2 ^! ^- p  c
  17. }& w) ]  J5 s8 J9 s3 b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.8 Q- g2 K0 T' {1 c
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!* {9 U6 }( i) B9 n

4 l" X" v3 D" b8 U; i
! R7 t* G0 |9 d6 p& t" ?0 p! Q2 \* d3 N! M$ u
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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