Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
* f; V, P9 T( X8 V8 Q
8 n; X+ L) f/ w4 C7 R# h9 V  j0 k
+ Y, F" ^5 M9 T- R9 h
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
$ E6 T, ]1 r2 H8 u; j5 N2 `Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
; y1 s' _9 B# iАстралия ?& e- \6 p7 a: A

, O5 n! [6 h/ ?7 c$ e

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!, W% E4 r4 ~& _" y$ S
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?& n' x0 n4 B" K' U7 q9 [
% |" R$ U$ z% P; _5 @
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
  Z% M4 c5 v" o+ o) u* k1 M
AlexCoder опубликовал в 2024-10-16 18:31
+ W9 `, g- C  _8 v( IДень добрый!" n+ C; A: P9 o$ Q% M/ E  `
В статье описано взаимодействие игрока с N ...

/ `2 W" @% Q. p5 g" ^6 U* p+ bДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& g$ t) ^; z1 u+ K& x# f
, u. [. M) p' z; nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% q1 @& W. o# l' z) [) H0 A
) V5 N* D) F+ ?5 i: Q; q% G" b
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- y8 \- r# G+ K7 P0 J+ J0 u
8 I+ G1 b- {! l& T; F
  1. <font color="Green">// Пакет для состояний монстра</font>
    ; T- p( d6 S% Q% \
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 i( C/ n* x1 v- h1 B$ D" U
  3. <font color="Green">; h5 u/ [; p: G: M# n& c6 V
  4. // Интерфейс, представляющий состояния монстра</font>
    7 T2 M* A$ n3 J% h( r! D3 Y- @
  5. public interface MonsterState {# l$ H4 K6 e. [! j0 R. U& v; t
  6.     void handleState(Monster monster);  k3 P$ g; t" h5 y- j0 [
  7. }: W$ O: Y4 ~+ o4 k7 U# a2 W+ Q
Скопировать код
5 l! J' T% i; d* ]
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 f: _( A% I/ G2 ?$ H) n4 [
# m( Z1 s0 X* {! m' z$ T4 e
Класс для начального состояния монстра:
; _! g" m' p; m5 t& Q* m4 s2 j
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* `2 u3 b5 w6 S8 v2 P
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 A  p. R4 r/ [3 X# M
  3. + W9 m- G- x1 u5 ?6 N/ y
  4. import org.l2jmobius.gameserver.model.actor.Monster;" _: M  S& {8 [4 H
  5. 8 o- _5 ]$ F- D0 H4 n4 R
  6. public class InitialState implements MonsterState {1 y$ \) ]+ F3 m
  7.     @Override
    4 g: q; F: f* }. d8 D* E8 |" ?
  8.     public void handleState(Monster monster) {$ A' J. {3 i+ E( L# N4 o
  9.         // Начальная фаза боя  m: |0 D! H3 ]% l
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ! d8 Z7 w& u7 ^" O- f
  11.     }/ f5 v: E+ t: C) `
  12. }2 t* _1 Y3 Z' t3 Q
Скопировать код
0 T$ h1 @! F- X% Q
9 _4 s( g$ G0 G& l, D
3 \: G% @, @  V& C  b9 n  a
+ E/ f4 @5 P/ d% F
/ o- u& B1 D  x& n
5 O( y2 w  q* \* O/ a
. [8 y6 H% A9 B# f3 c" p3 a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( a1 K& R# G! _) r- M

& M( E: V' z2 ?0 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
/ ?! Z# h( U1 L1 e% A, Y  _! L) z5 a) J) Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; R1 w- `) X7 [8 m0 S, }- g# b

: w; [& ?; u* d0 w
  1. // Пакет для состояний монстра
    # a1 p# p9 q: j9 m; ^6 W8 P
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! I. l& q6 ]! {
  3. 3 Z# M6 c! \! E. ?1 S9 J4 f3 d
  4. // Интерфейс, представляющий состояния монстра
    6 a: l$ f1 C- t( X9 K
  5. public interface MonsterState {, _9 v! d2 Z: |% c. m* k
  6.     void handleState(Monster monster);
    ( P7 d2 V3 U' I* ^) k7 L
  7. }0 v% |* r5 j3 J' W1 x" p* r$ N# i
Скопировать код
( |* r# O7 t/ `; j8 @( C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
2 E2 d4 e& Y; ~2 Q! s5 i- q0 y9 F# a  R+ l( [( E
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.7 x4 G! X  n- _9 G' \

' `3 A# k5 d, ^# {0 J) {  F! @- IКласс для начального состояния монстра:
( B% Z- \! o  K8 \4 o. G) Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 I. o# Z( B1 X% C$ E1 s
  2. package org.l2jmobius.gameserver.model.actor.state;* a' W: s- p+ [) X9 ^- W

  3. 1 d! _% k6 q8 e5 J/ N4 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; S# O3 M$ n/ O
  5. # q& m% X" B, s4 `$ |
  6. public class InitialState implements MonsterState {
    0 X% j9 Q0 `( @1 ^
  7.     @Override
    ; ^6 j( F7 p0 J1 j! C- n, k
  8.     public void handleState(Monster monster) {  S" h  W' d! c
  9.         // Начальная фаза боя. v' h# y' ^3 ]3 [) s" R
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % t0 S9 k! O* t2 H0 `( C( I
  11.     }* J, y& I0 m3 L
  12. }8 h, ]1 ~6 U4 J% P
Скопировать код
Класс для агрессивного состояния монстра:4 ^' U) C& \7 N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* |) J$ g% a8 T( J! L* T
  2. package org.l2jmobius.gameserver.model.actor.state;3 G& i9 _0 k$ x% n* X; f8 \

  3. $ }' ~4 H; M! n, a: j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 j. l1 G+ Y3 j  p

  5. , Q( m! Y* f& v9 u' B
  6. public class AggressiveState implements MonsterState {
    # P3 H5 @2 C& n) r, e
  7.     @Override
    8 }" T9 I2 C, Y8 T3 Z5 T) r! i* N
  8.     public void handleState(Monster monster) {
    % Q' O3 M: Y( H# |- q6 x' S
  9.         // Агрессивная фаза боя( P/ Y, m) }! N! S( V
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");- z% h% P5 a  a# C8 R0 m* R
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    / l6 B" j$ R: z( L3 s9 Y+ b
  12.     }7 t3 x9 J) `5 o2 m' t8 D
  13. }
    " Q# Y. J% g0 a- L- `
Скопировать код
Класс для финального состояния монстра:
3 ?$ P# J$ L$ f+ K- r. c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 ]2 X# ]6 M" D; O) Z) {( ]
  2. package org.l2jmobius.gameserver.model.actor.state;$ `$ `7 F9 ~" ?& S( F9 M

  3. 3 Z5 H$ i/ y5 ]* @) `( n' E: K* N9 F' p4 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;" ?5 S2 ?: e2 c+ v0 i" y; d

  5. 3 E2 [2 h2 P# K/ G% N+ Y% S, w5 u
  6. public class FinalState implements MonsterState {
    ; z. D8 u- M* g1 C6 j$ }  P
  7.     @Override
    9 C* N6 m) U1 W% |+ Z/ `, o) e  j( L
  8.     public void handleState(Monster monster) {
    1 ~5 ]; K5 j. p
  9.         // Финальная фаза боя9 {6 N# q9 s. }7 e
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; O; U6 n2 k6 s2 P+ V6 c
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ! `8 x3 q9 X" l( w7 e& ]
  12.     }6 O. a: s$ ?! @( u( E
  13. }
    % ^1 _0 F% B% b  h4 u8 R% m& w
Скопировать код

7 I( w7 x3 Z; C% \3 FШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
9 F6 {1 h8 z: u( T2 H  E5 w
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) O. p4 Q7 E" ~7 l! j! \
  2. package org.l2jmobius.gameserver.model.actor;! Z. `4 M4 y  F3 w& p5 p6 _

  3. ' ?1 \8 O% h9 I' h! \" _. E) O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ g9 C4 H, _7 Y! F6 |
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;( V+ W" k* V0 l8 l
  6. * c% L! ?3 i! \  B$ d+ M  Y' B- g+ {" B
  7. public class Monster extends Creature {
    ' h& G0 u- w) s/ l4 {- [. F' ]
  8.     private String name;/ D& R! X# i" s% n1 @3 g3 F
  9.     private double attackPower;
    5 [( x/ A; M( h5 _2 |. U
  10.     private MonsterState state; // Текущее состояние монстра; u, B! a* V$ R; g

  11. $ q* `3 G' B2 l5 Y1 E
  12.     // Конструктор монстра$ Z+ }4 p. c6 ^( j3 G
  13.     public Monster(String name, double attackPower) {# w) x- Q  Q1 P  y8 D. B% p
  14.         this.name = name;
    . ^! F* A4 v8 I* l4 D
  15.         this.attackPower = attackPower;
    " R+ T: c& K9 _6 C1 t
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние( l1 @! \  i, t' ~8 x( c
  17.     }
    4 P* y# \/ Z! U

  18. # d, |: a1 |# L$ M" k+ @
  19.     // Метод для смены состояния
    ) f5 N8 Q9 r% f4 S
  20.     public void setState(MonsterState newState) {
    # R1 z$ p5 g3 ^5 z4 Y2 J% `
  21.         this.state = newState;
    * M7 o. B, W! ^/ B0 M8 k, f2 u) T
  22.     }
    ) A$ A4 J4 K, \; G/ _

  23. " B* O/ Q% N2 }
  24.     // Выполнение действий на основе текущего состояния3 x6 u6 O4 f6 y3 e- Z' _& x
  25.     public void executeState() {
    0 H  ~4 u) ~! @
  26.         state.handleState(this);
    . ~" l# z$ j: P; W( v
  27.     }
    * E: q7 M# \6 g0 _

  28. : ~( E1 A* y; n7 q, B. v
  29.     // Геттеры и сеттеры0 J0 Z8 W+ i+ {- h; @
  30.     public String getName() {
    % U% P" @8 h5 j0 G* p
  31.         return name;
    4 O0 ^: f- m* Q- C3 T2 e! R
  32.     }
    / d9 G' v  v1 `7 e" A3 A, e

  33. ) \# e+ ?( G4 Q8 K" Q4 T2 T. ?0 ]
  34.     public double getAttackPower() {
    " j) Y$ E% n& c7 A+ f, E9 R8 d
  35.         return attackPower;
    % r( X2 k+ B+ g- T' s
  36.     }
    5 X: h: Q4 h9 \. O/ W, D( ]1 i

  37. 1 @& t; j' U! ^
  38.     public void setAttackPower(double attackPower) {6 |2 R1 C7 y4 ?* N+ Q: ~
  39.         this.attackPower = attackPower;
    * F7 a( K0 K  n0 w
  40.     }
    # P8 q! ]9 Q- B5 [1 K
  41. }2 a4 `. f/ k  E9 V1 O6 c
Скопировать код

. l' K- H6 F/ O6 RШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) X2 L, s# U4 Z7 c1 B$ A/ G9 k; p. t1 E9 ?& U, H" W* p: A/ h
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 g+ C, `4 r  }, w
  2. package org.l2jmobius.gameserver.model.battle;
    ' t6 W5 h1 U  G, t% \! {
  3. : [2 w) E) f, }  X4 V+ S$ @) l" U6 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 h7 ]& a) r6 }" W$ s8 L- Q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , a& u, @+ n8 {5 _
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    " B1 w2 F2 a  `0 l& b) T

  7. , R: [4 g8 M2 W0 l0 m
  8. public class BattleSimulation {: {* z/ }) R% u
  9.     public static void main(String[] args) {
    ( L, U6 @+ G) e5 z* e) a5 E
  10.         // Создаем монстра с начальной атакой9 G" Q+ @9 O5 a  n  f
  11.         Monster monster = new Monster("Дракон", 100);; k# b6 m: `: A/ _4 A# o/ P

  12. 9 ^' J# Z* e  `
  13.         // Начальная фаза
    % Z. ]" Z: M7 H* N& U
  14.         monster.executeState();
    ( |8 p; W/ `7 X6 J

  15. 1 N8 [: s+ Z" ~+ t
  16.         // Переход в агрессивную фазу
    , a. v. j5 {! M8 v
  17.         monster.setState(new AggressiveState());
    + z3 ?5 f! {# y( P5 n* I% M
  18.         monster.executeState();" f, S) n. P0 P" J0 U6 k

  19. # `, f; H( p  f& E: K" y8 d
  20.         // Финальная фаза
    1 ]7 M- D% N# R! z) q' [
  21.         monster.setState(new FinalState());
    ; I+ k* a, n; O) l$ m- \
  22.         monster.executeState();
    * ~6 p& n' t4 q- W
  23.     }
    5 H, H5 |% h; [* e
  24. }/ x" u! R$ Q8 T: e8 j
Скопировать код
! u% ~$ m1 q. f! {- _  N' A
Комментарии по структуре пакетов и классов:
8 s5 D, {5 h1 B8 @* c  P! }' J
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    8 Q  |- F! s: A
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; ]  [( V6 [& m$ T% Y% mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ H  M! A4 w5 d4 Z5 i- r  j; C6 q) x
  F* @+ s9 |9 e$ t" u" a5 t+ A7 S* G4 O0 y/ O; i6 O" v

! n- |0 x5 _% _3 H# o3 h0 g3 O: _
9 q7 x7 u# A3 S. g
4 K- a' \; J; d' L" `  @' u# y0 J0 t& ?5 h6 a) ?1 s

' V; Q7 L$ A! T) \: ^6 k9 Z# m0 `8 k' _

' w, ?1 g& H5 i# F6 i$ ^, W
5 |0 ?; ^$ e# ^% o$ k3 c
5 H! ^& J9 J( ?, l9 s  k# Y" c' g4 c& _

5 J( a4 P5 @4 U
6 N, v) a+ T0 z
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
. l+ m  }1 T  V6 z, ]: yДля управления сложными взаимодействиями, такими как  ...
9 G! T; P4 p/ p' J' I) h
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
  A( i5 [  G. p  x  @. aОтличный подход! Использование шаблона "Состояние" де ...
- ]7 w% B) q4 G
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 h/ k0 _+ Z" z% @2 U6 V
! q( ^, N8 _# ~8 H! hШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя./ f# O5 J* H& }4 n1 U' f9 D2 E
. V( \6 i6 E. ]% l: y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ) A- X, {  q; d: K+ L7 D8 m
  2. package org.l2jmobius.gameserver.model.actor;
    2 f8 F! c) }& r/ l# N- o/ c

  3. # G6 \7 ?- s9 G& s
  4. // Перечисление для типов атак; x  S- u1 a6 I( _5 }
  5. public enum AttackType {& }$ r/ T# g8 M0 g
  6.     PHYSICAL, MAGICAL;
    3 Z- Y8 d6 ?6 `0 U" k  g
  7. }8 v) b: _$ r8 _2 Q- t
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
6 |3 @# S! p* D# ~Обновленный класс для агрессивного состояния монстра:
- p' A' j5 u9 b" h' T/ ~, t9 g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% G4 d! N! t+ u/ J
  2. package org.l2jmobius.gameserver.model.actor.state;; _* F8 b- ^# i; d8 F& P6 ]8 ?

  3. - Q* y% h  h: _' e
  4. import org.l2jmobius.gameserver.model.actor.Monster;" s" A4 C$ p& b; H
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    , S$ P1 U9 q( d! q

  6. 0 }: q6 @# S; n" }, l0 q
  7. import java.util.Random;
    1 I/ Z# N. `: A, V4 V5 f. L
  8. 3 z- J% M$ P& ?0 N
  9. public class AggressiveState implements MonsterState {
    ! U8 g% o# ~) K
  10.     private Random random = new Random();
    8 Y' a& l* y+ h: I; b  K* Y
  11. 5 {: h$ ?# d2 [* [# @
  12.     @Override
      k0 V4 i1 ^8 T% E/ f
  13.     public void handleState(Monster monster) {' D3 \9 ?( Y5 g. o5 r: Q
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ) C7 s: w6 M- o4 k
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;8 ?3 a3 v% M" F  M9 ~+ `

  16. 2 Y& Z2 q9 ~- i& ~9 g
  17.         // Логика для агрессивной фазы боя
    $ }7 G4 Z6 b. V+ S
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 6 }) u! J9 M6 r4 S0 |4 b. Y& j
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");0 [# \+ g$ a0 `4 s7 p
  20.         
    ! u+ |2 X& E. ]
  21.         // Увеличиваем силу атаки в зависимости от типа атаки% V0 w# S$ V! ^  X, n
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    6 E# B* @/ }4 D/ i# C7 u! s) R$ Q
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);- ^% ?8 {% B- Q" r
  24.     }5 y  x) i3 u) Y
  25. }
    $ D  `) L: B$ i- ?3 N
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
, z' d' |! i4 ]4 n
& x. m& S0 T9 s' X
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 D. V) y- j2 j+ {
  2. package org.l2jmobius.gameserver.model.actor;
    0 R" f) U4 |! B" ~4 P0 t  C

  3. : l, y$ k- }+ Z2 ]4 K
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! ?, J& d' D& w& Q) u& u, `* w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;% S7 `) u6 Z: w3 t% H, Q
  6. . A0 n8 H6 u/ T) u- y. r
  7. public class Monster extends Creature {5 A; b1 _1 [% f+ {* _0 q
  8.     private String name;
    % @  p* v& N' i8 F; R% B+ j+ s% F
  9.     private double attackPower;
    3 O, ~& C) p: j5 O0 R. P6 ?! f
  10.     private MonsterState state; // Текущее состояние монстра3 A# Q, |  c# b* W6 ^+ V: w) q

  11. & K: }5 k. k$ t9 ^# W
  12.     // Конструктор монстра0 K& w3 m% p6 |' M2 Q! B
  13.     public Monster(String name, double attackPower) {
    + ~0 E+ X. o  F  ~) u
  14.         this.name = name;
    ! `+ U9 @  ]+ B
  15.         this.attackPower = attackPower;1 {0 D7 U9 w/ d8 H$ F$ r, l
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию' F, F& A( U, V9 u
  17.     }3 G& ~, O% v% `1 a, }7 A( w2 Y

  18. 9 ?" I7 m- Q# N( H- w/ I
  19.     // Метод для смены состояния
    8 ^1 x6 R/ A, n
  20.     public void setState(MonsterState newState) {  c8 w; d+ g# f
  21.         this.state = newState;
    6 t7 S: ]# G6 Y
  22.     }
    * v% J+ F5 v6 \# M' ?0 \* W; }

  23. . C" g; f0 z- ~  j
  24.     // Выполнение действий на основе текущего состояния& j% A* q' g1 `; p$ c
  25.     public void executeState() {; Z) R; Y, ]3 ^9 f& N& T  k  q+ H
  26.         state.handleState(this);
    3 A3 s/ ~$ K3 m4 v
  27.     }) }( A% w% F5 Q4 A
  28. % g& f0 y  @0 G2 b
  29.     // Геттеры и сеттеры
    ) r1 d% V, `# U4 X" A/ P. Q* L: {
  30.     public String getName() {8 U1 s$ b9 ~5 x; l
  31.         return name;
    ' X1 V' I4 J& B) t
  32.     }
    ' z  X% Q* j, p1 p" P' p
  33. 9 [- S  z4 W, s6 x
  34.     public double getAttackPower() {
    . V! t+ U( b. J4 k( U
  35.         return attackPower;2 o* W, U% v% e4 `% g( F- ~
  36.     }
    " h/ S1 W( i. G

  37. $ [) I- P! ~/ p/ e1 v) t
  38.     public void setAttackPower(double attackPower) {
    ; n  c  L' u' a
  39.         this.attackPower = attackPower;8 J4 `0 y/ A5 z  i% M9 X/ F( _
  40.     }
    , Y* J  Q) U; N( c, ^) T" `
  41. }
    2 a' y8 U$ D& ^# Y1 e# a* A
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
& q6 G5 R7 }+ W/ D/ ^
, s1 `2 ^) m- _2 z3 s" D4 ]
  1. // Пакет org.l2jmobius.gameserver.model.battle- Q. Q6 o. l1 Y8 z
  2. package org.l2jmobius.gameserver.model.battle;  }% `2 B+ I2 E

  3. : t+ Z5 b' V" s6 V0 |( o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # u, z# R4 [. S$ A! ]0 _- D* x* ]
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 }8 \6 V3 N4 M5 [& E8 S+ y0 ]# n
  6. ( R, M) @. ~4 {7 K) p  p! r1 i
  7. public class BattleSimulation {
    2 ~+ {- ]# j& y% {" z- x# L- f
  8.     public static void main(String[] args) {3 k. v7 K5 p2 b8 t; G9 O1 U. E# J
  9.         // Создаем монстра
    $ T$ z2 L' }! Q- _$ I: j# Z
  10.         Monster monster = new Monster("Дракон", 100);
    : r- f/ N. ?0 E! ^' H1 Y4 h3 W

  11. 7 G% r( A: y% x5 c' A
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    3 E+ v& \, _$ r2 d. [
  13.         monster.setState(new AggressiveState());
    ' C) k6 [4 h: R  l6 ~
  14.         monster.executeState();
    ' e. `5 w1 C! v% m, b6 q4 I
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ M: S1 p8 J3 ~" j  A
  16.     }* l/ p9 O" |& @$ D/ v. R( r6 N; ]
  17. }! Q2 j8 i0 s! f6 U9 b; P8 X
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ [. K0 t. o- Y- g5 cЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!* t( g/ t: W( T# Q9 \
. u* |' `# `9 m1 X3 s" A

, d6 ^$ x( I4 D! a, N
/ e+ v! @8 A  ?4 j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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