Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
" N* B2 c2 P- j* r" v
7 j3 s* N# Y% b# }( b" ?

1 C1 }/ k( E' P0 G& r4 ?6 L# Y) AЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
" Y6 n' ~" ~7 ^1 t0 C& MЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
, i. `( N( u% S: AАстралия ?0 P* s' D* S" {. g0 M

* v; Q4 n- k4 ]; V* l4 u

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!& a7 G8 u7 X/ P; G' [3 j' E( O
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?4 e6 o! d) L0 h! J0 J5 z  g' Q. E

: c3 q8 H" T8 W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
, N% b# `( t3 k6 [. ], A( R
AlexCoder опубликовал в 2024-10-16 18:31
" ]) I0 j/ g+ F, W; G, nДень добрый!) ~, r/ _. l2 P4 O" J
В статье описано взаимодействие игрока с N ...

; X$ |8 a- l  ^( [Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / P; ~! P5 M6 c- a
" }1 |) ]" L" z+ M& s% S
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 m4 t( ~$ V0 C# m- e
6 c# b5 `* R0 g1 S+ k8 z7 l0 a
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 z' a" t) F  O3 v/ V5 i
* a$ r7 y/ f. y5 ], u
  1. <font color="Green">// Пакет для состояний монстра</font># [. E& j. @/ f: w
  2. package org.l2jmobius.gameserver.model.actor.state;4 I" [8 m4 U/ y% n
  3. <font color="Green">' H" W' W: Q3 M2 O& K
  4. // Интерфейс, представляющий состояния монстра</font>
    4 _9 r9 Z: i/ ]1 V! e  O9 f
  5. public interface MonsterState {
    5 s1 p7 B3 [- A/ D
  6.     void handleState(Monster monster);
    / m/ @% B: K, ~% s- o
  7. }4 @: w& t1 W+ N$ {- n
Скопировать код
; Z8 M* Z7 o: h0 k0 Y% c6 x7 ]
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., C% q  \9 O8 R: \; `* w
  t: I7 y. L$ p% _( p7 D( U. [
Класс для начального состояния монстра:
, O! @9 p; z: a# {2 J
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    # f0 D8 O& i& l% d
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 k5 d3 J2 t  o8 T- F9 K: w- h8 }
  3. 5 o6 _# f' x/ _8 b; [: y" G' i
  4. import org.l2jmobius.gameserver.model.actor.Monster;; F/ @, h7 X6 s0 K1 q; j+ v! z

  5. ) \" r2 p! k* H6 }/ L
  6. public class InitialState implements MonsterState {/ K) Z; ]5 n1 ~4 O/ q+ n3 M, n" e
  7.     @Override
    ; S: H  M& y! W+ |
  8.     public void handleState(Monster monster) {$ z& {- ?* \3 D) E
  9.         // Начальная фаза боя6 P2 ~& y: E5 c! u5 d
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : c, F+ F8 D2 k/ f( e7 d
  11.     }* D  D, b/ ^3 O
  12. }
    ! h; H5 R. C0 S: z7 q: H
Скопировать код
  b* L# l+ T! h# R& w0 P

6 a" x& g2 G. |, N' o' d* f& u+ W- q- w: o
* [, g8 @5 T% J

+ P# c5 v: |3 u4 R$ [9 \- N% G8 C2 X( j" r+ t/ Y8 e+ G; L- w

8 ^) `" G9 y  _7 b- ]
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 C) H1 N6 T) w8 w7 ^. I5 a4 m+ R& ]; q9 X4 ~4 i7 `
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; O0 A7 U7 l5 @% Q0 Q
- {8 W! m0 O) Q( O1 a! J0 lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ E- L# _! ^8 v7 b6 y0 A* L

5 K: V7 l% e# H( y7 x9 M- \
  1. // Пакет для состояний монстра
    7 V& u# E9 h% y: p/ g  Q% T$ p
  2. package org.l2jmobius.gameserver.model.actor.state;
    & v7 w9 V; w! l- U
  3. * o3 R- T' O% y( Y) g& K
  4. // Интерфейс, представляющий состояния монстра
    # V1 O, ?+ M) ~% s
  5. public interface MonsterState {7 e- w9 L% f7 E. _4 C8 K& G9 F
  6.     void handleState(Monster monster);. [- g$ f8 \, h2 u9 C" t
  7. }- j& T8 o( w$ W. E! H9 Y
Скопировать код
, _$ T, ~: O' i* b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% T" X) p/ \3 l! D$ ^3 A2 A+ }# R3 M, A$ o& Q- G7 W7 i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; X" Q9 T9 a- F  w0 d3 u8 ?

& ?2 H) |# K, |$ Y% eКласс для начального состояния монстра:8 q# w6 r  Y, P+ M% p* M
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * b% K% ]) Z; ]% U* D" T
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) S' S1 Y: E! _  {

  3. 5 g3 u1 U: @# ^; z7 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;: M7 ^+ a* ?' @0 u

  5. . o. L0 h. ^2 h$ m
  6. public class InitialState implements MonsterState {
    $ L* d5 w; {$ ?5 g% u" f* n7 B3 n. r; P
  7.     @Override* T% T  s3 `0 l3 B% R
  8.     public void handleState(Monster monster) {/ F- S7 T# Z7 n, h
  9.         // Начальная фаза боя
    7 [3 @  Z% N+ o; u* P' h# D
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 I  p( r# e! x; F* i
  11.     }: U2 i1 S4 l$ E1 ~; X5 g9 @
  12. }
    / j5 ]% y4 z9 `9 t/ h' Q4 ?
Скопировать код
Класс для агрессивного состояния монстра:; n# y9 y; E6 @8 W8 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; _4 ^/ E$ v' j. V
  2. package org.l2jmobius.gameserver.model.actor.state;: d' l: g+ H# V( [3 z
  3. , V, L& l, Z) s% y0 p% p! S5 C
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 i: B4 K- D, v) Z# _* {2 U2 p

  5. 3 @6 L( `; g, t! N
  6. public class AggressiveState implements MonsterState {
    ( w1 I* t) Y+ W6 \
  7.     @Override/ y5 [5 s$ m& l
  8.     public void handleState(Monster monster) {
    9 H# E  \' d* g9 S% t4 C) f* C
  9.         // Агрессивная фаза боя
    : |) p  }2 ^" V  ^( J( P! F0 O- B
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    " T# \  G, q8 l( [) N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ' W1 C! H! [# u/ d  A% J/ h
  12.     }
    5 e* T8 I( m/ z7 \5 ^
  13. }
    ' i/ m) N( U3 b) D$ \5 Z! p; Y  K
Скопировать код
Класс для финального состояния монстра:4 G" w" K; K1 E2 z4 w2 [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 `+ C3 l/ {! i" t  f5 |
  2. package org.l2jmobius.gameserver.model.actor.state;1 i; H4 W1 R* c$ b' b
  3. ) V; ?. t$ G% A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 g) O& v# i8 U1 M2 y% n- F

  5. & G! H- W6 |7 o' J
  6. public class FinalState implements MonsterState {! h* W8 A& X$ r: @; M
  7.     @Override
    3 G/ x# e2 \& G9 a! V/ h' r) Z- ?
  8.     public void handleState(Monster monster) {: ~& E# @2 n; S0 }, r7 {: n
  9.         // Финальная фаза боя
    , z" |% e' {0 y
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    # K. N7 j( q# K! ]! N
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки2 m  ?, p% O% {; Y  N" u9 k
  12.     }% {: b+ c' ?  B, s3 P
  13. }( i* T% y0 I5 h0 |! }6 v# m' X& F
Скопировать код

- ]9 V% f! }& z2 D8 N, T0 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! M4 B* X( r  I1 c+ Y
  1. // Пакет org.l2jmobius.gameserver.model.actor5 u0 ^( Y8 O" ~* k
  2. package org.l2jmobius.gameserver.model.actor;- t% w( y- U( K3 j* B

  3. 2 U" K1 u" r" {
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ X9 `0 e6 L* S3 Q% g& t1 G# Q) G
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 K5 T6 j, r4 D& {0 Z

  6. 1 |$ n# W6 o. f4 ]  J
  7. public class Monster extends Creature {
    . i: q' _3 j3 s
  8.     private String name;
    ' h/ z' E6 G+ h( K0 e9 B
  9.     private double attackPower;
    6 A# K  r  }7 j+ W2 j
  10.     private MonsterState state; // Текущее состояние монстра9 K& r% R9 {# W3 l# k+ M+ T

  11. 3 Y1 W' H+ b$ O& p: m) ^. ^
  12.     // Конструктор монстра1 I8 \, L* B7 D8 M4 K4 @5 x
  13.     public Monster(String name, double attackPower) {* p, q( _6 v2 L( _$ `0 U# e3 r3 N! K
  14.         this.name = name;
    - X9 l) f6 y. x9 @; Y
  15.         this.attackPower = attackPower;) T# @1 F# i# \9 T% t
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние* K* u3 O1 U. H7 b  a6 k$ q5 z
  17.     }
    , v1 {' ~# C# h: l2 Q! ^& X
  18. & U( B7 \5 m  k, a/ I3 v! q' _* B
  19.     // Метод для смены состояния
    0 ?: ^: t1 N* f' [/ V1 U
  20.     public void setState(MonsterState newState) {
    1 c: W7 ]! P" M& G  m" n4 X: Y
  21.         this.state = newState;
    * Q9 ~" r$ T: S, X
  22.     }
    6 [; D* c: b' i4 U, ~/ w  V

  23. - V- H1 M3 E6 P$ G5 d! S
  24.     // Выполнение действий на основе текущего состояния
    1 N4 ], z" Y$ z/ _% v# v
  25.     public void executeState() {3 o+ p& f: q" ?+ y
  26.         state.handleState(this);
    9 O- A2 N+ K: g& k
  27.     }
    1 B- x' K4 {8 Z  @: z
  28. - i4 c8 R! Z2 |9 |4 x$ Z
  29.     // Геттеры и сеттеры( Q. z; R$ V2 r, s6 y5 L& t
  30.     public String getName() {9 z# n! I* x/ q5 Z3 Z( i" T: ]7 ~
  31.         return name;
    4 W' V/ L9 [  B: O# A7 R/ `1 h% p9 {
  32.     }2 J- I7 _, B! M4 ~1 O, c

  33. : m8 ]7 m6 @$ [5 U; K8 v
  34.     public double getAttackPower() {  K" T4 v' X* R, ]! E( w, Q- u* t" F
  35.         return attackPower;7 N5 \) A/ k' m0 F% e
  36.     }. s, H+ s( l# y! i, t

  37. 6 R+ E% ]; h, ~7 R. F
  38.     public void setAttackPower(double attackPower) {* |5 i& y, |* l" C; h4 v
  39.         this.attackPower = attackPower;/ P1 Z1 k4 N2 F& V
  40.     }
    ; ^2 E# C1 y, p  r4 ~$ J' J
  41. }7 c( L! ^' A( o5 G4 {! H6 }+ `; w
Скопировать код

* U& M( z1 ?2 R6 V" z. a' vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." {; ]  {1 W/ {& y) }( c
# @6 \* j+ p# R; X4 {) K% M
  1. // Пакет org.l2jmobius.gameserver.model.battle4 I* a1 ]0 Y. B3 R2 [. s7 N3 z
  2. package org.l2jmobius.gameserver.model.battle;
    5 R6 ?% s/ q6 s+ t* t
  3. & @# ~5 S6 i" d. f
  4. import org.l2jmobius.gameserver.model.actor.Monster;. M/ T* U3 t: @! B9 W/ v4 l
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  ?" `$ Q: A6 K6 H2 q  _: i
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    . U  S/ i# N8 D, P. x
  7. & s; h' w* ^  H( R
  8. public class BattleSimulation {  G. G6 b! P. f8 s5 }
  9.     public static void main(String[] args) {
    0 ]% M0 L9 e8 H9 ]9 w5 \
  10.         // Создаем монстра с начальной атакой8 E% {0 Q$ x7 |$ h7 i& F
  11.         Monster monster = new Monster("Дракон", 100);3 O& `- Z. @/ B* p* E. b# E5 o
  12. + p6 U1 S: ^2 O9 z/ t- r% ?
  13.         // Начальная фаза
    . i# m+ N: Z6 w! n. r
  14.         monster.executeState();  `- j) x5 F- l, O( l

  15. + R5 X0 c& `3 O/ _1 G7 N: K! [# X
  16.         // Переход в агрессивную фазу( A! I, s! T: t. P
  17.         monster.setState(new AggressiveState());
    " H3 e6 G) T; M) G- D: \
  18.         monster.executeState();) }( w  Y( x% n$ B1 x2 {

  19. ) n; _% C( \) v  i' X* _: I
  20.         // Финальная фаза' w) E6 ~% t; g7 [; u" q- D
  21.         monster.setState(new FinalState());
    7 A* |; Y4 O. C- Y" S
  22.         monster.executeState();
    6 m2 o  r$ Z5 K  k
  23.     }
      Z+ q/ u2 z9 k: R$ D' I
  24. }3 ?9 V7 z! P  Q" w6 `
Скопировать код

7 H! _1 ?- f$ N( zКомментарии по структуре пакетов и классов:
: @+ S. r# A5 ^. @' g6 }
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.4 `" e+ H8 c7 I# r7 s. i& j8 a
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. Y3 o- |0 [9 D) U9 QЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!3 W1 N3 M, o# }- h
- O3 \( f4 R9 ]
- A# j2 C# b' h
+ u8 v% n4 q/ L: A* ]  r$ }1 y
* x- Z1 e) B7 h$ b" F5 v

/ ?5 p" M( q! }3 i% I& d
! k- n' ^% b6 |1 q! e' S6 H# e) m( o

* C; R" V% i% G$ ]7 a/ T& u: T7 K  r

3 L5 O8 E$ G# J) x6 `0 T. x7 h& k( a, z/ ^$ S- e  d
/ H- S5 E3 U# Q# L0 @1 g

2 `8 z" l; e$ a# y$ A6 U- l1 X6 j6 ~  D
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04! a0 K3 B, U0 M5 e6 \
Для управления сложными взаимодействиями, такими как  ...

! s* u+ n! A# w6 I3 ^, [$ `) T  SОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
2 `$ f6 s+ [! j6 W. Q4 bОтличный подход! Использование шаблона "Состояние" де ...
" f5 s1 n& M, }
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
% H/ G' r& Q& s* H! J& m# u# |; _0 G. J' }% A1 d
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.& {5 u0 P8 J& X1 X
- m, a" H* }) J3 @1 }* D( S/ r
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / s/ _; O5 x4 F/ E4 R
  2. package org.l2jmobius.gameserver.model.actor;
    % X" }# g* J0 Z
  3. % k5 b& ?1 v2 R6 y( d9 t9 Z
  4. // Перечисление для типов атак: \# p. t% l- T, h% v7 d- V- ~. U; F
  5. public enum AttackType {
    : V7 c$ m; S0 I$ }# Q
  6.     PHYSICAL, MAGICAL;$ q+ j* @3 R8 D/ p) i
  7. }9 B8 v6 w9 A; O
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.2 w* y- E, c1 c8 M0 Z) d- W* t* e
Обновленный класс для агрессивного состояния монстра:' v5 H/ I' B1 R, A( x1 `# E
# v& K% B! _% t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ _6 W  |1 P* ]8 b. e5 M, w% Q( c' l
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' H& _. |  l1 x  j& V8 F+ a
  3. 3 [; n" c! B' M) ]. r
  4. import org.l2jmobius.gameserver.model.actor.Monster;) x3 t( U0 m1 J( e* \
  5. import org.l2jmobius.gameserver.model.actor.AttackType;) H  Z3 w+ `8 h6 R3 k4 u
  6. 8 @8 m, J2 _% ^
  7. import java.util.Random;- Q6 H( H) @9 G
  8. 6 V. f, {( N4 ]; w5 r
  9. public class AggressiveState implements MonsterState {4 C% L+ T4 u& a$ T/ o: i; Y1 Y: n
  10.     private Random random = new Random();7 C3 U; A0 S. H; X$ h; z

  11. 4 h+ s# v& V8 V# a: M- E1 F
  12.     @Override
    ' X5 A$ e0 K# r) q8 k
  13.     public void handleState(Monster monster) {, {2 X! S- `' O  |' D
  14.         // Выбираем случайный тип атаки: физическая или магическая3 L9 k8 t- T" O+ Z5 {% {( I7 c
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; q. [' v: Z) S7 P

  16. $ F7 n2 e1 L0 n: Q$ s* J% I. R
  17.         // Логика для агрессивной фазы боя
    + s. I4 f7 w8 F; v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 ~. S, Q2 _& }
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");, p0 O- Z4 T8 f6 T- v
  20.         5 L2 y! e4 n  N& |; h/ B: j1 H5 \
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , n1 U3 c- I! a: u, R+ [- f
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, D2 S( i, M$ D
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);/ r  s2 d0 E6 ~
  24.     }
    5 V2 [& z2 F4 ^# k, q+ g- L* @8 }
  25. }
    * B5 J0 [2 e8 r2 {, f
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! u- h: ], B; {3 X/ \& j

1 J6 L8 W( \, b( P
  1. // Пакет org.l2jmobius.gameserver.model.actor" h5 B9 d" ^& f, I' I- n5 }! z
  2. package org.l2jmobius.gameserver.model.actor;
    0 z7 d: D4 P- m9 x. U! G  T

  3. ! M7 z  v" U& N' h/ W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    - e; i; A2 U- k
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * g5 P! a1 D* o( H* B/ m

  6. 2 Z5 n- @- B4 T6 {
  7. public class Monster extends Creature {
    . k) Z$ f$ I7 m8 l" c1 D* E
  8.     private String name;, O# `6 p9 Y+ r( G, ]
  9.     private double attackPower;
    9 @4 t6 i+ Z: a6 Y3 }
  10.     private MonsterState state; // Текущее состояние монстра
    , Y4 N: W" i3 W, O

  11. 7 c/ {9 @4 X! K" R. ^
  12.     // Конструктор монстра
    / O" F$ d: T8 h* {% c- ~
  13.     public Monster(String name, double attackPower) {4 Q2 U8 b. b) b! F! u
  14.         this.name = name;& O3 T9 ^- a' N2 X6 x
  15.         this.attackPower = attackPower;
    8 r/ n" [1 ?# S9 O/ k4 e
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию+ \5 H0 E1 s" t) |; I; g/ n
  17.     }: ]7 p3 ~' u" S+ {6 O

  18.   R; L" J) L% S2 V
  19.     // Метод для смены состояния" A8 G% B+ X4 E0 s
  20.     public void setState(MonsterState newState) {' G8 h5 V  X  e) m
  21.         this.state = newState;6 z  Y$ g7 |: z5 h$ T# V8 c
  22.     }
    3 S( a/ [! q  e+ e: B4 s$ }, d

  23. 8 F! Z0 n8 Z6 f" _2 }
  24.     // Выполнение действий на основе текущего состояния
    ( ]. f& |' |* N' q* D! u
  25.     public void executeState() {
    * G+ F+ i4 n; K) a: H8 _% _
  26.         state.handleState(this);
      l; W4 C# T; l$ v+ x
  27.     }* N6 h& z; ?* O8 S0 B1 ^$ C

  28. # K* ]6 b& V! k& X( p; x
  29.     // Геттеры и сеттеры$ a7 J8 M1 p, [2 k
  30.     public String getName() {
    - `3 n- m8 ]4 x9 W8 V7 y
  31.         return name;
    & K1 V0 Q% E( @+ A" u' z
  32.     }
    / |$ F0 l0 {( K+ \# V! t

  33. ) J$ F1 L7 e( M
  34.     public double getAttackPower() {
    & C) F, z  c2 @) _
  35.         return attackPower;
    ) _0 f- B- B/ [' i1 u6 }4 F
  36.     }
    & X* K7 z- L+ k3 L* e

  37. ' b( Z# f% r( N. o" y* f
  38.     public void setAttackPower(double attackPower) {
    6 [( Q% b) }' f) U4 k! g, F9 I
  39.         this.attackPower = attackPower;! W5 _, W. ?; ~5 T) z) l0 c
  40.     }+ ]$ F0 {# }! ?0 A  P7 s
  41. }
    ) p. W0 O% r! h+ a) W; E/ f8 C
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! d9 h) N0 _+ D- B9 M+ i2 e( n1 l5 Y6 V- w' y- }, d
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - P& b. U3 W( D+ c6 E. I
  2. package org.l2jmobius.gameserver.model.battle;
    ' I* h, s2 h6 Z

  3. 7 R% s  |5 H% ^1 y4 Y4 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;" e0 j& w% E! I' Z2 E; l4 F) F
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % V( e1 q& h/ r4 a4 l

  6. ' x+ u, F2 a* o
  7. public class BattleSimulation {# u; q# \: _' ?) y' U5 {2 h
  8.     public static void main(String[] args) {: M0 _" y& ]2 a* I+ r! e
  9.         // Создаем монстра; [6 a9 V" r( O2 f+ H
  10.         Monster monster = new Monster("Дракон", 100);$ M- r, P' Y2 [1 }
  11. 3 R3 @' A5 n& `! \9 }
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
      c3 s, \* q' C% m+ p
  13.         monster.setState(new AggressiveState());
    ) W( Z" W2 F: `' E. u
  14.         monster.executeState();
    7 Q1 V+ |, e% w0 s2 O
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак, ]: x: W' f7 w# g- @
  16.     }: ?; \% o. C7 J9 k2 |
  17. }
    " F9 V% ?# i5 c& K" o+ r/ j! L  ?4 n
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.1 \% {( U5 v6 q, I  O/ O! S  o
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!! w1 ^4 y2 j6 w+ P& `9 L& l

# ^% c( V7 i$ A2 g* ]& j* |2 l# x( W* ^; w. ], `
) A) U: W, x3 a5 N
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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