Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
& C  R" W6 w+ v. {1 w
" j  x0 ~! o0 M
2 f- o& m, ^  [( }0 c6 }: H4 c# I
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.3 N1 D& A  m# }% U/ Y
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!/ |8 s% g' B9 H4 B1 k
Астралия ?
* G2 X6 ]+ Y) N) D$ ]& n5 Z* l( k7 j  v: z+ C

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
! L# s8 v. W  v& M0 k; V5 [В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, z7 N( m* y* Z6 J2 |
' n( p. o; K: e2 N& [' v3 R
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
7 U1 j2 S9 ~& f  p0 r7 l, ^5 }( U
AlexCoder опубликовал в 2024-10-16 18:31, v6 v) x/ M" o
День добрый!
8 Q) A2 V( a* q* x' z1 k# M8 rВ статье описано взаимодействие игрока с N ...

* j" h9 Z$ O8 @! [# ~) kДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 o2 {& u: ^* q% m% T
4 Z9 Q1 r4 B9 A$ e8 tЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 k- O& A8 w6 ], E* ?  B* @- M; l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.4 u4 F% l+ ^9 u& i- |3 G# M  Z
5 g2 A& u7 b- w3 I
  1. <font color="Green">// Пакет для состояний монстра</font>
    5 y; _1 T7 }( h8 t
  2. package org.l2jmobius.gameserver.model.actor.state;
    : l0 i& H" Q' T+ Y  ?
  3. <font color="Green">
    % f/ H) E- U3 ~0 h/ Z  x! i9 z: @
  4. // Интерфейс, представляющий состояния монстра</font>( {7 R3 @# B) S2 T. k* y. M
  5. public interface MonsterState {
    " e: I9 @0 W: l3 h- ^4 P
  6.     void handleState(Monster monster);
    9 g5 P( X- K) R# ?# U7 T# i5 ?
  7. }$ h$ N/ |* e& K9 T8 ~5 R( ^, v( o
Скопировать код
. n8 ?8 O  G: s- N/ v
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ T: @" R( j! t. Y% n! q
. O4 Y; h! `. {( D- E8 L: N' q! yКласс для начального состояния монстра:
) d$ b/ }& d/ n7 ~
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 \, O$ e: l% j1 a  J1 o8 ~8 B6 B
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 n  C/ _2 l& c0 a/ C% K
  3. # G: H5 v1 q$ _/ Z! R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + j0 x! j2 p' N
  5. 6 G3 s" m' y, ~
  6. public class InitialState implements MonsterState {
    $ y: a  S5 Q6 q; f% j* i8 u
  7.     @Override, |- T+ ~) |- ]5 S. ]# h$ x% g6 {
  8.     public void handleState(Monster monster) {
    1 V. a1 n, P8 p4 b. \
  9.         // Начальная фаза боя
    , y8 o3 S1 l+ C& [, v  Q0 ?" ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # l7 u: E0 ]; w- E! q9 z8 ~
  11.     }8 u' V3 m0 g- {# U+ e1 A# S) r+ d
  12. }
    + P* A2 J: z7 e  z
Скопировать код

1 W  {2 o  O5 A0 g# d+ g  d0 k7 A& H
3 ?  S4 s; m+ ^+ L) i5 J
" d' R* ^  D7 _  D
$ S: g# g8 _. [: D
' [3 I5 R0 y' x! E
; j1 `6 M: \: L) t/ [* W  f
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( S) F1 E3 N0 e' ?+ U

: V  t; [) m8 F! X, m% h5 {1 vЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." \, r4 C2 h4 z# a

9 {4 V; o" ^% T7 @# V2 N+ a4 \. vШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. V2 Z' s2 b# D7 i& u
7 q; E6 e% n% v$ L  D
  1. // Пакет для состояний монстра* j% W$ f& V9 @1 L# L
  2. package org.l2jmobius.gameserver.model.actor.state;! b* J' m' c! A, u: ]8 S3 {2 ?

  3. ( S" {1 v  w! g; i* A, y+ N  ]" y, Q
  4. // Интерфейс, представляющий состояния монстра
    & d/ r2 ]# n( Z6 w# ~0 `/ ~6 N+ W
  5. public interface MonsterState {! j$ Z& E! I. x' X. K" E2 T0 R3 B
  6.     void handleState(Monster monster);
    ! P# n( ?! X! ~- U2 |, G
  7. }
    - b) f! O1 I) Y7 c% B' V8 j- m$ q
Скопировать код

9 d0 x* p6 z% |; h( {& o7 EШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & o6 Z4 }* Q2 j0 h- h

& U! s9 |, r  C* a: kЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., [" }7 w. k. x0 h! V
* V" I8 v+ ?6 {- o. S
Класс для начального состояния монстра:
3 c6 W7 C  D3 {, B. z! w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 w; o/ q! {- m3 ~! n  G* a4 E' I
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 X% P6 T. _% \6 y. _$ P
  3. ( R5 C" c8 Q+ \0 H8 `2 i( z
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 N4 A  l% z7 L. A- h1 }2 B3 s" K) h- s

  5. 1 c, y" z9 K5 B7 d( U  F) m/ U* F: C8 ]
  6. public class InitialState implements MonsterState {8 Q% u# \! c. \$ q
  7.     @Override
    ( T& e, ]/ h0 x. U! N% q$ |1 q/ m
  8.     public void handleState(Monster monster) {
    ; ?. `" j& |, z8 L
  9.         // Начальная фаза боя: B- {( Y) V! e& f. R! ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");. A; ?) r* [2 q/ r9 \
  11.     }
    9 W! @2 U- Z" _2 z; q+ L" J
  12. }  F( n2 V% M: `7 p1 z6 l9 G
Скопировать код
Класс для агрессивного состояния монстра:
6 d% ^4 ]$ D2 c1 ~' f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 R. L) |% a9 K
  2. package org.l2jmobius.gameserver.model.actor.state;
    * |: o. ~) ?. c

  3. / W2 r( S4 A9 T' q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 g0 p9 w3 j2 A& K* i" }

  5. 8 r$ e* j& |* {( `  }
  6. public class AggressiveState implements MonsterState {
    5 t6 J* o' C, R& d2 E1 A) B
  7.     @Override
    3 L/ a6 `1 Y0 B( b% O3 ~. O# D
  8.     public void handleState(Monster monster) {) d! ^  x8 }: L4 b9 K0 _
  9.         // Агрессивная фаза боя
    ' w+ g+ ?. t* h, N# |0 B
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");. h/ c3 K7 `; v/ y0 \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки) C7 }7 ^! |3 u4 ]3 D9 I* u
  12.     }
    . d" i0 r& `' Z" t' e% _. O
  13. }
    - C) f1 d8 ]5 {* e0 C/ p+ e* C7 _' A
Скопировать код
Класс для финального состояния монстра:
2 p  J+ B# g$ e2 V+ _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & k3 }3 V+ @. ^  B8 g; P
  2. package org.l2jmobius.gameserver.model.actor.state;/ W, `* U# ~; D, E

  3. , m  D0 \2 V3 _3 S
  4. import org.l2jmobius.gameserver.model.actor.Monster;* W- {8 E- U' v% S! ?4 k

  5. " f6 m6 J( T# r) G
  6. public class FinalState implements MonsterState {
    ; e! V9 d' G4 u$ A
  7.     @Override5 ?) F  m1 _5 ^- @' R
  8.     public void handleState(Monster monster) {
    - S; \- t; G3 l6 u+ U* b5 M/ Y
  9.         // Финальная фаза боя) @9 W0 A3 ]2 ]! v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    . C: e7 q1 h) L
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ; g# }+ W4 N4 q3 j: A, X
  12.     }' f( Z  D5 N& H0 y; l* @( _% Q
  13. }
    * h& J$ Y( R; l1 p' I
Скопировать код
6 C' C: e- q0 g" s& V' }; |0 p; E& m
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# Q8 O9 v, w1 D1 u3 z' q; q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 ]- J; u6 [; R, D$ J! Z" {) l! U
  2. package org.l2jmobius.gameserver.model.actor;' i9 r& Y/ [/ @2 Y

  3. 3 k/ {- M" @5 e' m1 [
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : `% ]2 y" w7 C; Y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;3 e/ a7 m; |5 T. v
  6. 6 X' P' \+ _7 a) J" B5 z
  7. public class Monster extends Creature {
    7 K# |8 Z5 Y& A* x
  8.     private String name;7 u2 r" X- V5 n. z6 x$ w. t1 O
  9.     private double attackPower;0 @* f2 m0 C6 L' `
  10.     private MonsterState state; // Текущее состояние монстра' B9 r' f8 U- x: q8 Q! k& C5 S
  11. 6 B0 R! N5 t1 @' p% e) n
  12.     // Конструктор монстра
    . ^6 H! i5 W# }8 Z
  13.     public Monster(String name, double attackPower) {) g# K& R4 M- I- ?
  14.         this.name = name;
    # I) C( u$ {8 V( l
  15.         this.attackPower = attackPower;+ z- n- `" _% Q  B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние' `; F$ u+ [2 B
  17.     }' e( T$ \5 ]$ \( a

  18. $ ~9 q3 m9 g) F- l- N
  19.     // Метод для смены состояния
    % t& K+ w( [; [1 ~
  20.     public void setState(MonsterState newState) {' x" e! Z; h% N" a: X  m. j
  21.         this.state = newState;
    5 y# ^  W4 x6 C: }0 K. j
  22.     }
    & k+ h& i8 f* o0 D' |

  23. , D) l" U$ c/ V
  24.     // Выполнение действий на основе текущего состояния# X3 D) |2 ]3 N8 |0 f- }
  25.     public void executeState() {* B# `; N* l/ a. K% {
  26.         state.handleState(this);5 @0 Y( \6 ~1 O2 M4 d% m& H
  27.     }- p3 T6 a( D$ r) k; w& P

  28.   R, Z8 g3 d+ [) K
  29.     // Геттеры и сеттеры
    " k5 Q! w4 W2 b' \/ r- h) L5 x
  30.     public String getName() {5 g  i- i2 W- m8 ^! O
  31.         return name;
    ! r7 H4 L$ S3 Q9 [% J: m, L) j
  32.     }6 N/ m# E' M' M* n& ]. W! n5 e
  33. 1 m' u. F2 r' B) O. S9 F
  34.     public double getAttackPower() {
    " }: \  F9 f' u; ~
  35.         return attackPower;& [7 N1 _7 o5 i' i
  36.     }
    ( P  v6 T$ l5 D

  37. & y- m+ l- ]8 ?3 F# \* N% ~
  38.     public void setAttackPower(double attackPower) {
    3 ^1 X  y* a9 G+ @8 P1 W
  39.         this.attackPower = attackPower;# L8 W% L7 Z( I8 k9 T( t9 X4 ]
  40.     }
    & S2 c& n2 I& X% E/ ^; }
  41. }
    1 s% q! ~, u; B; q
Скопировать код
9 u' E; F* a1 {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
' `1 e( Q; S7 |( l+ }; `, K9 w' W
# w, d5 m* X6 m8 u2 _. P5 h
  1. // Пакет org.l2jmobius.gameserver.model.battle: _; N& `' G8 I# U8 }) p6 a3 b
  2. package org.l2jmobius.gameserver.model.battle;' V" }1 \% _2 ]) e
  3. 1 U/ @3 v$ J5 l% ~* ]& G: t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( v* e, |6 e4 l" J) f  p1 E  o: p
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      E3 }  \  @2 Y  i* V5 t  q7 q
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;; F' e  k4 m- A, p+ B
  7. 6 \) Y" I! q: ^
  8. public class BattleSimulation {$ ^8 S( \# x- \& [: O7 a) s  `# \
  9.     public static void main(String[] args) {8 a- s' D% l) d# r2 l
  10.         // Создаем монстра с начальной атакой) Q) G7 \* E! h8 Z! |
  11.         Monster monster = new Monster("Дракон", 100);
    , D7 d8 L3 r, L/ ?1 M$ }) F) ^

  12. ) ?! @. O  i1 _- \2 N" [3 [
  13.         // Начальная фаза/ _2 N  o! ?* Q0 S8 a0 q
  14.         monster.executeState();& M% X$ m7 F7 |# L9 L) s' @

  15. - |8 N! f4 X3 Y8 a2 o9 x( n
  16.         // Переход в агрессивную фазу8 {8 S9 E( s! {7 [8 p/ x; l& F' K2 L+ R
  17.         monster.setState(new AggressiveState());
    $ C9 l5 ?: Z' ]1 X
  18.         monster.executeState();7 Y( V3 ~$ F' p$ B+ p

  19. 9 e" h/ M5 \* p* Y: x
  20.         // Финальная фаза
    $ m6 A( A0 o4 O, j0 i5 \3 Q
  21.         monster.setState(new FinalState());
    & M% n5 w% x* ]4 ^
  22.         monster.executeState();
    ( ^5 |% m; T/ X
  23.     }5 [1 ~& B: L+ z# a' r" x# A4 b
  24. }  L3 W* x8 v, u  i: g* ?- e; |0 A
Скопировать код

- E0 G/ ~, s5 Q) i; t' q7 KКомментарии по структуре пакетов и классов:" @, R& s: j. h+ h! z7 i$ _5 i
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- P4 j& C6 `6 i# F* }4 G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% i2 Y. a9 k1 F3 {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- M* y4 t" e* @5 C. C' n: X8 F  e

, e, x6 P$ G9 ]4 x- W' g1 f! |7 m& ^7 B; t2 f% b

8 e: O4 b* |; z( |: y" C" x
) ^! Z, k& V1 V- p' Y8 b2 x6 g7 ]) N+ _# j

& O' r# G6 R1 O% O& v" c7 S2 @: J8 h5 d
' B7 [+ f2 a$ u" c4 a6 ~; T) L

+ i% Y, q& E2 M5 x
. ^- g; ~5 t, P, C; h# s
$ F; ^. F0 l' k* w( B. i- H7 T
: v$ }1 k! d# s$ U
# \7 }: X* s7 M) K1 ^, {% y
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04: w  L9 V. }) w; w7 X
Для управления сложными взаимодействиями, такими как  ...
; o& S; @" E, j
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:219 _! {% K5 v1 u6 [- ~
Отличный подход! Использование шаблона "Состояние" де ...
/ E7 X+ U$ I4 |: Z
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
$ j: x: z1 O$ \" [2 i1 U5 {$ ^
) e, E3 [8 m8 G) K; y" X! ]Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
- ?' t" l% v3 U: D2 D
! s# b3 e! m# J9 G. t! X2 M9 i
  1. // Пакет org.l2jmobius.gameserver.model.actor) B4 X1 |" [; L
  2. package org.l2jmobius.gameserver.model.actor;: s  ]- I& |) D4 T- n
  3. + b5 ?8 O9 C: D6 e  b9 b
  4. // Перечисление для типов атак0 Z% M; B9 |+ T1 z
  5. public enum AttackType {3 J. S7 ?: x# V1 T
  6.     PHYSICAL, MAGICAL;
    : F" H9 i  G, ^  i6 v
  7. }
    , \% B1 }; u( S, v5 r4 l" \9 H
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" _8 Z4 j& M0 k1 xОбновленный класс для агрессивного состояния монстра:
0 e- ?& c8 x  d7 C$ X& |
* c& ~9 ?, a# f* p7 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . x8 ]1 \* |9 {  O' ?+ f, A
  2. package org.l2jmobius.gameserver.model.actor.state;* M" k% A2 k+ X9 V* q

  3. ( @& o, z! e. ~0 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;, j8 s& F& c) \; @1 W; p
  5. import org.l2jmobius.gameserver.model.actor.AttackType;( S' H# O- G' ]8 [) A. h' a

  6. 0 W; w* L7 P0 i% X
  7. import java.util.Random;# V% K! J- m+ ^& h& U; i

  8. * H8 E: g* `  j5 p" u
  9. public class AggressiveState implements MonsterState {1 v7 R. t) u* @0 g8 ]# C$ e% i
  10.     private Random random = new Random();
    ' b; y) u. H3 q+ p) k. w+ g

  11. 5 n8 ~- K' G* ^. J1 j" y+ Y
  12.     @Override- A- e* [, ~1 X- U8 z
  13.     public void handleState(Monster monster) {; c( p+ u+ I- O) ~# g
  14.         // Выбираем случайный тип атаки: физическая или магическая
    6 V0 f+ W; N# J8 g5 N; z" i
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;' j' G( a, R' ]" ^( ]5 C$ l

  16. 5 L# e: {( C8 n
  17.         // Логика для агрессивной фазы боя7 }7 o. I$ M1 p7 D2 w/ k/ W
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ( K7 K) q6 ~$ v9 G+ p: c4 [
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");/ ^6 e/ E4 o" j( `7 f. y: ^" D
  20.         # a9 ^2 P( |! F% ^& x
  21.         // Увеличиваем силу атаки в зависимости от типа атаки+ h# |% @5 |2 b3 `" c  q1 \3 [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    2 w7 ~3 a/ I# e6 t  V( C* _) l
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / x9 d, v- M1 o0 Q9 K' g
  24.     }( E; A0 M! }* x6 f0 \
  25. }
    2 \( d# E  I# }$ M9 b. z
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки# D6 q, T0 A2 D* z+ \( K4 [% O

3 ?3 s+ N; b+ n" f# U2 Z6 P
  1. // Пакет org.l2jmobius.gameserver.model.actor9 p9 f! u2 i  t9 V! i. Q- ?2 ^9 Q8 W; p* X
  2. package org.l2jmobius.gameserver.model.actor;  I- J) K% \) K& J! S" C- {

  3. 0 B" C" s- c, P" W" q8 ?( i' p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ _2 Y8 g, ]3 l. B2 x4 ?0 R" N4 y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # X  Q+ `6 V& u# v: Q' s8 E) O# y
  6.   ?# b) g5 N3 {; c4 r2 P9 e+ O+ |# o
  7. public class Monster extends Creature {. R% p2 J8 p7 U+ [
  8.     private String name;
    7 l# }& l4 T' h  r" Q
  9.     private double attackPower;
    9 e7 I) x& q- Q" N; {
  10.     private MonsterState state; // Текущее состояние монстра
    5 ~$ X7 A8 n4 S/ H8 o( d5 T# ?
  11. # \- L7 D: Z6 a% b" L
  12.     // Конструктор монстра4 O7 s& c! }/ M, O& K9 G. q
  13.     public Monster(String name, double attackPower) {7 _) _: ~3 e; U
  14.         this.name = name;( @5 K, }1 h& S8 n* ~& S
  15.         this.attackPower = attackPower;$ ?$ N; x. u" x- L$ `- \
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию2 x* E, Q% h+ X7 k
  17.     }
    " O# A1 Z, ?/ u* P9 z
  18. % z- k; \+ G3 B9 T
  19.     // Метод для смены состояния7 T0 k9 O5 z+ O2 A; z
  20.     public void setState(MonsterState newState) {
    ! ^- c: X% {$ X/ E- M
  21.         this.state = newState;
    . Z" E- s+ o& `$ {0 N! w
  22.     }, L6 o1 j2 @+ t% [

  23. # W+ Z1 |/ t8 Y& f2 z  d
  24.     // Выполнение действий на основе текущего состояния  G/ x5 J( K) G: Q; L* {
  25.     public void executeState() {! d' T  D" y3 Y  q# B) e' x3 H* h3 t" l
  26.         state.handleState(this);  A" B: H9 S8 s/ ?% B& t) j
  27.     }
    / M) P* j# g: S4 C& O* Z0 M
  28. * g" o" M" e, ~1 n2 g
  29.     // Геттеры и сеттеры& z4 ~$ H- ]+ o2 i  x# K- N! Q6 ?
  30.     public String getName() {
    % o3 b! J: N& w
  31.         return name;
    : v8 ~5 u$ S; l  x- {! M
  32.     }
    - O1 ^4 q8 k" j8 [4 G, Q- ?( H

  33. 3 K# w4 O( B2 T
  34.     public double getAttackPower() {
    ( [: L, c3 W) X# u
  35.         return attackPower;. i/ J; T5 |( i; z8 S7 g2 O. |2 K
  36.     }
    ) G; ~0 K# y# ~4 I& i: a2 E+ O

  37. 5 X$ j* s* ?+ r
  38.     public void setAttackPower(double attackPower) {
    4 Z# ~9 V1 V9 P; C4 D3 i  r
  39.         this.attackPower = attackPower;" H, x6 c) U4 x. _
  40.     }
    4 ~6 K' P8 E8 u" `; [9 \
  41. }7 `+ `4 [7 a" {3 |5 ]+ t/ m
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
4 [: B! G; e4 I: a) [( `$ ?5 }
: f6 P! a+ ?5 E4 |
  1. // Пакет org.l2jmobius.gameserver.model.battle! c" x1 F5 B, k! \0 ^! W3 @5 R
  2. package org.l2jmobius.gameserver.model.battle;
    ' `1 H" }& Q. b1 [" |& `5 A( [# ^1 d

  3. & X1 O& s/ Y2 _" w2 `& r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! u$ `( Z+ h) u+ Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- e4 `$ E% @+ a; `. D7 N
  6. ) C& @# {- z" B) f; A8 C
  7. public class BattleSimulation {0 g# j5 Z7 c0 Q3 s
  8.     public static void main(String[] args) {! h- u% P0 r& w- T. R# A
  9.         // Создаем монстра
    7 E  |) M5 I$ E- _5 s: z
  10.         Monster monster = new Monster("Дракон", 100);. a0 `" v" {( w/ ]
  11. / R( }3 D/ ~0 C* V4 F5 V
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    3 ?) o7 r% X3 H0 q
  13.         monster.setState(new AggressiveState());8 F) Z6 f0 [+ M( a# P, _
  14.         monster.executeState();  z$ s$ L3 Y* d9 X1 A* @# `/ k
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак# \4 B/ P7 y+ W; y3 A2 C: d+ p
  16.     }  W* t6 Q# [, _! r
  17. }
    % Q4 ^# g6 I; W) h3 b" g
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
1 h: v8 ^% i( ?5 e! dЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
  v% q  P* n6 v6 a! l6 `1 z% r5 G  \) l( g$ C) P& z
. P  s3 Q& F! Y9 }6 u: M
- n  ~: ^8 O) [1 T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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