Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!" N$ n" l. ^" f, N

  j& o+ i/ F0 c" M: C' I9 [
4 Z: G7 y* R7 ?9 e) T: F
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 B2 M& V1 O( w* K3 _* c! m# q, o  Q6 T
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!+ w5 c, p+ v% w8 F
Астралия 🌟& P( d: S& @( a/ e0 |# m: z

* c, Z( I! g! F+ Q$ d( X

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!# Y# Q! u: @+ t. u
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
; X  a4 G1 B( C+ ]1 w) s9 b6 ^$ z1 X7 {7 B" r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: v) P6 ^+ J7 Y& W( P, J2 h4 k
AlexCoder опубликовал в 2024-10-16 18:31
. w3 t$ }# T3 f% f) l; l; uДень добрый!
  p7 ?# H+ n3 z( B/ KВ статье описано взаимодействие игрока с N ...

  O0 f1 b9 K  ]; C3 {2 z; aДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' P* \! F4 [) Y& ?$ G4 Z* s

+ y1 U* N5 E$ O6 {+ M0 e- d& ]8 aЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% Z0 O4 U# Y" u$ |! Q, R' h

) w4 M) F5 N) z4 P/ z$ Z6 U, z0 q9 ]Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; t5 L2 G/ \4 q* }5 l% O

4 U: M$ m/ M2 [3 s
  1. <font color="Green">// Пакет для состояний монстра</font>5 Q  `* q; P1 p) ^1 H; z
  2. package org.l2jmobius.gameserver.model.actor.state;: w. h  V% S$ Y# `7 v
  3. <font color="Green">
    & ~  f7 o: U& R* m8 b# Z
  4. // Интерфейс, представляющий состояния монстра</font>
    / F; r" }0 T+ e# z0 K
  5. public interface MonsterState {
      O+ t; {/ ^* H: t1 W( t* U
  6.     void handleState(Monster monster);3 Z7 V. N4 {) [# S( \" B1 \
  7. }9 h6 j3 l5 n* {2 T- w
Скопировать код
$ Y# g  c3 e( C" l
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.2 [) Q) c- g- w9 V; j1 i

; L" v% J- ?2 I0 Z+ ]/ c. j" nКласс для начального состояния монстра:) p# A3 x( c* p- g+ N- h7 r0 b9 A
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    6 R9 S5 V3 N+ i% W7 o8 @3 Y
  2. package org.l2jmobius.gameserver.model.actor.state;+ k0 ?7 c6 c7 b4 N# |
  3. # E3 t$ M" H6 g& g) Z& Y& w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 G: G! A8 A" j: C9 [. w
  5. ( Q' F% R" \; h; M4 f3 _4 I
  6. public class InitialState implements MonsterState {
    1 G  l- e( K0 H3 W9 u' L5 J
  7.     @Override
    & J1 Y6 V) g) j
  8.     public void handleState(Monster monster) {! p6 c6 G, `$ L7 a" x$ {
  9.         // Начальная фаза боя5 ^+ Q0 t% \# L4 E$ w0 k' [
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" d' f0 L3 J4 \  I7 j
  11.     }+ {) Q& e6 s9 i, @, c6 [. \
  12. }7 u2 i& o* G! e
Скопировать код
2 N9 e, j$ q7 l0 p5 V+ p/ V( Q

* Z6 X) e) z( o' R& T" [6 x* c# o  \% [8 n! W3 k
5 d1 }4 E( ?- y9 [% W* `: j

. v$ I8 K5 _, K) Z. ~5 y/ r4 s! \+ H, j9 H6 e
) g3 z3 x2 Y1 Q' g  v( d( M
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
  Z( C2 f. c* s0 d* A! x2 L) f9 S
8 R2 F. O- r, R) l2 O; jЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ H: `  _$ T( `
/ {8 A3 h* n4 _Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! ^4 N: N) T; n3 W! Q

) d4 F* I1 a: |/ P; F9 v, |) K5 _* Z. q, m
  1. // Пакет для состояний монстра" t+ h2 b8 V1 `3 ], W# T
  2. package org.l2jmobius.gameserver.model.actor.state;- M& V! k* G' G+ s

  3.   a* K  S9 R; E5 h
  4. // Интерфейс, представляющий состояния монстра
    , `1 v5 P- g& I. w. Q
  5. public interface MonsterState {
    5 V7 q# l2 G; \
  6.     void handleState(Monster monster);
    # n% L3 q. r5 N% V% a% y
  7. }1 A, ~' y3 V+ P9 }' l' r
Скопировать код
6 k% e7 |0 A' \, J9 H
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' t6 ?7 \5 ~* O5 S6 t7 L

. N. x3 O! T  T( _Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ n/ |5 S$ @1 E7 S7 o
0 j, ]' }, Y+ lКласс для начального состояния монстра:
3 ]; p* G) G2 l# P, d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! }! a- N6 V% }0 r  I, K
  2. package org.l2jmobius.gameserver.model.actor.state;6 D  z) V8 s5 W
  3. ) g( `  ?% X8 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 |# u( w8 T* U2 u; n$ y0 {& p
  5. % F6 X+ e, A5 ^* l, z" N& h# t3 w: I: R
  6. public class InitialState implements MonsterState {
    2 L4 X/ J0 ?) y% o
  7.     @Override
    7 L' ^" w1 b% X6 p2 T; o& ]" r
  8.     public void handleState(Monster monster) {
    8 c+ S4 s; W# y6 C+ t( U- |
  9.         // Начальная фаза боя
    + m$ |: h( c5 y7 \# r0 g  X
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ; t+ s2 G8 [, V1 Z6 {- [
  11.     }8 Z  m! Z. ~/ k) H& ?. j
  12. }: {5 i- s5 W, s1 K" B
Скопировать код
Класс для агрессивного состояния монстра:+ y2 l2 P; D2 l( o+ R- [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ f! _: a- A" d8 f2 @- G
  2. package org.l2jmobius.gameserver.model.actor.state;6 F. D  ]* x/ j( l: R! D2 T3 A* T* J1 ]

  3. 5 @2 I, E2 V8 I, a/ f6 W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + b2 C* i8 T' O6 k8 K% Q5 u
  5. : Y5 g1 K- T# I1 p2 p% }# d
  6. public class AggressiveState implements MonsterState {4 H  G- j" |) S5 q' p4 P0 }
  7.     @Override
    8 W$ E6 P* k- ]
  8.     public void handleState(Monster monster) {8 u4 u4 Z; Q' S2 \; m
  9.         // Агрессивная фаза боя
    ) F8 l% n. w5 g
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    $ {! M9 B$ j6 g% P
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    2 v2 E& e* Q: }- ]$ c0 u
  12.     }2 Q( E8 b! X0 b0 Y/ f
  13. }
    2 g% @. e2 A8 j: R% q! U
Скопировать код
Класс для финального состояния монстра:
+ N: h- ~& [& |: e: a, h% P4 T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % X1 j' _8 c7 C2 b$ d" A" M
  2. package org.l2jmobius.gameserver.model.actor.state;* W6 u& [5 L3 O# N& c
  3. * ?/ `" V4 x& V2 S( C- i- X9 R( r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) b, Q9 |$ d2 L; ~- O

  5. ) P7 M) t, D' e  b  m' ?! I& p# Q* {
  6. public class FinalState implements MonsterState {2 l# h1 U. w3 @' ]+ l: U: q
  7.     @Override$ I9 d  p1 R9 Q. E" \8 p- Y
  8.     public void handleState(Monster monster) {7 z: I9 H+ V' A
  9.         // Финальная фаза боя
    " Q5 L2 V4 ^) b9 k3 p
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ! Q( }0 u* C* T8 ~. G$ S
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки4 w& G) p7 n! V& p
  12.     }' m$ j0 d1 g% r6 U8 @
  13. }2 _$ K0 K8 F; ?& ^6 s# Z
Скопировать код

$ n- i' U, |9 H$ s4 `. ?Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 }/ r9 n2 k. t& C  a: N
  1. // Пакет org.l2jmobius.gameserver.model.actor8 W) P( b: F8 `9 y, S4 [+ {$ L
  2. package org.l2jmobius.gameserver.model.actor;- _* V0 N. w7 Z  [  r

  3. 3 Q* q( ^5 f( q0 x+ ]$ C$ k2 h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;; y) |/ F- h  K+ I* a  n6 s
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : S% @0 L4 Q0 M) H9 q; `

  6. & T; z3 w1 \) T
  7. public class Monster extends Creature {
    / ?! O+ D. [" b1 n, }/ N
  8.     private String name;
    ) Y& ]4 R: E+ N9 f: _# T' w1 L! V3 G
  9.     private double attackPower;
    # F+ j& J: I( J/ q
  10.     private MonsterState state; // Текущее состояние монстра
    - {# D9 Y. _) c" u5 k
  11. / Z. S4 C8 r3 k- w6 U) y
  12.     // Конструктор монстра6 X8 U5 N4 O% M2 M( Q) ]
  13.     public Monster(String name, double attackPower) {
    6 I$ ^3 D. f( C- N7 y& \& q
  14.         this.name = name;
    0 S' H- n8 @; f) p/ @7 O
  15.         this.attackPower = attackPower;( L9 l: H7 Y4 z' e: Y, @' v5 o4 v
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние4 ]; ^: A, H- ~; K" l; C5 Y4 ~, ~
  17.     }3 q  D# ]3 a0 m9 r; X9 e
  18. 2 u" s2 f7 Z- B
  19.     // Метод для смены состояния
    ! i6 w+ ~% X* e9 [
  20.     public void setState(MonsterState newState) {
    # ?" u% B' \  E  \8 {/ R3 b
  21.         this.state = newState;
    9 ]* g5 ]& m. K- [) g& I8 @
  22.     }
    2 j5 Z$ {4 L2 E! u+ I+ I8 C" t. v

  23. ; S4 E  Q2 y; V  Y; L) u
  24.     // Выполнение действий на основе текущего состояния
    % d% O  F! q4 i; K
  25.     public void executeState() {0 v) W3 H: v- Y1 o
  26.         state.handleState(this);) D9 G; i; h) Z2 h) y' o% p
  27.     }
    / \& W/ K; O# z9 @

  28. 9 A1 e6 D, r) Y% |
  29.     // Геттеры и сеттеры
    $ n0 G; L6 Y$ y) w( n' f3 i# K( Q0 M
  30.     public String getName() {
    " _& g- _. U) @' T, v
  31.         return name;5 l3 m2 m( w( p/ {* n
  32.     }
    $ x4 M2 t, E" q7 l
  33. ( D1 `- z6 M2 S1 l
  34.     public double getAttackPower() {
      z* }# e' P5 v- c( ]+ U
  35.         return attackPower;% F* _, _* I7 g8 \0 T2 u
  36.     }
    . J5 J; u( i# ]

  37. / d6 I. s6 ^$ v2 \) f& c
  38.     public void setAttackPower(double attackPower) {
    ; j5 G% Y5 z: W3 T) p
  39.         this.attackPower = attackPower;9 \, T/ V- n$ u0 o* B' H/ i) d" G
  40.     }' ]7 K- H2 u. b% k9 c  p8 x( `
  41. }
    5 [% ^  _: \+ ~$ b5 S! P
Скопировать код
. G  J& W4 x8 K
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
$ v! W/ N# z) ]0 W0 l, |, H# d  v- F' T! z7 k) ~% }4 f, Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
      }: x. |: d' V6 z$ [# Q
  2. package org.l2jmobius.gameserver.model.battle;( x& o& H* P/ b  {( S( |

  3. - V  e! L7 m7 E/ [2 ^, j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / |! @) i: u1 z2 y8 F0 P" ?0 Z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; U8 V( }* [$ H5 y/ a# x  j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    6 l! j( m' g- u; b

  7. & \9 g% `! r$ S$ j" w# C7 {- a9 S
  8. public class BattleSimulation {
    0 t* t5 H# `% q1 g
  9.     public static void main(String[] args) {
    - i* O; g2 c6 S! f
  10.         // Создаем монстра с начальной атакой
    * T4 x  p, O5 e; F
  11.         Monster monster = new Monster("Дракон", 100);3 j4 [3 D9 |1 }, M

  12. - |) \- L6 D/ R" J5 v( k
  13.         // Начальная фаза
    * |2 l7 I7 C9 y$ ]7 ^7 c
  14.         monster.executeState();
    + s( P( r0 U% a  e& t3 v2 f
  15. 2 f3 y" X) U  y# u% @
  16.         // Переход в агрессивную фазу1 J. d% ]4 @: v4 H  [
  17.         monster.setState(new AggressiveState());
    3 K+ N9 w6 a- O( Y6 M; P0 Y
  18.         monster.executeState();
    $ k* L2 s; L6 R5 z: T- n) ]

  19. ) ~: J0 P7 n% n6 c
  20.         // Финальная фаза
    7 a4 ^: R( g% B3 Q( K
  21.         monster.setState(new FinalState());9 D+ e, o& |. }& q3 Z; ~
  22.         monster.executeState();6 D5 P0 h& O( W& J% j
  23.     }
    ' e7 e# z) b- u+ d
  24. }
    9 W! o" j. `$ K% u
Скопировать код
  S+ {1 m1 _: @/ f& H
Комментарии по структуре пакетов и классов:: T3 s: \! K  v0 W( A+ }6 u# R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев., ?6 V. b- B9 U3 J# x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( c/ E+ U  g6 Q7 v' V
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
  g* @: d* b, t( `( f5 Z9 j/ {/ S2 W+ p% \& F' [

3 h# _- y& r/ s
% E, @& g3 i; U) ]/ {7 V* K4 m+ f) z1 U% j1 \

  t) Y/ z% F" T6 ?
4 y4 d$ D- x: P6 V' y$ m. w9 ~& K

$ H( l- I4 v. V4 d6 \1 V; h0 W( j

2 q- E' [8 t; N1 \
9 ?( r0 Z: W) t: a
$ t8 K! V! Y) N$ @  U2 w( ]* Y$ P9 f4 H- Q, y. X
6 W8 Z  \2 h5 R5 M
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
, Q% M) R- K" H& iДля управления сложными взаимодействиями, такими как  ...

, z/ ?  R0 f* p/ N8 `- qОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
5 o' E$ u/ i! n0 u1 ?Отличный подход! Использование шаблона "Состояние" де ...
) e0 ?3 R4 q+ v5 O
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 h4 n, h5 `; Q4 J6 h
0 Z, m+ o. I' L3 f5 _  EШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
6 W. B- ^2 d9 ?0 g  g! F' x6 H9 M" A- _- x6 J3 `
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 r8 ]8 T+ q  R$ I) Q. l( e) u3 s1 O8 k+ `
  2. package org.l2jmobius.gameserver.model.actor;
    ! S1 H- I8 ?& l9 E/ o

  3. / s2 K) b' Y8 u/ I- K7 l. ^2 w
  4. // Перечисление для типов атак) ^: f: s4 ^2 ~" p( i7 h% q
  5. public enum AttackType {  E& S$ W- B- o; J9 X# a6 B3 \8 B
  6.     PHYSICAL, MAGICAL;
    3 G/ i0 W! K% D2 D
  7. }1 r7 Z6 V* }7 n
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.# w0 S; r/ J* k, R
Обновленный класс для агрессивного состояния монстра:3 b4 S$ }1 D3 ~8 z7 _( b

9 w+ W3 P" E& Q* t8 w6 e7 |8 Y$ X+ C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 A$ P' f# `" u, S
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 _2 `- d& Z6 t5 [; {2 S

  3. ; I6 J2 u* @0 R- e" b
  4. import org.l2jmobius.gameserver.model.actor.Monster;* }' t5 G; D+ @- r0 G
  5. import org.l2jmobius.gameserver.model.actor.AttackType;6 j8 c" W6 D: @6 W) ^( @" W

  6. , C3 M# n' E% j
  7. import java.util.Random;
    2 F6 Q3 b5 Q! g
  8. # G: u7 F5 S( Q
  9. public class AggressiveState implements MonsterState {! @9 ?$ A2 R. E, @, Z
  10.     private Random random = new Random();
    , s' V6 r* D( _1 R9 i
  11. 1 E7 S$ m1 k& W8 ^
  12.     @Override
    1 W) E& f( X: U8 {3 g+ [" v
  13.     public void handleState(Monster monster) {
    - {- e3 L) F, @4 V0 K2 r, e
  14.         // Выбираем случайный тип атаки: физическая или магическая1 _" i: H/ I: Q. v* P
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    + V. E' @1 d9 b" S
  16. " k% ?8 X3 `9 Z  O
  17.         // Логика для агрессивной фазы боя
      X  q% L# s$ v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    1 R2 q, _2 `. _" \- o% E0 d
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
      d6 U/ d6 u. b1 p, [1 ^
  20.         
    7 Y0 u, g4 F: ]) O. d5 W* u
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    : R& p" @: V% `* ?! J
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;$ `: i7 K# \5 w; U9 @3 a
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ! t! b, ?' B7 L1 C) W
  24.     }- A# w( u% U) a* Y! t% H
  25. }
    " W% ~* M2 L0 d2 T6 a  S" o
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки  z# }& S& P! h9 `- l# ^
' w* p; {+ f  K6 z* e3 z1 f
  1. // Пакет org.l2jmobius.gameserver.model.actor( H, D* J, r8 R- x4 z
  2. package org.l2jmobius.gameserver.model.actor;
    ( t  g4 Q& L  X0 |9 H
  3. 8 Z: K) r# q# \6 K2 Y; P, I6 u9 d1 ?
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 d. p7 ?9 H6 a! x0 ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 ~, P# \2 `) h' b: b9 O
  6. ' }& D  D$ }" f
  7. public class Monster extends Creature {3 P9 @6 \8 x* l1 h  w- Z& H
  8.     private String name;
    6 b6 G" {4 `6 K6 ~1 r, P6 e
  9.     private double attackPower;
    ; q" z( t- ?: R5 M, E6 n
  10.     private MonsterState state; // Текущее состояние монстра& v& B4 G/ c  F! ]
  11. 2 O& B; d& A7 f7 O0 k$ n
  12.     // Конструктор монстра
    ! o* U" o$ G' n
  13.     public Monster(String name, double attackPower) {3 U- A* Q" B4 o' C
  14.         this.name = name;
      d# R8 R' F: ~4 B
  15.         this.attackPower = attackPower;
    $ U& F: w8 j$ N. M# F1 z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & {3 G1 P/ p( S
  17.     }
    + H+ Z0 n) L5 x- _' _: ^

  18. # A7 B0 D7 A7 W+ N2 Q1 g' ]" S
  19.     // Метод для смены состояния- \6 j& V) q* K: w" p
  20.     public void setState(MonsterState newState) {
    * z5 z# N' P3 y& w
  21.         this.state = newState;
    " e6 s9 v' W6 C
  22.     }7 k# Z6 G8 Q& [# `* T$ q

  23. , o( G. Z( h: H/ F2 i8 [" w. c
  24.     // Выполнение действий на основе текущего состояния/ C) _( L* r; H4 T" Y
  25.     public void executeState() {; S( t) Y, [% \1 y% l6 x8 Y0 T/ m5 L
  26.         state.handleState(this);
    / _% e- r5 C2 L/ K; Z
  27.     }
    % G9 ~4 m3 ^1 U2 [
  28. . d: `, ]. C4 @; o1 s' E# a. G
  29.     // Геттеры и сеттеры
    * E1 n8 K9 Y1 A  h4 k
  30.     public String getName() {
    5 [+ J1 l+ G# E' N- V4 E
  31.         return name;) I/ s4 e( h) i( N
  32.     }
    ; ]2 Y" J! |+ t% B

  33. ) v2 w! t! x3 k
  34.     public double getAttackPower() {3 a9 m& r2 [' B
  35.         return attackPower;- K4 f; T; b, Y
  36.     }
    % ~5 c$ @) c3 _9 u' z  T4 M: ?
  37. % p& h3 M/ b# v) t( ^
  38.     public void setAttackPower(double attackPower) {
    4 k6 W' o6 i% O  x+ J
  39.         this.attackPower = attackPower;
    ( u/ G4 b' ]5 F7 {7 }
  40.     }5 b$ t8 `( H# Y- S, _) s
  41. }1 r: V9 y- F1 A( M5 T
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.2 I* z, Q2 ?2 x4 @* ?2 d, \3 |
7 y- Q# L5 l' t- L6 @: `( a+ _$ Y  F
  1. // Пакет org.l2jmobius.gameserver.model.battle+ ]- N: p$ Q0 C. \/ e% R- \
  2. package org.l2jmobius.gameserver.model.battle;
    8 S* s9 R+ [4 m; O+ k
  3. 9 b: W9 s/ i  d" Y1 C# T
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & t# U) z6 [9 `  P4 p& J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 d4 K3 T  O- f2 r2 n9 z5 t

  6. + e" H/ I$ V# V. v% V
  7. public class BattleSimulation {
    8 D4 A' b. C9 T! r
  8.     public static void main(String[] args) {' i: |  x9 g$ n' Y( ~$ m  H
  9.         // Создаем монстра5 p' u- e  p0 ?
  10.         Monster monster = new Monster("Дракон", 100);
    * c- G( i( p$ ~: }

  11. 0 F* U; i) t2 o! ]2 ?
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ' i! d, k, S  b. T
  13.         monster.setState(new AggressiveState());! i, N" `' Y1 Y3 r$ ^
  14.         monster.executeState();7 }' k# P: h# ]( ^( k
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак2 T: Y4 x; K- _! ^1 B$ k( O: I
  16.     }
    0 g; q* j$ J3 A% k) k
  17. }
    2 o# D( O% O4 }# c2 S. K# P4 l' u; Y' {
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
. L& }) ]9 h+ n  x0 M& Q+ [Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!9 m6 f4 V% ?: y) {, _) [* x

7 L  [' t" z9 A' v- t$ c9 r, `& `; _7 v& F2 K$ \

6 J/ Q1 `0 y4 g- v9 I5 k
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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