Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!% i' c* W, [  C: r
9 N- r; r5 k4 v* m

( z& x( `3 W" P0 x+ X5 I9 ]( WЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
0 `1 v4 `( M$ T0 {Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!* P  a  N  P" _5 x' U( N
Астралия ?( t* X7 b9 C9 N
% E/ ~6 J; r3 w# M( i9 z( r

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!: k; K; u# \$ g; O. ^& p- g
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
" r' \5 Y5 t3 y6 `: Q& X
1 |+ ?( q7 Y2 U2 f6 x9 k/ W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 5 j+ u& m4 I  i4 X. @3 ]
AlexCoder опубликовал в 2024-10-16 18:31* P. P0 y, u% E$ h' I  j2 W
День добрый!; g: K) }+ H1 r( D( U
В статье описано взаимодействие игрока с N ...

) Z' t& Y. j$ V' h9 u* Q6 XДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 0 N9 N  z8 B. ^4 q9 {6 w  e
+ c! W6 D& t: X# E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
, r- H/ F$ }8 P( W" z. f( W6 u  V- k" }& N4 X# c0 l& p  a
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 Y% g5 A( \) F; F) e6 O

# n* `* A- }* [5 ?3 u
  1. <font color="Green">// Пакет для состояний монстра</font>
    3 z; |$ q2 q' A" o
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; J7 Y8 @8 I4 H2 K
  3. <font color="Green">$ M) z4 W- D, l' A& ^! b' ]) b4 z
  4. // Интерфейс, представляющий состояния монстра</font>
    3 Y( ~4 z. x% U$ `" g$ {1 X
  5. public interface MonsterState {/ M. P2 q  \- I$ r  c
  6.     void handleState(Monster monster);
    " _5 M& K5 w5 u' I& U8 u; a( c! N7 Z) @
  7. }9 Y! X* q2 t  T
Скопировать код
4 b/ |3 `! s5 k4 R% }5 Y( x. z! C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! {$ f6 \4 `# h' F% l: [9 L/ `
3 o' h1 f- g3 K3 ^& l
Класс для начального состояния монстра:3 O1 X0 t3 Y# S
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    3 I+ {: N% B& u! _6 v) H
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( g' m7 p$ P$ e  {0 Y

  3. ( `0 ~, d1 u% Y0 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . |. T5 `" H. d6 N9 V
  5. ; D  @/ L+ W! ]- {7 O8 J/ n
  6. public class InitialState implements MonsterState {0 V' V/ F& Z& H+ y
  7.     @Override
    ( }' M2 z- z# ?/ X
  8.     public void handleState(Monster monster) {
    # C, [* y' e5 x) o! J# w
  9.         // Начальная фаза боя
    " Y; c6 a9 a9 D" v
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ Q# D- X0 l( y6 D
  11.     }
    1 T) t5 R; e( a% P0 l% [) Y8 F
  12. }
    ) B4 }& ~+ \$ E5 i( C$ W! M7 Z
Скопировать код
6 T% c. N/ H7 ?0 h

7 a2 g  n+ i: C* U; f  [# x, c. u$ D

& w3 M. [( C, F7 [7 q
& `$ s) @  M( \6 c' J
  T1 T) ]0 _- c3 K0 f) _6 b5 w! A0 h% l) a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 A- b1 }; D& l% P5 Y* n

; _$ I/ m+ L0 A4 GЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; k6 W" P+ G( @* m
# R' G" k6 E3 g; x- iШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 ~) m! Z4 k* E! e8 @/ c6 R' H
3 z& z4 q/ u$ O8 d3 g! p
  1. // Пакет для состояний монстра% a& \! i, w+ s( w1 Z9 d
  2. package org.l2jmobius.gameserver.model.actor.state;/ S' i1 |: B5 q2 m$ }$ ]3 g; n
  3. ! }/ C7 N* ^: g# L2 \3 D4 x* J
  4. // Интерфейс, представляющий состояния монстра
    ( A  X$ O9 K+ S
  5. public interface MonsterState {
    $ D* }3 X- K! ]7 Z3 k& B4 o
  6.     void handleState(Monster monster);
    ( n6 Q1 ?$ Z: Z2 }9 d8 P% Z
  7. }
    0 \0 u- a6 s# ^1 K; C
Скопировать код

8 u& S( l% R" P1 D+ ^7 \9 gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. / u/ G8 D+ g- z& P

7 C( W3 X& v- ^9 [9 D1 DЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 Y9 z" v  C( C' s) q: q2 \1 ~) _5 F+ Q) W) p
Класс для начального состояния монстра:' s4 C3 S; s5 ?) e; i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( i( j( s9 M- t9 |% h/ i
  2. package org.l2jmobius.gameserver.model.actor.state;) Y9 e9 I$ L% @/ Y: F. @

  3. . X1 s3 d1 i' C4 J8 o+ |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ I, Y9 E* }3 \# r9 g
  5. 4 X: S4 j- `! i" C! m* e8 B4 P
  6. public class InitialState implements MonsterState {  z6 a/ J- z# k# L! J& r0 l
  7.     @Override
    ; d0 [& Y3 D1 j5 O' Z3 F
  8.     public void handleState(Monster monster) {
    9 l" f' k3 u; g' [
  9.         // Начальная фаза боя! T3 I. L& U$ z: O% p
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 |: ?+ q& P9 X7 D. w2 i  m
  11.     }5 z( f* f! M/ G* g. f  P
  12. }
    % N3 x" }0 U+ u7 L# `* V
Скопировать код
Класс для агрессивного состояния монстра:1 O  k2 x4 a  L8 \, A9 `- B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : o. I1 j+ g, O( G7 v! S
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 g1 A7 A' X0 P) u4 \- `
  3. % A9 z1 v! s- B9 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;( g5 \- }" o  R/ z+ K

  5. 2 j8 t1 g5 {& i# L3 F( A, S& d$ m
  6. public class AggressiveState implements MonsterState {: Y. f0 x6 T2 {, @# A
  7.     @Override+ A1 u- o3 V0 |7 K) J5 s
  8.     public void handleState(Monster monster) {0 z& m; W; i# w1 L% o5 R( u" J% _
  9.         // Агрессивная фаза боя
    / w) W9 z/ ]: f  w0 {3 t# m
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");& g" F9 L$ }; F# u% {
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки3 |9 X: S) u0 r" u; d' J
  12.     }5 ~) q- Y5 Q6 ^( s! q
  13. }- p8 v5 U% I' D' f7 s4 ]. L
Скопировать код
Класс для финального состояния монстра:$ o8 [! J  p6 a) B: |8 Y: b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 q, S8 q+ v0 N4 ^* ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    " N" Q% {- q  P/ b- F) A  Y

  3. 3 e1 X- u( A+ E/ A& y- e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; |) F! G/ x$ g% E% `% w. s
  5. 3 B7 g; ^. e6 ~' \3 o5 B
  6. public class FinalState implements MonsterState {
    $ H& O0 c7 g2 n. j0 e, `
  7.     @Override( A3 f" f4 E  E, O4 H$ Y# D
  8.     public void handleState(Monster monster) {/ D& l, V; d# l8 u. E
  9.         // Финальная фаза боя; f5 z/ s: b7 H  X
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    6 f/ d* o. y+ ~) S3 @
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки- N) W0 Q+ o/ r0 R. e, G4 ?4 _/ A
  12.     }
    0 x3 U0 s) [1 a% a
  13. }, }2 W+ e5 p2 G2 S. _- b
Скопировать код
! T2 v7 c' U9 b$ T. _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 Q4 t# V# T* f; }
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 I# h1 F& s' R4 S# v1 m  X
  2. package org.l2jmobius.gameserver.model.actor;
    3 l; T/ B8 Y/ S7 V/ ~
  3. * {0 @" q0 f2 f6 s. D9 I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;7 j0 M7 Q0 ~" g$ \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ j4 X$ M0 B4 C; I, ?2 }0 j: l
  6. * w: A+ p: `  ?7 ]
  7. public class Monster extends Creature {
    / Y3 G% a2 ]5 F% w. k
  8.     private String name;; Q: C. x8 c0 y  X$ M
  9.     private double attackPower;! l) i$ I7 \: ^: W2 B
  10.     private MonsterState state; // Текущее состояние монстра
    5 |3 C/ R1 t# a: [

  11.   Y8 {, h( g! o; m9 h! c9 p
  12.     // Конструктор монстра
    8 p: B" D% x* ~+ }/ v
  13.     public Monster(String name, double attackPower) {" }5 E- [, C/ K. w1 S) r3 j, I
  14.         this.name = name;' e6 }& _1 z7 y& `& |: O
  15.         this.attackPower = attackPower;+ n) y: |" [9 U" P
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    " a+ j) I$ ~- J" e$ t- O1 X: D6 X
  17.     }8 `% F5 o7 V- H& u

  18. 6 @" |0 N. {% l2 q
  19.     // Метод для смены состояния$ ~1 s0 K" ?& j: U" t0 N- L
  20.     public void setState(MonsterState newState) {
    $ K  n7 w$ J/ L) z
  21.         this.state = newState;
    2 p, u8 G( U2 b% X/ o6 u7 x
  22.     }
    : D+ S# n5 D- d: L2 [9 ~- [
  23. * H9 e0 t; P: e( l$ f
  24.     // Выполнение действий на основе текущего состояния
    5 E3 M4 \& g* j2 ^
  25.     public void executeState() {3 u- c6 \& E" g7 D; H3 U. F1 M
  26.         state.handleState(this);
    2 B+ I1 u# Q) Y8 u  a6 Q
  27.     }1 k0 i' _7 u  k* e* c

  28. 3 `8 F8 ]# R5 s( Y( n0 e
  29.     // Геттеры и сеттеры
      P" ~- \! U& i/ X
  30.     public String getName() {
    ! E; L: _/ s0 ^5 @1 L: i' Y
  31.         return name;; S1 D- i( {& D, C
  32.     }
    ( B$ A* F3 s3 ^/ @% y) P$ s: W

  33. $ p, F. R$ x! q5 A+ v2 C2 E+ S
  34.     public double getAttackPower() {3 i* J* g+ G# r5 O# C+ \
  35.         return attackPower;# O, w3 k, K3 C0 g4 g1 r
  36.     }' f$ j3 s8 |# r

  37. * e: K, D+ G- p( S; d
  38.     public void setAttackPower(double attackPower) {
    5 S" l8 i# C7 [
  39.         this.attackPower = attackPower;  K9 n: i9 `+ c" |; k& ]1 I4 L0 z9 ^
  40.     }
    5 E1 Y7 e, f9 B
  41. }1 m: P4 o1 g# Z. d  ?  Q
Скопировать код
7 {! f2 a: d4 n0 F8 O" T& w0 q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
" j9 Y1 }! O! Q1 I; C9 V  l7 T9 n  [% O
  1. // Пакет org.l2jmobius.gameserver.model.battle: Q7 F6 y/ M0 _2 ?
  2. package org.l2jmobius.gameserver.model.battle;" o' {8 x: s5 a2 X2 e$ |# d

  3. 0 j  W% w% ~( u) J# _3 O2 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;( l/ R  \0 a( _/ ?! Q- F1 n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;3 L5 }0 L2 |- G5 K6 ?$ C
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    2 d1 ?% K: A( p" v6 b. b
  7. - N% G5 P+ t, C2 k5 ~
  8. public class BattleSimulation {$ H, ~) Q% y# g- }$ r# w) P
  9.     public static void main(String[] args) {' w+ y5 F& a6 e$ q6 L
  10.         // Создаем монстра с начальной атакой% V6 ]: O) i; T# d5 ~
  11.         Monster monster = new Monster("Дракон", 100);6 h* M- R$ N. Z7 H) b

  12. 9 K6 t9 c$ [7 T9 C' `7 W/ j* x
  13.         // Начальная фаза
    ; B+ O- [. V9 c4 |: I
  14.         monster.executeState();! c9 ^  `8 U9 V9 H

  15. 7 E2 \9 Q9 ~4 j  I! B
  16.         // Переход в агрессивную фазу
    3 A1 R% c1 U6 S7 Z% H  E
  17.         monster.setState(new AggressiveState());
    5 V7 L9 U0 y" E0 L) I
  18.         monster.executeState();
    " \0 v: Y5 G) [  b" X& u
  19. " O! N9 N" r4 G5 Z* K9 W" {9 a
  20.         // Финальная фаза
      U; S- s7 h; E  w- ^2 a
  21.         monster.setState(new FinalState());
    + f0 X1 e0 q  b" V
  22.         monster.executeState();
    $ W, }/ \7 Q7 v
  23.     }
    2 p" F: [6 f0 A3 m% _* }+ \
  24. }: `! w- Y- U4 {) [/ L# |
Скопировать код
4 g# ~' t8 I; p. T2 ]/ }# K8 s
Комментарии по структуре пакетов и классов:( }. _& |' g  F
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    $ H( m3 l: k, ?9 D/ g( d
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ q3 R! W9 S7 P4 a0 G( x5 \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
: I* e, ?- O& N( W2 l7 ]& j/ I$ U, V
( W4 ^2 m8 K; {7 s; F

# B* l6 ^  g2 h% w" b, }" c+ t2 v% a# {9 j
$ h" @. x, E" m; O2 ]

6 E, H* z" f9 N) v# R9 _4 D( ]9 I% q$ u$ a, K3 X. w* C% F  `6 O  y7 c

7 l3 N* ~2 c; t8 F) {8 J% c/ e2 }9 @5 q7 P$ d9 v

/ r: \: O3 Q# p( j! |
6 q) [0 J  ^4 L: @" I# v0 z3 r
3 ?, w% c, |' F- M$ ~& B" ~* ?5 i! `
9 y. i) x$ w0 {& _+ S9 S
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04& Y/ s( i' Y- i4 p' e
Для управления сложными взаимодействиями, такими как  ...

  ]+ j; X$ t( E* T2 JОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
3 z+ ~1 Y: g1 R8 [Отличный подход! Использование шаблона "Состояние" де ...

* @" F7 ]8 z% e+ R3 k; \" PХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
9 M# N7 p7 @* D9 _5 \
# W) v7 c# B8 M& t+ Z% o. _: ~Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
  f! i: B) J' h$ d3 q
" L$ J8 e! n# [3 p5 R7 h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 E/ f& z4 p, @3 K
  2. package org.l2jmobius.gameserver.model.actor;% e7 P) F  F/ l

  3. % U' N* N+ a: U  L
  4. // Перечисление для типов атак
    9 h! |3 \6 ^- z8 l
  5. public enum AttackType {
    : p/ C, S' D- ?- B" j
  6.     PHYSICAL, MAGICAL;
    . t0 N/ X3 {  n+ b- i! P* }
  7. }
    6 e9 z6 c  c/ J2 W2 S
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
$ G0 _8 Q* o& w& L! P6 XОбновленный класс для агрессивного состояния монстра:8 [+ E9 A1 x1 T. O. T: @

( k" l; S% K6 {4 U# j
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      n/ b7 D( d$ j; D( [
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! _* `3 y- m" v7 U
  3. ; x3 P* m+ g0 W/ T8 X# d$ y2 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 d3 i8 H* F9 i) A! g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;- l) N' Q) O! f1 A/ d
  6. * l( j0 e9 J- ]6 ?, k  P7 T6 U5 m
  7. import java.util.Random;
    3 V. M& Q% [! _' A
  8. ! Y+ H" O7 j  x8 k8 q' a
  9. public class AggressiveState implements MonsterState {
    2 Q4 K; i, m1 y9 h3 G2 a9 m  d
  10.     private Random random = new Random();
    . n; f2 M4 e) k3 e; L$ \: R

  11. 5 a' r* H+ g) F8 ^
  12.     @Override9 ?# C# m/ h' |* h$ k
  13.     public void handleState(Monster monster) {
    $ q! y& r( Y5 y( R" j
  14.         // Выбираем случайный тип атаки: физическая или магическая
    8 V$ e1 n- y+ L4 p3 w4 N' N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 D4 }) s5 l  r; P- M$ o

  16. 2 H0 u; I! N' o& t1 T5 d& C5 q2 x
  17.         // Логика для агрессивной фазы боя
    8 W2 |+ W  j" ~, u8 k
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " $ i, k- W$ h* t8 q) f6 K6 o8 e, {" U
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    $ q$ `0 N5 i8 i: W/ t5 _2 o) u
  20.         
    + T$ s. v# M* V, @7 |
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    / F9 u; ^0 ^9 k1 P$ ~: F
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    , I3 D7 M2 \2 K' w5 O
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);" E! S/ A% ]# C8 n( [
  24.     }
    7 ]& T% B! D# b4 n. `+ `1 H$ T
  25. }8 O" m5 A7 O$ t" v, M6 p/ y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 ?" `/ q4 N, G1 ?6 @

* D! {' p5 V$ n( @. U
  1. // Пакет org.l2jmobius.gameserver.model.actor1 M1 O0 l) _" K& T- I( ]  x6 n: R1 P
  2. package org.l2jmobius.gameserver.model.actor;
    ; s  b9 j) F! O- d
  3. * ~9 y8 Y+ f6 M' L
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 u: o) l; s  Q/ `- F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;7 [# b' o) v* ]8 i+ B8 ~& X: C* j: J

  6. 8 M) T4 m& Q* Q; d5 d* f
  7. public class Monster extends Creature {
    4 ~# H5 a* q, G. [
  8.     private String name;
    " q1 y' e+ H! X4 s& f+ q9 `
  9.     private double attackPower;9 T6 X" e. _8 v  {  ~; ?
  10.     private MonsterState state; // Текущее состояние монстра9 A/ M: R/ z6 v- j  p1 Q/ _

  11.   T: D' t. a) d+ D1 p
  12.     // Конструктор монстра( T7 |' ^  k0 ?* `6 L$ j6 Q
  13.     public Monster(String name, double attackPower) {
    3 Q4 p( t$ E/ A  {4 e3 ?
  14.         this.name = name;( u' v) \( H- ?- D8 j$ q, A( m
  15.         this.attackPower = attackPower;
    ) N" q! L% r. Y2 ^7 f, g7 a, O! U
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию, J6 J5 f( h: j+ u5 S
  17.     }
    % u' s, F4 E* B6 W; c1 g
  18. ! H0 D3 D" n8 {  [" r* l9 N
  19.     // Метод для смены состояния' A5 R3 r0 z# P( t7 a
  20.     public void setState(MonsterState newState) {
    + H: h: O0 V' C4 Y: m" Q
  21.         this.state = newState;
    $ k3 _# b; O6 W' o6 ^/ p5 t
  22.     }
    % e% S/ O2 L3 u$ e1 O: K

  23. 9 M9 P& }- l7 @( B
  24.     // Выполнение действий на основе текущего состояния
    / s) {2 C; a1 `& @
  25.     public void executeState() {
    / t1 f5 [. p+ r. X# U& z8 R  J0 j
  26.         state.handleState(this);- b/ I1 j8 O" t# L
  27.     }& Z; R8 J1 V; E# {  S

  28. 7 r1 {3 [  X7 D- p- o% i
  29.     // Геттеры и сеттеры
    . ?+ U* h* F% e. ^
  30.     public String getName() {
    3 ^) o$ K7 G3 A% Q
  31.         return name;
    4 m0 B, j8 X7 Q, ^# n
  32.     }
    $ J/ }! p* V2 x- g- J
  33. ! ~. ^8 G8 X2 s/ _
  34.     public double getAttackPower() {+ X' ^1 A8 E2 {: _' j
  35.         return attackPower;
    9 x3 i8 P5 t3 d
  36.     }
      O0 W9 T3 c5 B$ F3 N. }  t

  37. ; b  H) d: Y- v" v( R2 Y( s
  38.     public void setAttackPower(double attackPower) {8 c3 g& R3 S3 N! s; M8 q! Y
  39.         this.attackPower = attackPower;
      o' j/ z" H! |
  40.     }" Y9 |6 p# K0 ~4 z4 b
  41. }
    ) d" k; E! x" S( r: E
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
* L, [: F) \! M: x! B' l# y. Q6 S# ?
  1. // Пакет org.l2jmobius.gameserver.model.battle" Z1 ?0 i1 W$ U2 @& F0 ]2 h( D
  2. package org.l2jmobius.gameserver.model.battle;. G; s/ Z$ b8 B" D3 m: K
  3. 9 n6 z. [, |, }. p! I% G6 ?/ J
  4. import org.l2jmobius.gameserver.model.actor.Monster;  {7 o( u" q0 C5 N
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;8 o+ I& l5 E+ K2 ?! y

  6. ; j, a" P( F) Z) t* O
  7. public class BattleSimulation {7 X" ^9 L! u  Q* N. o3 }
  8.     public static void main(String[] args) {9 g7 b4 x& I+ |$ l7 \
  9.         // Создаем монстра; |  Y) J8 [5 H, Z- x6 ~
  10.         Monster monster = new Monster("Дракон", 100);! r7 Z( @' Z7 y- G
  11. , G: ]- G3 t* J. R
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак& q* |' Y4 W- J5 o* {4 K  P
  13.         monster.setState(new AggressiveState());
    * x4 i/ `1 ^# h/ K+ n
  14.         monster.executeState();" O3 o% P$ J8 \; G
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак. T! j) ]+ Y5 g' u
  16.     }; E- G. T8 O- |$ X: W  u& S* S
  17. }
    " G+ |" F" k$ R% @+ p8 o
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
" Q8 N9 f; Q" e+ w) b3 r, iЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
: S( V9 H# m, y) O0 Q$ J+ U5 j& G8 }
4 V- i# n( v% p2 n' i" f$ \3 _/ a( m
) K$ D5 {) q0 [# n0 \; e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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