Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
2 Y0 v5 l/ R  ]( H; B; ]
6 W- A1 J- V8 \

$ R7 P3 d5 b' `7 b8 c4 FЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы., }  Y; J6 d% x* r3 N/ k% \
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
( B2 J; n* B: {. k: Y  MАстралия ?* r9 u% ]/ z9 I  o

, ?3 U8 l5 Q( F' e) w

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
# z$ U' J1 B) N7 WВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?4 Z. K9 A2 z( ^

$ x6 b( ~3 g( \
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
5 ^0 T0 B/ w, o. R
AlexCoder опубликовал в 2024-10-16 18:31
/ {$ J5 R5 T8 u7 v0 o, A) QДень добрый!( }% p% V0 _  O; f2 b
В статье описано взаимодействие игрока с N ...
8 X; j+ o1 ^' f8 d% F" M/ {3 p' H
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 s5 l/ {% p& L  I+ D: |. m% f( W4 a: c% f2 Z( a" y3 I( @
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.$ K8 M2 T2 E0 D0 Z( [$ d5 |
$ {; D+ E/ t0 U  u2 e; U7 Z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% m! U6 V* D% J( W" C0 V' x1 K0 ]0 O+ s0 \  h0 I/ r( d
  1. <font color="Green">// Пакет для состояний монстра</font>
    4 N4 {/ G5 C/ H: ?
  2. package org.l2jmobius.gameserver.model.actor.state;- X: Q' Z5 |! W% ?5 Y6 s
  3. <font color="Green">& P0 Q# X2 c& o
  4. // Интерфейс, представляющий состояния монстра</font>* a$ |0 T9 J$ M. k8 h1 n
  5. public interface MonsterState {/ h2 ^- @% R5 o$ J% {$ i5 q
  6.     void handleState(Monster monster);* ?2 ?4 b( o. u) n7 Y0 n
  7. }  H* `5 C/ _. u% E- B+ ]: y
Скопировать код
- u+ l) t# ^8 n) v7 X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.4 S! u" y. g, \  k$ ~& @' L

/ g$ ]2 d+ n6 Y/ @Класс для начального состояния монстра:
1 v4 [! j' X% R1 O+ {, ^
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    + G' t. C" s4 _8 u7 R6 a
  2. package org.l2jmobius.gameserver.model.actor.state;
    % I$ f# M) e& U" q4 D! F' W( z' H
  3. & k; Y1 q8 G# d  z  O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) r- M& u/ h( H/ z' H4 r
  5. : O% {1 n+ l' p: l
  6. public class InitialState implements MonsterState {
    $ I2 _: r$ d, W2 I3 k. U) r
  7.     @Override' [8 N1 K' w4 o3 f8 l# [
  8.     public void handleState(Monster monster) {
    + V. h3 }. |6 b, L# N" V
  9.         // Начальная фаза боя
    8 m- q# ]' }" Z  _5 j& f8 f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 }4 `: C" p/ K1 k* h: n9 G
  11.     }
    % @: \/ Y& i* Q0 k3 }% j) i3 ?6 \) v
  12. }
    / F6 X: `/ `7 l$ i: K, W
Скопировать код
3 O! I* {' n6 i6 {

1 v; L, w* ]8 M  |+ b* r7 k7 |: g0 o& U. O; R
; J. Q6 J' a( K. `6 l
2 L" |0 n) f2 j

! n* Y- u6 j  I, o4 l- f! v5 `. z2 f6 ]: |& E
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 X& w; A4 V6 `0 w, K( c' M

5 T( _7 u* x+ Q$ uЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 O+ w2 t5 S  z( n0 }7 z
4 T7 ~. o5 y; y8 a7 d3 w  j
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 l- r" r2 g8 e( A
3 C) o, h$ h+ K" Z/ v
  1. // Пакет для состояний монстра- i+ o5 a1 i& k9 _# j0 I9 s
  2. package org.l2jmobius.gameserver.model.actor.state;# `' o! E, {  h# w' F

  3. # b0 b) R! Z( T  C7 U/ n
  4. // Интерфейс, представляющий состояния монстра
    ; [  q6 e# X7 E' C/ A  t- p
  5. public interface MonsterState {
    . C% Q4 t# Y$ L5 }
  6.     void handleState(Monster monster);# d1 V- |8 l  m0 b- n
  7. }5 E6 a  Y( |8 R
Скопировать код

0 |% e3 `* Z: K+ PШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . O. |7 ]3 C  e! h- j
$ F  z4 w& t' u
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 F$ D, N2 k3 }$ ~3 h7 P( Y: o; {

& V% `- o' a6 y3 `Класс для начального состояния монстра:7 ^/ G% W# K( ~& u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 _1 s! V7 ?. Y) |6 \# ^9 h
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 ?, V6 d/ b% c7 P* v

  3. ) I- ]  K# S3 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( ]7 y  a9 ~' H6 ]! L
  5. 2 x1 ~0 y) k% d+ y
  6. public class InitialState implements MonsterState {
    ' i6 D) u4 O: D1 `8 G8 f' M) c3 m
  7.     @Override
    2 D% D- R  b* i& ~
  8.     public void handleState(Monster monster) {
    / V" `+ O4 Q, @
  9.         // Начальная фаза боя
    5 M! m- V3 c' h+ v& Y/ ]1 {& e
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ L+ ]. Y+ t* G( E3 ?- K" x
  11.     }- e5 j) s0 X+ E9 P
  12. }
    7 R5 p$ J' P# X1 t# C
Скопировать код
Класс для агрессивного состояния монстра:
  a$ M( j! G9 R6 C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 V. M- p- A" P2 U8 m# ?) L
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 M; I: d( N6 D9 G; y$ s

  3. ) F1 H2 K! v0 D# o. g: _$ p/ \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) p; V2 a5 ^2 c# t  B4 ]# l
  5. ( @. t, T0 A5 [- q6 l" Q: p
  6. public class AggressiveState implements MonsterState {
    4 k" D; S; `9 d$ A5 ~% Q4 x
  7.     @Override
    6 H& s- T/ L$ m4 D7 p( w) f
  8.     public void handleState(Monster monster) {: H5 f. p! S6 s
  9.         // Агрессивная фаза боя
    0 A% S4 n) V6 i/ N; X
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    # X/ f  F& d; _& U* E, F$ L9 L
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ b: T- i* U0 w! V& Z$ x
  12.     }. t2 Z6 N5 ^1 z7 C5 K( C) W0 n
  13. }8 t1 h: g( r1 b+ R* g8 Z
Скопировать код
Класс для финального состояния монстра:
9 m0 O/ g  X6 ^! I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# [  B2 X' ^1 V- z8 X1 W8 Q9 C! R
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ u" Q5 F* H6 w' Z! |- u

  3. 4 B( r0 Z+ X; o. @& o% A7 f4 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 s; q- M2 L1 G. e! m9 A* g4 F

  5. % S. ]2 x/ [; i6 B" {
  6. public class FinalState implements MonsterState {
    3 t; u' L% L, q
  7.     @Override6 s, p9 Y7 |, \# e2 x
  8.     public void handleState(Monster monster) {- l6 B4 m# I7 r
  9.         // Финальная фаза боя& p7 Z$ i3 r( z9 r7 R9 ]5 W$ S
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
      w$ N/ {1 H* j7 Q' e2 r2 Y
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( {/ d, g7 D! p; U! w
  12.     }# _( r6 l% ^5 G- V- [/ d$ Z
  13. }' {$ f4 g6 k- v
Скопировать код

: W. X$ F. @, T6 X" PШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.' I* g) `  Y5 B
  1. // Пакет org.l2jmobius.gameserver.model.actor
      M/ Q" T  s+ r4 N! B" v
  2. package org.l2jmobius.gameserver.model.actor;0 ]5 A6 ~7 X, v2 y+ y  }
  3. ' \/ ?9 ~# s. M7 X6 G, I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 }' p, {' V% I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! N1 t: U# G8 s7 P

  6. . C7 K1 r. `8 b, l7 J
  7. public class Monster extends Creature {! _# U9 Y2 K% ?+ Y/ }& _# k
  8.     private String name;7 w8 p# V9 {! F  n4 w8 B9 Y& I
  9.     private double attackPower;
    0 W8 t. ?' x3 H: o  q/ `( O* |- _
  10.     private MonsterState state; // Текущее состояние монстра! D3 g* ]7 l+ l/ Z( v: x

  11. / w, X0 L( `3 R/ p. h* c
  12.     // Конструктор монстра; \7 `3 K  e( b6 A% h
  13.     public Monster(String name, double attackPower) {& d) m( M* X$ Z
  14.         this.name = name;
    : W( a. [! u5 K  I
  15.         this.attackPower = attackPower;
    # T  L% f( y" R( I& `
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ' C6 Q/ r3 w5 z' u/ q2 S$ s5 L" m
  17.     }
    ! \, D/ @& n3 G5 u

  18. % [8 Q& ?9 M  @! w
  19.     // Метод для смены состояния
    * P9 l4 U+ \+ F
  20.     public void setState(MonsterState newState) {9 A; F$ V. `0 z2 A, |4 u9 Q' M
  21.         this.state = newState;
    9 {3 m! [9 p1 P" U0 ?5 B* `3 ]
  22.     }
    1 G6 [3 f7 n9 O+ x/ x+ X
  23. ( ~: u' k) \, i$ j7 C
  24.     // Выполнение действий на основе текущего состояния
    % L/ m: W& v, [* y: s, A! U
  25.     public void executeState() {6 i! e, f+ U  q- \. b; ~2 {
  26.         state.handleState(this);3 T2 }  m1 H( N9 @
  27.     }
    0 B4 T; Q' o8 o; q$ i

  28. * W1 ~( z$ r" y, M0 J4 k* }
  29.     // Геттеры и сеттеры
    1 G) R: p. [6 {9 S4 l8 j, B
  30.     public String getName() {
    7 v2 ^) \, o0 R: l7 X
  31.         return name;1 q8 h- I7 B3 ^( _0 Z: s
  32.     }; ?0 W% l3 ]! t

  33. 1 E. b6 w# `2 x/ N2 a8 a2 u! @( y
  34.     public double getAttackPower() {
    % o+ T6 I1 S. Q- X
  35.         return attackPower;3 d+ Q. g& `! w! N
  36.     }  P1 P9 A) B* e5 [- n& ^+ u

  37.   ~8 E6 Q! w2 c% V
  38.     public void setAttackPower(double attackPower) {1 J6 F# b6 q& I6 ~: ^' T) O: l  a/ Q- i
  39.         this.attackPower = attackPower;+ s3 u' K6 w# r. j: E$ T# Z: A* c
  40.     }
    5 f, V9 l/ X  V6 g" U" {& C; g
  41. }
    ) n  J% l5 U, b+ }
Скопировать код

# \$ }) \% f2 m. v0 Q5 fШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 s$ F/ Z$ [! m, N5 x8 D8 U- m! y4 a% z% o5 O9 d% A+ D
  1. // Пакет org.l2jmobius.gameserver.model.battle% G. [; Q9 X7 |- p' R
  2. package org.l2jmobius.gameserver.model.battle;
    $ W$ h/ ?, S6 y" l+ G2 l

  3. * ^. P1 X8 U  a; V9 t8 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;! F; G+ v( d6 T) A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ; O7 l- b' ~. ~
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % M( t7 m9 R3 n) ~, p6 R5 L
  7. 0 u! M' {3 X; a; Y) o% h
  8. public class BattleSimulation {
    ) S$ x: M! [: A( t' N3 t* P! W6 ]
  9.     public static void main(String[] args) {
    2 L  n9 O: w9 _5 y3 w8 Z
  10.         // Создаем монстра с начальной атакой
    $ t: P4 r# p+ X
  11.         Monster monster = new Monster("Дракон", 100);
    * f- |, t) V3 }
  12. 6 b, A; D) W6 t0 g+ ~' d9 A
  13.         // Начальная фаза
    # k; r! J6 a) F
  14.         monster.executeState();# J9 R2 W. k$ g

  15. # Q' |1 n+ _5 h8 L9 x2 e# V+ W
  16.         // Переход в агрессивную фазу
    " t* }7 A& y9 O+ R  d$ K3 v
  17.         monster.setState(new AggressiveState());0 [) ]3 ?6 b  Z$ M$ r
  18.         monster.executeState();
    5 I# w; u+ n' A3 H% D: \! J: Y5 H

  19. , W! Z8 s. V! c9 N, r  Q  o4 {2 M
  20.         // Финальная фаза
    , B/ `( l$ x4 f/ L/ R# L2 K. b
  21.         monster.setState(new FinalState());# b% s$ \" ~+ L  a
  22.         monster.executeState();
    0 O8 t7 f1 i5 G1 s& r
  23.     }
    : P  F; ~+ s$ i5 q! X  P$ B
  24. }
    6 [  `8 n2 h5 h% ^; A' I1 Z
Скопировать код
  X8 y  S( B) S+ D) Z
Комментарии по структуре пакетов и классов:- P& a- ?  Y( `" F
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
      u7 O$ g1 ~( ~0 n2 S3 [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ `* t, F. U9 r/ `Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 P% J8 J" g0 N' K0 `& Z
# E! p, }. `. f( [, j; R8 k
/ E  N) U# G8 \# C7 Z3 S- |
) {$ [0 d, P7 e+ r

! S% y; b/ t0 j1 X& F
/ n: J  ]% i9 K, d0 @. Y+ P% v- w+ F( Y# L
$ L8 b8 T) h' v; j4 ?
0 O+ P; W" A- E  L: C
2 L/ h$ r* {1 f* c. m! f0 `
" z& h# J4 k/ n5 S) `! a

: P2 _8 z: g! {* x
9 a9 L) |; R+ ]4 l2 M
" g9 @9 P4 b: ?: a5 m! q- {" M) \" c( ]5 P$ n8 C
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04& d$ c- I& s* t
Для управления сложными взаимодействиями, такими как  ...

: n# b7 @$ ]3 L3 QОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
* c( h* A" N& y' t1 m- ZОтличный подход! Использование шаблона "Состояние" де ...

3 t- g$ ?: t+ }- S& }' ^( UХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
( U  v2 m& \% Y, r$ u3 B1 x: O0 e( p* g# t; p6 [2 @
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.% ]  f/ j( B) h* ]2 G9 Y
4 A5 O7 }. b; q# h% W' {' M
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / {5 q# S/ }: q( l! d1 J# _& y. h
  2. package org.l2jmobius.gameserver.model.actor;
    ' f! B6 `  ]+ o( g  E* ?3 d

  3. 1 a7 r2 d: H  m1 Q! Q
  4. // Перечисление для типов атак4 B5 v* Z) [4 g+ j4 N0 @
  5. public enum AttackType {
    & A. x* f5 j2 K% r
  6.     PHYSICAL, MAGICAL;
    6 w6 U" I6 K  y/ _1 o+ K# h8 V' u
  7. }
    8 Q2 g6 F4 ?/ I  R& m& I
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.  V+ `; |& u6 h! v+ r. [' A
Обновленный класс для агрессивного состояния монстра:
4 L. n' z& z6 V
3 ^3 Z( t) J! [! ?6 W# i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 W+ j4 {4 u5 t8 S) u# S
  2. package org.l2jmobius.gameserver.model.actor.state;3 |8 ?! e  I0 h+ V

  3. * r, V+ U& S, v3 L! }% E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 h  c5 g  x8 Y- D) q4 H% c
  5. import org.l2jmobius.gameserver.model.actor.AttackType;. Y+ J. W( P( t+ `7 {* s
  6. , b# ?7 P& N* _0 A* L7 M/ }
  7. import java.util.Random;
    0 r( D& U. [. K4 D8 Y  \
  8. ; u/ r! a1 w% o1 J
  9. public class AggressiveState implements MonsterState {
    4 }7 U8 C0 G) I1 _, o) s$ K
  10.     private Random random = new Random();$ L" D8 x( I5 i) E' V8 I/ k' u
  11. 8 z% z$ }4 `% B# f. u- j( y
  12.     @Override
    7 |9 ?0 z: l3 T4 ^) \: X% o7 g
  13.     public void handleState(Monster monster) {6 ^/ Q. a( o' R5 ^$ W2 Z0 u
  14.         // Выбираем случайный тип атаки: физическая или магическая+ c& m* L3 Y9 r4 O8 p0 L
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;% b* ?( Y7 ?" @& U7 z/ r" ~

  16. ) J* b, a6 _( t5 Y' n$ Q5 J' s' a
  17.         // Логика для агрессивной фазы боя
    6 A' t% a8 U6 y( E
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    $ C9 n3 t1 v& q- x1 M
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");. @2 o" y. X) E; a+ i+ Z/ J& J* H( Z2 Z
  20.         . y2 a. \/ x# W8 `# W/ O) M7 U
  21.         // Увеличиваем силу атаки в зависимости от типа атаки/ h' c/ ~; [( f2 E5 y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ( t" c+ R; `) I8 `/ w: F
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);$ v0 n3 q/ U3 e! B$ q
  24.     }: C6 `5 K! P2 u' R; U. n( a2 A  f
  25. }" }4 l& o% F0 `( \9 m3 Q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! R9 F) p7 Y; f' X- T0 `" D
# K! H- a" R' s
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( q. |& J" D4 u- Z- k  P
  2. package org.l2jmobius.gameserver.model.actor;( W8 x8 S8 r8 \& Y0 ]
  3. 0 n3 J# f2 a/ O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    8 T; r, Y5 R4 b' ~$ }
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 r$ N, d5 X# f5 Y0 d9 b. B( c  j

  6. ) h( L1 i0 S9 _5 o+ d7 m4 e
  7. public class Monster extends Creature {0 @' P6 g+ n" D5 [# n
  8.     private String name;6 s! {" {/ ^5 ~& v1 }
  9.     private double attackPower;4 t+ P# i& ?. L3 T/ s5 v; Y
  10.     private MonsterState state; // Текущее состояние монстра
    ' e2 U1 {4 ], b8 d% D+ `* W+ h

  11. 7 s" i+ z  ~7 O$ ?2 L# u6 k
  12.     // Конструктор монстра' a- Q/ f8 U4 z! m1 M0 d
  13.     public Monster(String name, double attackPower) {8 K3 m# ^% e" c. n1 C1 v( z
  14.         this.name = name;: i' t( C- K' k2 ]' q  b
  15.         this.attackPower = attackPower;
    ; R3 b& }. x# d& h$ @
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию$ ~7 G9 X" A( @8 `
  17.     }* J, W, c  v. |" e7 m7 O7 i

  18. ( U5 W0 T  [7 }# v% E  Y
  19.     // Метод для смены состояния
    ' L3 r( a/ x8 ?5 P  x9 M
  20.     public void setState(MonsterState newState) {
    & H  V' d9 i. [: ~
  21.         this.state = newState;+ c/ c/ D2 b- L) s
  22.     }0 S" A' a- F+ J$ K

  23. - W! }  m; M2 w# w# B6 A2 N
  24.     // Выполнение действий на основе текущего состояния: [$ v7 T" Z5 p% d# s3 v: B4 k
  25.     public void executeState() {
    ; n+ s) v- O2 ^9 \2 G1 R
  26.         state.handleState(this);
    . ]" M5 J$ M5 s- \$ U
  27.     }4 i( p1 z. o9 t- H; ~) V
  28. . i9 x. ~: H7 l4 R# R, s
  29.     // Геттеры и сеттеры* u$ ]% R8 K+ Q/ X/ g  |, d2 ]
  30.     public String getName() {
    % B# L4 T5 c. z, g7 w4 B# {6 U# B
  31.         return name;! w0 c$ j7 {" u! J
  32.     }$ \# a0 T4 U+ a' r1 _/ Q

  33. 5 ~/ o: G; o5 R; ]# Q0 T
  34.     public double getAttackPower() {& E0 l4 k, ^$ T* q; G5 k7 |
  35.         return attackPower;
      s; G7 R, F4 E" [& x& _. Q" r; L
  36.     }; F& w! j# Y- c) d' y, ~  ]. N
  37. ; V9 J) W& B; N! z0 x. G1 P1 Q6 e
  38.     public void setAttackPower(double attackPower) {9 Z; i1 @+ l% r& y" D  j
  39.         this.attackPower = attackPower;
    7 N: w* n: Q" @( M
  40.     }+ A3 R4 J0 Q# i5 T% p$ D
  41. }
    & q: }& Y& w! b) b
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
2 I8 |  r& Q& M* E  `& F/ {; x4 N& P) s( H9 G
  1. // Пакет org.l2jmobius.gameserver.model.battle* w; e/ h- A9 `/ g$ K9 c
  2. package org.l2jmobius.gameserver.model.battle;5 G$ l, _+ s! O  A' q# t

  3. 0 u+ D' t; z: X  ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;( r! N% O$ i/ J% v  |( W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 q8 C: k" W+ d4 o5 b  f; J
  6. ; i% I, j" H$ |9 C
  7. public class BattleSimulation {
    " i4 v: k6 T. l3 K+ y
  8.     public static void main(String[] args) {
    " L1 i$ Y+ [& w
  9.         // Создаем монстра. q. E0 @  ?& K( w% l
  10.         Monster monster = new Monster("Дракон", 100);, `9 F3 |, X' i+ X: Z4 j

  11. $ ^* ]3 {7 L: Q1 W+ c4 N
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак; z7 y: D6 |' I+ ]+ R
  13.         monster.setState(new AggressiveState());* Z9 C4 G2 B: d/ f5 r
  14.         monster.executeState();5 |+ G2 Q( s7 C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    1 E) D2 S; ^: I/ Q5 z( a
  16.     }6 G0 _5 W+ g3 H" s. r
  17. }
    % ^7 j' \) U) R# u
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
* ], B0 D, m9 ^6 `. UЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
" G4 e$ G: C) G& [5 m; z, g) @
  J7 }$ I# S# e* Z$ t, a' f
+ G1 m, ~, X1 F4 J
& F+ i1 n9 g% q1 _, N$ z! |2 W
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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