Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 ]! L0 }7 V: N( y5 o+ ]
! {" Y- a* r- |& [% W  F

) o7 R4 J- B: V% zЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.0 w  x* z; o- I' F0 E" ^
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
% q1 R6 U; x1 M& A- _Астралия ?
; i# x: @: ?( f1 X4 P% X  w1 @) U. }; d5 O2 U5 G0 }

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!6 T8 B2 Y; u* C! j' w
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?3 i' ^6 W4 k) k$ L" [( P8 L

2 c$ C# B9 a, ~$ ^& M
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 i6 |7 H; m" n% i
AlexCoder опубликовал в 2024-10-16 18:31+ I# g7 b$ r& Z. b+ Y9 W, m
День добрый!
- \, s/ l  P( I8 i# C! lВ статье описано взаимодействие игрока с N ...
% k0 K7 L3 {/ g" q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ! I* c' I' w; r
1 `% g5 W/ |4 ]! {) Q0 }
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# K5 `& s9 k( W) K/ i, K" {* ]5 O9 R0 i+ Y: k! _) i
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: N  v1 o3 H% T3 y$ y* u5 o; b
" N* o- c' K! o$ A5 H( [
  1. <font color="Green">// Пакет для состояний монстра</font>
    1 _, T7 }' ]1 T$ Y" D+ f( q
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 c8 j4 i) X+ h
  3. <font color="Green">
    7 O1 p7 n9 g6 F' X
  4. // Интерфейс, представляющий состояния монстра</font>) z$ P% C1 ?2 z' M5 ^( _
  5. public interface MonsterState {
    , F6 ?  v2 y1 U+ b/ L* A
  6.     void handleState(Monster monster);) d5 Y/ i$ O# Q% d  V
  7. }+ C( ], t& m3 M' ]1 c
Скопировать код
5 n$ F/ N8 `. e% q) C' j; I
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ }' k6 W8 N; ^! \* g$ ]

" D  z" ~  t2 i, c) D7 S4 q6 pКласс для начального состояния монстра:
* N1 J. V/ f4 j3 K4 _+ L" R; `
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>. [% x, e) ]% D* W, l6 I, S0 g: L
  2. package org.l2jmobius.gameserver.model.actor.state;; e& l+ J5 A5 t6 ?6 h3 `

  3. 1 A: j- V# W& M, F$ g) Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) {& J$ ]% F9 Y* n% i* d

  5. 9 l/ h: P* x6 g/ s( F* D8 K2 p
  6. public class InitialState implements MonsterState {
    # b8 I* [- t: L0 B8 `
  7.     @Override: I8 ?: V; N; i9 Y5 N1 @
  8.     public void handleState(Monster monster) {) ^" d) r9 Q: U" ?  H6 @
  9.         // Начальная фаза боя
      ~# H9 M! E5 K4 L0 Y# @/ w4 m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : j4 f3 F% t8 j) O3 L
  11.     }4 O+ b, p& A1 l
  12. }
    0 G6 O& k- @) l
Скопировать код

6 z. w! _3 c9 C/ A& J3 j+ P% D, ?9 Y8 O! T/ L

/ ]4 c8 d* W5 p9 E1 P5 R0 {) `+ N$ r: f. i# G

7 q3 A. d  j6 B7 O: F& u/ N/ V5 u4 g; ~) y& o* h7 y& z' Q

+ k* T; Z: x2 \5 R: N; k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. h; l% \9 T) Z+ f) Z( s) [- W7 I1 s9 P; V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.& M- E" [/ r5 O6 z/ \: Z

8 l7 }+ ]8 D. ?/ G! a6 A" B4 _" \Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.# `, O. f  h7 _5 \+ g" l
6 V' N9 w2 \6 A0 e
  1. // Пакет для состояний монстра
    & j! F5 f+ c9 e. t* o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; P; H* P$ I2 y# @/ B6 o" N% K

  3. 0 ~; j( q2 V0 o. Y5 S
  4. // Интерфейс, представляющий состояния монстра
    & r* l" x  F! o% b6 J/ X0 x2 H. _
  5. public interface MonsterState {0 V& y: x+ |  F4 [: x2 a. n
  6.     void handleState(Monster monster);5 ]& s7 Z5 U: E
  7. }% P0 x" e$ H; ^' [
Скопировать код

3 z% C$ B& A0 O8 ?: mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
5 B) ?+ e* p; Z
2 D' z" a6 q2 z9 T6 p0 X3 kЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 B( k2 q" g* G7 F0 j8 w! l$ p- `
# a( M! u  A9 }0 Y' I$ F9 |Класс для начального состояния монстра:5 U" {3 K# }+ ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* j; o, f3 C8 J8 D* W: b
  2. package org.l2jmobius.gameserver.model.actor.state;8 U4 m! P6 L& P. _7 a& \
  3. : ~, M1 ~! B0 a# @5 q! i
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 d. ?& h: c6 e5 K7 _( r6 }  u9 v

  5. " F* z7 A9 ?: r# G+ J  K
  6. public class InitialState implements MonsterState {
    3 I* F& G9 G; g" \: ~( G
  7.     @Override
    " v$ o/ c$ s% N5 M0 r
  8.     public void handleState(Monster monster) {5 D5 }  g; ?& ~3 l7 t# q
  9.         // Начальная фаза боя" A1 B/ |) h7 @! B( P) J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 V8 b2 Z# c$ X0 j& x! c
  11.     }
    4 c  k9 t5 I2 A( b& b
  12. }
    * _  L4 e$ O1 L% P- |* \* k
Скопировать код
Класс для агрессивного состояния монстра:* o1 l; T5 n' K5 S! @$ \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 }1 c7 q" C' }, O" |
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 p+ e1 j) B8 p6 J1 k
  3. 3 f: g  `  ^0 O: p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " ]1 e9 V7 e7 t* \- C
  5. 6 J! H6 i9 z( L
  6. public class AggressiveState implements MonsterState {
    2 @9 p$ |+ @0 P4 X; c% W6 C
  7.     @Override# `4 i4 `5 k1 V7 c
  8.     public void handleState(Monster monster) {: z1 V  \5 \+ }5 D' N% d
  9.         // Агрессивная фаза боя; V6 t& ]2 _1 A9 ]
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 x( I% X* v' x; W3 y: Z* \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ! l1 Z+ h3 |0 m* d
  12.     }6 Z$ {/ y. x8 }. R4 {9 b
  13. }
    / S( X5 W9 e# A9 h8 P, p; W
Скопировать код
Класс для финального состояния монстра:' a$ x* w* c; Q$ Z; Y' W3 e$ P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . H0 H1 p% o! o: x
  2. package org.l2jmobius.gameserver.model.actor.state;
    % q4 f! g- d' {6 s" v6 ^

  3. 8 p" j  l. F) P* s
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # }' A+ C) S3 c4 L' |
  5. 3 n; l- B$ L; F$ \- J  r
  6. public class FinalState implements MonsterState {
    % @. A) G' W5 o" c
  7.     @Override
    2 o9 A; Z6 e9 U/ ]- l
  8.     public void handleState(Monster monster) {( b& ~0 d6 Q- P% v# Q9 i$ U6 j. Z
  9.         // Финальная фаза боя8 N! g. x  C. Q6 W( B) \& l
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");8 ]+ H# r3 ?: A8 s3 E
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
      u9 W2 @6 d! u, {: k( D' C
  12.     }5 A- H5 Q! F4 Q+ k
  13. }
    / ^7 W' v4 `9 w% l/ o3 v
Скопировать код

, Y2 F0 L6 H5 |) V. f" jШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 v3 u) T1 f; u1 f$ ^  f4 M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; `& C8 j( t( O( K' p  k4 }' h
  2. package org.l2jmobius.gameserver.model.actor;7 _( h: g& [7 A  ~" @8 V- X1 d
  3. : d" {' H, \  A5 y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 n- L9 T$ s- m% ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    , p* n! d  s$ a4 }5 w
  6. 8 R9 Z& p5 }  _- u; ]$ |9 o
  7. public class Monster extends Creature {; S9 w' H* k6 y) P8 |8 i& V
  8.     private String name;1 B# o' V6 r' k8 Z+ O4 w0 U
  9.     private double attackPower;
    & a- }! h  k. o, }
  10.     private MonsterState state; // Текущее состояние монстра' T4 l; G2 Q; [  C8 Y3 J

  11. 3 w+ v" {: J/ L- y7 c+ b
  12.     // Конструктор монстра0 A5 ]9 r1 N, {5 X5 V
  13.     public Monster(String name, double attackPower) {' R% J/ |* f# N" _4 _* S
  14.         this.name = name;2 i2 p4 C7 {( k7 F
  15.         this.attackPower = attackPower;
    1 p6 v4 T2 e7 G6 z& M6 \( {7 b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние" j' h) F+ I# |; j5 E
  17.     }
    # ?7 s8 Z( K& \

  18. - U& S- h& j# Y. g* T" T  F0 j; j1 k
  19.     // Метод для смены состояния
    / ~; Z  E/ d* I4 j! z+ |, W% a/ k
  20.     public void setState(MonsterState newState) {
    # z6 u' G3 x* {
  21.         this.state = newState;
    " Y+ ^' y$ `% {  `
  22.     }
    7 \- M- |1 A$ W
  23. 0 \3 E0 x$ R( |9 y3 a
  24.     // Выполнение действий на основе текущего состояния
    8 k$ J& x0 Q, S! b' U
  25.     public void executeState() {
    9 [. U( ~; ^- `7 |# {2 v' F& `
  26.         state.handleState(this);- m: v4 E$ |3 {' ]# Q" ^5 }, e
  27.     }* l8 |. ]" b" N, D& \

  28. 1 f' m& a" S, O& N
  29.     // Геттеры и сеттеры
    " D" U  T+ _$ o) X
  30.     public String getName() {$ W! ^$ C) ^  f3 d
  31.         return name;4 f6 l* q# ^& }/ s5 x
  32.     }  F% _, E. T5 C# x- V4 k

  33. 1 U+ l1 @+ d% b- w* M8 X8 D
  34.     public double getAttackPower() {0 }+ [5 t, o4 r8 w8 t$ M
  35.         return attackPower;
    $ n5 A; _7 l, P! Y" A% d; T
  36.     }
    * i( L& N3 ~5 ]; F

  37. / m, {+ i  Z+ q' }
  38.     public void setAttackPower(double attackPower) {
    & V% d+ m: Z# ^& y" ~
  39.         this.attackPower = attackPower;" t& R% E2 ~# N6 ?. L3 T7 ?
  40.     }
    6 ^, N2 }% U4 b! A" Q& s2 y0 }& k
  41. }
    ) @& s: j# x: y$ p- A6 m. I
Скопировать код

& A  F6 K2 D- G; V9 z- `1 kШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 N# P2 r0 n, g# D" M
1 U$ J' @" P9 R% H. N3 d+ }
  1. // Пакет org.l2jmobius.gameserver.model.battle1 m! w4 Z8 W5 @! [6 l
  2. package org.l2jmobius.gameserver.model.battle;; x" }! Y! L1 [) A; U8 q
  3. + C5 {; Z/ }! M. _: z
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 Y0 k: R0 G  ^# C
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . m  h' ~1 x+ o- `' |
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    3 q* N) i, o9 X/ V( O; ~7 Z

  7. # A; R9 e9 x$ K) _7 X6 i* p
  8. public class BattleSimulation {7 ^8 P+ b- t9 I+ z+ w  |- f7 Q
  9.     public static void main(String[] args) {
    ( w6 g5 ~/ ?6 S6 K) t% m5 I
  10.         // Создаем монстра с начальной атакой- W  h$ [2 b. a
  11.         Monster monster = new Monster("Дракон", 100);
    . t( |* A& D! s0 a
  12. - g9 p. r% E# z# Y) M
  13.         // Начальная фаза% x) R3 J9 Q4 \1 Y7 i, U
  14.         monster.executeState();4 \! }: r% k7 {2 ^6 n5 B2 ^
  15. * q! g, s$ I: `5 F9 H
  16.         // Переход в агрессивную фазу" C1 ^5 T! N! y5 S) s! {& i( B
  17.         monster.setState(new AggressiveState());! ]3 Z. B/ z! r/ m2 Q
  18.         monster.executeState();$ ?, ]& ^: ^* M' F+ G: N

  19. 1 A! U0 ?* u/ |; Z
  20.         // Финальная фаза0 n7 n! t- C: ^; m
  21.         monster.setState(new FinalState());% ?& Y( X4 B) F% S% w/ u0 {
  22.         monster.executeState();
    # R+ y0 E1 ?( o6 B
  23.     }
    9 k* _$ d- E( @- D0 c
  24. }
    ) r4 o6 W2 g' i9 M" M$ |& G8 t
Скопировать код

* O) F2 h8 K& {; {Комментарии по структуре пакетов и классов:
. x$ l0 \. `" J! V5 G
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    * v3 D1 K: V4 m! L% p* c
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) O' A  O. r+ }4 s; Z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!# o- P+ J( Q) |' i& ?# H
$ f3 N/ `" l) L6 T+ `

9 ~0 i$ s2 N0 J! e: v: `
9 }( }& O- G! z' {' D& e/ d
5 _6 F. Q2 X8 Z  {7 R4 T, {5 \; `. j9 R- u) l
+ x% P% E4 P! ]& g- Y; I7 |

# ~+ s( b& `; F& n1 l: G
( O  m( i* l6 ?& ~6 W/ I" i3 N& z; S1 P

" p7 B' ?0 I/ K7 F( A4 P
" j/ S5 O( l3 v/ o8 R: U9 ]- g7 \
; ?: U2 B3 G+ f: u$ D5 @- B- x& M4 [5 Q/ s+ K: J

+ S+ J3 p) i$ r* @
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 Q4 [2 B; M: J0 ^7 `Для управления сложными взаимодействиями, такими как  ...
' H6 x& [2 B" `0 G5 g' U8 k5 `
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:217 l- x! X  k) [' k, w" w6 w
Отличный подход! Использование шаблона "Состояние" де ...

, D! i( O8 V3 B" O$ nХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. A  P& ^6 g3 d2 M5 g0 H# O0 l/ i9 o, O+ P. g$ i
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.$ ^6 f5 _3 g7 w) `4 }
& }8 O+ V$ G+ \' r. i5 L
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( ~; @% Q0 r) D; I- w5 ^
  2. package org.l2jmobius.gameserver.model.actor;
    , G$ H, @8 b- o" J
  3. % T1 j7 ]# i/ ?* b# I  A& K. x  A
  4. // Перечисление для типов атак. _; o+ Q7 Z, {
  5. public enum AttackType {
    $ ~% a  D7 B, |2 Z/ m/ q$ i
  6.     PHYSICAL, MAGICAL;
    8 U& }, q# b5 F* O
  7. }
    7 {) c2 P3 d5 w- Z
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
* m7 \& N1 _7 p! g+ J- zОбновленный класс для агрессивного состояния монстра:
1 u, @/ t5 D5 W! v0 X& j' R$ N: G1 _1 F3 F% H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 m' ^! w! X; i; ^6 ~7 q9 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    * e" Y  L8 U2 o

  3. " q' s1 I6 R3 H: @% S: A
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 j2 v3 O' v7 C3 {0 F0 m, f
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    , v( \: I$ M  r$ w& j7 q- U

  6. 7 `- L# c' L% Y: r, D9 b( o& O' `
  7. import java.util.Random;
    + S4 }5 N1 ^# p

  8. 5 {' M2 n3 S1 n" Q) X7 T9 C
  9. public class AggressiveState implements MonsterState {
    0 X6 E% p' y2 P, \) ^
  10.     private Random random = new Random();
    ! `( O5 f0 k8 l( b% h, P

  11. 4 d7 F* G' G( i* A/ O" y2 Q
  12.     @Override
    - @! |  k, n. t( B7 ]9 A
  13.     public void handleState(Monster monster) {
    ! U) _# O/ B6 T3 i  T
  14.         // Выбираем случайный тип атаки: физическая или магическая
    5 F" d$ ~5 `2 t2 y8 H) Q
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    # Z, c- K% @: g7 r
  16. + B3 p% t" w+ J1 i; u
  17.         // Логика для агрессивной фазы боя
    ; ]3 K) Z$ X) d* X, X( Z7 ]
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : h+ @8 W! |4 l
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    - |7 \) O. P( |( E) X
  20.         
    ' k8 h) [9 o4 B0 r0 q, T3 ~
  21.         // Увеличиваем силу атаки в зависимости от типа атаки8 `" ]4 U- u; n2 [1 d
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    , Q$ v; q6 y/ A6 y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    2 ?( a* ~% @0 ^" _6 n
  24.     }
    # d. o6 l  N0 ?) \3 b$ _
  25. }8 ^1 U+ K. q; s( z9 h9 }
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
# H  q# S  K' c) q8 X
) `/ w" H' H8 \
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 D3 w! `- g' Z; t+ P3 S
  2. package org.l2jmobius.gameserver.model.actor;
    2 O# h( A' g2 I7 ?& g0 E+ S8 X+ V
  3. / W6 s1 ^& r* P* F- v/ y  D: s
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 W3 V2 v1 K$ I; k" J  v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . \4 F, a( y8 X7 ]! [/ A* H
  6. 2 x- C4 ]. b. q1 V. ?, K% U1 P% Z  D$ t+ G
  7. public class Monster extends Creature {# d. Y0 K4 h% ]1 s
  8.     private String name;! n: M2 `9 }  A: Z4 m5 j) E1 h
  9.     private double attackPower;
    ; M3 z5 U: F: v- f( a
  10.     private MonsterState state; // Текущее состояние монстра
    / d# h* x. G, N# g

  11. # ^* X: W" C9 P8 M0 l  R. u5 v& V
  12.     // Конструктор монстра& N% N, i; R3 w8 q1 I
  13.     public Monster(String name, double attackPower) {; `% K$ i5 a( r" L; I5 V& x
  14.         this.name = name;8 ?8 h5 d# F" D4 d6 A" O+ h
  15.         this.attackPower = attackPower;4 {4 _8 D3 O, l. c) H$ ]0 c2 A5 C' H# [
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 ?0 C( s$ E/ ?# H
  17.     }
    9 I4 ?; y5 f, H0 |4 ]6 B

  18. " m3 a& y! j( w
  19.     // Метод для смены состояния
    / d7 }1 t" L5 ^* U/ p
  20.     public void setState(MonsterState newState) {6 W/ i- z! ?5 L
  21.         this.state = newState;2 A7 R6 F* k/ D5 W2 d
  22.     }4 v! t$ T' q" h: K# q7 _4 f0 |" C
  23. ( @% |1 x/ a. ?* d9 Z
  24.     // Выполнение действий на основе текущего состояния
    # S2 n. j/ r/ ~* |$ Y% e
  25.     public void executeState() {
    5 }4 ~% @; X5 }6 z1 M
  26.         state.handleState(this);
    1 a# t, ~& ]; k& X- ^
  27.     }' s  O9 E# Y; ~
  28. ! z8 z: t% M- j* c) d' j
  29.     // Геттеры и сеттеры
    0 d! g4 q+ |$ I/ [8 N. e9 a3 [- L
  30.     public String getName() {
    " ^9 S* ?& k& g3 ]# r1 Z; O  V
  31.         return name;
    : S( Z' x# |) |% U# y9 d
  32.     }% i/ H) L5 x3 E; \, r2 `& ^8 |4 T' I
  33. 1 \7 Y( H, a: a+ [
  34.     public double getAttackPower() {
    : d4 ^+ o$ q- c! f% ?7 i" ^- g
  35.         return attackPower;
    : E/ `8 |1 y7 d  r" q4 [! S2 L
  36.     }5 r$ [* _0 K# p! o, F
  37. 2 R7 A" V0 e* }' ]# O& y* ^! x
  38.     public void setAttackPower(double attackPower) {9 R7 W" E0 j) n" C
  39.         this.attackPower = attackPower;
      u. @$ C* e! V$ D$ W
  40.     }( g1 C% O. ?( c( J
  41. }
    ) z8 _: ~/ w- {' P8 }, d
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! @) O' Q: Z9 h1 Q! |% `5 Y0 s7 l/ i5 w3 F: V4 l7 `; p
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 b, `3 |; B/ J1 p) V1 W8 \
  2. package org.l2jmobius.gameserver.model.battle;0 K1 s- f$ ^/ s8 r+ r7 K& G% H+ L$ e

  3. " M* ~. \7 `. T* T% V
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ G7 t5 e# Q8 y# a6 Z( c- r
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) B0 `2 J/ X2 s. Z3 [, `

  6. 8 R  E4 _' I9 _. |8 y+ H  K
  7. public class BattleSimulation {
    5 r8 G* [2 X8 {  F
  8.     public static void main(String[] args) {, [6 P$ b: c: G% o$ y6 s
  9.         // Создаем монстра( E: s& Q% `$ ?; `" A6 [# b* s& f% `
  10.         Monster monster = new Monster("Дракон", 100);7 E3 h$ s4 W+ }1 X  `

  11.   k" l7 Q  L, F- Q, a! W" f# g- S# {
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак  W' d# Z' T$ ]- M. b
  13.         monster.setState(new AggressiveState());
    - Q. g8 `4 T2 |+ W4 \" i
  14.         monster.executeState();0 i8 ]4 [- B- s, f" I
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак# l* n5 K5 W8 k6 g$ [3 I6 i- f
  16.     }; s6 |, ~- r5 _& n$ X6 c5 |
  17. }
    1 O" }2 w( `% W
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
4 K5 n9 {+ p; @4 h! ~5 u$ E3 @) |Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
5 q! m1 i. `7 Y1 L$ f4 |: t2 o. p" D* g" i1 ^! }- ~: I; V
) p& b: v/ X1 s$ J6 u6 ]
* k$ K+ a- F1 a' D  t. n
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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