Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
4 T" x7 _3 s( u( N% B: l3 F8 O
7 O. L( F  n8 @5 T# r
; D1 y- }6 d1 a' Q- [- n) x' K" b2 x8 u
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
/ `/ w! f! j( m: D! ?* ]" bЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 I  ]3 s& @) r! V
Астралия ?* c3 Y8 x" C  X. x. A
% E: |# p! }( x% A. x6 D& o

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!$ {0 v1 F+ F1 I" E
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?0 K4 a! d, B7 \! ~2 S) b( Y

* ~% S& @7 i$ e# m  u
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 $ @. w- F/ R" n2 L; x: E
AlexCoder опубликовал в 2024-10-16 18:31
: G; s/ p0 D- M* rДень добрый!
$ e4 @& c  N( R+ c4 e  [1 PВ статье описано взаимодействие игрока с N ...

% Y* l# b3 Q) _4 z, IДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
) Q9 `* t4 w" R! x8 m) `8 r
- K* Y% p$ A$ S/ P6 u! f# FЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 k8 S. i1 L$ S5 k2 D" }
2 [+ M# _) R2 q9 [' R+ @" KШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 R; ^3 M4 p0 ?
( l( A4 ~8 r3 a
  1. <font color="Green">// Пакет для состояний монстра</font>, m1 C8 F( s1 X$ M
  2. package org.l2jmobius.gameserver.model.actor.state;' N# g0 Y2 \3 ?2 b4 o  d4 Y
  3. <font color="Green">
    % @, r+ ?' I! X
  4. // Интерфейс, представляющий состояния монстра</font>( R/ i6 H% U1 X2 t: L* H' c
  5. public interface MonsterState {
    ' v% A2 q- ^( P# o! ]* x
  6.     void handleState(Monster monster);
    6 s) M4 C8 a; M6 u  N
  7. }" f" W0 t+ q1 K* j6 ]- F
Скопировать код
3 \7 d9 S" b7 g7 c* {9 ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.- V; X/ _+ ]/ R3 `

: o2 I5 T/ w. ?; vКласс для начального состояния монстра:! I1 J7 N/ _6 _6 G0 [4 m
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    # S* C4 i( ~& ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    : O7 N/ ]. N2 ~
  3. ! ~" |3 X( Z! h* r3 h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      L+ Q5 G7 U  N- ^' \. B# @5 `
  5. 2 F" n& G: i, B( `1 g
  6. public class InitialState implements MonsterState {
    # p1 w/ U( S0 R' R( r9 A
  7.     @Override! k3 @; u+ Y( p2 J
  8.     public void handleState(Monster monster) {
    1 |& {2 X9 C9 Z7 I1 g+ y' W
  9.         // Начальная фаза боя7 W6 n! u; ~( j5 ], Y) U5 ]
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");. N# u- z* _: `% \/ V
  11.     }( I, w! t0 O4 P$ E7 k3 @6 `
  12. }" n& n0 _) [: ]) c" x! y
Скопировать код

# Y5 T- I& F9 U- z+ {' f1 n; B5 h, l+ @* _8 \

: C2 ]& z* t4 d# T+ W1 p
2 W( g9 G. \& t) t7 f
9 v4 i* ]: `: |: `* d; ?
$ m7 V4 X0 ]; D: H0 U7 u: [( {5 j: m  a. o" J6 z3 h
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 ^0 D9 Y/ Y' I- O' N, s. j- n9 c7 x0 w
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 t3 n- Z) A) v
( n9 g" h$ C- p+ |5 FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 W$ s/ @0 R2 E9 C$ A; @
8 ]2 U( F* I8 A* d4 M
  1. // Пакет для состояний монстра1 ~- w  T8 H# L" l# b3 E* k; R
  2. package org.l2jmobius.gameserver.model.actor.state;# S+ g  W" o; i9 V  X* h2 `+ a
  3. 4 f: e/ R* L8 V6 K7 c! W% a; `
  4. // Интерфейс, представляющий состояния монстра2 P  ?. G- D) v$ D7 ~
  5. public interface MonsterState {/ w3 l) O0 o# u
  6.     void handleState(Monster monster);- e& R& w) H: Q5 ?. n) i& ]1 U
  7. }
    ) \! B6 T! N- E$ h2 ?8 {
Скопировать код
! X6 F( x) N' O1 [- }# [
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
* {; `7 g' _. T' B! y* l3 t' P% y. V( A% P- t5 q7 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" u8 h# G% Q- v/ F' k( ]. a( a
, ]' n/ c  t' N& N% DКласс для начального состояния монстра:
! e! j* x8 A: @# T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  w# Q: n) g+ c- M0 o$ }; [
  2. package org.l2jmobius.gameserver.model.actor.state;1 C1 K' G" l' X  W7 C# H6 w

  3. ' c) s' t1 Y: \/ Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 ?" V7 H: d# j/ q" Y

  5. ) v& v2 _9 M% V6 A* ~5 X$ m
  6. public class InitialState implements MonsterState {
    & |, s5 h( W- b2 L. M2 D
  7.     @Override9 b/ F9 z( C+ s0 t
  8.     public void handleState(Monster monster) {4 {( u% q: c3 S4 r; m" ?& C0 c* G
  9.         // Начальная фаза боя5 V4 V6 O; \% Q! X0 Q5 I
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  R' Y, k; p5 w; b( L1 ]& R
  11.     }" g/ F5 J8 s2 U: I
  12. }
    3 d6 P  m5 g+ f' r5 |- g
Скопировать код
Класс для агрессивного состояния монстра:; V% \  ]  h  Y) z  W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ z; L3 {% o( X2 C, f3 \, Z
  2. package org.l2jmobius.gameserver.model.actor.state;
      B( R2 i& ^; V) E, q. f4 [

  3.   n( i% l4 T0 s/ I6 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 U. n8 B) s& U/ e! g( s

  5. ) _, h+ p7 g- t# Y$ J. X% A" V
  6. public class AggressiveState implements MonsterState {4 X) G, d3 e% Q; Y/ g
  7.     @Override
    % Z/ J0 t8 E7 A* P
  8.     public void handleState(Monster monster) {) H4 t# l( h" x# L& j; l9 ]
  9.         // Агрессивная фаза боя
    7 p* p% B: N+ @; V
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 b1 {3 i+ ~) K. `9 {, u9 `
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
      z2 ]( D- `$ z7 a
  12.     }
    / _. j- U" L3 Q# j$ e" T7 M0 S0 V
  13. }7 I5 u; Y: B8 _" u; l
Скопировать код
Класс для финального состояния монстра:
" D- O1 D+ Z! e( I( q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , ?5 r1 R( o9 O, H
  2. package org.l2jmobius.gameserver.model.actor.state;# Q+ k1 c" o2 b: I8 P

  3. - H* C' m/ F3 `
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 V, N2 n- m; Y, j# {# ~3 o0 H

  5. 8 f% {, \9 x" e$ K: V& w' R
  6. public class FinalState implements MonsterState {; G& _6 p' ^, u8 ?
  7.     @Override- `% y) V: i% x, u
  8.     public void handleState(Monster monster) {
    ' L: c* J" Y; Z$ h! ~
  9.         // Финальная фаза боя
    * [- X5 L/ w& s
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ; R& w  s9 e: k; c+ I' G8 m" {
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 U# A/ W4 a1 h7 L. J
  12.     }# c. p$ k4 O" X" m* Z5 W9 r& t: C& @0 T
  13. }5 m" ]- K  h. ?1 R1 ^1 d
Скопировать код

* s- Z* Q+ i4 x9 v8 s1 KШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: @8 }3 n6 f* Y3 v, T$ ^* T$ y) W; q
  1. // Пакет org.l2jmobius.gameserver.model.actor/ [& B1 z0 X& `0 O6 ~% w# \1 G% j
  2. package org.l2jmobius.gameserver.model.actor;
    9 C% l5 r! m# F4 x  T

  3. ! I  d, ~1 U8 j$ ]
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 R4 o: N6 P8 E  _& a- X' m3 d5 l
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 X1 h5 n+ g6 S$ {: Q
  6. / W3 p1 L" R: R: H
  7. public class Monster extends Creature {
    " t6 B6 c, }- T$ \
  8.     private String name;  M9 Q2 }% z2 p) p
  9.     private double attackPower;! W) O# x8 E! K; O. L* ~' b. x
  10.     private MonsterState state; // Текущее состояние монстра' t* `# z+ F( ~4 o

  11. . T' P" |: a5 Z3 ]0 r! Y0 B
  12.     // Конструктор монстра
    8 T3 V* r3 e$ F2 q8 ?, p  r- }
  13.     public Monster(String name, double attackPower) {
    + k* q2 [& R# S: M1 J4 G, z
  14.         this.name = name;
    7 q4 T; `; J/ Z2 f, I# d
  15.         this.attackPower = attackPower;& Y2 a' x6 J2 m0 J/ u% s
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние, m7 n$ ~5 e1 A% b- u
  17.     }
    9 [7 V: u$ ?" X% @$ k* _
  18. ! y5 V8 {: S. v- g# ~# t
  19.     // Метод для смены состояния
    , _3 ]; w1 z/ K
  20.     public void setState(MonsterState newState) {4 M8 e9 P' A4 N& Q. B5 t2 A7 A  Y
  21.         this.state = newState;7 I9 w; M' T6 @! C) u0 k3 D( W' W" e
  22.     }
    $ ~: r# m9 v, ^' X& b
  23. 9 f( n8 D8 z9 P; t: S  T1 Y
  24.     // Выполнение действий на основе текущего состояния
      \% `5 w6 J6 o' e2 g8 X
  25.     public void executeState() {
    ! j: D) K6 {* y/ t6 }3 G
  26.         state.handleState(this);
    3 F* W0 d: _: c( _* L& R
  27.     }. x/ A' q8 r/ q2 w5 T
  28. " a+ E5 z% I0 h& F# _$ Z
  29.     // Геттеры и сеттеры
    & D. r$ R/ q1 X. T8 D' k
  30.     public String getName() {
    6 K  N+ K2 [* l3 K1 c, ]
  31.         return name;
    3 h. k, q' x" ?' V5 n# M
  32.     }6 l  V# x9 i! j/ g( k0 r  Y( d
  33. " ]$ i' M% R2 Q1 j8 O
  34.     public double getAttackPower() {5 s7 ?/ s! G- e( |8 @# T- F7 v0 S
  35.         return attackPower;
    4 E1 s" N  n/ K0 M4 R/ ]  [( U) ^
  36.     }
    $ e/ Q& `7 b5 h5 E. O8 ~' z

  37. 3 `' |" I# ]" g; ]  S
  38.     public void setAttackPower(double attackPower) {9 N9 k* e. r( D. h
  39.         this.attackPower = attackPower;
    ( ?2 c) t0 J. h1 R7 [
  40.     }
    / Z1 @0 K* p2 t0 `, H
  41. }
    7 X- a" M$ B' N) B% G9 \9 d
Скопировать код
/ B* {7 `& k# e% D1 N& t+ `2 q' ^
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) C' i# u- _/ r/ U! Y7 X3 ^
9 ]) ?, M& I  n2 u! E5 b
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ' w% c* T( x% w3 Y! G# v3 x& w. I
  2. package org.l2jmobius.gameserver.model.battle;3 S' \9 m' I2 g4 f) ^* {5 g
  3. : W! \' }" w6 |* ]5 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;- J; {$ i) b3 y7 B
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  w. v4 a' R7 \8 ]- r
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    8 v. P9 t: @! q
  7. # q1 ^: x; t8 v( N  I, @3 l
  8. public class BattleSimulation {: r+ [+ P8 e( B3 R0 o
  9.     public static void main(String[] args) {5 K% P+ k5 f9 }9 N1 c
  10.         // Создаем монстра с начальной атакой
    . b- K* l1 Z. d
  11.         Monster monster = new Monster("Дракон", 100);
    7 b/ H4 c" h  t9 p5 |/ k
  12. , w; m7 m% f" E. \( c  [4 l( V
  13.         // Начальная фаза
    1 V/ T+ q. Y- C8 m
  14.         monster.executeState();
    . x: Q0 B7 d" k* X: W7 @. p

  15. - W5 b: L! \& k: @: z
  16.         // Переход в агрессивную фазу& T! X2 r" O- H7 }0 f; X$ K
  17.         monster.setState(new AggressiveState());
    - j( m- S, g% r1 h
  18.         monster.executeState();" I0 f8 A0 _8 [" a% B6 |

  19. 1 [5 R+ h/ Q5 _# @7 Z
  20.         // Финальная фаза5 h! L/ _" C6 E, R! T! E
  21.         monster.setState(new FinalState());
    + B. L$ ^4 F9 J
  22.         monster.executeState();$ y0 X' ^  L; g0 A% M# x
  23.     }
    ! ]+ R1 C& v, c: o* I- c' J
  24. }
    : g; O+ g4 _8 t, ^' M, u/ K: c
Скопировать код

. a8 X7 j7 x7 G' K; ^Комментарии по структуре пакетов и классов:
2 S( E* n9 q$ D2 d
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' c2 c: u9 w) C  q4 e' H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.$ P/ k7 a, L+ S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
2 C' v+ Y3 C* F
9 @- _  y. o0 v" H* o# B1 w
: g$ [! ?3 |9 p( k% M7 y% W7 q7 V! c- s3 s! o3 H

2 o- O+ D# R( ]" X1 _3 P
& u4 ~8 u- u* x/ b5 ]9 V+ ?
# W& i4 S/ @% l! S, ~7 ~8 r8 Q' c8 a, q9 H
- A) D3 a( f; M& w- I1 b
# R; q5 f: I" y) ~
: e- z8 i, w! a. s1 `
& W7 `- F6 Z! k2 x: M" P& x
( a9 X/ [; ^$ N$ N

! N* v1 Y3 A. V- A& I: i/ j  v8 w) A6 ^9 O7 [+ z4 V9 G& Z! D
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 ]: ^9 [- W# {/ _7 IДля управления сложными взаимодействиями, такими как  ...

+ Z' b, |: G) K  }: h0 X8 i& [Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ ^3 Q/ Z: b2 rОтличный подход! Использование шаблона "Состояние" де ...
8 w% \& b' h; N3 o- I* A
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.  R5 ^6 m% B# F8 t
  {# q6 Z; J/ U% z5 O3 K9 t# V
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
: D3 M5 c8 J; m$ C+ d; L* V5 Q' {' b  @
  1. // Пакет org.l2jmobius.gameserver.model.actor" i& Q# L* H( k$ c9 Z. U; X6 A
  2. package org.l2jmobius.gameserver.model.actor;0 e7 ~% s, U- ~9 s/ u$ F0 K

  3. ' Y3 B+ v* ^: f: ]( {" l( A3 h
  4. // Перечисление для типов атак
    . j7 u7 X. Q1 |9 }+ y
  5. public enum AttackType {& t/ a5 s% h6 [* Z& m
  6.     PHYSICAL, MAGICAL;
    - f: T- Y* I2 N  ~  l( H9 k
  7. }
    0 `# H$ u1 }0 a% z' a! f
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.0 \' s) ]) W. ]! S$ [
Обновленный класс для агрессивного состояния монстра:
: ?! e& R/ s1 J0 K3 ]
' A0 p$ t& P' @, K0 d1 a; a6 Z$ Q& k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. M8 {' n# b' g. r
  2. package org.l2jmobius.gameserver.model.actor.state;$ @& ]9 j) o% w! P

  3. ; o" x- J. b" p
  4. import org.l2jmobius.gameserver.model.actor.Monster;* p; j; P% j3 R( o+ @$ d
  5. import org.l2jmobius.gameserver.model.actor.AttackType;2 p: f* g9 n* L: a/ {( ?

  6. 8 E& @) Z8 b6 X: c" N2 y
  7. import java.util.Random;
    8 x; W; J# p& H5 d. h* ?
  8. 6 |8 N5 k* l3 A3 t$ k3 x9 C& M
  9. public class AggressiveState implements MonsterState {8 B" l5 ]0 p; z+ Q) Q( `7 V
  10.     private Random random = new Random();
    . @$ l0 O5 ?  O, m* z6 v
  11. . H: M" r* y0 n- I5 A/ O" ~
  12.     @Override8 R6 K/ a/ _; N* F# v  b; C( R! t- I9 H
  13.     public void handleState(Monster monster) {
    ; L4 J5 Y2 z7 C  s: v
  14.         // Выбираем случайный тип атаки: физическая или магическая: l( M) E0 A# @
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    # j, z9 R& [9 Z$ n: A- Z# U5 N
  16. , f, x, I8 @, h- ]9 K+ z" D
  17.         // Логика для агрессивной фазы боя4 f0 K9 A8 C. J( K" Z) ~
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & C% ?, p( s8 Y( ?3 b* T
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- y, B! W8 ^5 }& b
  20.         1 q. b+ u! @* S/ Z7 {6 Z% u" |9 E
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    # w+ z% i! K8 I% n* `/ Q
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;( Q8 X4 G2 L, p/ [" b7 N) k$ H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);4 e- j" b2 D" p
  24.     }0 P( S4 {# ?, K# K
  25. }  t  l2 W/ W2 u6 g
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! A* l" O2 s* `; v1 ^

" Q9 z6 u+ T6 u* Q) z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 e& [8 S. a; \6 b' b4 V# H
  2. package org.l2jmobius.gameserver.model.actor;
    ; K& G) f! n" I. ]' x

  3. ; R! m) Y) W& `; W  }: c8 H
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 ?0 y' x& Z, B0 I' b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 a8 a. Z8 J$ Y5 N- K
  6. 4 n2 X& a1 M) J" C- _9 D
  7. public class Monster extends Creature {( S$ q& ^8 j* i4 L3 V
  8.     private String name;
    % ?% c  C. o# p7 {, S  k
  9.     private double attackPower;/ X5 x& @% c4 z
  10.     private MonsterState state; // Текущее состояние монстра
    9 r9 j, _8 W+ J. |& Z0 r
  11. ; q/ r8 t# h1 Z" [8 s% h8 D1 ~
  12.     // Конструктор монстра7 C# l9 J0 j$ \2 `& z& o" _# j
  13.     public Monster(String name, double attackPower) {* a! |# ~7 R; s7 f! u
  14.         this.name = name;
    . h$ U' X4 M5 n* R
  15.         this.attackPower = attackPower;
    ; @- `  f& S1 S  n# v5 u# Z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    * J# \2 u( c8 V. F
  17.     }
    & t8 u7 n2 C7 N% N$ c. m
  18.   y4 f3 o0 m: b$ C4 T
  19.     // Метод для смены состояния9 _! i; @' n) u0 l8 ?
  20.     public void setState(MonsterState newState) {
    - n/ L* {" a$ y; u3 n3 g2 ]( R
  21.         this.state = newState;$ J. T3 f3 k! O9 h) O7 n+ C+ \- p
  22.     }
    4 w0 K9 f- C" G2 g

  23. ; {+ O/ Z% y* N
  24.     // Выполнение действий на основе текущего состояния' b* ]' T" a- {; p0 m0 p% X5 [. o
  25.     public void executeState() {
    # I( P( S: y  V/ p; |$ C) n! n
  26.         state.handleState(this);
    0 f7 K0 K7 z  M" e0 p0 f5 L  X0 w
  27.     }
    ( A% z% Q/ {: n- e7 e

  28. 1 N% x. O6 J5 c
  29.     // Геттеры и сеттеры
    , t: V5 G0 x# }( Y8 G6 v, ]
  30.     public String getName() {' T' {2 Y+ V9 V8 D, u. i
  31.         return name;
    # K) L0 c2 H! W) o/ ^
  32.     }
    7 ?# f$ ]. Y" O$ u3 |" t) Q2 ?

  33. " j' R  q  i7 N6 Z! r8 P1 ^
  34.     public double getAttackPower() {
    2 Z: U9 U6 @% G) o) S1 r
  35.         return attackPower;1 D0 i! m9 N+ A6 ?: O% {
  36.     }1 ?' J2 ~4 T( ]

  37. ( H+ }5 U+ ^2 K3 \
  38.     public void setAttackPower(double attackPower) {1 Z+ ]! x6 \; M1 U2 x' A7 i' \
  39.         this.attackPower = attackPower;2 i4 M' C! ]  \3 Q+ l  o
  40.     }% ^3 R2 E4 }' x% E( D+ o# Q. M
  41. }
    % U4 T! [6 h  x1 U( L+ [& ?8 b: Z
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
" Z% i# d2 i* C0 [* d: y2 t  q' P0 k8 ~8 I
  1. // Пакет org.l2jmobius.gameserver.model.battle& g9 T5 s1 v: [8 [. d0 ^2 F
  2. package org.l2jmobius.gameserver.model.battle;$ ^* E0 l2 K5 A9 j
  3. 1 h4 h6 @+ H+ r9 C0 A4 t# K
  4. import org.l2jmobius.gameserver.model.actor.Monster;& J- t/ L9 R2 x7 k9 x8 G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 h" i5 c' t. w; A3 M  g5 @! |! K; ]
  6. & H5 v# T# O+ O; i- m% Q
  7. public class BattleSimulation {$ J- J5 R8 s1 \6 e; o, W3 N
  8.     public static void main(String[] args) {3 S1 D8 h& E) o8 z: H4 i$ M2 a
  9.         // Создаем монстра1 v) P3 Z7 H$ q( N2 a- j
  10.         Monster monster = new Monster("Дракон", 100);  P4 H2 N! I% R/ T
  11. 4 R" Y. [, p3 E- U" t6 b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак6 N2 ?/ Y# o! X" p% A
  13.         monster.setState(new AggressiveState());
    ) _3 }, _3 u/ v- b
  14.         monster.executeState();6 k1 q/ Z% L6 Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак5 ~. F' g: t- P3 F* N
  16.     }& b. I5 r. M! b  ~& X3 d1 [
  17. }5 z  G: h, j" V# R: h0 L/ c: \* T
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 S6 ]  V- x) i% F" t% j, Z% G
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!9 a" |* ^1 S7 G* ~, s2 Z
6 {% E6 f9 Y( o8 h) F

. O$ a" s  p: w9 A% c, L+ H) ?; ]
8 X& ]6 X0 q6 G+ D8 T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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