Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
! F% }8 x! ?" i' P4 }5 R+ ~  m8 R: L9 i

+ a/ W. A; V; p, P1 E, U! E, AЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.- K; {' h8 C6 V7 {
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
$ u1 n7 w; M: S" N' ]4 R6 YАстралия ?% d1 b4 C: j9 L1 E4 O- w1 Y
6 K! t7 l: P- J# b! \

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
8 {. |: t3 I: ~2 W( eВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- ?7 T+ ^* Q* s8 }. C2 v2 {" E8 T0 `7 g
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
3 G; F6 k8 z5 l% q! `& N" |. v' x
AlexCoder опубликовал в 2024-10-16 18:31& a: g/ K/ ^1 B+ i6 v0 z, O$ X5 ?
День добрый!
! D- @- L" K1 I) ]4 V3 aВ статье описано взаимодействие игрока с N ...

& j, X9 V  _) ~- RДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 K& f+ t: m) [7 G+ O8 U. I' v& Q# ]
6 J8 ]1 p* x3 X# M5 b
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., p. H" T( e3 y1 t2 q

4 U2 |, h6 }, ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 q6 z/ X9 a2 }* M/ N9 e8 o

1 i/ W, ^$ X+ ?2 Z
  1. <font color="Green">// Пакет для состояний монстра</font>
    0 E; O2 ?; d- j+ L
  2. package org.l2jmobius.gameserver.model.actor.state;9 A/ h2 h0 ^. G. x0 L
  3. <font color="Green">
    . y1 s7 p, x- x5 x  W  F$ W# W- @
  4. // Интерфейс, представляющий состояния монстра</font>
    ! P7 P: D$ o5 P! _+ q1 l  u
  5. public interface MonsterState {
    1 H4 }6 V0 G8 B, Y
  6.     void handleState(Monster monster);
      `* n& U4 d6 l8 c
  7. }
    ; [; Y4 p% j7 `5 C  i0 h
Скопировать код
, A  @% Y, v" _8 ?4 n& {
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' m, C0 w* ]' e7 H& w
. o3 E: E: d/ L7 r4 T' ~Класс для начального состояния монстра:
2 J- u$ [( a4 B5 A7 L) }9 [
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font># {& ]  {5 q2 O+ l
  2. package org.l2jmobius.gameserver.model.actor.state;
      o% f8 {; I2 z$ \0 l  Z/ [* A, u

  3. 9 H) y" l7 ~; z4 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;! `% N3 K$ X# f' s# T! c9 `9 v

  5. 1 z# e5 _: b) B7 S! t
  6. public class InitialState implements MonsterState {5 j0 Z8 q7 t/ _$ W) Y( {9 s
  7.     @Override6 ?% X) `/ ^# _3 w0 j
  8.     public void handleState(Monster monster) {4 P6 ^; f7 K! G) E; G  W% S# ~
  9.         // Начальная фаза боя# E: M2 h2 h! h& L  c& H* S
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * B4 a9 D2 F3 V9 t9 A/ R
  11.     }
    + t# }7 D1 w8 s/ A+ Y. U- j
  12. }/ _# |0 m# j; o4 r. K
Скопировать код

/ Q* \" @$ B. Q! q$ L8 t4 Q
; m+ ?. s* G$ w5 t" I+ q2 ^5 ~% c/ c% M6 F$ T3 P
4 {0 e9 m& V- f9 L
. a& _" Y0 D( x# J
+ W/ G, b) k( p4 \/ A4 `4 h
- {" K, T! C; v$ J0 T, j
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 X$ |) b3 m0 i$ b- b; n  V: |
. R8 i, H9 q5 s  NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 @8 O& M6 V3 O/ U' |9 @5 E$ Q- Q; B' k
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& |! z8 c) W( v! U

' y3 |5 ]( Z* n. i1 _7 h, G9 [
  1. // Пакет для состояний монстра# s) ^6 I0 I4 H) ?5 ^/ H8 N
  2. package org.l2jmobius.gameserver.model.actor.state;* U, _% m& }! O6 n/ b

  3. * Y' c5 G' R: r. ^
  4. // Интерфейс, представляющий состояния монстра1 I: Y; C, X$ h/ X7 F: R
  5. public interface MonsterState {/ ^7 T* h* _( q  O8 \
  6.     void handleState(Monster monster);. T1 f& t. p& P! K
  7. }0 x# a4 i$ {7 [3 D. _
Скопировать код

* l8 a: C1 c8 a- e% r6 ]Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 V; i) M8 p! Q: ?: G) c3 V7 m% t) o' |. O/ x$ `% ~: T7 a/ \4 Y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- Y# }; h  L, e; y1 O5 f: G0 {/ L$ z1 `
( P3 Q9 \' m" MКласс для начального состояния монстра:
1 e0 v4 }) {4 @( p5 G  F( r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( L% v  W& [+ y2 p; `* B
  2. package org.l2jmobius.gameserver.model.actor.state;. t5 e; A! Q( P3 z2 u- |
  3. , u% a! z' y9 n8 D" x3 s
  4. import org.l2jmobius.gameserver.model.actor.Monster;" M$ k1 }  F) y( B
  5. ( g! p5 w( c$ I- |' b9 N
  6. public class InitialState implements MonsterState {
    6 N) O2 d( a! X( C  y
  7.     @Override
    1 U; X9 k! x4 q. Q
  8.     public void handleState(Monster monster) {
    ) `, m5 M( v6 u- q
  9.         // Начальная фаза боя4 h% \2 m0 a& Q0 S& @& ?% X
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& l; [3 t+ f: t
  11.     }( \$ Z6 X1 q0 B" z
  12. }
      P; k, y& ~  E9 U
Скопировать код
Класс для агрессивного состояния монстра:
# }. ]* \( q) A" n- I, e$ {) f% G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      O! A% R2 \6 e9 d( O
  2. package org.l2jmobius.gameserver.model.actor.state;  `9 m: O! ^) v8 j' w$ z
  3. 7 Q0 T0 Y; u/ P4 d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) J6 q2 W' P' K2 {9 O, z( R
  5. 2 l7 ~5 F' `: ]: u) g
  6. public class AggressiveState implements MonsterState {
      `# [5 r# Y: b2 l: T
  7.     @Override
    - g1 H0 m) [$ A. |: a+ P% J9 [9 B9 u
  8.     public void handleState(Monster monster) {
    ) i+ @) ^  L7 P1 [5 ?
  9.         // Агрессивная фаза боя$ p" j3 @8 d# N8 U/ p& H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");$ g9 |9 C& c' K% q) G
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ) H" ?8 ~- k7 _
  12.     }
    ' [6 J& A" o- o+ a4 T4 P
  13. }
    ) k; N+ \; {- P
Скопировать код
Класс для финального состояния монстра:
$ U" i/ t3 n$ i- n0 h3 d9 |
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 ~- a0 B3 R' d# A3 F- u2 B& w
  2. package org.l2jmobius.gameserver.model.actor.state;
    * v3 E$ ^; c# Y& M! u' e6 N# t/ j! Y

  3. : t9 H0 H7 l0 G; K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . \. H3 a! Z. s& t3 N+ {

  5. ; Y  b- B  F# w
  6. public class FinalState implements MonsterState {5 o0 z7 h8 u. G, s, g/ p
  7.     @Override
    9 V+ g; g3 |5 h$ g
  8.     public void handleState(Monster monster) {
    ! \: v, t! W! i) l% v6 [
  9.         // Финальная фаза боя% |  m9 D$ |! U: |, h
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");* Z' @5 @7 I4 x5 b
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ( ]# t9 L3 ]6 [% ]
  12.     }: _" W( e0 s% D" p# U3 E
  13. }
    2 ^- n! i1 ?7 r# x0 T# @
Скопировать код
! j& a7 z  C  T& J% z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.( h. _: e9 U/ m3 J, ^
  1. // Пакет org.l2jmobius.gameserver.model.actor9 @. y% R# C+ d9 C
  2. package org.l2jmobius.gameserver.model.actor;! G0 _) A; o+ `; p0 A2 U* B* Q
  3. & l. \" [8 ^7 d# x
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & A0 A: E  P5 K4 G# v$ i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    / l  J) H& z7 t" H

  6. + h& c5 t/ {# i4 @8 H, Q3 ?
  7. public class Monster extends Creature {% a# F$ Y' s: ?: R, w% s. ~
  8.     private String name;
    * b! U8 i* [  k  m
  9.     private double attackPower;
    : T: V* n+ u# {6 ?/ L8 [7 {
  10.     private MonsterState state; // Текущее состояние монстра
    2 u7 Z6 Q  s) w! p& x
  11. $ {/ S! i( B; W& s
  12.     // Конструктор монстра% f' y9 l: g" U. ]
  13.     public Monster(String name, double attackPower) {
    8 A, o+ k/ n$ Q/ m
  14.         this.name = name;
    , z  I5 f0 p( z' s. k0 w; c* n
  15.         this.attackPower = attackPower;$ n, M' A9 }8 B" J
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    # f4 V- I$ a; f  p
  17.     }
    $ Q8 G' S4 c; a. K% {$ v- p

  18. ! \) d2 p; d$ P. h
  19.     // Метод для смены состояния0 L+ v" j8 _) {& _  d3 Q9 I
  20.     public void setState(MonsterState newState) {
    ; G* N% y0 Y2 |5 s+ [2 s
  21.         this.state = newState;
    5 Q8 c# m9 m! _' F- n) ]0 A
  22.     }
    3 Z. m7 ?+ n& ?/ _2 _. @0 K' i
  23. 3 i3 t1 g% P; J5 ?4 ]7 K# k" M
  24.     // Выполнение действий на основе текущего состояния
    3 O5 q  ?3 E7 ^6 f$ v  K+ l
  25.     public void executeState() {4 b2 K, P. y. Y0 T$ ]5 B
  26.         state.handleState(this);9 k* {9 {7 [# O' t' K9 E. _0 Y
  27.     }3 C! V0 |7 U- Y6 g0 a2 W

  28. 2 m/ Z7 p9 z" l3 F: q
  29.     // Геттеры и сеттеры
    - l5 e( Z: e# m( j9 J
  30.     public String getName() {
    8 j" F) W$ ~% q2 X
  31.         return name;! E" z- _0 N" z, l; r6 {
  32.     }
    " \& y8 `* s' a* V* K
  33. - U8 R; z" J( x$ l; v. r
  34.     public double getAttackPower() {! s3 b# `" l% ~
  35.         return attackPower;
    1 d- s8 W1 ~# @
  36.     }
    3 x2 k# N( d9 [0 F; C; r$ Z
  37. : N7 u- u# Z! h9 _6 {
  38.     public void setAttackPower(double attackPower) {
    ) k0 h0 `& l5 L0 m
  39.         this.attackPower = attackPower;: @# C- o! C8 Y) k/ A
  40.     }
    4 Z& K; W8 L# R4 P& V' B
  41. }' D& n* r: e. O) [# X5 D) f, v0 z% a6 g
Скопировать код

  ~; r2 K! C- Z" v' l9 G9 e7 ]6 PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
: ?9 [4 ?/ E( I! \* J: g  i/ i0 _% h. O0 a
  1. // Пакет org.l2jmobius.gameserver.model.battle
    6 V& |  ]( W, e% |* J
  2. package org.l2jmobius.gameserver.model.battle;
    ; B  i+ B8 b, y$ B1 c
  3. $ J( L1 E* j, v+ K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) O# l, F6 k5 U0 n4 Q& w
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    & `  A* u$ m, \+ z0 k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    7 O5 @* W/ s( A( |) `9 F# n3 V/ n
  7. 2 X  N9 U* z" c  r, Y$ E9 K/ t0 ?
  8. public class BattleSimulation {
    " |# X4 f+ i0 `
  9.     public static void main(String[] args) {
    + J7 X3 A, U/ R7 T0 A. r) y
  10.         // Создаем монстра с начальной атакой8 w0 A1 h" B- K0 R9 v0 i
  11.         Monster monster = new Monster("Дракон", 100);
    2 M" }$ [( o$ T. s% h- v* M; ]

  12. " I1 g1 s6 n( h, g8 V- j5 ^
  13.         // Начальная фаза
    3 _& N* o1 m- W& [  I& U* @
  14.         monster.executeState();
    ' X. _6 W! b3 }' r* a

  15.   k. P8 z/ E) i: ]# l/ E) m5 d# N
  16.         // Переход в агрессивную фазу/ f3 N$ x6 G+ S, Q
  17.         monster.setState(new AggressiveState());: X6 O1 s# G6 h
  18.         monster.executeState();) ~7 g. P7 b2 I, b# `; F, g

  19. / j' {' c$ T+ g2 X- g9 U; A2 g
  20.         // Финальная фаза
    / g2 K1 ~# ]/ a2 S2 R* G' b- [
  21.         monster.setState(new FinalState());
    , ^6 e& g- H5 h% I
  22.         monster.executeState();
    9 C, `2 W2 Y8 o+ e$ h
  23.     }
    ! _$ J- L/ Q9 Q& Q* }$ o+ s: Q# h! Y$ J4 V
  24. }
    2 j* _6 J0 `7 n$ y# ^: A$ k% x
Скопировать код
5 p+ f( E& F$ E
Комментарии по структуре пакетов и классов:4 w# ^# ^6 Y0 O8 c4 K' M' g
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: \& B; J9 X) K7 T' J3 @. u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 a9 Z+ ~8 F  i# |- R
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. }/ i5 D+ y" Y4 N( D. w5 \2 {! M( _. J6 Y

4 x9 v, i4 R! X( h0 q1 d9 w, h9 F7 {( N7 G- ?
: f$ d" i2 M/ t* ?- ]  U+ Z
/ a0 h9 @, \. f% p' [
8 `3 y' T6 ]5 ^; r+ W
5 l4 w; |. w. Y, m9 a5 ?# |
% H' i0 _+ z. u8 w
; }6 C8 j& z0 u! [+ z6 q

6 j- o, c0 r/ {3 H2 d
1 s( d. r$ f. x+ `0 U  n0 R1 ?9 ]8 g1 a& P6 L0 g
$ V$ |9 [1 i  s) \/ C4 B6 q

; u  I8 f0 r+ }: E. u  w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
) F$ ?& y. v: r$ M$ P, vДля управления сложными взаимодействиями, такими как  ...
( I# a. c5 d$ A
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21& N* R  _2 n/ M* i# x/ e
Отличный подход! Использование шаблона "Состояние" де ...
6 O' I( q1 c* [# o9 X1 a* x# }
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии./ H" N& d3 K3 S/ P7 W; ~- e

- W. T' Z0 J( N& YШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
- m. h, _; c( h  T! @- R3 b; d& C' i+ [5 z/ i
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 K5 N) U. a  _$ \
  2. package org.l2jmobius.gameserver.model.actor;
    5 ]( `7 [+ {* }" O
  3. $ H& V" S' W/ m9 l' I
  4. // Перечисление для типов атак; T7 a) T. R5 |6 H' \8 f
  5. public enum AttackType {/ z0 ~2 y6 i* C
  6.     PHYSICAL, MAGICAL;
    ; W" V' L5 S, r; {0 _2 v4 |# e
  7. }
    4 y9 R' V. V7 ^2 [- g6 r4 K9 e
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
. n; B/ s- o6 NОбновленный класс для агрессивного состояния монстра:- V9 i1 g( i1 [/ L0 C

3 ~3 l: N6 D7 Z! X7 n, }8 e) ]) i+ Q7 N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, I! [% c3 n* m$ |! x
  2. package org.l2jmobius.gameserver.model.actor.state;4 N7 z$ U0 H$ `" G! U% x6 {
  3. # Y  X. P9 W% P6 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 @7 A! i0 L/ \3 @+ H9 f
  5. import org.l2jmobius.gameserver.model.actor.AttackType;. N5 M; G8 m) N! e. M' G3 N6 N2 {
  6. " J. C- c& [9 |( L! z/ E: b
  7. import java.util.Random;: V: y1 c$ ^: i& y9 \* ~& c! P

  8. ( ?7 g. j+ l; J. _7 G6 B' R
  9. public class AggressiveState implements MonsterState {& @1 S$ w/ T  O
  10.     private Random random = new Random();% N  }# w- h1 ~, \, |2 ^- ]
  11. 9 V/ ]9 M3 l9 e9 x% s8 [% i
  12.     @Override8 w! X) w! Q( v
  13.     public void handleState(Monster monster) {8 u0 L3 c: ^2 E" r. R! `0 k
  14.         // Выбираем случайный тип атаки: физическая или магическая* c# h2 R& A  Y6 ^
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    2 n' Y' j. u$ D6 k6 G* X
  16. $ D6 ?: v6 Q/ o7 [* Q( g- z
  17.         // Логика для агрессивной фазы боя/ Z' T/ G: h, R9 C4 w
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & ~: N2 b1 l2 }. v+ c9 i) G
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");1 T5 \" M& x; r1 Q$ L
  20.         
    ) P: W5 {: B+ X. l  f
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    % q0 y/ x9 |# K2 G# X2 `
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;# v) T6 M5 ~  A* s
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ; _2 Y- `' b  q; a$ e5 u
  24.     }# s2 `) @1 H. i: i* F' L' U3 E
  25. }
    - l9 m& ^0 F0 @8 V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
7 a4 T  G; U# R' }& [9 u% P/ b) |! ]) \9 f- P1 _5 ]! p, R
  1. // Пакет org.l2jmobius.gameserver.model.actor- ^; Z, B1 S8 Q) B% l* T
  2. package org.l2jmobius.gameserver.model.actor;
    5 y  J; \# v9 A7 |$ h- k
  3. : J: U& O5 N% F
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ U0 Y. ^: D; p. Z& o
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . s2 r5 A* q3 r9 D& M2 z
  6. + m& p2 c4 g. |# D) Z6 _! P' T( y
  7. public class Monster extends Creature {
    6 \* r; U: {) f; Q8 |. W/ Z
  8.     private String name;2 _$ q2 e% }& h8 X
  9.     private double attackPower;
    $ b1 D+ {% x9 J* ?1 }. ~. o  z
  10.     private MonsterState state; // Текущее состояние монстра
    9 Q* Q6 p2 j5 `' h; e) I. V
  11. ; o) ]2 t. f$ Y
  12.     // Конструктор монстра2 B7 G$ b0 k. m7 \
  13.     public Monster(String name, double attackPower) {
    9 |5 X# m3 f$ A% [4 Q( ~9 x, \" f, G
  14.         this.name = name;8 y0 {4 F$ L& U. _7 z5 m
  15.         this.attackPower = attackPower;8 ]0 I8 }5 v, p+ l
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию7 z* R. E/ D: m: u
  17.     }
    2 \4 L8 _+ Z& U: j( ]
  18. . z) C, N* }' R- G4 d! Z
  19.     // Метод для смены состояния
    , R3 _: t6 [" e1 a+ q
  20.     public void setState(MonsterState newState) {
    # D* h7 g! s, i6 H0 A# W3 p
  21.         this.state = newState;5 h" z' G. ^( Q  e! y# L' a
  22.     }
    . I. Z4 K- ]% m$ m2 z, Y7 q6 y

  23. ' O' ^' _4 C: d$ D5 e* `
  24.     // Выполнение действий на основе текущего состояния2 y9 d: f& U8 X% n8 G3 x3 @
  25.     public void executeState() {3 K; w- p- i! D$ @
  26.         state.handleState(this);! }3 x5 d+ A$ j
  27.     }
    1 {: ]1 M6 ?1 e+ r& w2 T# g9 {$ O: p: w

  28. . M6 F. D: B7 u) j( o
  29.     // Геттеры и сеттеры
    ( w! q; k. E4 [  L( ]# S: @
  30.     public String getName() {
    # `& ~8 R2 N1 J* t
  31.         return name;# d6 L7 B# ?/ Y: m6 p
  32.     }
    6 N( S' v3 f2 [; ^3 [
  33. 2 r; m. f+ h0 Q2 ?+ r
  34.     public double getAttackPower() {- ?0 T3 m# ~7 b: L; E2 |2 Z
  35.         return attackPower;! T$ u6 }- b7 i- l( L
  36.     }/ V1 C  k8 j( \, h# l

  37. - B) f. [4 N9 I3 `$ e1 [9 d6 @
  38.     public void setAttackPower(double attackPower) {! m7 r0 O( E1 M  H
  39.         this.attackPower = attackPower;: @- X% L: P- W. u! ?% o4 E! G
  40.     }4 ]( V5 I9 N. z/ v% ?7 |% B
  41. }) r$ I7 q& D' S5 i4 a% v- N( c- Q/ P
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.9 b8 }: {7 ]0 d: B" \

# R- o( n& Q: a7 I1 X; g. ~$ F
  1. // Пакет org.l2jmobius.gameserver.model.battle& O! s+ ~( C8 ^7 Q- t+ E0 ~3 x
  2. package org.l2jmobius.gameserver.model.battle;. K( y, n( e* h6 D& U6 Z2 M; L

  3. ) Y+ R9 b4 v0 B0 D9 G7 O* @
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . ?& F$ G0 y8 n5 h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 O' W6 d% ]; ~8 G

  6. : H+ E- B. o5 w  r9 p' P( [, ~3 q
  7. public class BattleSimulation {" L1 t3 s* w* K
  8.     public static void main(String[] args) {
    ) |$ h' m, F) U# f6 s
  9.         // Создаем монстра  s) T/ k% {$ L9 `4 f) M/ n
  10.         Monster monster = new Monster("Дракон", 100);$ o* q5 s" B+ g- D: H
  11. - j  \5 Y% `  y$ i" |) X& ^& {: \
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    - E+ `2 r% H; H1 K
  13.         monster.setState(new AggressiveState());
    4 h8 M. h( p7 J! E, ?5 o
  14.         monster.executeState();1 d  E* ~* D7 _( m9 x0 Y+ E& k% p
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    # ?. O0 n2 o8 P8 ^6 o3 g
  16.     }
    ; W/ s7 C1 G" @8 M1 g/ m6 Q7 y6 V3 I: r
  17. }- X9 ~1 V4 Z2 ~+ e
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
2 B2 U) z1 R! F1 n1 d8 NЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!$ E- y6 X6 J* s# ]0 O1 I2 X7 i
5 ?7 c* `# t+ G7 w8 K5 b

' Q% u4 l+ _6 d( e# a% O7 K0 k; m. M1 @/ z1 |' y5 y) `" U1 k
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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