Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!+ S& s" b, |$ q

& Y4 A' V6 L1 j4 \3 `; m" a, r
% t, E3 A$ M" S2 R5 B- F/ c; s
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.( j* I* E- j% k0 m: d8 ~' D
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!% `# Z2 O& S. z( {, ]
Астралия ?
: f( e2 h8 ?0 d. ~) m0 M$ w8 F8 r
! c* g9 `3 h; k. w

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
' f; p, V* [% |4 _6 n; D0 k; zВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?# m' ]$ ]& X+ U3 y# I; p
4 q4 S0 c( e4 n9 D
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
/ |4 O: l0 e, T# j5 a8 R
AlexCoder опубликовал в 2024-10-16 18:31
6 l# d. t  ^- g" QДень добрый!) U! R! N9 y: x: J2 x
В статье описано взаимодействие игрока с N ...

4 q! W8 E6 s5 ?: v/ \  @Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * B3 `8 L1 j/ Y4 x# T' C7 D7 q  |+ _
* \# M! B2 j+ ~; e, U' K& ~
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# K. S& k1 {4 E  I/ P; c" j. D, n

5 }; ^. Z/ }+ [2 H* FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, G5 s* V+ P6 W; V% G) X! Q' Z1 y7 C# O; k& Z
  1. <font color="Green">// Пакет для состояний монстра</font>
    : `) @, a4 h& [* f. E9 D6 F. M: Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    : L# X- F2 k# M. l
  3. <font color="Green">
    ; x) g# G  F1 X1 i2 K
  4. // Интерфейс, представляющий состояния монстра</font>
    6 \3 Q) [4 B) f: _1 U. U9 R
  5. public interface MonsterState {* d) n( V. `6 {- {2 r8 j# M& \* H# `
  6.     void handleState(Monster monster);/ V9 J; k8 G( H* M  i
  7. }
    ( f+ l+ K8 F- L8 ~) L  @+ m) L
Скопировать код

# R* T, |% n+ [" ]: ~* t/ K8 XШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) \. n  C9 Z9 ^  ~3 c
/ F( X) @, Z, r6 X. _Класс для начального состояния монстра:# X+ Y: X: g' _! U# s( R  u
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- u. A. R: b4 s. v7 H
  2. package org.l2jmobius.gameserver.model.actor.state;
      C! P/ ?6 y; K2 M* _2 z
  3. - U) s$ E; Q7 t+ \) U+ T! }
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ T/ r3 l9 F: H1 G* m* T

  5. 0 b3 {% Y7 i! [) d
  6. public class InitialState implements MonsterState {" s6 _% a" o2 a" s6 j
  7.     @Override2 |6 ^2 m! Z8 x& g* F3 p3 |
  8.     public void handleState(Monster monster) {
    6 X, t: }/ e2 b; t' e+ z9 Q
  9.         // Начальная фаза боя4 t! g  u) |0 P3 P6 ?% ?" z. q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& p+ X7 {7 Q8 ^! a% \: Z  J
  11.     }( ~5 ~& V# C( k) L
  12. }. B2 |! J& o* P% B' l' q. o
Скопировать код
$ u3 b9 z: S3 m

6 l% j5 W  u4 b, w2 ]2 O" `# I9 n0 C. @8 _- G

2 O. ~5 X& e  \. o6 g4 k7 v" z, d" H9 |

$ [4 k- |. [( n, w1 t; O7 D+ a. A* L$ ~: ]8 s
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 A4 L/ `+ ^. f2 ?! `
- ^( u. c5 B5 D$ T# x  E, OЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' x1 t, E' f, V9 P$ K: o* Q
, F1 d( X( s) b* x# r. {% Y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 N! z8 `" e  v0 S& K/ D5 Y% v6 x& d: o6 J; a: c" Y" F% x6 S: P
  1. // Пакет для состояний монстра
    * `* n. ]+ Z+ x
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 N' `% e' a4 e7 K( X) f- b1 W
  3. ; b% ~9 ?* @# C2 C
  4. // Интерфейс, представляющий состояния монстра
    ) P& i/ x4 m6 t; d: L' ?" m
  5. public interface MonsterState {9 m8 p& t$ u9 I8 ~1 Y
  6.     void handleState(Monster monster);
    , O4 T6 K; T2 g, @! N
  7. }
    5 H$ B& M4 c0 @/ p  B3 a' F5 ]2 N
Скопировать код
# k8 U7 \- l3 @5 ?4 A/ d' `5 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % J/ i7 C3 h( y$ N5 y1 C
: p- G( v8 S7 Q# i' V# @9 G3 a# s
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 c. [8 u( L2 Y9 C; D& L$ \$ }" X3 s- [# d
Класс для начального состояния монстра:
7 i) I  }/ k4 ^% U6 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 D  F5 _& ^% \4 x
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ s9 t$ Y6 m% G# ^! W5 ^' T
  3. , F6 w' b$ a8 P) ?1 o6 Q, ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;% T" n- a$ ~  q& _1 u
  5. & T# `7 x6 k+ {! ]# u
  6. public class InitialState implements MonsterState {" _! K" Y4 B& T6 }0 _# R
  7.     @Override
    7 F6 \" M( Z, n
  8.     public void handleState(Monster monster) {- l8 V/ u, X3 i. V0 a& j. ^
  9.         // Начальная фаза боя
    1 T9 J( C. a7 t( z. f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");; {. A& m; z0 \" P
  11.     }
    , v$ J" }+ ?3 s5 \% u9 F$ K
  12. }
    ! r- \9 a+ n* f. t6 E1 L
Скопировать код
Класс для агрессивного состояния монстра:
/ Q& g1 X/ @( `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 m3 o2 V* }- p3 L  C% v6 x) ], y
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; ?& t0 V! v# `8 N
  3. 2 h5 _. {6 j0 a: U
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 h+ t6 c4 p- B* m/ v
  5. ! Z& N  b7 E4 f* I+ K
  6. public class AggressiveState implements MonsterState {6 i* F. y' b$ m7 g* K4 l' a
  7.     @Override5 l% }' N" p2 N8 }
  8.     public void handleState(Monster monster) {$ e, Q3 E: m  C! M5 ]& B3 e  `7 T) k- ?) k
  9.         // Агрессивная фаза боя
    - }2 t3 x/ I' U0 d! q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 a9 l: e2 a1 h$ ]" y% Y) W6 A  L
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки% ^/ K: o% `3 A) O1 p
  12.     }
    3 z4 E  W/ `7 N. W; i! R
  13. }. x/ H  G. G* C6 }" _
Скопировать код
Класс для финального состояния монстра:
1 @* Z, V- e1 D( U& `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - Y8 n/ p7 k( ~& R0 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    - W) V* A$ D3 v

  3. * ]6 G* ^, A$ Z% x. j9 k# q! S
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # ^5 l: O! c# t/ P% L* p* b

  5. 0 r1 `% A& I' r3 p" i& I! M
  6. public class FinalState implements MonsterState {
      F1 m+ o+ F6 H
  7.     @Override' u. J) P( Y3 E, k- }* S
  8.     public void handleState(Monster monster) {' G& b2 o- y( P% ~
  9.         // Финальная фаза боя
    & N5 r- y! O* ~, K: B1 s. d" W; ]
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");3 f0 ?# F: k( D3 E9 `% N6 D: n9 p# u
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    8 u& _* k; a, ^" S, Y
  12.     }7 y& b% \& }- J$ S0 V$ ^0 g) @
  13. }
    . w+ W% h( Z1 J/ t7 t: P' x
Скопировать код
0 N- J- N# r9 ]  [1 p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, {9 A7 G, C6 L4 o
  1. // Пакет org.l2jmobius.gameserver.model.actor5 Q% H' K8 }- h- _
  2. package org.l2jmobius.gameserver.model.actor;. k3 \* h/ d  P. q

  3. + r9 {" r/ Y3 z/ \, `- g1 M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. ?/ R; o/ S0 e+ f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ s8 w0 X, p. X7 H/ \, Q

  6. ( Q* o' k) k/ e/ c4 Y% Y
  7. public class Monster extends Creature {9 u- Z2 S. E$ D' i  G6 E1 X2 ?
  8.     private String name;
    1 n0 U7 i0 P# {0 q& _
  9.     private double attackPower;
    $ @7 B  X8 E& W! N
  10.     private MonsterState state; // Текущее состояние монстра: ?; N2 }. p" Q4 W: Q
  11. ! |! v* p, h# E( K! C
  12.     // Конструктор монстра' W8 ]2 b. k* @& H! k
  13.     public Monster(String name, double attackPower) {& |: h. e+ }& J8 G& S) r5 `
  14.         this.name = name;
    - U7 l0 \, Z7 {* A3 D" q  H
  15.         this.attackPower = attackPower;
    . t: B5 o  ?5 u. P9 F
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    / q- z5 g3 S! j) \! m
  17.     }4 H* R$ \3 T1 z* V0 U( s8 c

  18. + g; a% X3 K! a2 _, D* X- ^' V8 B
  19.     // Метод для смены состояния( R2 ]: V1 ?% t/ E9 q7 u
  20.     public void setState(MonsterState newState) {. O+ B  |' [2 l, Y/ i4 ~
  21.         this.state = newState;
    ! E: n4 ~) i7 a3 ~+ t
  22.     }1 e. |% O1 u- z# G2 \7 t! V

  23. 5 D& s" n6 g/ o# R' P% b
  24.     // Выполнение действий на основе текущего состояния  m3 I7 p' D2 Q0 W( M. G
  25.     public void executeState() {8 B) G8 c; F' B. q: r7 z8 ]) \
  26.         state.handleState(this);7 k; ?0 }( V0 J6 }2 \+ U$ \6 W# H
  27.     }* e* R4 }1 g4 ~# F. u
  28. # t: |) H- |2 w/ u% _! P* _2 Y) L
  29.     // Геттеры и сеттеры) C) H2 D' u8 C
  30.     public String getName() {
    : z3 H+ S$ f8 g& v0 G" z# }
  31.         return name;
    ' P) n9 a& b/ l- H$ O2 E
  32.     }4 C8 m- Y6 \7 `& X3 z& a' k; H
  33. + j/ d- Z' a) ~" V9 {. J( [( i2 j
  34.     public double getAttackPower() {4 b0 n) y, g; k& p; m0 b
  35.         return attackPower;% e' r2 U, c( _: h4 ^; i; c: f$ k' ]
  36.     }2 H6 Z. n% {6 ]3 A9 Z

  37. " b* e, L  y' Y$ |: F. z$ M+ R
  38.     public void setAttackPower(double attackPower) {& Y/ z( X2 W3 ^2 N, F# h/ \
  39.         this.attackPower = attackPower;
    , S8 E+ ~6 E% T9 m
  40.     }
    ! D. C) G) H8 x  P7 z6 @
  41. }. ~5 T, d! R2 a' g& a0 j: Y; ?
Скопировать код
- m3 z$ m# c9 o! ]: b, R
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 N4 Z1 i; V0 b* s/ _) u% Z5 |

: V) ?; E+ }& U- M) Y5 V- Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ! F: R$ l; `6 u$ U9 }3 i  p! n
  2. package org.l2jmobius.gameserver.model.battle;
      ]6 S5 @6 T: s1 S  Z4 P- K

  3. , V) k' Z! [& l2 m# w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) p. V: t6 \. q3 L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 X# o* j- i" G; i) Z. C
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;; Z7 B& J$ B  u' W* X, c

  7. 7 C2 q/ }; h% b% V
  8. public class BattleSimulation {9 L/ M9 w( j# A' V8 l. P! z
  9.     public static void main(String[] args) {
    ( P! C  T: F8 i
  10.         // Создаем монстра с начальной атакой
    . L1 ~  d% N8 |/ X6 _# T& G
  11.         Monster monster = new Monster("Дракон", 100);% y6 F% l. o, ]# d

  12. " d* o+ ?) d8 f2 ~8 D
  13.         // Начальная фаза5 q; \5 z- m( O- C
  14.         monster.executeState();
    8 w' U4 I% _$ ^  K# b# W
  15. & G0 t' {" t8 l0 \6 k$ _
  16.         // Переход в агрессивную фазу6 @& }$ k0 j6 z1 d( e
  17.         monster.setState(new AggressiveState());
    " B0 {4 U4 H# U; |8 Z* R
  18.         monster.executeState();& H/ }0 Q; `; m& O3 F
  19. : H9 l0 i! \' }5 r
  20.         // Финальная фаза& a0 Y$ m: u9 _$ x
  21.         monster.setState(new FinalState());' l6 T9 P! ^# @; F8 }- E6 H# v
  22.         monster.executeState();
    9 O# V+ L) v# a( [! g/ H% i
  23.     }# I( c" b1 P$ M+ y4 [
  24. }3 g( m& ^# b$ g) k' C2 h
Скопировать код
1 N2 F4 @& T- C: y: b
Комментарии по структуре пакетов и классов:. V2 I. j) t9 t+ }
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# }2 @+ k& C1 F# M4 j- p
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& C# L' Q- U, T, X8 PЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 n7 X$ y' D2 G- Q3 h, s$ `

) N9 w2 K) p' S( L: o3 {3 s( a4 v: {, ~* A9 ~6 K
  @2 T! J9 B8 }7 m1 _
9 |) |& A0 y( G- i: D
6 R# U9 B: f& u& C( }3 A7 {( C7 W

) \0 @$ i' A! L, _1 A, W' V4 M) v3 v6 T

* J! ?$ J8 F- w, `+ i4 L. y$ {# T0 R% y
' v" |9 a& `  e! b$ b$ p% e9 O

) B1 i) b0 s0 `0 b8 t( R4 {3 z  Q8 a0 l/ j6 X
0 j3 k5 Y) J* r! a/ ], E" x) {

1 b! C% m% Q6 C1 d
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
" [; ~0 q* r* o4 @Для управления сложными взаимодействиями, такими как  ...
, B2 N2 [+ N$ T- y& |+ C
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21" ?( ~+ E& v* C! Z" p# Q
Отличный подход! Использование шаблона "Состояние" де ...

' ]* k" d$ J, ~$ Q" f" dХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. I' K5 m0 H8 r) ?

$ d  b& {9 F7 SШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.+ z3 ?( T; J1 x

5 P% s/ I1 g( ^( E5 ]6 R
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( p7 }/ Z0 v# X( w" d6 R+ \
  2. package org.l2jmobius.gameserver.model.actor;7 Y' H+ ]6 w7 m, N5 q% C: K5 G
  3. $ B1 [7 S# ]% l$ j1 v9 P3 r
  4. // Перечисление для типов атак
    9 g) S& X# P) T+ v4 _
  5. public enum AttackType {# U8 E* c7 q2 W8 O) B# k
  6.     PHYSICAL, MAGICAL;
    . |: U* a  J8 U9 v8 B9 x7 d! J2 O
  7. }
    4 j7 V& ?. ?1 M/ M
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.9 I  x" u+ [! [. `
Обновленный класс для агрессивного состояния монстра:4 h" m" {, w$ l. r( B
) Q# ?8 J. t1 }( L, ?2 O$ A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 E5 y9 k; e; V* l
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 A6 i9 g- F7 P

  3. / Y/ y* K; p; `7 F6 k* [; E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 F: Y- w& E* D* }4 r2 d1 D
  5. import org.l2jmobius.gameserver.model.actor.AttackType;* V3 W/ t- ^! Q/ w* W2 a
  6. , N1 w$ \8 q  ^9 k
  7. import java.util.Random;
    9 H$ I- l! B# M/ l) T: r% [

  8. 6 h, ^. ~: T$ M& U
  9. public class AggressiveState implements MonsterState {
    " f! Q! [9 [, `4 m
  10.     private Random random = new Random();2 y* n. P. P' w7 R* V' W; a

  11. ! ~' Z; x0 E" ^" ?, [4 {( d
  12.     @Override
    ) C3 f* o+ ^1 m4 [- N: `4 j: }  c
  13.     public void handleState(Monster monster) {
    5 W( T2 k9 f$ x  M+ M/ S  ^! s
  14.         // Выбираем случайный тип атаки: физическая или магическая
    * L. S, Z/ z, C2 X
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;' x! P- r9 N& u. y+ i/ U5 l

  16.   D! V6 W, d" f  s! S, n/ q; m
  17.         // Логика для агрессивной фазы боя
    : ^/ J. S, y# K- o2 Y/ i) w( i2 W
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    : R) b1 `+ z; Q6 t
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( Y# c. n) w2 y: w& X
  20.         
    % d/ W* p0 B: K' E0 o
  21.         // Увеличиваем силу атаки в зависимости от типа атаки; t% y5 N: D0 e2 X9 A- j
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    # O& w9 ?4 t/ y! U# a2 z
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    + u4 z9 V* f4 `( q( B% B: O# C- C
  24.     }# F' V3 I- X& H, {3 v! f8 _
  25. }
      C6 h7 J6 n9 ~6 _/ ?& _, q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки8 Y0 X, O8 R6 v9 a" x4 T4 E# F& p
+ K) O1 h9 H* N3 k# Y9 g& N0 A0 A, q
  1. // Пакет org.l2jmobius.gameserver.model.actor
      |" T( r1 @  t" o
  2. package org.l2jmobius.gameserver.model.actor;. @) ?4 O& A% f/ A
  3. 8 O4 n7 j8 G. I. O! R  t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 B& I+ Z5 s, l9 _% L: i6 u
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 f5 ^( ?) k9 y
  6. " D3 |' T- d* H0 x/ a8 y; F+ P
  7. public class Monster extends Creature {
    : {# x, z1 P9 ~* r8 j
  8.     private String name;
    0 m5 e+ Y, {; P
  9.     private double attackPower;1 P) K5 y  P2 B/ d" \0 O
  10.     private MonsterState state; // Текущее состояние монстра5 F. i( f; q: I& L$ m( v0 H* H, [

  11. 8 `6 `; y# q3 m) J% E% t) D
  12.     // Конструктор монстра& w( d& I, q% o; g- S; Q9 C
  13.     public Monster(String name, double attackPower) {- y+ ]# j8 }, L3 `, r+ A- S
  14.         this.name = name;$ z# h% _: n7 X5 o- N
  15.         this.attackPower = attackPower;% {$ _! s! e& j9 j* L
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию7 X& U3 b  O* M* ]" M" t: Q5 W
  17.     }0 `2 M$ u% C% Z1 t: e+ x/ g) r
  18. " C7 s2 y: `3 E* s5 z
  19.     // Метод для смены состояния% l6 b0 \3 h: m6 I% Q
  20.     public void setState(MonsterState newState) {6 C/ _  H0 Z7 r
  21.         this.state = newState;3 W4 g0 W4 r/ g. k
  22.     }4 w- F8 ?+ H' S" w1 A9 |1 l" G
  23. . F% c1 B( m4 I- {
  24.     // Выполнение действий на основе текущего состояния, j; o: v, A/ M5 o# @& Y! c  l
  25.     public void executeState() {
    # \0 I& i' P, O, Z* Y/ ~# R
  26.         state.handleState(this);% W* t0 O  x8 Z. _9 P) {
  27.     }- T) k+ t# A& l) b" @3 S# f6 d2 z/ ?) C

  28. + a, E. D! p6 v3 ^- H' L5 k
  29.     // Геттеры и сеттеры5 r! Y4 T9 ]- ~) }+ K: N: t
  30.     public String getName() {5 f% }+ D" @, p% f. G
  31.         return name;
    ) `2 g* l' b% ?8 O& ?1 E% Z' V
  32.     }7 s, g0 H& _8 B9 m0 v7 [8 J
  33. : e+ v6 _' n$ w
  34.     public double getAttackPower() {3 |! o) b5 M0 T8 b; S0 P. p8 z: P
  35.         return attackPower;
    3 y! w( Q# f* R. I
  36.     }
      ^0 K$ c0 i" \4 |
  37. ) m8 e  {0 ?- ?5 D2 G3 s
  38.     public void setAttackPower(double attackPower) {  \/ a/ k+ u4 T# j$ @
  39.         this.attackPower = attackPower;$ N1 U9 L2 j: O6 r- K# ]+ T
  40.     }$ b! H2 Z" X  Y$ E* }
  41. }9 I+ k3 r( h0 M; \% [- a
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
3 C8 S+ I) m, g' @) z3 ~* t" _/ T' P# {9 d. t, f/ e
  1. // Пакет org.l2jmobius.gameserver.model.battle
    6 S- ^% C  w9 a# J9 Z9 Z' X& H
  2. package org.l2jmobius.gameserver.model.battle;
    ; x7 B6 `! u# b% O# I
  3. 9 Y# [+ z, P1 s/ n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' }( `, P& F, S2 m$ f% m; L# G2 A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! X2 ^  i& J3 ?5 _7 S! I
  6.   H4 [$ l9 g" d+ h- r
  7. public class BattleSimulation {2 z/ n, F, `" K7 P. }5 q2 M/ [
  8.     public static void main(String[] args) {/ M( W5 A+ j3 _+ L  t1 L* A, i) B
  9.         // Создаем монстра8 `) h9 ?2 f( d, P6 H& t
  10.         Monster monster = new Monster("Дракон", 100);- t+ R; o' E: l1 |

  11. $ U. K9 [/ O, l. \: k
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак; o# F5 w5 U+ M0 J7 E! c
  13.         monster.setState(new AggressiveState());: H5 K( @1 e5 W
  14.         monster.executeState();9 \5 U. y$ I' o+ `: _) F4 B0 K
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак& N% i, u7 i( V. y. j
  16.     }" {) d- y/ `' c# C
  17. }; y( n. d- F/ \: H' ~# f
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.+ F0 _% U+ h) m+ B3 J
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!9 R, t% G1 M% A- \8 {6 J4 m
  f4 c1 W/ X$ A* n

: H( E4 B% c  E; V  s! M4 v4 }, c
- n/ i+ {( q6 \9 U
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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