Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
0 r7 R# A5 T" @& O' O" }) z; e, L' k! ]1 r$ Y$ {

* t8 p7 V4 u: t9 Q- `% ]Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 ^# d/ w& j  H- @5 O! ~
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
$ k3 O: l$ _; ^& ?1 p9 {Астралия ?
- h4 R7 F9 N3 F$ y9 ?; y: j0 S. Q8 P+ y9 A$ w5 E2 y

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ L/ f5 _, D' j- nВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
% c% m  ^+ m" {  a0 F2 P3 R% `/ ~( R! }- G* I0 k
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
% F* U2 N( l9 s$ J% k  R
AlexCoder опубликовал в 2024-10-16 18:31
- W1 P) R4 O+ h- u3 u' GДень добрый!
* t; E% h" g# l: D3 U8 F7 A' i. g- FВ статье описано взаимодействие игрока с N ...

# q) Q; q# U9 c; E; fДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) X3 B% q% u- A1 ~1 |
8 v- X7 m, K6 [, ]
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  }% }5 G  d1 }3 N
5 x% j! n$ ?/ y$ CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
+ @7 u, B; O* Y1 O5 Z0 q
  F. u7 m0 F7 B/ s3 j  @
  1. <font color="Green">// Пакет для состояний монстра</font>
    7 X1 m) D% C& D. v" p2 E6 y- E
  2. package org.l2jmobius.gameserver.model.actor.state;$ Z/ q* G4 s. Y4 R8 _" {( w, L1 V' X
  3. <font color="Green">
    1 U# g  E3 }) P
  4. // Интерфейс, представляющий состояния монстра</font>
    ! v+ v, g9 e0 H+ v  ^( [  c
  5. public interface MonsterState {- D# u. N  D. o  s5 x; _
  6.     void handleState(Monster monster);$ |* i: T# K5 I/ |! j. u' ~
  7. }  u9 q* o6 N7 z5 q) G
Скопировать код

4 B* z1 E5 u4 s% }" {5 m% A5 _5 }Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 l2 ?! p! b: j; H

4 b  |0 ^/ H. d1 t; X2 d$ ]' lКласс для начального состояния монстра:/ l; S. E3 X' Z8 q
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    $ ?& r0 U5 b. v' J" ]
  2. package org.l2jmobius.gameserver.model.actor.state;
    # i8 W# L( s% y! C* |/ `
  3. / Y; ^4 q, t5 m, t( M- f
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 J0 S( w( Q! q5 w- V- C
  5. 4 |$ Z1 ]3 C+ d- h( O7 p1 E; H( `
  6. public class InitialState implements MonsterState {5 M5 X8 J  }8 ~" b
  7.     @Override
    ( E+ d# }1 N* n5 S! U* I
  8.     public void handleState(Monster monster) {2 d( T2 W% V* t8 [& x3 Z! D7 K
  9.         // Начальная фаза боя7 o& o5 N5 i) L- {/ [( v! T
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");. Q9 c8 ~1 h6 H- o7 m9 z
  11.     }
    " B1 K, i2 \4 k* _+ C7 ]
  12. }
    3 j) `  V5 `: W# B8 w% F# S7 E
Скопировать код
) @$ t/ {) s  T! k) A( J; {: ^

- j* s& s7 g  |- y- O$ }$ P" j' g5 Q' ?
2 V: P; ^; Z- S, K& T' i) N
: E& g/ i0 V7 Q' R9 C" C
% L" |; J( w- P: _- w

8 {8 K# [1 E: y( a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 6 {  ~! R' I# t! @
# ~9 G, O3 v" y! K' T) U: }/ _
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; N% [0 L8 L. P/ c3 e' r$ O( a

. `% _& W5 P9 CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.; t, D  g$ ~7 s9 p1 c
  Q: h% {2 Y! q8 q" z6 _5 W
  1. // Пакет для состояний монстра
    : Q, m5 e; [( [/ ?+ w
  2. package org.l2jmobius.gameserver.model.actor.state;9 {5 O* ^  u" v. u  i6 @  ]- |

  3. 4 S7 b8 w5 L9 U1 X( D, m
  4. // Интерфейс, представляющий состояния монстра
    $ n% u3 {; b( e, C
  5. public interface MonsterState {; c7 Q+ I9 ~: ~6 V- H5 U6 h
  6.     void handleState(Monster monster);
    4 ]& \8 x$ z/ O$ y6 Q" T
  7. }
    8 ?) h# u" j" c* Q( l
Скопировать код

1 r# c1 S8 J# u+ S1 D, u' s; I% dШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * V& j3 E1 x) M0 D* p; D; }

4 w1 |/ |" }  N, DЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.) g" k& `: P; I+ s! N
& N) P9 u: h- b6 h# R
Класс для начального состояния монстра:
3 }9 o+ j8 T' R4 F' V( W$ d# L9 L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      n) O$ t/ T3 t' G/ w
  2. package org.l2jmobius.gameserver.model.actor.state;" N/ U, \: T2 u/ ]+ E/ D' \. [% H$ X+ W

  3. 1 J% m- j+ o# i
  4. import org.l2jmobius.gameserver.model.actor.Monster;. \1 Y# L' }  r" J

  5. 8 t- |: \0 d) N+ P4 B' [9 n! U- t
  6. public class InitialState implements MonsterState {
      f2 G- [( L/ ~" S( g
  7.     @Override5 d+ P. J) {6 _) w8 w, ?
  8.     public void handleState(Monster monster) {
    ( \3 \8 q/ P0 `1 f4 ]- a3 O
  9.         // Начальная фаза боя
    0 ?3 k2 y# V+ C/ W% f5 a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 N8 J- |, v& C
  11.     }3 v, p$ G/ i, x
  12. }
    0 U3 M' i" E) k/ j+ K
Скопировать код
Класс для агрессивного состояния монстра:
( h  ^7 ^% E% d) u$ K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; O& j- {+ S3 K+ l  Z: |( h
  2. package org.l2jmobius.gameserver.model.actor.state;+ U, @/ |5 G. U+ N/ |5 r: _0 c

  3. 8 E* T$ S1 G8 F6 H# V+ f
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ T) u  {' V  J% f; e1 }
  5. 6 w8 e9 E: Y' ?( I, t  s
  6. public class AggressiveState implements MonsterState {
    & H- K% e  G9 W! ^
  7.     @Override" }9 d/ Q% k+ z" G! k
  8.     public void handleState(Monster monster) {5 ~4 v9 i5 c6 T) T* a" ~9 f/ O7 n
  9.         // Агрессивная фаза боя8 s4 E! X) w* Q6 v# @. m  K
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! Z% o- p, ^, a+ m5 X7 ?
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    0 s9 D" }) d) m! }; O
  12.     }
    2 ~7 ~7 @* U& Y
  13. }
    ) t* z2 |* d' _2 W+ T
Скопировать код
Класс для финального состояния монстра:9 p! }9 d) N0 b- T- y# D  i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; _$ ?$ y$ p0 g9 ?1 ^( k* \7 b; ^
  2. package org.l2jmobius.gameserver.model.actor.state;/ z8 o8 m- t! M& d/ O

  3. 4 _4 j- e" o% H- f6 t% e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 l$ `1 T$ Q2 ~

  5. 0 t9 z" h' q# M# ?: x
  6. public class FinalState implements MonsterState {
    6 M2 ]: B% J! S2 I$ a% a
  7.     @Override
    6 E! [( }2 |2 ~+ h% q1 c; X3 N7 u
  8.     public void handleState(Monster monster) {4 k! U, U6 h: B9 K( j! L
  9.         // Финальная фаза боя5 x: ]& V# b: z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");7 I9 y% T( Y# K( A' C# G2 M7 g
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. Y6 a# p% s7 R6 W6 }& m
  12.     }* m- I5 e, T- B& T0 J* y
  13. }/ T, N& o- b/ A/ }: o: N
Скопировать код

  z6 O! H2 s; HШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 M* u" l, R! K
  1. // Пакет org.l2jmobius.gameserver.model.actor/ G8 ?. J& s9 \0 U$ y
  2. package org.l2jmobius.gameserver.model.actor;1 j) }/ w& p: h% ?5 l7 G

  3. ! {" W  T/ L! G& ?, P) o# @
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ ]& r2 q6 B/ b1 A
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 @4 |0 B$ d2 }
  6. ; B  A8 }" d, A: [4 z+ o0 x
  7. public class Monster extends Creature {
    7 P9 M5 M6 o( ^9 L. v8 N3 P
  8.     private String name;' x' X; B7 K1 d0 {! `; K" P
  9.     private double attackPower;. A# U& a4 A. w2 W
  10.     private MonsterState state; // Текущее состояние монстра
    , ?, R+ r0 y' i, ?6 H. [" d
  11. 6 }" c2 ^# d" l% F* ~* v* G
  12.     // Конструктор монстра5 q# g' u9 @# z' |: r7 G/ `
  13.     public Monster(String name, double attackPower) {
    ; A) z. {8 a0 j- [1 ~
  14.         this.name = name;6 Y' ^3 e7 M, p
  15.         this.attackPower = attackPower;
    6 H( j3 ]% B! m" l( H
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние8 S, e% f% k) X
  17.     }
    # ?0 L6 g$ @' F1 d
  18. - H& J* A+ ]* i; o+ t( x
  19.     // Метод для смены состояния
    7 W+ C7 F' n  d
  20.     public void setState(MonsterState newState) {
    # G2 r6 J9 E+ N! t
  21.         this.state = newState;
    5 M4 H6 K4 q7 G. t0 d
  22.     }' W6 Q' O! a" W$ t

  23. 2 I# W& E  N$ p! U1 n
  24.     // Выполнение действий на основе текущего состояния" n, N6 G  T) O6 m/ j4 a# O
  25.     public void executeState() {- G$ _! O5 P# R# h4 n8 Y9 h
  26.         state.handleState(this);; |! [* ]' G8 m: ?! Y9 J
  27.     }
    / G" x3 Y  m9 ^$ r: r2 e

  28. ! m- H; Y4 _, G1 e( U  x. j
  29.     // Геттеры и сеттеры, \1 ?4 n/ e3 K5 C
  30.     public String getName() {
    - I; V( _' O; d, J; y
  31.         return name;
    $ S* ~: t  \% F
  32.     }
      A( [" F; M( D0 O6 T
  33. / f% T0 y9 ~2 |, M& ]/ T
  34.     public double getAttackPower() {
    " P, k% }2 a  R& s
  35.         return attackPower;
    ) H+ \! A4 Y/ o2 s7 `* K/ c
  36.     }$ H7 C' T, M& E% V+ h4 b0 d3 ~8 h
  37. 0 d! s( V: h) @0 y* z$ u1 V
  38.     public void setAttackPower(double attackPower) {
    ( G7 ?8 W7 n/ L$ o
  39.         this.attackPower = attackPower;
    5 R7 D# y0 T7 E. O9 Y/ H
  40.     }
    . Q/ G! P1 d* _0 ^$ P
  41. }! D' _2 u  Z2 `
Скопировать код
/ e0 d: z: h0 ~& K5 V
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
5 K$ i! r# N& [- u
: ^- K& Z  I9 \( C$ m  t
  1. // Пакет org.l2jmobius.gameserver.model.battle
      P% L; Y8 d/ r* [; f! G1 J( c
  2. package org.l2jmobius.gameserver.model.battle;
    : a. _/ g6 v% L- f& R3 K

  3. : a. u  a% e9 C  M# M, i/ s9 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;& @9 {+ N0 ~5 r$ g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! I# h" Y5 W$ u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;# x7 t" i/ Y/ k
  7. . C1 T5 T! J" @4 i  w5 q6 U
  8. public class BattleSimulation {, Q' u9 l  @% t1 Y, E) o  j
  9.     public static void main(String[] args) {
    5 O0 H- Y0 G! P, {% k8 ~. U" ]* B, y" K
  10.         // Создаем монстра с начальной атакой
    " A, G9 O! F3 h( v" \. Y1 W
  11.         Monster monster = new Monster("Дракон", 100);
    + @3 Y; B9 A8 s7 s0 K6 c

  12. 3 g1 D1 S8 b" Z6 W3 `# w' m
  13.         // Начальная фаза" I. _: V2 [9 _: E$ W+ Z4 S  X
  14.         monster.executeState();
    7 V. F/ g2 @& V
  15. + \9 ^: s2 p* w6 r" G' A6 f# K2 ^
  16.         // Переход в агрессивную фазу
    : Y- x5 s/ X! k# R4 _
  17.         monster.setState(new AggressiveState());* E" S, e& y( J- ^/ n/ _
  18.         monster.executeState();
    9 v7 I6 z' l3 t* U( t3 w
  19. * |5 g% b5 n0 W/ P8 l
  20.         // Финальная фаза
      d. Y2 @& M+ n8 f. ~5 K: F' ^' R
  21.         monster.setState(new FinalState());0 V& a/ N1 t! T9 u# o8 f
  22.         monster.executeState();. W9 [8 v- h5 a- L9 b" T
  23.     }
    ( N. H9 w2 x8 N: a+ e. o1 q/ D
  24. }
    - J$ N5 C! H9 F6 @
Скопировать код
5 j) S' x, c: C: l* m
Комментарии по структуре пакетов и классов:
2 y7 L- R2 c2 ~  }6 Z* ]
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.9 F( k! m" H/ {$ E9 [- \
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
5 F1 @9 X: e- e: sЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" ~/ m% S& O: d0 c
8 R8 ]0 m, o( p3 y. f8 v! {7 z2 A7 s2 a/ {: D# f& U% _, I% g
6 z2 i! J$ x9 \  l

: {4 H5 d. d9 L( q  j0 a
$ A! Y4 T: Q5 G4 y( {& z' f% `) Q5 A8 z

- Z1 j. [. c% H5 @
! b# q; l9 G" ~) d' @/ e
3 ~! l4 K+ V/ _1 U4 M9 u
6 E* ~( s- g, j5 x
' R" u8 H: C6 {, _: i( p0 x8 T  p
' @  H+ _) Z9 V& c7 w: Y* f# d- m, l3 r
4 p! V- E. O# @
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04, @; x& B% X! }. W
Для управления сложными взаимодействиями, такими как  ...
: x! ]: h1 s. t$ s: _1 _& r
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:216 M+ [2 X# d. n" s# f
Отличный подход! Использование шаблона "Состояние" де ...
+ a  r) l' g) U0 _9 [6 }1 `6 e# X
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.0 s& x. O/ S* w2 F$ ~0 Y
" d- k7 X& G5 ^3 L% j  B. Y- A
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
8 C0 C  w! L; Q4 P- D7 J% D: H4 v  {/ D5 ^7 R# ]( T
  1. // Пакет org.l2jmobius.gameserver.model.actor% g, n* }7 i* c
  2. package org.l2jmobius.gameserver.model.actor;
    4 r" Z+ B7 {% w2 k! o" P  t

  3. " C- L. F4 N. h! ]* R) W( [
  4. // Перечисление для типов атак3 g' a% ?% W# f- y; x
  5. public enum AttackType {
    - O) J0 U: z, q+ A
  6.     PHYSICAL, MAGICAL;: F1 |& }& [/ A
  7. }* r# ^/ u4 v( ]6 E
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
) N- u9 M. D" `7 I; A% B9 u) EОбновленный класс для агрессивного состояния монстра:5 b3 B$ q8 L+ L0 Y6 w: h! i; B' t- _
& U* y# b4 A! F( J1 _9 Z0 r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' T/ u9 W, |0 g8 F  ^, Z
  2. package org.l2jmobius.gameserver.model.actor.state;# i2 T0 c3 P; F, R# Q" O  o! G

  3. / y/ Q# C9 p5 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 ]) h/ W- H$ a/ v# Z
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    9 o" O4 ^0 ]. x6 v9 Y

  6. , D' |) p4 m( m; M5 h
  7. import java.util.Random;/ ]+ ]$ L4 m: X" g( I/ [& @( y
  8. 3 O: `8 U" E+ B) T1 \
  9. public class AggressiveState implements MonsterState {
    8 e7 [1 s( x6 c, E1 ]
  10.     private Random random = new Random();
    - _- z, V* r: i1 o7 G) \* {. a

  11. 8 b+ Z* j5 p( l+ @, f. b6 Z8 K$ Y" Z% S
  12.     @Override
    - R+ o' S. Q& G, U3 A9 m
  13.     public void handleState(Monster monster) {6 I' }: j$ n" L6 u: J
  14.         // Выбираем случайный тип атаки: физическая или магическая& w4 S: {: ]( L+ X/ {7 s4 V! _7 t
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    2 @* h) a( o$ P+ p$ h, x1 H

  16. * K1 |5 I/ z* G+ ]4 d5 `, p9 f
  17.         // Логика для агрессивной фазы боя
    7 r' I( J/ @/ u8 X& W
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    4 y4 T: B  p8 ]; w# c
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ) |( z' p& p4 e
  20.         
    8 y3 ?' |, U0 m( P# E) E
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, s4 P( C( C# C& X/ b4 Q. |
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;  i; Z5 n$ K/ J0 G9 }2 T
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , x* F2 y" o/ J6 O' y. r0 s1 O- ~
  24.     }  k; `! z  M; E3 ]
  25. }
    ' G4 m1 X2 U: N0 t  I
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! ]' y' C  {  |1 W' b  o8 c

  [4 K1 q$ g0 g7 v) j
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 u, a( L$ D: ]; N7 s
  2. package org.l2jmobius.gameserver.model.actor;
    2 o  T: t8 h1 `9 v' {4 S' K

  3. 6 Y- [8 ^1 v* Z  ~9 B
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' F" |6 H7 t  y7 O+ }6 o
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 D& v1 X- i2 `2 J3 f4 z3 |2 m/ H
  6. ( T* N) k. [- S0 |7 m. S7 J8 Z
  7. public class Monster extends Creature {
    1 O8 k1 Z8 K6 b/ V4 R2 V$ C
  8.     private String name;
    ( C5 Z# i3 G* w" N& Q8 z
  9.     private double attackPower;5 E6 c7 W5 J) |( O5 X- \3 X) E
  10.     private MonsterState state; // Текущее состояние монстра. H- O. [$ h, Q5 z: Y6 A

  11. 3 Q& n& x( N) i* A' v
  12.     // Конструктор монстра. U4 a1 B7 w) r
  13.     public Monster(String name, double attackPower) {
    5 [9 F4 ?, U+ o& S$ T
  14.         this.name = name;7 t+ [( Z8 ]! i% s; {8 s" a- {
  15.         this.attackPower = attackPower;
    " _( u! h0 N7 E$ B
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию$ T/ A6 t+ G6 O" {  |4 A' h
  17.     }
    5 P. e. K1 t& v& e# g4 E

  18. # M3 r! E5 f8 ^* i/ P; N9 k
  19.     // Метод для смены состояния! \' S9 n2 Q! S! f; w; l9 ?* b
  20.     public void setState(MonsterState newState) {% d: ^; t& ~* z9 c
  21.         this.state = newState;5 g: T8 E2 w! ?1 C6 l! k
  22.     }
    ! I6 G: R8 R5 C8 q* P. y. x9 F% S

  23. 8 j% A) u$ l8 C0 H  @+ F* \
  24.     // Выполнение действий на основе текущего состояния8 _* o8 K; P4 y+ ~
  25.     public void executeState() {
    , f( b; q/ |: ]/ R3 W6 t$ ^4 K! Q; ^
  26.         state.handleState(this);* Y7 {4 P& X* X# r' J) ^" y
  27.     }
    : P+ M8 i) L- ^2 E$ s' [

  28. $ k' k2 S; t4 B5 a9 i* {
  29.     // Геттеры и сеттеры
    ; u( `5 [) {6 Y7 }- W  j! p
  30.     public String getName() {8 ~! P# k; [  x' L1 x* J, V
  31.         return name;
    # k- D( g: i0 w" Q5 a/ U  L
  32.     }
    + f$ G' h3 r$ Z  ~1 R
  33. , b# l& F/ t! M2 P# @
  34.     public double getAttackPower() {
    1 \- ^6 X3 ~3 m( a; \! D4 @& [
  35.         return attackPower;$ u% O. v% z7 Z2 V+ B- z
  36.     }
    + {, L. N" g- v/ \: P( R. e, K
  37.   I  p) T) C6 c( {
  38.     public void setAttackPower(double attackPower) {  Z: ]9 _3 Y; J/ F
  39.         this.attackPower = attackPower;
    , i+ x3 t  D' }0 q
  40.     }
    $ r$ F' p+ e# b& w1 s$ o& S/ e
  41. }
    # y: l3 l. s7 W- f2 {  d9 B% v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
: A# F4 R( H; n6 Z9 g) @
2 e1 M4 x& X" l6 U- P
  1. // Пакет org.l2jmobius.gameserver.model.battle4 h* I: n8 C- A& i# K
  2. package org.l2jmobius.gameserver.model.battle;
    1 A0 T( Y5 Z/ k7 q  p2 e' Q& X  M, G

  3. + F5 \2 ?  ?1 r* }5 ]( w3 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % S5 }$ |/ V9 E8 C5 T( w
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  K! Q0 i0 w+ R1 G' {: t
  6. - L! F% w) M, P$ a
  7. public class BattleSimulation {: P' \$ l' w8 J9 t# t2 r+ K; G  e3 f
  8.     public static void main(String[] args) {
    9 L) q8 N1 F( T
  9.         // Создаем монстра
    ! v1 h+ p' O/ h; h9 ]6 {6 r
  10.         Monster monster = new Monster("Дракон", 100);
      w2 S- R( P8 b  e# ~; v: f% G& Q* t

  11. & ^0 ^$ `% S2 \+ `
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак$ k8 D, Z) l( A+ m
  13.         monster.setState(new AggressiveState());
    ' i1 ?9 ]) c( s- I( k. m. R
  14.         monster.executeState();& f9 a) T6 S8 _$ X
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак# v- u9 K2 B6 ^( l: I+ O5 P  y3 _
  16.     }! p; L, \% n3 [/ {
  17. }7 @( ~# x: D8 i' K5 n0 K
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
( k, ~$ N" V; z' x  y9 G! p9 d1 u" |) bЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!% F4 v, o" V" M

; Z2 A" f9 z4 `# s1 Z
  a5 `- {- v1 L! `2 Q2 j
% [; a( a1 ]$ b3 o& j- e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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