Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
) i( \7 z! M8 h
7 c# r2 ?: w5 E6 W. z* d; V
! t% U. {5 S4 L4 x. [& Q
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.. K( D* H  {& }' s, g$ j
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
$ F8 z; P5 x( }: \3 o% n1 E+ e! [1 BАстралия ?
; @, [) G9 [0 l& i+ M8 t: t6 R/ q3 a0 O" C0 ?/ o

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!) f5 V0 E$ |+ w, U0 P
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
! N- H$ e& t2 Z( o; k8 G
' }7 k/ N! g4 i
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: k  d7 w6 m' J' u2 f! T
AlexCoder опубликовал в 2024-10-16 18:31
/ T* k. p& N5 K1 oДень добрый!2 j" d- R! {9 ~% h$ \
В статье описано взаимодействие игрока с N ...

0 d/ ~+ W  ~2 y) @0 JДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). % p. s5 f1 [) l2 @7 [$ g

5 B; A$ B; ~) N7 sЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ W9 [+ {' v0 ^

- r# r# G5 u  `Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& ?( O7 m1 |" k. Y: O

9 s# U6 r. ?' C0 K
  1. <font color="Green">// Пакет для состояний монстра</font>
    * X% u  ?4 `, e; K& ], \9 z5 r
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 F. L5 [7 i3 l6 |9 v0 O3 l: }
  3. <font color="Green">
    ( @7 O6 C1 p  i# Y
  4. // Интерфейс, представляющий состояния монстра</font>
    8 d, I0 S# l4 b% c
  5. public interface MonsterState {
    ' s1 i5 N) G8 A: q! @  q( g
  6.     void handleState(Monster monster);( ~3 e8 H! z$ |. R- K
  7. }
    3 R& ^5 u; A. ]3 q* h
Скопировать код

/ U& Y3 y8 |4 s# ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ w( o6 I4 c  P8 F# R% H; Y

; q) t+ x8 m( E- ?) f$ |* BКласс для начального состояния монстра:$ s8 H7 N2 Y  W: v( W
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    % |% \+ x' l+ q. }% H
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 z# p9 r* T% t- O- V% c/ g

  3. ) u3 D0 l7 V- n" Z/ \8 q) Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 ?% y# a; J2 {% u

  5. 9 a% ?  \& Q' m% P
  6. public class InitialState implements MonsterState {
    3 Y3 g7 u( {/ i0 a. A# U* G, m
  7.     @Override
    $ W. e3 c- N& S% X+ ]# ]- Q
  8.     public void handleState(Monster monster) {
    % Y" g* P" v2 V  y
  9.         // Начальная фаза боя
    6 {1 K1 z6 j" b/ j1 W/ @2 U6 ~- t1 j) E
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    4 A" O- s5 |' S6 C8 Z" o
  11.     }$ f3 P+ @0 U" e, b* B& a1 U0 x
  12. }
    9 t. U, F, ~0 }, o$ V- k- @" u; @
Скопировать код

$ ]1 L9 K6 z, _: j9 l: K8 G- t3 Y* C% o& g+ d8 @

! r" K% s! ?8 h: i5 n
$ A# L" @1 b4 g2 @% O
$ s* v- J  p. W+ W7 m8 G5 ~% U
. L- ~5 r3 ~' L3 s' Y
" I6 R  |" _; Q' [
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
+ S' Q5 i& I0 M. s& j
0 k/ u+ K0 O  k, e1 q5 aЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  G3 A" a7 V, y

4 t. C1 u8 Q+ i2 d# _Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ x8 |/ F6 t  G: W

: A/ g0 J9 ^% }* N9 j/ Z5 |5 ~9 F
  1. // Пакет для состояний монстра
    " o% _4 |, j" v, V
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! h; [3 f7 x4 T* L4 ?

  3. ) n1 \8 b9 M3 J- e9 Z
  4. // Интерфейс, представляющий состояния монстра
    ( [4 k. e9 b5 o/ [& X
  5. public interface MonsterState {- ?% _& p7 `8 c: W4 S" O' y7 r
  6.     void handleState(Monster monster);
    5 B6 d( r3 F/ R7 ?$ X" o
  7. }
    5 e$ I9 X: m2 l; i3 ~
Скопировать код
% c" W7 H6 c8 \# s
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
. o+ i" i+ c. P- B4 J
0 j- i7 ~& X9 |7 hЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 l/ z2 v1 F" [+ W! @: B4 Q/ K+ D
, {' s9 h0 r) z7 U$ ]" }8 ZКласс для начального состояния монстра:
! g) t2 U4 u# S" U" O: D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ b2 D1 _3 @6 K( E! o7 r
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 P" |  N. f5 z1 D- V% @
  3. # A) Z) t0 G) _* E7 k: a$ P: ?6 ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + o5 `' b; c1 a, Y  Q, }
  5. + `* U) ~5 f2 V) R& S
  6. public class InitialState implements MonsterState {
    8 Z' t. y3 j; k9 p% @  ?$ y* D
  7.     @Override5 u) C' s4 A, |! n, H5 E: _. ^
  8.     public void handleState(Monster monster) {
    . V9 c% R4 H0 j* Y) v! K
  9.         // Начальная фаза боя
    * q6 x5 Y0 B. M5 u* q# o1 d
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* Z( P3 K& _/ m. Y4 \
  11.     }* S6 B: A/ x! H1 G
  12. }
    & A/ Q0 o& {% o. _+ G+ z/ l; d
Скопировать код
Класс для агрессивного состояния монстра:
$ w/ h0 @4 i& Z! i! Q/ k+ k; w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- r$ k. ^+ s' J
  2. package org.l2jmobius.gameserver.model.actor.state;4 w8 e: l" Z- b" {" o! t

  3. 1 F4 T3 N" u: ?4 u2 G& ?, a
  4. import org.l2jmobius.gameserver.model.actor.Monster;) u4 d! Q6 [: _4 R

  5. 3 n( M6 h$ k2 M  D5 B9 k9 p5 E
  6. public class AggressiveState implements MonsterState {+ P- W# q( Q, W" o+ n5 Z
  7.     @Override' C) W* o9 M/ ~7 v% U! a
  8.     public void handleState(Monster monster) {- n' e) l9 B. e
  9.         // Агрессивная фаза боя6 J8 W) o9 A3 _9 P0 M
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 }2 x9 Y0 c" @4 |  ^6 \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки# _9 X& E  b' O0 O
  12.     }
    3 Q, d' T$ ~. Q& y6 d' v
  13. }! z- e: w9 I9 N" s$ V0 q
Скопировать код
Класс для финального состояния монстра:& X' X% b5 y  g4 f. v' e, b2 M
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 K, e( N0 M7 X( s6 c" @$ }
  2. package org.l2jmobius.gameserver.model.actor.state;
    + M( a9 J, g) ~5 Z" ~9 d

  3. . i. X+ g# G- p) c' T  o
  4. import org.l2jmobius.gameserver.model.actor.Monster;* d- @3 z7 T. j1 a* ?( r5 d$ i% b! s
  5. 9 ?) M' V1 \+ X9 O
  6. public class FinalState implements MonsterState {' u& i* d  \% N) f0 K" Y
  7.     @Override
    & M! }( X3 A# c* e3 Z& y. Q
  8.     public void handleState(Monster monster) {
    , T; _4 P( Q! X0 h
  9.         // Финальная фаза боя
    - ^' R$ o3 i7 {, L; u* ]
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");1 ]" u! M" g$ I; W0 h6 T6 u$ n
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# {$ |, B3 r% W
  12.     }
    / O3 b+ [, O% C* b
  13. }
    % A; l1 i. [5 T
Скопировать код
6 B% `. v. {( O0 U0 S
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
$ b, I! X1 v# J0 K/ S" z
  1. // Пакет org.l2jmobius.gameserver.model.actor9 {! t4 i3 F2 f3 r$ d* e5 ~
  2. package org.l2jmobius.gameserver.model.actor;, t; n! @! v* n, n: f8 Z
  3. 3 e. M8 h& R& K
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , e! s7 D9 \  O
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % `& R: ^- Y9 u5 i3 j

  6. + K2 P; y7 ]( q5 Y) a
  7. public class Monster extends Creature {
    + C0 Q  z$ ~& F; U
  8.     private String name;  V  U2 D1 O# ?& E: z# x5 n! Q9 w( a
  9.     private double attackPower;
    & e2 d: ^7 ~$ Q1 g8 i! p
  10.     private MonsterState state; // Текущее состояние монстра: R/ u6 v; ~+ |% h& \1 [! b+ a

  11. % A- Z, P" i$ i1 r
  12.     // Конструктор монстра6 ], I/ {/ F+ v, r
  13.     public Monster(String name, double attackPower) {/ H% E% {9 |8 Q7 ]: X1 a- \3 R
  14.         this.name = name;
    : I( p: E+ z! e  J
  15.         this.attackPower = attackPower;
    " d' V: D+ q6 ]. ~1 }/ ?, F" \
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 j- X  B0 M' l6 w# m% R' T& b4 E
  17.     }
    6 R) y6 C' s7 d! H- s5 Q5 i

  18. / C. v+ J( G7 I2 I, u* p
  19.     // Метод для смены состояния
    5 a: d; F  k1 q: A
  20.     public void setState(MonsterState newState) {: E  r. J3 Q2 V4 {8 `& ~
  21.         this.state = newState;
      h( a6 t2 u7 V
  22.     }" Z) B/ V" o; v/ p- _, }" e! j
  23. 5 s8 m4 S* J# l7 T7 b5 O6 I
  24.     // Выполнение действий на основе текущего состояния
    8 c' M+ T% ]! Q
  25.     public void executeState() {$ l) R. P: K3 A2 q, _+ k" S" e6 s
  26.         state.handleState(this);
    & i- |6 x4 n3 h  V3 X1 M9 u, f
  27.     }) l9 b; Z! l! }) y

  28. 4 e, d, J! [2 s% N+ [
  29.     // Геттеры и сеттеры
    : n4 `. t  k" {3 s* Q$ g
  30.     public String getName() {
    $ E8 d0 y2 u6 L8 y* B
  31.         return name;
    # e: P& \7 j6 q) P. @; z2 \9 T9 y
  32.     }7 ~& {6 r* q* A8 R) z/ }! c

  33. $ A0 \- c% y0 R4 F
  34.     public double getAttackPower() {
    + _, {! @: _8 H! h+ l
  35.         return attackPower;
    0 E2 F" `# S; |) L6 i, b  k
  36.     }
    3 _4 B& Z/ h& L6 j  g* @( H1 E

  37. 7 `, k: U( c. V
  38.     public void setAttackPower(double attackPower) {
    $ v+ q% J5 c+ `
  39.         this.attackPower = attackPower;
    ( Q8 G& V; ^6 x$ l
  40.     }0 Q4 X4 @" }+ m8 n6 a+ H
  41. }. h, a; C; {9 M3 Q  H# o5 ^+ w
Скопировать код

5 j5 c, y, x( I% {: ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
# V" x, P+ y: b" C5 n0 |4 W  }
: e( S! }  ?" P0 J
  1. // Пакет org.l2jmobius.gameserver.model.battle! Q% o5 \( @: {+ R; U* B/ I
  2. package org.l2jmobius.gameserver.model.battle;* |. L7 y# P% [+ Q1 q4 J
  3. . e1 |& {5 b9 c$ ?# }) s) _' `
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ x# U8 X; G6 i3 z" Z  X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;' _4 ^9 D6 ]) u  `
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    . q  G" L8 a: G: G9 }

  7. 1 {) _+ F: f+ j5 |/ R; N) z
  8. public class BattleSimulation {5 p* P9 t# ^. J. i
  9.     public static void main(String[] args) {: [# R" Z$ }. k) e$ |1 [* r
  10.         // Создаем монстра с начальной атакой( N0 Q2 {- [' _" Z
  11.         Monster monster = new Monster("Дракон", 100);
    ' T! C' {4 R0 p' K% P

  12. 1 B6 l% a0 W: \" [- K4 q# e
  13.         // Начальная фаза
    " B+ ~! @( J$ R3 }- J) ]/ a
  14.         monster.executeState();
    0 p  B9 k1 F* k( C4 r2 _& }. \

  15. ( O$ P& Q& V0 {, Z
  16.         // Переход в агрессивную фазу
    / }+ a( K4 u5 h1 K
  17.         monster.setState(new AggressiveState());
    1 {  v) y0 p6 J! P
  18.         monster.executeState();" l' Y9 z- H+ V9 B+ C2 b9 @. |0 ^
  19. # n- `, q& [8 q( V
  20.         // Финальная фаза" F. H8 [3 n, \  P
  21.         monster.setState(new FinalState());
    ( o2 M8 Q) t6 d
  22.         monster.executeState();
    , r7 K3 N1 F  C" w  p
  23.     }
    / Y: u; c* ?. P% m9 l$ `
  24. }
    - D& y( V  i1 y" f
Скопировать код
1 |4 S6 K% Q  N1 P! a4 S- o2 I2 U# j
Комментарии по структуре пакетов и классов:! h+ Z( }4 h. H) C2 ~9 G
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.) k- @  F/ Z# D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
6 o- }2 Y2 a& EЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. c0 y9 [% S' k. x+ M& s; V& `3 b4 L/ O; u$ F

  |# N4 y9 M+ g
+ U# ^0 V1 c  q5 @) C- p! A' C5 W
" [# R" U( e8 `6 J! _- \2 p
: H, w7 N6 c2 w1 i8 j& @: _1 i; h; o% t

( |- p2 r7 p3 l# d
7 |; V! K: j/ ?+ C
1 ?/ h, ^# G; H* Z% ~7 g5 i3 c- g# l

" N) M: c- v4 W/ n2 A/ [6 y, ^$ U, X4 ?
, v' |7 T0 b8 p" ?# k8 P0 _1 z, K& _# C. }" f5 ~8 p
: s8 m! r/ b# ~4 v/ \
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
# Y; X0 P* \* q  w! KДля управления сложными взаимодействиями, такими как  ...

! I0 x+ _8 _' f2 ?2 T4 W: f+ R4 ?7 M, zОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
6 P+ f- [. I  @: eОтличный подход! Использование шаблона "Состояние" де ...

/ i) x) ]+ E: C! LХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.( B3 f0 s" E; D' Z6 d0 N

) r0 m: h+ Z1 F; y8 sШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.4 ^* R' v, ]6 B8 ]

: V9 R+ Y" k* ~! t; I  `; C
  1. // Пакет org.l2jmobius.gameserver.model.actor+ h( V: Z3 n" |/ f  B
  2. package org.l2jmobius.gameserver.model.actor;1 e. J, b. x4 ^' b

  3.   C6 S# S4 T% h! w3 X. E" W" l
  4. // Перечисление для типов атак/ \; f& Z+ k0 n# T
  5. public enum AttackType {
    : V/ L4 e3 T* ], {2 J. l
  6.     PHYSICAL, MAGICAL;8 R7 M7 {% ?" l4 X) |
  7. }" z5 X! M5 a8 J! E# W- o7 d# Q
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
& R2 C8 H: Y9 s7 t$ q2 ^Обновленный класс для агрессивного состояния монстра:+ g0 W- ~" C: W  h$ i
3 n* E$ i  X. m8 ]* k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 K0 a! F# i; I# ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    + X# {# ~4 Y, w2 y

  3. ; E9 U0 U5 A- p) L# a9 Z# p
  4. import org.l2jmobius.gameserver.model.actor.Monster;: I& \5 g" |9 Z2 L% N/ f
  5. import org.l2jmobius.gameserver.model.actor.AttackType;% J9 ], Y8 ~& d7 H
  6. 5 ]' f2 I6 t# S3 L% O
  7. import java.util.Random;' a( a' k( E7 f  ^

  8. / R, c- i4 p3 a/ b8 P! X
  9. public class AggressiveState implements MonsterState {
    3 n' {" d. e; t- G; [5 k
  10.     private Random random = new Random();
    0 ^) p$ E4 P6 l
  11. ) V* Y1 Q- z# @4 A/ p& T' l' x
  12.     @Override% L, c' [* v, d8 i
  13.     public void handleState(Monster monster) {
    . N/ R2 ~3 F" k& C. ^
  14.         // Выбираем случайный тип атаки: физическая или магическая
    8 z* {( _2 {. J# ~0 z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;. y7 L0 W0 ]: m/ }$ ]( A! P
  16. # E  i. z! w) m: z* A* X8 X" ?
  17.         // Логика для агрессивной фазы боя
    7 V- `+ t+ a( k; B/ j, |+ R" i
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 d; ^7 u0 [' T& a: u8 z  l/ F
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! f1 x- w* G# v
  20.         
    - ~% v3 A! T& G* p
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    7 g( g4 t8 j# N* s8 |# e
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    7 E7 {1 y8 A$ g4 o
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    " g- \0 [" K: x* o4 t8 L* ]
  24.     }$ |' S* S3 v& r; ]8 p. z
  25. }% m$ @, I2 q4 l$ R
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
0 }  n$ y2 C& W" Z; g; C) g1 v' }1 N* ~
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - t* w, V3 S/ [) g3 s9 N
  2. package org.l2jmobius.gameserver.model.actor;
    2 ]/ y4 l  g6 [7 ?; m

  3. " A3 _/ y! J( y1 T9 ^/ H! ]
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 c$ u: ]5 i4 f* m" D( P+ {$ o5 j
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 u  [8 G& i% L( M; T

  6. ; S; [" C+ r$ a8 ^' v
  7. public class Monster extends Creature {
    " k) S+ A/ S2 S8 x% u- G
  8.     private String name;; Y# K/ ^! I0 r3 g1 }
  9.     private double attackPower;
    ! M9 y3 ^7 \: [( I' C: @) e& W# n
  10.     private MonsterState state; // Текущее состояние монстра) R+ U, [+ ^2 n) p/ T
  11. 7 I4 b" E* S! `& Y# H1 D/ o/ B- \
  12.     // Конструктор монстра, I  P" p- j3 _8 R  B& D& p
  13.     public Monster(String name, double attackPower) {
    / q( _" U+ e8 b( B! H0 m5 t9 g. g
  14.         this.name = name;% \8 l3 _: V" x( e. q" g
  15.         this.attackPower = attackPower;
    1 N7 Y$ ^! `2 t5 N
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    # K5 A2 a0 v6 V! |  N, }" g
  17.     }
    1 D: l7 W8 i8 h, p0 M

  18. ( {$ ]8 v; b, Q, D& R  p8 F
  19.     // Метод для смены состояния! @; g3 a0 y: f6 B' G% N
  20.     public void setState(MonsterState newState) {
    9 f) L/ n, i! @' ~8 A, Q* f5 j7 m9 w
  21.         this.state = newState;
    4 L. ]; b- k7 ^; u" i* p
  22.     }; v3 B) X! Z# e/ O) y- G
  23. 2 M! X" K. E7 J8 y5 C  w
  24.     // Выполнение действий на основе текущего состояния
    8 d  m- P* I* L# ~
  25.     public void executeState() {
    / M, f1 i5 J3 r- s. l- k. H. z
  26.         state.handleState(this);  s9 `" U% |6 p8 F5 K+ Q& C
  27.     }5 ^& D  R! I# V# v2 i3 y- m: o

  28.   Z9 S  h# P' I, n4 y& }
  29.     // Геттеры и сеттеры! k0 y% h- N  m0 K- E& }# \4 z5 j
  30.     public String getName() {
    2 ~' ]7 s1 X8 U  I
  31.         return name;7 _$ I! J1 w8 b2 G3 [; W& A5 X$ l
  32.     }. u1 R4 R7 w) q3 D* P
  33. 2 O$ f# r# i/ F
  34.     public double getAttackPower() {$ P! ]& i" d; {, F' O- o! r
  35.         return attackPower;
    : w+ \# \3 g, o
  36.     }5 s. S4 _8 |* ^1 S% p# Z( ~
  37. 5 s4 K- _# c1 l2 ^& \: N) x4 `
  38.     public void setAttackPower(double attackPower) {
    8 P- M% e& b$ a% `
  39.         this.attackPower = attackPower;' P0 m; ~, o6 B+ g. U, j% @
  40.     }
    & e8 y, i# C! @2 x/ F7 F6 e
  41. }' [8 E, ]3 I; y+ Y/ o
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
. [$ z& @3 i7 C
, H/ U! \" a# x8 J: p
  1. // Пакет org.l2jmobius.gameserver.model.battle; Q2 d% N; t- R# x3 P, G+ c
  2. package org.l2jmobius.gameserver.model.battle;2 X& v" b# }- y

  3. . R% G" z: K# q$ q) ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 e4 u9 ~( C' I2 N
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 U7 U. W; S+ L% {( ]& S/ P
  6. . T# B1 b3 ^5 Z. I$ p0 e
  7. public class BattleSimulation {; y& h4 o) _; v
  8.     public static void main(String[] args) {
    7 j6 a7 Q2 I7 y- h' I
  9.         // Создаем монстра+ V, Y  ]5 k* Z! G- Z2 Z
  10.         Monster monster = new Monster("Дракон", 100);
    / M+ J$ o, v, m

  11. 6 n9 x" p( Z0 d; @8 x
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак7 v0 z# P7 m+ I2 x
  13.         monster.setState(new AggressiveState());
    . B# ^5 y% }) L  A7 m8 ^6 F
  14.         monster.executeState();
    8 N# x* X  r  @  j9 `5 U
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    1 H# F( I3 M: L8 m5 _2 |! K
  16.     }
    2 k3 g% @7 c1 \8 S4 J. ?
  17. }
    : ?6 t' @3 e3 C8 _9 g% S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
% s) A. k0 _1 |7 L! y7 o3 |Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!( s9 j% H$ \6 c7 J5 b* u! i

+ C. ]! `8 C( n, R) r. L( R
+ R7 B% a9 e- v' {- }1 V0 }0 [) W8 s, R! c1 F5 `, S
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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