Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
2 c- ^; r) D8 P8 d  t& U0 ~
6 S( `7 ?0 P) I
' r7 t( q; b+ ?; P- b
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.% h8 o' s1 L4 P- x! c2 F
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!+ I/ e# ^/ d5 K  @, N
Астралия 🌟
7 t* l, O; `. r7 I
# [' ^. Z& A, o& z8 [; j& `

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
* s$ _* e+ |, U+ U; `2 d1 E# fВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 s% J2 m  \  p; Q5 g% Z! l6 O5 W
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 7 I% E9 \5 e# d$ W
AlexCoder опубликовал в 2024-10-16 18:31. X& @9 n* p4 }% w) ~
День добрый!, v1 t8 x  o2 k7 |2 R8 j" O0 e/ i
В статье описано взаимодействие игрока с N ...

* X- w4 X$ w4 ^! t1 Q; UДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 [; P) G0 e: }% E
/ B8 A/ F  X& T( T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." R/ t$ K8 v( ^& U( ]2 g! v$ U6 Q
# i- U- b# d8 a, A* c
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ j2 x- c7 t. \
: n6 f$ G4 ~9 ^8 ]2 }  k1 t
  1. <font color="Green">// Пакет для состояний монстра</font>
    0 {8 i% J" |! j) h
  2. package org.l2jmobius.gameserver.model.actor.state;- i. {. v& I- a4 Y0 v
  3. <font color="Green">
    ' j: S1 W, a8 q4 f  J
  4. // Интерфейс, представляющий состояния монстра</font>
      y8 a* K  d7 S2 Y. W
  5. public interface MonsterState {
    ; Y1 k( |0 E. H, V% {
  6.     void handleState(Monster monster);$ Q- [0 E: e  f+ U1 x1 @( x
  7. }
      c8 L( y6 w. C
Скопировать код
* E7 y, W- T) S! a# Z
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.4 ~3 Y! j8 ]8 r( Y2 F$ `0 P

4 j; J" Z/ `: a6 i9 pКласс для начального состояния монстра:6 E+ M- \- d4 b: I+ B; P% S2 v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>! x, w! c# L0 u) }
  2. package org.l2jmobius.gameserver.model.actor.state;. H0 _7 Q: d3 n6 j

  3. . s5 f# t" x/ d# i5 c# X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * C1 |. k/ u% J3 d& @

  5. . w, s5 M7 z  X* U" D! H  \7 k% _
  6. public class InitialState implements MonsterState {+ G$ L2 Z* V, b5 U2 P
  7.     @Override0 y# V, l7 A0 v4 J
  8.     public void handleState(Monster monster) {0 D# W9 f/ ]2 b9 [2 r) o
  9.         // Начальная фаза боя! C* C5 Y, z# i0 W8 A2 X. W% E  H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  B# E& ?! W% l
  11.     }7 Z, B( \- f0 [* U2 u8 Q8 l5 R! l
  12. }
    + s( |. H' b% q$ ^! J# r, j
Скопировать код
3 U: [' Z# g5 L4 [) D

" \9 q6 s9 x# E2 T# P# p" M# g! T1 h. ^
2 {/ X9 w3 L; D3 B; U

- ^. m2 ]2 v, [* n1 c3 t5 z! j. z# o' d8 L8 }; V

0 {' R8 q2 D- O# }4 g! F
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 }2 [: O4 r) \, Y9 {/ W6 N! @! F4 p6 V
" M* O5 n6 f7 P% a3 Z0 \Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.8 S6 ?/ }7 p  ?
2 X/ s4 ~( m3 V
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; w' Z) [$ O2 ?* O; Q3 |
& n3 b5 F# L" Y; K3 a
  1. // Пакет для состояний монстра
    ) L8 r* U6 \3 S0 b$ q
  2. package org.l2jmobius.gameserver.model.actor.state;& ~' y; S$ M" ]6 G+ \) _

  3. # e$ J. l+ ~4 f: n. `- ]
  4. // Интерфейс, представляющий состояния монстра$ k/ F+ m+ X, {
  5. public interface MonsterState {% |, z- X/ a- L7 c0 p0 A2 z* w
  6.     void handleState(Monster monster);
    ! F3 z) @3 b4 M. ^0 k% S6 c
  7. }$ [- {+ Z7 W1 S$ D$ w* q( f/ U
Скопировать код
3 s4 e3 @2 j0 N2 W( B6 ~& x0 t
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # f& r1 V& k9 F+ M
; E3 Y3 c9 E! V! \7 Q% F; z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя., [' T  B$ {  j. R1 [' b8 L

3 q  m$ T- ~9 p* `' Y% _$ l3 n0 d- kКласс для начального состояния монстра:4 k! v. G  M$ y% o: `. l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! v* T! {" u1 C
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 q1 a  P2 R' c/ z; M% r3 _: \5 Y

  3. ( `" j7 T8 N$ {1 a5 L* e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 C4 S- q! l5 A# ]
  5. ( K* h$ r% s* H4 }+ r0 G& R
  6. public class InitialState implements MonsterState {, p- ]2 m# R1 `" ]0 m
  7.     @Override
    $ l5 ]4 b9 C( |
  8.     public void handleState(Monster monster) {+ d* ?/ u) D) k$ g( D
  9.         // Начальная фаза боя
    ( T7 K& I8 [( W3 V* U7 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    / J- S0 [! P$ p3 Y( y
  11.     }" K9 W. a0 T2 u1 D7 W2 A4 I" X4 z
  12. }3 _4 z% |/ h3 O
Скопировать код
Класс для агрессивного состояния монстра:
- Y2 K3 \* `  h( V% w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 N+ w$ x  q) A
  2. package org.l2jmobius.gameserver.model.actor.state;+ S) z, U1 D( {4 H+ a: ]+ e) a& H

  3. , w) ^, ]5 H" F6 |; R1 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 |) Y) L* C* ^" y0 q( A! U/ ]5 I

  5. : S6 f9 {! V* p- g) b9 g* h
  6. public class AggressiveState implements MonsterState {
    . }* J7 M" ^: D6 c
  7.     @Override
    & T/ V$ x# }9 o/ I2 |- B% f( ^
  8.     public void handleState(Monster monster) {7 Q) z% S5 K; P; ]* C0 B5 d9 a+ I" C) x
  9.         // Агрессивная фаза боя
    " E. B' A) h4 l
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( V" C) z- w) X" A7 K
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" m/ Y/ U6 z2 q  h
  12.     }
    2 ]: T5 j# L5 D0 q# i2 a
  13. }( g, m* m' m7 a5 y+ U0 s) w3 T
Скопировать код
Класс для финального состояния монстра:
* I  ]) x! {6 j" b, H1 T/ |: `: C0 X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      n$ t0 _1 q; K9 h+ r
  2. package org.l2jmobius.gameserver.model.actor.state;- ^# @( m2 M' f5 q9 M
  3. 5 A' T, c4 h. D$ B3 i' S
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' L5 b; z0 z/ _8 C0 m
  5. 5 ]8 J" Z9 a; ~) z) C& V
  6. public class FinalState implements MonsterState {
    $ ?6 `  f- O( F, M
  7.     @Override
    9 K1 @, ~/ Q  s9 v% p, t
  8.     public void handleState(Monster monster) {2 S; A  S1 u$ j6 \% P6 j9 I1 z
  9.         // Финальная фаза боя
    % f+ B& ?/ \, ~! R7 `! j' w/ l
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 \, U! f$ |+ X( u6 f
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    / H* y- d+ L  r+ a1 j+ ]
  12.     }5 E2 o; `4 {1 g& S" }& [: d! [
  13. }5 n" P7 Z/ S1 L2 Q! Z2 A$ o3 t
Скопировать код

* P0 l1 Q) P$ F! t7 m7 y8 n8 [Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor./ a' x/ _# y4 J  K3 x( j
  1. // Пакет org.l2jmobius.gameserver.model.actor7 W0 q9 b3 b) z8 ^
  2. package org.l2jmobius.gameserver.model.actor;/ w+ _. u, K$ X, ?6 n2 @; J
  3. 2 S) z! e, t9 t$ Q. z6 j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( s, S2 z: j9 Q. o# i1 ~1 n' b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 x. F# a0 ^1 L

  6. 1 T2 |  M' E' V
  7. public class Monster extends Creature {9 i+ e  l8 x, v/ i
  8.     private String name;# a4 `+ S" h. S/ W6 U
  9.     private double attackPower;( [1 N" c. ~3 `/ ?/ T3 s4 o
  10.     private MonsterState state; // Текущее состояние монстра
    1 W1 y+ O) R2 P. W4 d1 Q, w
  11. + @, ?% c9 k% D3 F/ x
  12.     // Конструктор монстра
    ; U' Z& o( e; w' Y* @; L# l
  13.     public Monster(String name, double attackPower) {0 ]4 F9 Z' }: u0 ]
  14.         this.name = name;, ~! U$ K5 @4 [. @$ }) x! O1 u5 S" T
  15.         this.attackPower = attackPower;+ q7 x+ T$ n# c: N2 K
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние- U- F7 H- f' v3 _
  17.     }
    + W, W& J8 ^6 k4 C9 d; r' L2 l# G

  18. 3 I) r/ J' F+ z  T
  19.     // Метод для смены состояния" E1 Q2 l2 x( G& T/ H5 p
  20.     public void setState(MonsterState newState) {0 K4 X  V2 n7 G( c& @  w. I6 n; P
  21.         this.state = newState;! ^0 |2 k& q3 i7 W$ J
  22.     }& t- q9 g8 s# H8 D0 m% t
  23. / k  q  I# b; C# F! ?, K
  24.     // Выполнение действий на основе текущего состояния* B; _1 p. \3 \1 T
  25.     public void executeState() {
    7 n/ B' w, O8 I' V8 V8 N2 c5 J! s
  26.         state.handleState(this);! L7 X3 ~. e) g* f2 {0 z+ r0 f) c
  27.     }9 h* L+ S! o6 _% z
  28. 0 H1 [% h+ m- z0 p, n6 X& O8 F
  29.     // Геттеры и сеттеры6 k1 a' d7 q7 L/ Q7 D
  30.     public String getName() {/ a* s* N5 a& _* M& S8 g$ E
  31.         return name;
    , {: {6 V! X6 n& S4 B  V" ~4 a
  32.     }
    3 _( K4 C4 T6 C, H

  33. ( H3 w8 C1 l# }' o4 {+ y% y
  34.     public double getAttackPower() {
    0 j& q! Q! d7 M8 H+ f# n5 v- s
  35.         return attackPower;
    / U5 [: {. R; @' [
  36.     }
    ; @4 O/ C: n& {9 I

  37. ' _" X7 J$ A* v7 C& N! ?# U
  38.     public void setAttackPower(double attackPower) {
    7 F# s; m+ C' g# {  N
  39.         this.attackPower = attackPower;
    ! w4 j  \+ d% T+ ?6 [0 [: h
  40.     }! O7 h' y# P7 u9 D+ }4 p
  41. }
    * v, ~/ w9 P; u
Скопировать код

  w6 j. j8 ^8 Y7 LШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! C. v5 |/ u1 o

+ z( L" t2 H7 x4 C0 [& Z
  1. // Пакет org.l2jmobius.gameserver.model.battle2 g. B: ~! O4 @; Q7 M/ F
  2. package org.l2jmobius.gameserver.model.battle;$ m! q* m4 N/ m

  3. 4 q+ f, l6 M2 x% J6 P. ?3 v$ i
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 I' N1 s5 o. }! o
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) M0 k- h5 B+ @" Z. y, P/ L8 @
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    " v: V, `3 \9 j+ |
  7. , g4 K* A" Y# b
  8. public class BattleSimulation {
    $ \" w9 H& O' z) W6 y( |4 R
  9.     public static void main(String[] args) {4 |- F* N$ c6 C4 o# u
  10.         // Создаем монстра с начальной атакой
    & }- q( k2 O: R  h6 G; t% k+ G
  11.         Monster monster = new Monster("Дракон", 100);
    4 q: H+ R+ m. c( Z. J
  12. ; H5 Y5 h; q# K- R# i* C
  13.         // Начальная фаза
    # O2 f9 B7 t5 L6 ^: n) g. Y$ W
  14.         monster.executeState();
    ) D/ d# i2 S+ ?8 \, x% v( C8 |
  15. 2 E1 A8 y: ^; S+ z5 f; Z7 \
  16.         // Переход в агрессивную фазу
    , ?1 Z) `, C" f- h6 P( Z
  17.         monster.setState(new AggressiveState());% u: S  B" g# i! l- W
  18.         monster.executeState();2 u% o2 T7 W. S) U. J! L2 _2 k

  19. . e! {/ U+ p% b) J
  20.         // Финальная фаза, e, f* o) }. i* D. B+ n
  21.         monster.setState(new FinalState());, N# G1 B3 {& l2 B& D& ?
  22.         monster.executeState();; a6 y' Y- y0 }+ D3 J
  23.     }! ~8 _. Z- v) s
  24. }
    . w0 K* ]8 B' e2 a3 y! n: e8 U
Скопировать код

% O- C4 [" k8 T' ~& [/ U6 bКомментарии по структуре пакетов и классов:7 u. {! R* \: S1 q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ [* u9 I; @4 m/ H
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; D" ~8 a" u0 ?5 f# P: D! f' j
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# m" D  P3 `2 H3 Y) _4 f5 v' o
7 P# P, R; s$ ^, K' d% n
  R. V: X# E3 N. N
" e& l2 R& m- f$ h( [. j& s4 E% l) ?5 l4 w, Z
, N; t9 o# i, J

  Z/ P% U! x( p" s/ f
' K9 }, n) t4 N) M, Z7 q; h; I$ g1 v- Q
7 n, x; [5 G* h( _+ |6 B

$ z! g5 ^, C, C& k
, M: ?- n5 h" W3 {! p% V/ A8 J/ h
. h% M0 D/ a  M7 \# O# n
1 W% F0 k0 a9 @& `% e9 c
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
7 P! e% k4 ?/ u( a/ X5 |Для управления сложными взаимодействиями, такими как  ...
3 M7 b% _# h+ G
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21/ N5 ?' \5 H$ |
Отличный подход! Использование шаблона "Состояние" де ...

; b" F% M7 u# H6 b6 F; |' f- W" sХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.% R0 w% U6 m5 u# Z" Q" I
0 Q# G3 Q9 }+ C, B2 h
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.' S2 J* Z5 t7 s- p

8 L1 @5 i# V& A+ K
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % h" \$ h3 D1 e. P6 S( J, x
  2. package org.l2jmobius.gameserver.model.actor;! m: {" Y2 \0 z: [
  3. . t4 i* H5 w+ a, c
  4. // Перечисление для типов атак6 f- O/ M  p8 O. g* \
  5. public enum AttackType {4 I+ R! n/ D5 t/ Y
  6.     PHYSICAL, MAGICAL;) E4 _' J9 E# ~- L$ z# l: h
  7. }
    ' g6 Z9 b" Z$ t" n6 k8 U
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" l$ Y  q7 P: o( O: {4 m& nОбновленный класс для агрессивного состояния монстра:4 C2 j+ |3 j# y! Q
: _! Z# ~- n0 ^% p) e/ Z+ f6 P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( f6 F0 x: d7 e* l) w1 ~# S0 u$ @
  2. package org.l2jmobius.gameserver.model.actor.state;
    . q0 c- K! i+ d3 {( B" e0 E

  3. * {: E5 Q' J. e) u9 _( {. M2 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 d9 d& B" a+ P  ?
  5. import org.l2jmobius.gameserver.model.actor.AttackType;3 [8 m/ E9 g; O! ?5 r0 t

  6. 7 n* g# H/ `/ j, M2 ]: m3 q
  7. import java.util.Random;
    4 z& ]$ ^% i9 U+ c
  8. 8 j: J( P' u# `0 i
  9. public class AggressiveState implements MonsterState {( O7 X" t  B4 o# d
  10.     private Random random = new Random();
    + H% O& V! E( N6 C
  11. 2 N# Q9 q& a7 y0 @0 C
  12.     @Override
    7 X3 |& [6 k0 d: y- t2 N
  13.     public void handleState(Monster monster) {  H0 S, f: }3 g$ A3 w
  14.         // Выбираем случайный тип атаки: физическая или магическая
    . I4 u- N: W3 \) K5 \1 p. |! [
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    * j; h9 S& x) M7 u  r
  16. + O# b/ f5 z9 E; N! b  z
  17.         // Логика для агрессивной фазы боя5 F. c1 s. F3 Y5 b
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " # W. e8 j% w. b; y) v4 Y5 O9 e2 f
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! c6 c" P6 j8 o7 b
  20.         
    % S- E/ Q0 G3 l( V" H7 Y& B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки' i# }" y7 _+ d% X* k
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;# v8 ~7 u3 ?2 z6 D& M# U5 e
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);! n; E& a( e2 M3 v; b# A
  24.     }$ w* K$ w! p" Q& z
  25. }
    2 |3 z& K' F% @# f' ~( x) I: K
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки8 D6 Y: r2 c& l, e1 J
- B/ Y; V% [, |1 h1 T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 a# S2 H% y( `) P
  2. package org.l2jmobius.gameserver.model.actor;) U+ R/ e! `$ c/ a1 X0 }. l' E6 t

  3. 0 x! T' l1 Z3 o8 s9 o+ `+ U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    # |; B1 t3 r% i. d) G) M% N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) k9 Q& s4 F* A

  6. 8 H7 f8 a  D. k# M/ H9 w
  7. public class Monster extends Creature {+ i. `' f& \& K, B' }, T( H7 V- v
  8.     private String name;
    ; R6 Z( X) _1 d, y$ w: f( U
  9.     private double attackPower;" n. P, g1 m  a5 w" J/ b
  10.     private MonsterState state; // Текущее состояние монстра/ R" I' Q& e1 C: m% W5 N2 z
  11. : ]( r: R9 v6 n& [! m6 z0 }2 W
  12.     // Конструктор монстра
    ! {4 U6 f( L$ {, a- \, l* p/ w1 V9 U  w
  13.     public Monster(String name, double attackPower) {
    / a, `# J$ p5 [, C# v: l' J1 P
  14.         this.name = name;  L9 g; ]; I* U! w+ M* L  x- _
  15.         this.attackPower = attackPower;1 f2 L8 w2 O' v. f" [$ e  h
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ' @2 [, |+ p/ V2 n, [
  17.     }
    5 z1 A3 B4 ^0 m) n, [2 g& W* [
  18. 8 |6 Z, A. r7 P/ V3 L
  19.     // Метод для смены состояния
    ( z  P4 p) L! ^) J* p
  20.     public void setState(MonsterState newState) {! Z# I; ~, L/ z
  21.         this.state = newState;* y# v) M' [' i' o
  22.     }! l+ {) J+ C4 T
  23. / {: ]4 H  b- Z* U2 T9 m
  24.     // Выполнение действий на основе текущего состояния
    + ^! h3 p3 r/ U1 I3 t  N6 d
  25.     public void executeState() {" p9 Q+ X2 h5 l: \! ]- g
  26.         state.handleState(this);" c; M- E8 \5 S( c+ t6 k6 a
  27.     }4 U, z2 b6 |- y2 h* S9 |
  28. 4 W8 Z5 p- _" p' U, y' C& Q0 ?
  29.     // Геттеры и сеттеры% j5 Z/ Z9 i5 Z7 Y3 e/ c8 v2 o# _5 J! B
  30.     public String getName() {! V2 m$ h5 U6 ?1 `
  31.         return name;
    . d# f4 [. N. x, ~3 ]' R
  32.     }
    / u- G4 g3 F3 C* n% ~$ v
  33. 2 h9 ]# ~7 {* V
  34.     public double getAttackPower() {+ d+ [6 w( B3 h
  35.         return attackPower;9 u  I' ]" N6 Q# {( E
  36.     }( Q% W% x. ^" `- |% R4 c6 M! m; C

  37. " o1 A8 n& T6 k* C& y/ V$ @
  38.     public void setAttackPower(double attackPower) {- A' x7 d1 w# q* L) j3 D: t9 |
  39.         this.attackPower = attackPower;& F0 {8 t$ U. }5 F6 ^3 G# H
  40.     }' u, L7 Z; T- m$ V8 C4 q% G; L
  41. }; e" O: S5 W; s4 a4 P6 E/ D
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
8 z7 m8 T# k) N/ W4 _; }/ n& Q& q1 N
* ]" {- \0 x2 I
  1. // Пакет org.l2jmobius.gameserver.model.battle
    * ^+ }. [7 L. `' f3 e
  2. package org.l2jmobius.gameserver.model.battle;. J5 R0 Y- V+ n  Y5 P
  3. 3 X1 M# P$ s: _6 g4 g& J9 _4 I
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ T8 Y# I: r0 h7 U; Z, J1 O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;0 E) K9 i2 m3 L; s* E* v: ^5 i, C

  6. 0 k) N$ c% \! @
  7. public class BattleSimulation {, h5 d: v, D. @" ^' K- I2 i' f
  8.     public static void main(String[] args) {
    . t1 j; R& V' N9 C& r: ]
  9.         // Создаем монстра. ^% U8 r) V, f( E
  10.         Monster monster = new Monster("Дракон", 100);  K7 l1 I+ y; b
  11.   c5 c: C- r2 U" k. f" ~+ G# f/ J
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак5 Y9 ]% @+ C: r4 Z
  13.         monster.setState(new AggressiveState());
    + T1 N8 B& j7 L: y( c1 e& [" {& l
  14.         monster.executeState();& O- j0 G$ M1 R- _# c% l, q
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & l6 m6 U! \* O# A1 W* X9 A
  16.     }
    % Z' P3 D3 b4 n% q3 O1 m# {
  17. }
    ( o7 y, b' _3 f. H$ Q
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
$ G4 q) q$ ^. C& R8 m0 ^7 M3 M/ |Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!# v9 G& y2 N& S, S4 t# @. @
( G! J6 C4 X8 h, t% N
$ d$ r1 [( I7 W$ F) [% A* g, f* B
4 I+ i4 J/ [. x& X+ f
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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