Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 Q" U+ E  F% Z+ H5 C3 v

. q5 h% Z2 v* G! d$ g

" w( [' [! y, c1 j/ h8 ?! wЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.1 ?, G/ K. L- y1 _6 {
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!: Q6 B- `: l1 s7 N
Астралия 🌟
7 Z& I  k" E# i& Y
2 r, f5 P6 a+ ^

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* U8 W# A9 a( E# p. H/ q4 k
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
* i$ L4 D# G$ m) T: l! {  Y+ K* f( V! M2 _, E& I% x3 e7 ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
' \$ h& V9 U- Z5 P2 k" o
AlexCoder опубликовал в 2024-10-16 18:31
+ V% q) y9 r$ N- z+ E9 p) cДень добрый!, [* U3 y) b- e( S- z
В статье описано взаимодействие игрока с N ...
# {- Z% Z: ~% t
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. R& g, K3 p) q  C
2 Q% v0 |6 o* [; G3 ?0 I8 m: lЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  e5 Q0 t/ a$ E7 }" [! j
7 _) ]  [0 O5 j2 C' m2 aШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& J! m! d7 k- O% H) h* w/ R3 }, L0 ^
  1. <font color="Green">// Пакет для состояний монстра</font>: D. a& o: A$ A' _  B% M0 B
  2. package org.l2jmobius.gameserver.model.actor.state;0 H) i6 f# i4 N
  3. <font color="Green">
    9 n+ ~, h/ V/ u! z6 S( J
  4. // Интерфейс, представляющий состояния монстра</font>
    + s! w# ?3 k# [% y4 U' @, R0 I
  5. public interface MonsterState {) w: ^7 `( W2 V
  6.     void handleState(Monster monster);6 o  {2 N9 E4 ?
  7. }
    ' s/ h+ j. m3 g& T# {. M
Скопировать код

9 G+ c4 Y& i  T, C1 n  i, yШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.- p5 ?7 Y# B* Q0 E; k9 T& G

& z% U' v2 z4 DКласс для начального состояния монстра:
) @& n! |8 S; d4 n$ \! M, I
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>. g# N4 w  `0 ]
  2. package org.l2jmobius.gameserver.model.actor.state;- K4 \4 W9 B% h; T/ }
  3. , N0 Y+ W/ B  g; g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : J* c6 C5 t! R/ V) P; A+ a

  5. ( {) T. o, m( ~) I% }- I
  6. public class InitialState implements MonsterState {* }; y: T( y- g$ M* {0 u# [+ u) o
  7.     @Override
    / K% o' R6 [( n# ]  D
  8.     public void handleState(Monster monster) {
    : Y) i/ _: k9 v; i
  9.         // Начальная фаза боя9 @4 k0 v$ y" n% ~
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");; a: g( B% P# S; G' @, ?# [+ _
  11.     }1 a% ]7 W. U( E3 {8 ?  s0 M
  12. }$ y- `: D2 G: Y( r6 U
Скопировать код

; ?$ j/ S/ D4 m: t/ A2 q
/ A, o5 Q% H% J& G: y
% \/ S6 y1 ~  t( _9 s5 M
: ~7 _) \& G; S$ H2 {9 {0 l8 `0 o* l) ^& X# y

0 s6 h$ g! F) X! _+ H
5 B) y. A7 i. F5 r/ q& n
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 t! |( X& Y5 e3 n% ^
. R" B: v5 Q6 A  d7 h
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! Z+ S: q& {, y% k* d- `

, {9 ]; o$ U6 Y3 ^. UШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! |+ B8 L( u( A( @4 l1 b) K
% N' b( \# o9 C/ l4 R2 q
  1. // Пакет для состояний монстра& F/ Z8 T: C* p2 Z9 ]1 {8 Z3 r6 g
  2. package org.l2jmobius.gameserver.model.actor.state;
    : l4 D6 M+ X3 T! Q) E7 G, H

  3. ! N& l7 j' b7 N7 G
  4. // Интерфейс, представляющий состояния монстра/ g0 ~' h9 e) _1 p' P- b* A
  5. public interface MonsterState {5 D6 ~" n, J  l
  6.     void handleState(Monster monster);
    # ^+ L! W$ ~2 a* J& n6 s
  7. }
    * o# ~+ X( v6 Y; |
Скопировать код
- _! `8 m4 p' H: e7 g" M
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. & J0 T. t' W1 k* R5 r* F8 ]4 U& M

9 O- u) l+ h6 m% N$ S) j* LЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  _# S5 _9 X0 G4 l) r; r$ G# J

6 k1 v/ w% ?7 {( n+ }Класс для начального состояния монстра:
# [7 s9 X+ @' n5 k5 @: O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( \# e& ^5 ~# g# ^, S
  2. package org.l2jmobius.gameserver.model.actor.state;4 Y% [9 G" d+ K4 f) P+ a/ Z
  3. 3 j9 F; E9 B, `. _: T% f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      n  k) Q4 G: N, ?

  5. % E+ E- W9 q  t5 J
  6. public class InitialState implements MonsterState {
    * c9 E6 ?) |8 K; J6 v4 l7 x
  7.     @Override
    6 x' H1 k  [+ A9 Y
  8.     public void handleState(Monster monster) {
    2 ]4 ^1 T% w9 |# [9 r
  9.         // Начальная фаза боя
    / X) D9 Q: V% N; i
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % {9 ^8 X( O$ \: W" q
  11.     }
    0 t' b! k4 Y  D, ]. Z+ h) L$ ]
  12. }: O# ?* {. t/ e9 o6 i4 T; V; @2 E
Скопировать код
Класс для агрессивного состояния монстра:: K* ]7 _% ?7 F* `) \) V& i- a
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& i. C9 d, S: H( o$ j
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 L, c9 W% G* |. r' M3 v! r
  3. 1 {2 J& X4 v+ e. W
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 Z7 q$ U/ S; G  N

  5. & P0 o) t: H7 h- h! _0 C6 V
  6. public class AggressiveState implements MonsterState {
    / r" H( f" q+ E
  7.     @Override
    4 e" {" k. o- x; g1 }: u
  8.     public void handleState(Monster monster) {3 o  ^3 a' f. h8 |/ E+ i5 v0 _
  9.         // Агрессивная фаза боя9 |* |& c7 Y# O. K
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! w& ^8 {0 Y) P0 l9 h
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    # D! d! |' I# m7 q. k! t$ |- w
  12.     }" d7 p! q7 S- o- I2 y) m
  13. }
    3 u! l( P6 T  {6 o( k
Скопировать код
Класс для финального состояния монстра:" C- I! u) G- F+ a7 }/ k1 \5 S
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( U9 f! h; J% ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' z/ K! j# I- r7 s4 ]8 C
  3. 6 s" ^9 ]; v! J. \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ q+ b: o4 I7 O( M: f
  5. 3 Q. W% E* M2 {
  6. public class FinalState implements MonsterState {
    ) c: x; e2 Z3 [  ]( ~
  7.     @Override$ N% A# c7 _9 i2 e' F9 ]% W; r* D3 o
  8.     public void handleState(Monster monster) {2 q7 T5 h% p3 B" v% u7 e
  9.         // Финальная фаза боя" F! U8 h+ [& b
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");' [7 d" ]# `" T+ D* `
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    2 x5 h3 K0 U* U2 U+ x
  12.     }
    1 [( Q+ a# P/ i  r' N+ A, W" |
  13. }; a) w7 l% Q8 P( B
Скопировать код

1 a' ]8 S1 K" H( M2 kШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# w7 c" L: g2 l* l9 |* y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 j; s: h1 W7 @. g# N9 m
  2. package org.l2jmobius.gameserver.model.actor;
    ' M# Z) ?4 y. I+ t) l" Z( W5 i

  3. . ]* W( T. Y9 c: e, l  U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    8 n- S9 _# m2 n: ^, K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- V# i/ e; F( M5 ?& ^- Z
  6. . R7 H+ t& M5 q/ y* [& r) ~
  7. public class Monster extends Creature {6 r) H5 z# T/ a" G
  8.     private String name;) T6 L& I5 E3 p% d
  9.     private double attackPower;
    7 t. B1 o. x; p  S
  10.     private MonsterState state; // Текущее состояние монстра& g+ Z7 ?- h8 s. s1 B9 i$ d

  11. 8 K* L: j5 E* a8 H# Y3 a
  12.     // Конструктор монстра: T( A- \- T7 w
  13.     public Monster(String name, double attackPower) {
    : |1 J; J$ c* C, f/ P  ^  i4 |
  14.         this.name = name;
    7 o/ Z) W2 [! \/ a% f4 x
  15.         this.attackPower = attackPower;
    & {$ y9 v- Q2 U$ F0 ]' Z9 t0 r- \
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние! U$ g1 B& S8 y$ ^7 B
  17.     }
    8 D7 D) d6 O1 k  m

  18. 0 x# @$ v$ `0 p' e3 F
  19.     // Метод для смены состояния* x# f& F' a4 f$ P
  20.     public void setState(MonsterState newState) {
    1 S, Q% ~& ~- V# @
  21.         this.state = newState;5 w- |. X* [2 x" ^6 c6 ~; {% U4 q
  22.     }
    ! o) [% ?/ w+ c, R7 N% Q
  23. # G# o4 {6 {; y5 H) C, ?
  24.     // Выполнение действий на основе текущего состояния
    $ \* `6 Y; c8 `
  25.     public void executeState() {
    8 Z$ |, d, s/ Y- Y* [* S- Z" @
  26.         state.handleState(this);3 R- Q  P* c) R/ G( C# W& o5 [
  27.     }8 Z$ {) m# U6 {0 v
  28. . x9 C% Z, U0 H' ~- E- o- K2 }' E
  29.     // Геттеры и сеттеры
    ) a8 D& @8 }, _* P2 R$ O. d" Z3 r  x
  30.     public String getName() {
    6 G" J) V" [- ^
  31.         return name;
    - r1 k6 j9 C! Q5 q) [
  32.     }- d5 E/ J; y7 ^" o. {! l
  33. 6 z" \+ k0 p9 c. n" ^
  34.     public double getAttackPower() {
    * [  f& V' Y( a) [' k0 Q0 E
  35.         return attackPower;" `+ X) \( y+ _1 G* `" [
  36.     }
    8 `. \. [# `% y5 S
  37. - S8 Y6 `$ c. \; t- K
  38.     public void setAttackPower(double attackPower) {
    / a& n% F: q: U% f4 K
  39.         this.attackPower = attackPower;5 k/ ]4 i( \. {8 s, L4 f" n
  40.     }/ [; E/ p& `8 l/ a+ I, ~
  41. }
    2 V; g: R  i: m- I
Скопировать код

+ ^5 ]- |9 i5 M, s5 f+ zШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* p# ?7 m8 ^# h" [( v; C' y* l) F, N$ p0 o2 K
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - @% t* J% f. s6 L4 y! s8 A% c! p2 f
  2. package org.l2jmobius.gameserver.model.battle;
    3 h- d; ?! i; l; l0 i& e5 j( p
  3. % |) s3 g  [* A+ p5 n2 i. {$ r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 O' f9 L# j  P& b& p3 k1 v5 j2 S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;( F- k, {) b- Q% V& j; y
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;* @$ J! k5 Y% k

  7. * l, ^1 t7 k7 B+ o
  8. public class BattleSimulation {; P  ~  b$ F% O! r- |8 O' c2 ?( [
  9.     public static void main(String[] args) {
    7 k6 _- ~) y% I7 Q- e
  10.         // Создаем монстра с начальной атакой
    % K* R( [0 Z1 {( }
  11.         Monster monster = new Monster("Дракон", 100);! k4 {9 ^8 t+ N4 u- O

  12.   V4 q6 m7 F; z6 h/ K7 R0 y
  13.         // Начальная фаза+ g) M2 m7 [4 G' @- G5 k* U
  14.         monster.executeState();" n. k+ p# h$ J1 J* h
  15. - Q! i; s& W) m: g& s% O' R2 N! Y3 P
  16.         // Переход в агрессивную фазу
    : U7 d  k5 q* D" r" M: X- n8 a, f
  17.         monster.setState(new AggressiveState());
    ; b+ k8 F# b- D* a: Y) |% L* j3 h. g% \- R
  18.         monster.executeState();+ O) L9 I  V; N

  19. 0 Y" b. ^  a8 E2 h
  20.         // Финальная фаза
    ) v# \" X7 O5 F
  21.         monster.setState(new FinalState());. {8 `/ o, I1 c5 C" z* ^
  22.         monster.executeState();
    ! p3 ]2 F" ]; p8 s
  23.     }# v+ |; z1 {/ \6 B
  24. }
    2 R7 z4 \$ b& X0 y2 o" p
Скопировать код

+ ?' r$ R  \2 v% B! O; u: q: s+ [Комментарии по структуре пакетов и классов:( P2 ^. D3 v7 _5 t2 W7 G- b! t* Z" p5 O
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.  X- h2 [, }. X7 t8 j
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; k0 J4 @; K$ O: g8 u3 g! F0 {9 V5 M
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ j$ j; l9 i) V& W: s: d

9 X$ I8 w/ k, Z8 L! I6 y
* z) O* b. e2 e& S7 H6 N0 q) u7 w9 J5 E" v# g

% i8 S% ?* g$ h( p- ^) C- E8 s. s* b( `" }% J  m

. G" S, t. H3 P. z2 n  E5 N4 }* m1 q+ I, E8 A0 Z: A0 _
* \& X5 C  _; E
' T8 n5 k0 X" {; M; c* G4 f5 o1 v0 K

7 I0 e& X. m5 x+ \. v- V0 l6 I- u7 l6 i# B" p! L; T1 p

1 C9 L0 h" T% H1 d' g) `* }$ [
; W* V8 f+ g" B; S1 }: U, ]& f9 A6 ~6 w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:046 [# \( x+ n6 O) q) t8 k5 X
Для управления сложными взаимодействиями, такими как  ...

. \& D5 r, q- }1 O; |, J. @; IОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
! L; I  M2 y2 R/ ZОтличный подход! Использование шаблона "Состояние" де ...
9 j) @3 @. S6 j1 {7 P
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.$ g- @' U2 Z, z; n! h

* s# x% {5 C+ UШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.1 D: J3 X1 L: n& Y: [

8 W1 |) Q5 G: Y+ A& a; \
  1. // Пакет org.l2jmobius.gameserver.model.actor9 K# I( K& Z3 S/ w$ w$ `; ~
  2. package org.l2jmobius.gameserver.model.actor;
    ( I; L, t7 B* S* w; ~, N7 B2 f
  3. " M4 Q/ [% T7 i3 B6 s9 @
  4. // Перечисление для типов атак- X( q( X9 p7 a0 k! N, s5 b
  5. public enum AttackType {4 \5 l- u2 Z/ }" D( o+ G; R) j
  6.     PHYSICAL, MAGICAL;
    ) M6 Y6 [# d  ?
  7. }
    7 i; O( e0 W( {8 R) Y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" C7 K" g8 `  \Обновленный класс для агрессивного состояния монстра:1 X) _1 w3 r. d. Y6 |& N( T. e
7 Q4 X; u# Q( r3 M6 A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ S4 c- o# w( o: x6 Q4 `
  2. package org.l2jmobius.gameserver.model.actor.state;3 a1 n3 L! E0 s% J7 R

  3. + p, x) v& h# l) U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " Y" Z; ?- J3 Y1 e# Z' h
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' [5 }4 K- t/ S6 a8 u; e

  6. 2 i* ~( T. O& Q( o% a! i' X; L1 e
  7. import java.util.Random;$ }- X) L- F3 k. Z; E: i
  8. 8 T" _8 L' S& B) |* [1 H0 t$ w
  9. public class AggressiveState implements MonsterState {4 m+ q' m0 [6 A. u
  10.     private Random random = new Random();
    . ~/ Z, e' m  |* @
  11. ! M( _8 R1 |# `. ?+ W
  12.     @Override
    - J  `5 \( w& V  o+ D4 k
  13.     public void handleState(Monster monster) {
    : [% q- H" G7 x, A3 ~# W
  14.         // Выбираем случайный тип атаки: физическая или магическая2 Q- y6 K. R9 \% i9 J8 X( E0 c
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    , L8 i5 n1 {$ x$ Q% a; `) I

  16. 3 F  E: ~- y8 U2 W- E" u: f# }
  17.         // Логика для агрессивной фазы боя7 z! {0 N, {) b: v- m4 S
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    # w# s, Q' m0 r6 f
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- R$ b. _& `: N* c
  20.         
    # r5 V3 l: D$ e# b( V+ w
  21.         // Увеличиваем силу атаки в зависимости от типа атаки/ e6 M! Q  T8 ?
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;3 N5 O0 u& W% D7 F: l! n
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    2 h" h8 D1 l- ~" V  r% o
  24.     }% p" `2 Z& l4 T8 q
  25. }
    ) X3 s5 X* R& x
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки5 R  T" j3 J, ?. w- ]% H! F- f
/ }6 [" X! C: M4 |3 S* Y8 v
  1. // Пакет org.l2jmobius.gameserver.model.actor7 T$ _6 d% c1 l
  2. package org.l2jmobius.gameserver.model.actor;
    * z  k7 b) j+ Y% Q' m

  3. # c) R9 ^1 U4 q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    3 K! |7 B+ J) u$ U) n/ k
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;5 |; w7 _# l+ `
  6. " N4 A) t$ L4 p( Y( x' h; _
  7. public class Monster extends Creature {2 S4 c' b2 y6 w- D8 J
  8.     private String name;
    - Z+ w" j$ z. C
  9.     private double attackPower;* J# `$ P* n/ F# d2 G2 c, J
  10.     private MonsterState state; // Текущее состояние монстра9 U4 o1 J2 h; g+ `
  11. 8 _1 x9 e2 z: W. ?+ N8 D/ }
  12.     // Конструктор монстра
    ) @% h! d% _. J* u7 o" T9 ^* C$ U
  13.     public Monster(String name, double attackPower) {; ~. B, u. \% }# x
  14.         this.name = name;
    # @" q2 }" G/ A7 R, Z
  15.         this.attackPower = attackPower;
    0 I8 m( I2 D+ u6 s% F
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    4 t7 _3 W, v; g, B1 R7 x9 S
  17.     }' v: [$ ^$ p5 u8 o" e
  18. 9 {/ S3 h4 v" S0 |# u3 b
  19.     // Метод для смены состояния; k" t3 j/ r  ^$ J" j1 y  a2 a
  20.     public void setState(MonsterState newState) {
    # F2 w" t5 C2 @* r: @  ^. H
  21.         this.state = newState;
    * u: _5 @. p7 ^, V% l
  22.     }  m7 `  j" k7 Q* a5 H% ~
  23. 3 m6 P! P+ \5 F; t) q
  24.     // Выполнение действий на основе текущего состояния" w- L) O8 z5 y7 k( l* }
  25.     public void executeState() {
    ' j; q  H) \# Z( y+ L
  26.         state.handleState(this);* r5 V' w& S' P: H* q; u4 H
  27.     }
    . w4 L/ i, L1 O- j: ?
  28. 5 T% S' H3 e! O
  29.     // Геттеры и сеттеры
    1 r; X3 }  Y9 g; s7 c
  30.     public String getName() {
    ( z( T/ u' @! w# E3 x1 U1 z
  31.         return name;
    6 L8 S$ m: D" \
  32.     }
    , X  @# i- @* e
  33. % \7 e1 Q! U0 \! e8 e
  34.     public double getAttackPower() {
    . q# F) Z& |" o; k. o6 @
  35.         return attackPower;
    % n+ n% d4 @( U+ Q  ?; l
  36.     }
    + D' D! ?/ H; i( Q% I! E3 I' v, t

  37. # b5 D) i7 r$ H7 x  B' x9 k! k
  38.     public void setAttackPower(double attackPower) {
    $ W8 Z4 o: W* |4 r4 E- G0 Z
  39.         this.attackPower = attackPower;) U6 [( M. d3 g
  40.     }
    - L" ?% N- X; o& e2 d' B" |
  41. }* {$ O- ?, g9 Q6 |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.( b# s5 u, K' W8 p* N
9 D* r3 j- K" A7 l
  1. // Пакет org.l2jmobius.gameserver.model.battle! k8 r# |6 |* d$ u
  2. package org.l2jmobius.gameserver.model.battle;% Y. @9 M6 ^3 G2 z3 I  u/ M

  3.   x4 W" L  {8 I; T5 @
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 ~  @8 Q3 |) y8 ]/ v$ `
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 J" K, q; P( q# O. w

  6. ! B8 r* c, i: h, d1 l2 b0 z
  7. public class BattleSimulation {
    & d3 q. K$ i" [$ O7 A3 E5 N
  8.     public static void main(String[] args) {1 D/ W! x; Z3 E+ l, v/ a6 [! y
  9.         // Создаем монстра
    # f6 j  x" |/ d( x3 ]& M
  10.         Monster monster = new Monster("Дракон", 100);
    - T% A& v3 r" G. S' H7 o2 w
  11. . I  q9 m; T; X7 g" w
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    1 u- ?* l  r% Z, D0 R$ K
  13.         monster.setState(new AggressiveState());
    9 I: _8 `* e8 |7 _
  14.         monster.executeState();9 F6 W6 }! m( c& [, H
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак5 r/ }& M4 c. g" H0 T$ e
  16.     }
    1 S' c  `- h+ Q2 }$ |6 I4 A
  17. }
    . d; I3 j: O: H- G  G  t
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
$ q6 u3 V5 }  A9 N2 H1 d% jЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!/ O. R2 w6 V( N9 h" Q; f. P

4 q1 m* I) l; l# f: ]# ]1 R# Z/ ?& h& i7 `/ x. |: x  @

$ k  i+ P5 ], g  m7 i) G* f
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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