Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!7 F  e' ]3 {+ a3 m- o
8 X' L* |2 S" H0 C) @5 P  H
2 @: U  O8 A) y- k" W$ k; O- Y% h
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
! R" X+ N3 {8 f# lЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
" S/ o/ E1 I0 [- rАстралия 🌟4 h& c1 u8 v" Z5 y9 b. ~6 K

5 x: O9 l5 x3 o, I; T3 W

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
$ {) r) W1 n3 P# B, Q) RВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, m1 J# c3 X: x6 v; F! G, `* S! r9 r1 j8 J* v2 ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
( v+ b: f* s' e2 t# J
AlexCoder опубликовал в 2024-10-16 18:31" [  k9 i" I  e9 W: C
День добрый!
; ^( w8 w% t9 v! i1 G; _8 LВ статье описано взаимодействие игрока с N ...

8 H% ~4 k! E; h' G% Y: {Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . ?! n' `- y0 G  O# w, L
2 H! r# A. ~* ]; K+ l
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- q; t; D# b: L' i  K7 c7 l% u0 T6 T3 d- c) @8 c. W! x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' `" y9 [5 X0 L) d# `$ k& b0 n, {3 N  ]0 w- m7 W' C$ A
  1. <font color="Green">// Пакет для состояний монстра</font>
    ! C# l* _/ S: @4 i" E  h" G
  2. package org.l2jmobius.gameserver.model.actor.state;* H; \: V$ y, x& Q5 M
  3. <font color="Green">
    . n# Z% l# L( K* K+ o. d
  4. // Интерфейс, представляющий состояния монстра</font>% T) C. O+ D' }0 ^9 Q0 I6 ^+ i
  5. public interface MonsterState {: O7 c: Y- |9 B6 R' B  a: U
  6.     void handleState(Monster monster);9 t8 O, |/ h5 Q8 J2 z1 |# V
  7. }
    & Y: V" Q; L" n# J! J# s, Z
Скопировать код

6 Y, M3 G- V+ t3 f+ HШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# ~) U; p( j  o. r/ o8 S4 v. W
- P$ i  ]( N  w4 z6 Q& H
Класс для начального состояния монстра:
2 L: c5 U0 G( m
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>$ B; `/ |% n3 I& l; x) K9 W8 _2 @4 B
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 s' C( e: ~  U: \. |0 w

  3. # v6 k4 R0 g2 @. w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , l, n# c" }; {' R% a
  5. " T8 }& A8 k) j! P5 f+ K$ n
  6. public class InitialState implements MonsterState {1 o2 g+ s* a+ E" m: L% k$ F
  7.     @Override
    ; I: u# h- K  j
  8.     public void handleState(Monster monster) {2 _8 D( R5 j$ N3 o. j5 x$ ~: j4 `
  9.         // Начальная фаза боя( e: M2 K% G0 `; b8 G; k  F+ o! z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  o8 |$ ^: J6 I# b& [# ^
  11.     }0 x9 o$ H2 x* H  i- V
  12. }
    $ G& W( Z3 A5 ?7 F: f  d; w! a7 L
Скопировать код
4 T8 ^1 ]% w0 F5 j" n

" r/ ], b; F7 L2 x6 Q) `
& k/ d' T" f9 `, y3 C2 H
# P  Q, B: C8 M; l/ \/ E8 o; U) P. J5 K% b* ]

/ k$ r5 f, a+ }" c5 b9 V6 j4 f
+ y( q& k9 c. X0 I
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 I% y/ v( y# G/ F! k% h/ i
5 \7 ~# l) f: Q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 ]1 J- R. e, p  b
, U7 q. P8 C" U7 `/ X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! d4 F( ~" x/ i* W* i% k. i2 r/ X3 H2 ?
0 Y5 k6 z  S6 t; L% F
  1. // Пакет для состояний монстра+ g4 O: k/ S/ o, U' v
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 H' |( u) }; I* _

  3. 1 e' ?: d: _1 F. K) D7 }8 ?
  4. // Интерфейс, представляющий состояния монстра
    / F6 R, ?( W: H* X. A# v
  5. public interface MonsterState {  l0 ?/ M8 j2 p  f& _% D
  6.     void handleState(Monster monster);6 F! L, N2 M! m2 y
  7. }+ k1 R8 w8 ]* s
Скопировать код

; `# g; w0 k* p0 DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 ^2 L/ v% E. p& P, z

* z, G  X+ B% l; C* I& }: {# cЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 i8 v6 x" l& c4 ]  _

* N. u4 e, v" i* q, Q: wКласс для начального состояния монстра:" @: \" a3 i+ U, I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! K! q' ]8 Y* {6 E) v8 U6 D
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! f1 x% ?$ l3 k4 P3 @  C

  3. * k5 W6 P) s6 F; r! y" b. i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      H2 m, X& g4 i  @

  5. # B" n6 P' s- R) Z* T; G
  6. public class InitialState implements MonsterState {
    . `8 J) h) D% R/ M
  7.     @Override
    # c- R; ~! o( c5 B6 F; _% }
  8.     public void handleState(Monster monster) {* y7 b% n. I% n3 k# J
  9.         // Начальная фаза боя
    # \0 D# ~1 j$ ^$ }  @7 \; I
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");: r0 M3 e* j: [
  11.     }( F/ P; k% ]5 A$ |& V9 i6 u
  12. }
    + b! @$ @  Q4 ~" y$ c4 D
Скопировать код
Класс для агрессивного состояния монстра:6 S4 R) {* [; t6 f" o; r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# ]0 c) z, D' d# _5 }) Z4 I
  2. package org.l2jmobius.gameserver.model.actor.state;
    * O% g# G7 H) W1 a1 x
  3. " ~0 d) P  n4 R; l& Z5 c# k8 o; r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % t9 l% u; l5 Q2 Q2 W+ k. ^

  5. & c7 U9 [6 Y; ^! w" b
  6. public class AggressiveState implements MonsterState {
    - p0 ?) U. w+ R# s7 r
  7.     @Override
    ! L0 b. {0 t, Q+ P" o
  8.     public void handleState(Monster monster) {/ d+ F/ c' i$ E( x1 H! i- W
  9.         // Агрессивная фаза боя
    % Y0 o# W  Y6 |5 @
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
      L9 _6 X* g9 f0 E
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' `+ }$ |! M; E: ?3 }
  12.     }
    4 F) B# T: @$ d9 b8 \0 F
  13. }" A) _- I- f. ]! _1 k4 z
Скопировать код
Класс для финального состояния монстра:
7 @7 V  [9 ]+ ]6 Y7 U  h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 y9 B5 M# W1 Z1 m. Q. k8 `
  2. package org.l2jmobius.gameserver.model.actor.state;
    + D7 L8 E5 p! I' I: u" G

  3. # C7 G5 l% s3 l2 m9 ?4 t
  4. import org.l2jmobius.gameserver.model.actor.Monster;) \8 Q1 U4 O5 m1 {; J2 @5 }+ B
  5. : t# w! n1 f. h' m+ s, |! F( X
  6. public class FinalState implements MonsterState {" ~+ _1 S' W9 ?, K3 G4 W
  7.     @Override
    , D9 F7 n" J* I, [7 H& U  ]8 V. \
  8.     public void handleState(Monster monster) {
    / X- u: q4 \3 e8 W
  9.         // Финальная фаза боя7 r/ }* N: P9 A( a4 E
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");  I' E1 ]2 a8 Y0 m/ T
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    # B, i/ r1 a5 {
  12.     }) Y% c! ~) A3 M7 R1 k
  13. }/ v/ q9 W: p) U6 w* g* f3 G
Скопировать код

0 q2 O# Y+ Y7 ]( Z, r: hШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; G  m4 q$ n0 E7 B1 \/ }, ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
      x2 q' |# X* U8 U
  2. package org.l2jmobius.gameserver.model.actor;
    ; o2 h; H( x' a1 M2 _

  3. - o' T( Q8 l+ O$ Y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ Z9 n/ {, H6 C  e0 n& j8 i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    " t; Y1 P2 B! i; j- g0 Y2 T! E! r

  6. " ?  x+ ~- m1 d2 J: M5 C$ y
  7. public class Monster extends Creature {
    ! S$ E0 ]6 u5 A# m, |; x
  8.     private String name;! |5 u/ J# m7 p* t/ [
  9.     private double attackPower;, L6 f5 x: n  y) r$ ^0 `
  10.     private MonsterState state; // Текущее состояние монстра
    # t) X* a. s& ]- a/ S

  11. 2 z9 Q4 C8 M% j
  12.     // Конструктор монстра3 W6 t( ?( n, H5 ?4 r4 {
  13.     public Monster(String name, double attackPower) {! \8 n$ |5 W  k
  14.         this.name = name;- w, n/ w* K- [4 }& N2 R6 A" G
  15.         this.attackPower = attackPower;
    2 x4 }' g- g: i  P. u3 I0 E
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    8 B$ V2 K8 e6 @% u4 g
  17.     }
    7 d8 ^& W1 s4 G& u  H

  18. 2 q6 `# \5 q$ u3 L; `
  19.     // Метод для смены состояния
    ! K' H2 T& J" k4 {( U2 D
  20.     public void setState(MonsterState newState) {" J  o+ A% H% t* r9 }! E7 t' j' ^
  21.         this.state = newState;# m' Y. \* m, v% \
  22.     }
    ( Q2 Q, l2 f1 X1 r" t8 F( ^
  23. ! z! S/ m, K1 ?4 i- v
  24.     // Выполнение действий на основе текущего состояния
    9 j, n! s& e; i* f& G4 Y
  25.     public void executeState() {
    9 X& {6 `" n2 I1 l8 |# F
  26.         state.handleState(this);" [3 f$ O3 k1 s- y& z" N
  27.     }
    2 z+ _! y2 O. \8 b# q( b

  28. , F6 U3 W4 D# v& U( _
  29.     // Геттеры и сеттеры
    1 F" J' H9 @5 _/ v
  30.     public String getName() {! T7 f& @, C% {0 M3 m& `' {( v
  31.         return name;# [4 K0 Z+ |! W2 B3 h( t4 c
  32.     }
    3 B4 \* e" [1 A) i

  33.   ]3 \" F3 `+ O1 f( k, B
  34.     public double getAttackPower() {
    ' Y; B. I3 @$ J1 T
  35.         return attackPower;
    ) ^, a5 ]# u. @) v9 x8 I3 s  L
  36.     }
    + n4 h8 y9 f) F; p
  37. ( X9 [; r1 m" e. x. c$ ^2 \* R
  38.     public void setAttackPower(double attackPower) {
      Q) e/ Y% e/ s& x$ `6 ?# ~
  39.         this.attackPower = attackPower;
    3 ~, l5 d" I7 H# Q! D2 E& ~
  40.     }
    + b1 O0 O/ j, @
  41. }
    7 _5 i+ P/ O* H% P! ^$ X7 `
Скопировать код

5 a, d& ]) ~+ H4 dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.( `+ d4 D" J5 A
  F0 A* M/ }4 K- I5 q
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 S2 Z+ I5 b4 ^$ B$ ]
  2. package org.l2jmobius.gameserver.model.battle;
    4 x) t- f: R& O" m' {
  3. ) Z) e: J! N2 `3 U+ Y1 J) w3 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # D& g& E! M9 s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    9 n# f5 P( Q) |0 d7 C3 S3 c2 Y
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;& y" V2 i4 |9 t* ?/ S) P4 A  I, ?

  7. 7 K" q4 i5 C1 P+ a) a
  8. public class BattleSimulation {
    " z5 I& C! K5 m
  9.     public static void main(String[] args) {2 L/ u  s. D: s0 o8 G
  10.         // Создаем монстра с начальной атакой
    7 A& R; N3 V4 C& s
  11.         Monster monster = new Monster("Дракон", 100);
    9 a# ~; ]: n6 c& n& Y/ U( @7 o
  12. - \: B3 d/ u" H8 |% m7 Y
  13.         // Начальная фаза1 K7 b6 K  y; a
  14.         monster.executeState();: Y4 T, K; V/ S6 \1 ]. N4 A
  15. ; N, F% b3 r" ?$ O, K, b4 e) `
  16.         // Переход в агрессивную фазу9 a$ R6 r* ]6 t* D& d: a
  17.         monster.setState(new AggressiveState());
    + B- l1 _4 `8 S# R5 N1 e' z! p
  18.         monster.executeState();
    & t' s" m$ G, ~  ?( F
  19. , H/ A0 ~  m  l$ {+ H" w
  20.         // Финальная фаза' w4 X5 [. X: A) O5 [# C9 q
  21.         monster.setState(new FinalState());' d7 Z# H8 }. z1 `+ M$ T
  22.         monster.executeState();* p  \* G  i$ w: F  ~/ ~+ b0 B* `/ L
  23.     }
    , Q# n- B8 B$ ?* ~$ {& u% S
  24. }
    * X; `$ n) u! f% b2 }" Y9 O
Скопировать код
& o9 g# J3 j9 y# s# M. l$ v( c
Комментарии по структуре пакетов и классов:
$ e: ~) p: r: @- W7 J5 \1 F# v' Z
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ @/ u$ \: ^5 r9 j, Q% x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
0 Y6 r# E: Q8 w$ _* E9 d  C; Y% m( gЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% |+ ?# \, F6 ^# Z+ D+ `1 M: g. d! e
; N$ \( t" k) O4 @" ~- y2 _. s4 ^3 G1 w# r. [: L
+ q9 I# z# t% Y% d

% W- I9 {: p- k1 W8 [& v6 J% S5 y+ Y) Q( L& f

% {2 P; ^% |/ k$ ?+ m# ^/ }0 Y# j. x! r+ q

1 l9 X# D; |5 s* Z. f7 o7 E" r
; }( m; ]0 ?+ ~: g+ g& q* i
$ W" d8 N, `1 y9 Q- e
$ C1 p# f* v: S( J
2 p" K, F8 B4 ~, ^& o
+ L, ]8 a) n5 l9 ^! j# g
- I8 E; P" [0 j5 j: k  |* n
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:045 f2 ~) Y4 x# S2 H& l
Для управления сложными взаимодействиями, такими как  ...
2 M. Z3 G' K; b& }
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
; D0 N3 D3 P  yОтличный подход! Использование шаблона "Состояние" де ...

) b/ \: y' l# L4 sХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
8 Z) r" Q8 n; s! _5 j- h" f! x
. q7 n! K, C  v2 YШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
' S8 s0 R) G3 d; H; r9 f, q! G
. ]% J/ m  [; B/ L
  1. // Пакет org.l2jmobius.gameserver.model.actor, n& R- ~3 s& j1 u
  2. package org.l2jmobius.gameserver.model.actor;
    . x2 v. ?' w  F" W) f; `/ X( E$ A/ t

  3. 0 v' m( G& n8 `/ i
  4. // Перечисление для типов атак5 n6 d) a/ ~6 v" @
  5. public enum AttackType {0 ^- t+ S& r6 O6 m6 v+ A+ c3 c
  6.     PHYSICAL, MAGICAL;0 q/ M& ]& C: q2 ~8 A# Y
  7. }
    5 C2 u4 v0 n1 U" T) l
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
6 g& i( ?7 M% z4 Z& [; C' I0 t1 ZОбновленный класс для агрессивного состояния монстра:
! _: e  ?' T1 N( d# A3 Y
; e/ J: j- U- ~5 o9 U2 X; |. h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 b. M+ V) u& f; D& g; ^
  2. package org.l2jmobius.gameserver.model.actor.state;" X2 @, x/ |$ G9 R0 p6 M

  3. 2 y' s& j- p. f& z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ x8 ?4 O9 s6 `4 Q6 e' n- h- Q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 M  p' l, _9 ~; g

  6. 4 [) i- d- ?9 K" Z+ M5 U7 A
  7. import java.util.Random;7 f9 T7 I  J% u3 ^$ d
  8. 7 ]& o" Z" r7 T' {2 m2 X7 }
  9. public class AggressiveState implements MonsterState {
    9 {! y6 }% ?( R+ y4 `* `
  10.     private Random random = new Random();% L1 I( \' D2 R& d7 h7 g

  11. / N2 t3 k  X( @8 @) j
  12.     @Override9 W! y, G6 C6 m6 f9 {1 ~
  13.     public void handleState(Monster monster) {
    + I9 B3 K& w; O' Q! s
  14.         // Выбираем случайный тип атаки: физическая или магическая: a$ V! ^0 W! h! @
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;  A( T1 q6 Z. ^9 q0 U7 q

  16. : ~( i3 f2 n! X
  17.         // Логика для агрессивной фазы боя9 h4 g% o( S1 M- C; _( d
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " / [6 [' V6 K- A
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    2 o$ B0 b3 ~5 @, F# g
  20.         
    $ z0 Z) q& J% k# Q3 ^* T3 Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки! l8 R/ L* w$ P9 x: A
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;8 F8 e: ]8 ^; d2 X( T) q. b
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ( ^# I, t: x/ L" t
  24.     }
    , {# K2 t  C8 H2 U8 d' ~3 `2 K) q
  25. }% u, {4 |) |2 _
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки1 @$ w" S# u, `: _$ n! F" b
# F/ z0 C$ ~) i! y: P, q
  1. // Пакет org.l2jmobius.gameserver.model.actor7 d( }  T. Q+ }  e  J6 _7 z* f/ _
  2. package org.l2jmobius.gameserver.model.actor;
    % ~  ]- [9 t  h6 |
  3. 9 I6 g9 |, T. I  \0 A- F
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    + @* e: P# B9 o) p
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : j# V9 F; c- g1 A9 U3 _/ H

  6. 4 c: O0 }2 `0 C% Z
  7. public class Monster extends Creature {
    ' P( V  L$ ]0 S" {4 \' B2 [- y; {
  8.     private String name;* q5 A3 d9 @/ w. x9 e0 M; |2 n
  9.     private double attackPower;
    8 F- b$ b9 ^6 h4 B7 T
  10.     private MonsterState state; // Текущее состояние монстра
    + }$ n$ q" b2 q8 E- u$ ~0 L. |, r3 |

  11. & c$ Z2 h6 w) I/ r4 m/ B
  12.     // Конструктор монстра- ^$ G; A( `! g
  13.     public Monster(String name, double attackPower) {
    / `5 [. s& p% @1 a2 u" \& \: M1 R
  14.         this.name = name;
    6 A, i# j& N% U
  15.         this.attackPower = attackPower;0 F6 A% Z  d& G
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    * j" g# p" Q! w3 R1 D  C1 d
  17.     }) y# a% V8 p+ N; z& ^3 K
  18. ' U8 y5 U2 y" y' j3 B
  19.     // Метод для смены состояния
    - o$ r) f: z9 e, K7 d, m/ S0 R
  20.     public void setState(MonsterState newState) {# h" E( t! T. Q. J/ @1 M2 B' j
  21.         this.state = newState;. U6 G/ ?% e- r) I! \8 h. d0 T
  22.     }# K9 _7 p3 X% D

  23. + N8 I  q: ~$ h
  24.     // Выполнение действий на основе текущего состояния2 O# I; [& x4 {7 g4 Z5 x
  25.     public void executeState() {4 V/ _, [) E: M8 x. Y9 \2 _
  26.         state.handleState(this);
    & R7 i" }! W+ |3 u
  27.     }+ N+ M3 r1 O& X9 F/ P( s: B* i. p7 m6 H( @

  28. " j% D& K* C6 T, X
  29.     // Геттеры и сеттеры
    ) d8 ~4 b* K: I. U- k$ N
  30.     public String getName() {7 a& @& M. F. r+ g& d* w
  31.         return name;: Z$ j) Y: F0 g9 A! K4 s  [
  32.     }3 H3 o, }2 a; d
  33. + u5 q4 L' ^$ ?7 ~  q: n- S' P
  34.     public double getAttackPower() {
    7 Y$ @' W9 c) i) {
  35.         return attackPower;. B. R! G( A3 f0 C
  36.     }
    - Z# K8 v' P7 U8 l9 @) E

  37. ' T# r: b: R4 @2 f
  38.     public void setAttackPower(double attackPower) {
    ! \% c+ O0 Y" b% A( |" T! s
  39.         this.attackPower = attackPower;
    2 r5 Q3 p+ m7 r7 ^; S# }3 h% R8 U
  40.     }- u, f) H! m  M2 R
  41. }
    - I% g! ~& ^% W8 O" r) M+ o
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.; r4 d, d* Z( `, Y/ f! F9 J6 R" `

- W8 _$ S2 j/ Z; d7 o! M, N
  1. // Пакет org.l2jmobius.gameserver.model.battle$ h* i$ _5 G8 N3 A/ d2 s) t
  2. package org.l2jmobius.gameserver.model.battle;
    % o/ b* n/ h  f

  3. ! ?& ~3 B* @4 H0 p& @4 @+ ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) a) k. q! {5 [* J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % T. b2 c2 F) {

  6. 7 q4 J* t. Q- @' z' e- ^
  7. public class BattleSimulation {  G, i) a- B7 {5 d% N; u
  8.     public static void main(String[] args) {% j( j+ D/ f  E; T* ]+ R7 s
  9.         // Создаем монстра" _! e1 [6 T* p8 G5 v- |. a
  10.         Monster monster = new Monster("Дракон", 100);/ p$ l& ~7 ]& l9 s% f7 R! C) Y. F# H

  11. * m7 A' Z* U6 C2 o" _
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ' M8 Q' u9 D% W! w
  13.         monster.setState(new AggressiveState());
    , L) i4 y  V9 Y* e5 M
  14.         monster.executeState();0 u2 S5 m) H8 }* i4 N' X4 r4 V
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак1 W6 m1 a; q6 K* ?/ w
  16.     }! g8 ?2 F. U* F) p# O) `
  17. }& \! U' U, A# e0 F
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, {7 E. y" y, A& d/ E. J6 zЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& K# X2 E, B0 L- L  |2 O
+ u' q5 x/ A4 U# a6 d
/ D- i5 ^+ y. [. ]; d
7 ?( H& w6 R* F, F* ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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