Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 D: |" Y9 K  U/ c" o! p
$ N- [+ [0 Y. u- _+ D6 Q9 B
9 j  ^. P% Z2 X0 H% b
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
) |7 q3 G3 k; s- W" Y0 {' RЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!! C9 G7 t; f8 W. f' w
Астралия ?1 W* U7 x/ o6 W
# l+ t% W6 t8 z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
+ ^+ N6 d8 U8 f# I) q$ Y5 X) DВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
7 n5 L4 {/ V1 I; W% f- O4 w) K" A& j6 o' q! J
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 & q9 ?7 J+ a7 _2 P6 z/ k* b* [
AlexCoder опубликовал в 2024-10-16 18:31; M- O1 V0 \& t! w8 J- s  r# m
День добрый!
  e+ T) d, u8 f7 U  AВ статье описано взаимодействие игрока с N ...
5 \1 A/ e+ B3 P6 o# S7 b0 s
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 p8 x, z7 e8 O! k: T+ W

- q& e0 }8 w* d" E+ P* eЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 D: f, \* u5 A$ }& C
$ @3 v. V  `' z2 X& F& W8 U( I3 T& mШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 K2 l7 l: U2 u0 z7 L
( e3 B5 p  E4 h0 s: ]: L4 Q
  1. <font color="Green">// Пакет для состояний монстра</font>) d6 d* s( z: H( w4 _
  2. package org.l2jmobius.gameserver.model.actor.state;
      A9 [: W" v5 L4 E8 `; G; J! |) {
  3. <font color="Green">: P5 u' f6 ]+ v' H/ f; M
  4. // Интерфейс, представляющий состояния монстра</font>% Z  W" N. W- \6 R- U: @4 H: _! H
  5. public interface MonsterState {
    % B( c3 J' J( |' v  t
  6.     void handleState(Monster monster);/ M# `) C8 ~- u; u/ t, Z) ?; R
  7. }
    ) N) U" Q4 U7 ~. U. z1 e
Скопировать код
# |  [9 b8 N' ?6 p0 I4 C& {
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ d9 M4 L$ ]1 g/ T- q+ i8 u
& g& V! l3 B. _3 `# X; x- L" G- mКласс для начального состояния монстра:
) r. e5 b  U! j, @1 ^% N/ T; s
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    / W2 T* o. \6 N! O; x4 f2 A5 v
  2. package org.l2jmobius.gameserver.model.actor.state;
      K+ J% x  i% P+ `0 Y

  3. % ^) \* f3 R8 f3 n. \
  4. import org.l2jmobius.gameserver.model.actor.Monster;* f+ w- x! ~" d! U

  5. : E; K6 C) u; n, g) J
  6. public class InitialState implements MonsterState {
    ! j6 k. V, e% _* P1 F# L
  7.     @Override
    9 r$ A9 C( t% G/ j. y; U
  8.     public void handleState(Monster monster) {' F- v  U3 g, W) ~
  9.         // Начальная фаза боя7 p1 n0 F# F* }! u: ^/ z# ~- D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 t- U& X3 z/ a2 v3 H# Y1 d
  11.     }
    1 d* M3 C4 h& W4 X7 ?
  12. }5 P- z% `/ U* Z3 A1 N
Скопировать код
3 W$ g% v, ~' b1 X# }

( G; M6 s" H% W' [2 f
( V% h0 B* A4 }; a& T
( T! M4 i+ i4 ^* _1 b+ J" w4 b
; q, ?( y5 b; b  M6 B2 h  X5 A! }3 J8 a/ N
& t! y; C: l' v7 O) I& ~/ u; n( e* a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 |3 M: o) o! F% b0 F+ S5 U
9 U2 T- D, D. L* m. ?
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 a! f& W5 o; ]% c# S' @6 B! W
& k2 J' a5 n) e, [, h2 x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( O+ M3 Y: y/ ~' {# ]4 Z8 d4 X$ d, T
  1. // Пакет для состояний монстра* ]* j) W  g3 \: @; a( Y* y
  2. package org.l2jmobius.gameserver.model.actor.state;, [2 `: a* c* X/ T

  3. 4 i" W* |$ S% l
  4. // Интерфейс, представляющий состояния монстра- _  _6 B; M9 x4 E6 E2 K
  5. public interface MonsterState {
    3 V0 n3 B  l2 ]9 Z5 s% B! a5 a, p4 S
  6.     void handleState(Monster monster);0 D  o1 j" i2 d) ^5 N5 \7 g! B7 D
  7. }7 S. D+ B7 N# X2 W( c
Скопировать код
! W  R7 R8 r+ \4 C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 G3 o9 c+ }# S% a& ~- o. }) `- f! q

5 o9 O3 a! w& [( dЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ \5 w# ]# `( V: i
: z2 A" W3 d% aКласс для начального состояния монстра:. X4 {8 r) |: X9 l  w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 ~7 r7 ]: g1 I0 Z7 }2 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    * j8 y' a% p, @$ E6 U, T3 }
  3.   ?* O! T1 V1 [* A+ r  ~* R6 }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , A- g! J* c8 j& }3 W

  5. 4 i$ p( F! J3 a9 T
  6. public class InitialState implements MonsterState {' K" @; e: h; [- L0 [
  7.     @Override
    % b8 Z+ m: L- _; a2 o1 f
  8.     public void handleState(Monster monster) {- F7 k" e5 W3 y
  9.         // Начальная фаза боя# p- x+ o) f. A( M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ ]" @" s4 F) p3 W4 X
  11.     }6 _/ z( C7 F$ M2 V0 E- C) Y
  12. }
    8 w3 [1 {6 P! B2 U# p
Скопировать код
Класс для агрессивного состояния монстра:1 ^) b/ G: m" B( Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- k+ v9 Z$ b& O; ?0 L
  2. package org.l2jmobius.gameserver.model.actor.state;* ]9 {6 {: O9 N- d- B) }

  3. : z0 Y$ v+ L. D% ~3 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;& d* v: M+ z$ w5 a+ N5 W
  5. + W2 o- c1 E) X  H
  6. public class AggressiveState implements MonsterState {) j$ }; `1 B; t! _' `0 m" w
  7.     @Override- m& ^4 X; ^; @/ ~0 H: o
  8.     public void handleState(Monster monster) {
    ( T' E" r& b. g
  9.         // Агрессивная фаза боя
      Y* e+ E4 S; @& u. K" n. B7 Y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    7 D, I& |/ g6 }4 ^- U2 Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    / c/ ]- h# L8 N* u0 q1 l  s2 ^$ I
  12.     }& d4 Z4 @. K" h' ~0 N. _+ i4 I
  13. }9 F& ^8 x  M2 \" k9 B; ^
Скопировать код
Класс для финального состояния монстра:! K0 D$ J% k. ^1 x# `$ e; g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* i0 H7 q0 V. N, O3 t
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ V, k( W& V3 e6 f4 G

  3. . |" e4 n3 l- F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 N5 e# ~% g( h+ i7 N
  5. / B4 ~4 X- h4 C/ W/ i4 g0 A
  6. public class FinalState implements MonsterState {5 k$ Z: ]$ p1 y0 w4 \
  7.     @Override
    " |5 b0 ?. W  k3 a1 {0 \" A3 o6 A4 c# Z" S
  8.     public void handleState(Monster monster) {; _: j7 a! o; z9 s# @3 \
  9.         // Финальная фаза боя' ~. p. U4 k# ^: y5 V: I
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    $ G  t* w( L( |9 {0 i6 n
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки1 B3 W( o0 w( A' @4 Q! `: ~
  12.     }& @7 i+ f; @! E: H8 {' n0 R! i1 U
  13. }  W0 V! U0 i# `+ M; U# w
Скопировать код
+ R( m8 X& ?0 D' Y2 m# r
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
. x6 Q) R0 E: V5 ]+ H
  1. // Пакет org.l2jmobius.gameserver.model.actor" }3 c! ~( r6 V* F
  2. package org.l2jmobius.gameserver.model.actor;
    ) [$ d% S' ~* K

  3. 4 \+ `+ {" H% S' ?/ ]& \5 A
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. _. t+ U- V1 Z2 N8 [
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 B. ]; |2 b/ q" D& t/ i2 m

  6. * B; V* D/ d& \
  7. public class Monster extends Creature {
    1 |7 d/ A( D; M/ s
  8.     private String name;
    ! l( }0 X. R& u: \' f3 Z. z2 l5 \
  9.     private double attackPower;  j* y$ f* W) Q7 r5 X: A! ^0 p: b  L
  10.     private MonsterState state; // Текущее состояние монстра$ q& Q. {8 ?4 h, S4 N! A
  11. 9 a. [$ M5 B2 A/ [' g
  12.     // Конструктор монстра
    # H* e0 V6 Y! s- G9 n7 q
  13.     public Monster(String name, double attackPower) {
    & J  P8 r+ r" r9 U
  14.         this.name = name;' X6 u8 r# c3 [$ T
  15.         this.attackPower = attackPower;
    8 g  I3 y0 h$ J) w
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    % z. h0 O0 m, q* h. G
  17.     }
    ) `2 k1 p1 t3 G$ ^3 ?7 C
  18. / ]# T2 Q' Z! N6 V" c
  19.     // Метод для смены состояния
    / G" @7 i4 ^5 E. l: b( V7 Q
  20.     public void setState(MonsterState newState) {
      c1 V# A4 W* J% r6 F/ D
  21.         this.state = newState;
    ( e% z3 \, P7 J/ N0 z& V
  22.     }/ u8 |% k4 h3 R3 C& z. {9 N% L* P

  23. ! J4 L! b5 T6 ^+ D
  24.     // Выполнение действий на основе текущего состояния9 g/ a& j% A+ S" r$ o- ?; h- i( X
  25.     public void executeState() {( @- G/ z; \: f
  26.         state.handleState(this);
    ' U) ]4 G% N1 H/ ^2 ?7 t! h
  27.     }
    8 z/ w( j2 U9 m3 K3 l3 F, U; S
  28. + m, l* [- V9 D
  29.     // Геттеры и сеттеры) H1 N% @7 x3 A! f
  30.     public String getName() {: s7 P; `  S. E4 j4 U
  31.         return name;1 n6 p4 u( |( }" {/ N6 }' ?& U
  32.     }
    ( r- w+ H0 T+ M- p
  33. 4 }; h6 v; @! \
  34.     public double getAttackPower() {
    * Y+ Q0 H+ k+ @7 y
  35.         return attackPower;+ ^$ C  U, A( n0 h% _: A
  36.     }1 o: l0 L9 W- i, a% e+ {

  37. ) O, ]! x0 L1 c& y0 D& W
  38.     public void setAttackPower(double attackPower) {" `0 \8 \6 W* p. H% Q3 [  k
  39.         this.attackPower = attackPower;
    4 g- w7 b. c& a4 x# c
  40.     }' Q/ H7 r$ W) _8 U
  41. }
    9 ^3 |. N* P: J) U5 f
Скопировать код

1 o- e% S0 `+ [# V2 s/ e: rШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
# p4 y  Q7 Q2 ?; d3 t! Z: e5 a0 k1 X$ o: I/ r( d+ d
  1. // Пакет org.l2jmobius.gameserver.model.battle: T8 F- _( U* F; i, g
  2. package org.l2jmobius.gameserver.model.battle;
    3 o; g  a2 v' p4 {: s

  3. + ]! X8 X/ z0 ~+ a# b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; q; D8 M+ h9 Q7 Q, g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , @! y) g: a# O9 }% V
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;1 g8 b( \) v0 P
  7. * ~3 u0 o" f& s) z; s6 ?/ n1 I
  8. public class BattleSimulation {
      w1 r; {' H2 E! Q/ A$ o! J
  9.     public static void main(String[] args) {
    : D: i& \" z0 p) F4 Q9 Z2 G. G
  10.         // Создаем монстра с начальной атакой
    ( b! H7 |+ n4 U! x6 i5 n9 f( T
  11.         Monster monster = new Monster("Дракон", 100);
    , Y- j1 t0 \; Q. d  z

  12. 7 K( a' \. N+ ?! \" R: F* \
  13.         // Начальная фаза
    : o* R$ N% I) G. c) a* f
  14.         monster.executeState();3 M; [8 `$ \  |( S+ K: o0 v
  15. 0 i( T3 c( [8 I  n" Z
  16.         // Переход в агрессивную фазу
    1 c0 a9 P5 Q( b( y) ]5 l
  17.         monster.setState(new AggressiveState());) ?: ]& e4 O% i& F2 k& t- L+ a8 P
  18.         monster.executeState();3 R! o3 m( L! t1 C' ^. D
  19. 0 Y" J# u$ r( O- i6 w
  20.         // Финальная фаза
    # c8 j+ i" d) s2 O1 J
  21.         monster.setState(new FinalState());. O- r+ U; ^: V$ m
  22.         monster.executeState();, u6 f( T, l! i* C
  23.     }: _# l3 \" f. i2 _8 }
  24. }
    ( F% m4 Y6 N; o' ?
Скопировать код

! _1 I0 u! }. t' M) Y, qКомментарии по структуре пакетов и классов:
3 m& P! v$ C' b0 o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.. ^( p, z1 }& V
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 H+ ?5 D2 X# U2 OЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!' s' A, C4 d1 s$ o1 a
7 N9 ~: S& U: R9 O' O
( P! s* Y( n" ]  [/ k% u' i) m! \5 {
4 F/ r: M- q5 ^% v+ d  c
: E/ r! u/ P+ l" |: `/ ]- d1 L) L

! z: Q( w6 c0 c# |9 u; T1 ?/ V
9 I( k5 s% B) J) S% y+ o
4 @( @" R. E% T) L0 v* m4 {0 k4 m5 \+ i6 a" T9 f

# U4 m! }: h3 G6 n
! Y% O6 J! Q. f* s
! R. a2 }8 g( y1 g. a7 \- g9 M3 |% m* ~6 U9 u
- u8 `# F4 U& }( D9 Z% Q
% f3 q1 ~9 D  r# ]6 \: N4 F
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04+ b! }' z  b' \% X" _9 B
Для управления сложными взаимодействиями, такими как  ...

1 J4 ]- Q6 B4 f* u6 w( O! ]Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21( i8 M$ e6 n9 Z3 ]! X. {  N
Отличный подход! Использование шаблона "Состояние" де ...

* J6 t2 r+ @& J  E2 u* Q9 ]; h5 QХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.) T2 {2 C7 h2 X8 H( D

5 T' I, M0 c) l' y1 GШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.) z, O7 f5 X7 v5 r/ j! H
* T5 @) |; c3 j* z. R3 j' P
  1. // Пакет org.l2jmobius.gameserver.model.actor: Y0 J( S1 \  i* O, H
  2. package org.l2jmobius.gameserver.model.actor;" E4 F1 F0 q. \4 {: s
  3. & M* @1 x/ e1 I( n% a
  4. // Перечисление для типов атак4 p5 H$ E+ G5 [3 J/ n
  5. public enum AttackType {
    8 A9 e# K5 r! ~5 \
  6.     PHYSICAL, MAGICAL;
    # `: b5 p6 N2 Y0 P) k- h3 S+ Q9 w
  7. }' ]& L" J+ d/ b+ N2 A/ j3 e5 C% g, p
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
$ P, q" p( v( k  aОбновленный класс для агрессивного состояния монстра:/ w: I6 d  t+ q  A
( x' d7 k+ W  @+ W" v
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" h6 @/ J2 \: T3 k
  2. package org.l2jmobius.gameserver.model.actor.state;0 w) I7 U6 z8 q9 E2 ^4 ~  x
  3. . w# Q, E! H# ?* e/ ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 c0 c2 Z* C9 f
  5. import org.l2jmobius.gameserver.model.actor.AttackType;: d2 O! s, x) g+ [) O5 {

  6. * L2 G$ {" n5 R9 I& o
  7. import java.util.Random;$ @/ c# [+ C: }

  8. . C4 \' L4 F* V# {' D
  9. public class AggressiveState implements MonsterState {  Y2 W1 s5 }4 F& D- X. c* B
  10.     private Random random = new Random();) a  l5 N/ b$ t/ t/ ^  z- G# P

  11. . y5 w( ]  Q2 R7 a8 ?/ o1 \. ]
  12.     @Override
    $ {& n) s( p' G$ G9 ?2 S
  13.     public void handleState(Monster monster) {
    / z; {, X% t8 n, L
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; V+ E8 U. A' x
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    % q+ z: G; H% X; x5 F

  16. 0 W/ r9 l$ L5 O  W" x
  17.         // Логика для агрессивной фазы боя$ _4 |" b+ V! [0 ~- C5 f5 I
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 6 G0 K( {$ G. x/ n5 n6 a
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");7 G. n5 @  r6 G
  20.         ! l( g2 v/ m9 V4 `" k
  21.         // Увеличиваем силу атаки в зависимости от типа атаки7 r8 ?) x) ^4 ^$ k6 r  l- Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    / b5 ?! a; {3 f' y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);7 T( R) S' Q  @8 Q5 g- T
  24.     }8 X5 y9 g% O' x4 B( x
  25. }" P) g. A& \  i4 `2 P; T
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки0 X2 t4 ?# t0 }! l  Y7 K" b

) v" A9 r" ^' H0 x' {8 {
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 g" U5 N. T# C6 h
  2. package org.l2jmobius.gameserver.model.actor;
    8 \4 G! \4 s5 D  B
  3. % ~" z3 [3 x5 E+ z. r4 W# x1 `* }% V5 a1 S
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : R3 t" o  S6 }; H( e6 m2 e
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;, V% f  \1 y+ }* Z9 C6 r* S. W- C  D

  6. ! ]3 J. u9 a4 f# v% [0 j2 Z
  7. public class Monster extends Creature {5 J6 Z0 c6 H! L5 z
  8.     private String name;
    $ W& F: I& }, P7 E
  9.     private double attackPower;
    2 f4 s$ O" x+ V7 e. i
  10.     private MonsterState state; // Текущее состояние монстра
    + l7 Y+ c% V+ x! A$ j
  11. $ P5 b; o. y( D8 Q! A6 o
  12.     // Конструктор монстра
    " K  |) `7 v, j2 K8 I) N0 S: d0 d
  13.     public Monster(String name, double attackPower) {6 _" {& G  S0 x! Q' `7 O
  14.         this.name = name;  B- e/ h) c/ y5 X- y# O; I
  15.         this.attackPower = attackPower;% F' e7 c- x' t6 ^4 [# M+ j7 U
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    : \7 j: p8 Z0 h4 t$ f
  17.     }
    ) A8 @4 Z* c; i+ B; K

  18. , |' b* `+ f8 S3 v
  19.     // Метод для смены состояния
    ) X/ _" i* I# O: n4 w. E  t
  20.     public void setState(MonsterState newState) {0 v& z5 e/ m! v8 u1 F$ _
  21.         this.state = newState;
    % r+ h' B7 |6 U2 q) U, E
  22.     }7 T) W1 C( q3 ^9 ?' |3 x
  23. ( k$ ~0 c# C/ u4 Q
  24.     // Выполнение действий на основе текущего состояния
    0 E4 _1 Y: T4 i6 ~4 P2 g
  25.     public void executeState() {
    5 x' R/ }) c: j% B! N
  26.         state.handleState(this);0 _# l. i( b  L/ V' T2 h8 G
  27.     }8 \0 |! z7 Q! @' U
  28. 6 Z2 p9 m* I3 c4 F
  29.     // Геттеры и сеттеры- V7 l  @: _9 ]" @" ^) h
  30.     public String getName() {% C- X! a4 @/ x3 a
  31.         return name;
    / \; h, C: i6 R
  32.     }
    - `& J2 O; D& g: S, [) n
  33. . B6 ?  i% e6 s" U7 t
  34.     public double getAttackPower() {2 p/ \& a5 W6 Z8 [
  35.         return attackPower;
    / I; Z/ g, C4 O* S' p7 H* H
  36.     }
    ( O  d/ D  Y! P- x: ?! D- Y
  37.   S; m9 U9 ?/ u; h
  38.     public void setAttackPower(double attackPower) {
    - v: P# r9 y& R, d5 W
  39.         this.attackPower = attackPower;
    & p6 }- E" e9 z( Y$ X( M
  40.     }
    * H% n, ?( Q) S- Q
  41. }
    2 P+ d. B) t7 w1 K4 r4 Y9 s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.) s+ b# C. E8 ~. k7 C( n) W1 ^9 H
! z+ ~/ Z$ m: }! s. ^
  1. // Пакет org.l2jmobius.gameserver.model.battle" @9 f( G% v: \5 t& Y
  2. package org.l2jmobius.gameserver.model.battle;* t- ~( O, X3 P& A& v+ K
  3. 0 c1 _  K* @4 E+ o, _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 B$ k" h' S- Y  Y9 F
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    3 n7 X) D1 c4 Q& M* P: G4 d$ ^

  6. , ^7 Z7 w. f0 q# ]# M2 |- e
  7. public class BattleSimulation {
    * [2 X1 b; O  j4 P
  8.     public static void main(String[] args) {7 g  E9 ?$ B) X$ H
  9.         // Создаем монстра9 M% h+ T& Y. m  L8 X
  10.         Monster monster = new Monster("Дракон", 100);
    3 U: _: H4 P5 C) `9 s4 \0 w

  11. & V. Q" C% e5 H8 H7 W
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ! T; P; F8 `! l. j$ H: k
  13.         monster.setState(new AggressiveState());! D5 s. A% t3 c4 D: U' S8 q, `
  14.         monster.executeState();
    , U# O( d) N* P8 D$ `* t
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 A# `1 m' x  f1 ?1 _, X: S$ C& g
  16.     }
    ! m% P2 t# n+ `) y; l: E) ~0 P7 R
  17. }
    8 G$ t- |5 H! u& [8 Y7 H
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
. L6 b0 C" P6 B0 Q8 i" ^. {! jЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
+ v: H/ x4 t5 j5 @; ~" h
! x+ y  k0 \6 S$ s6 y
+ w; i% u, {! x* V) w, _" g) F8 ?- o& ]" ~/ c9 I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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