Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!8 s# {; F; h, t1 \* A) ]/ b

% I; s: K( j9 Q3 M& n
% I% }& d1 c& P+ T0 F$ q
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.# U/ C, i( y! a$ T# d% ?
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
: Y; Y% x! b8 d! I* b, N0 C4 ?Астралия 🌟0 U$ r& P# t4 i% `2 n7 N. G
: p, @' R/ n. V$ E

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!& \) w& U: W+ E1 ~+ J
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?7 e! z6 @0 w1 @5 }3 D. v3 [
2 N( ]0 D) v. P4 I0 y) w
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
9 z' J( |: x0 z* g% E* E' W) F& }
AlexCoder опубликовал в 2024-10-16 18:31
- k" A$ T* j1 Z6 Z4 k5 z7 i2 MДень добрый!
2 S; _1 B( K2 zВ статье описано взаимодействие игрока с N ...
+ ?) `. ]9 _4 u- e
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / t9 d( i2 \- G1 N% ^& c8 Y2 `: `
1 q+ C6 y  D5 ]( g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; ~- S7 Y( g( [9 V. \

" b5 k- e3 Q9 vШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ q" d( x0 a$ y. I' f3 w! j

: a& G$ i% B. J; `/ |1 `. N
  1. <font color="Green">// Пакет для состояний монстра</font>
    $ l$ \3 w6 R( F" \3 [7 T
  2. package org.l2jmobius.gameserver.model.actor.state;9 h  ^( P) l# Y' O) T. d
  3. <font color="Green">$ k& L( {* E" U/ K- F4 `. R
  4. // Интерфейс, представляющий состояния монстра</font>
    % N  h0 B, I9 k* B$ U/ a/ h
  5. public interface MonsterState {
    " i( C# |' S4 }. p" v2 t: j
  6.     void handleState(Monster monster);
    5 ~) F. j" v0 D4 I/ C
  7. }) I( t& E# w) y, s8 @- J  L* ]' Q. ?
Скопировать код
" o9 L; x) r* x3 W7 j
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.4 F0 W5 o2 j4 A5 B: P
2 S1 s3 {$ D' P( |# K  J, T# Z
Класс для начального состояния монстра:
2 ^; }2 V8 e' Z9 W  a. q2 O
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    7 @3 _8 f- i; Z/ _/ @' J% g% O
  2. package org.l2jmobius.gameserver.model.actor.state;3 S! I$ F" ?% n, F% s$ o% [

  3. $ [4 T# ?( ]. R( k9 P" k9 t! o1 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;% i6 w- h  f9 L9 X; `$ n8 n

  5. ) s+ R  k1 f6 P  `# \3 o
  6. public class InitialState implements MonsterState {
    4 _+ c. a: O' t! z4 @# L0 Y: p
  7.     @Override' j5 Q" p; \) \9 C
  8.     public void handleState(Monster monster) {
    9 s' `6 o( M& ]
  9.         // Начальная фаза боя
    / P2 A# d( R. _( H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ E% [( \1 R# E# C6 Z8 |
  11.     }1 C! E. x. \4 a' P8 A2 H, o2 O
  12. }/ y) r' Z* n( P/ x* H% K/ A' x
Скопировать код

- w0 @; }$ [2 {9 ^. ~% |) n" i3 I
3 N$ g+ w7 R& Q% C6 T; o8 }
9 [8 k  x; d/ o$ j( F
0 |/ J3 l: f& n% z
9 l; p& ~7 I; w& S9 s; j/ X3 c2 z! H5 w" E/ J# x

3 Q% |7 f) f+ X7 F2 w$ I% r6 x
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ; ^3 b" h3 X3 X( N" S+ R& r

8 X2 e6 d7 ^  Z8 QЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  S0 D) U3 q. \5 K0 s5 g

; t5 [5 x2 ]( }3 w5 ?( {' F& dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ G/ D1 z8 F5 ?

: y+ |, \7 {- \: u# S7 o
  1. // Пакет для состояний монстра
    - a4 L5 x& t0 m) B+ [9 J! w
  2. package org.l2jmobius.gameserver.model.actor.state;, a' F- D2 E' _
  3. ' j# M8 C; g4 ^4 S5 j% [
  4. // Интерфейс, представляющий состояния монстра
    ! q" v' k9 s" q/ p9 \
  5. public interface MonsterState {" }0 G2 F8 P7 X* ~7 F2 w4 L
  6.     void handleState(Monster monster);
    9 `, ?4 B7 {( b, H/ l
  7. }. |: O* e* o( l3 A
Скопировать код

5 ?( |' r$ A  {9 ^, O7 X# mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ _7 @; x7 E, a/ L4 W7 n. T% v% R1 z; T5 u
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  V1 b8 H5 I  a+ O, X9 Z! Y; t+ X
$ j6 u% ^, {  b- N/ NКласс для начального состояния монстра:
1 M3 h, [4 c& x$ j& G. }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( J% H' N( B$ q) S
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 a/ f0 ^* h6 j" P/ U4 _

  3. , R3 ^7 R! t  S, D! P1 v) A9 }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / F* O! ^& E$ I6 u

  5. # O- `, {7 Q: J' n' w5 k7 e( E
  6. public class InitialState implements MonsterState {/ r4 [5 M; ^  i: P' j0 ]
  7.     @Override. C. m% c9 F  s6 y. c) n9 d0 [
  8.     public void handleState(Monster monster) {
    8 q6 c$ P% g& h5 N( X
  9.         // Начальная фаза боя
    2 Z' Z# d5 i8 {* g7 B6 U4 i) u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 f6 X* n. b$ f" T
  11.     }
    : [) A6 w& Z% p; H1 {( g. l, Q
  12. }
    2 m6 _) x  w) B7 _
Скопировать код
Класс для агрессивного состояния монстра:1 @. t- A; y7 Z+ \4 u9 P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 j* b5 x- b. H, U- c; H4 ~" s
  2. package org.l2jmobius.gameserver.model.actor.state;
    # P, E* ?, @+ t( c, j) L: n0 E
  3. % \4 {; \, \. Y, Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % E5 q# F  y' G" U) X3 d* t

  5. 8 C% n- e; |8 {; u0 d% e
  6. public class AggressiveState implements MonsterState {6 M& ^- h3 G7 F; t" `: {/ p* g
  7.     @Override
    8 k& r6 f7 |/ D) @
  8.     public void handleState(Monster monster) {  P6 T7 w& Y: C2 o% `
  9.         // Агрессивная фаза боя
    ( r6 Y3 Q7 |7 A2 n1 q# }3 o
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , D+ ^1 f4 B- u9 O' W, c
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 t2 o. z2 `8 B, s" n! m
  12.     }
    2 y6 L6 ~  o2 F; L$ u
  13. }
    3 q* X2 B( N+ o' n9 x
Скопировать код
Класс для финального состояния монстра:
) n) ~" I# C" d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # S) B9 q6 O1 k8 y, \4 r
  2. package org.l2jmobius.gameserver.model.actor.state;! i0 A2 t! D" }9 i

  3. / Y' G! m7 e4 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 I) }$ r1 F+ Z" V% n
  5. ( P3 `6 |3 w2 _6 y2 Z6 L& G' d
  6. public class FinalState implements MonsterState {9 S% r$ j& V9 c6 C8 d" T- @0 a
  7.     @Override
    5 h" J, b$ d# J: h6 s! Q
  8.     public void handleState(Monster monster) {
      U: ~* d2 _7 S9 V7 ]
  9.         // Финальная фаза боя
    3 e9 \$ A+ u& S- C) u( L
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ) h7 L7 M; H& y; _3 G2 x6 ^& v
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : e3 }1 U; `7 D2 V2 p  Z6 F
  12.     }
    1 N" p. `: ]" C9 P; T% s7 _$ J: D
  13. }( [% N: F5 \9 E6 L/ l, X9 t
Скопировать код

/ L: S5 U2 x5 i4 R  }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
3 x5 G% ]: ]6 d
  1. // Пакет org.l2jmobius.gameserver.model.actor9 x8 G3 P, p5 K( E% C9 Q7 s9 k5 p
  2. package org.l2jmobius.gameserver.model.actor;
    4 w$ S5 P% j& C0 p( `  q4 k
  3. 6 P1 @; I7 }+ v  P
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* f" f8 n% a. ?' E% d" N% W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* S$ b! y( m! M) M' O* O
  6. : [( N- W2 ?! j. t
  7. public class Monster extends Creature {
    ! S' Z) L; m+ X2 g8 q
  8.     private String name;
    8 q! p; D  `1 w: {
  9.     private double attackPower;3 x: P2 W2 k) d; Y, n
  10.     private MonsterState state; // Текущее состояние монстра" c- o% ^' ~& ^0 r: J9 S
  11. 7 }- F: N" Z" Q( p6 y) ~
  12.     // Конструктор монстра
    - M, C. I" C" F- g
  13.     public Monster(String name, double attackPower) {
    / Q' s4 p$ K1 j9 S' S: g
  14.         this.name = name;0 F2 v4 }. p/ R4 V& U, W  ^
  15.         this.attackPower = attackPower;
    ; M  X7 }+ a4 N2 ~  z
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    + t/ `$ U' U% X0 D  u" i) D; U( F% C
  17.     }
    ! X/ d5 u5 @( K1 `

  18. 2 [, L' Z# G6 X7 H. l/ \3 O7 d' D5 M$ m
  19.     // Метод для смены состояния: @6 H5 Q' N# K! s- O
  20.     public void setState(MonsterState newState) {
      S& f! U" P. T" U
  21.         this.state = newState;. _  c* `0 c+ C
  22.     }
    5 t- i1 W# f/ c6 t9 R

  23. 6 [, ^4 E# Q1 {1 ~8 p. v
  24.     // Выполнение действий на основе текущего состояния9 {( a2 I, x& i( t" I
  25.     public void executeState() {0 b; N" l# b$ s4 t9 r: K. v- e
  26.         state.handleState(this);
    . v8 V% F0 n( ?
  27.     }7 i' O3 O! j7 w; `1 Y

  28. 0 }& a6 R' M) G+ B: [8 j
  29.     // Геттеры и сеттеры
    6 `! e, v6 ^" ?0 E3 H( u, H3 f
  30.     public String getName() {. K  R  f( Z7 c: E# S- Z+ K
  31.         return name;
      `; r  x! t. m) F1 c6 ^% k# \
  32.     }5 \8 |; i7 ]6 m! H% U

  33. . x, @. E: _' d. Z
  34.     public double getAttackPower() {2 Q8 j1 ?+ E$ o1 }1 E2 b* a
  35.         return attackPower;) J4 w% ~+ B! r! c/ w3 c$ u7 u5 J
  36.     }( d+ I* K8 p: z

  37. ' n2 U' m; _& H: o: O. o/ s
  38.     public void setAttackPower(double attackPower) {& q- Q1 T- I! l
  39.         this.attackPower = attackPower;
    - e- T0 H# @# c2 j- f4 d/ [0 A
  40.     }# C$ ~! S- G( h" z! h" ?' e5 ]
  41. }
    ) ?: j" [* t& X
Скопировать код

$ Z9 z0 f9 U+ g. vШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.) j7 {4 q0 m1 j7 @' t2 s
7 M4 P# n# Z0 @" z  F
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , i+ o( `: H' K6 _1 S, P% a
  2. package org.l2jmobius.gameserver.model.battle;& ~: k9 o/ h: c8 m8 ]
  3. ; F8 |" X) K# [+ N
  4. import org.l2jmobius.gameserver.model.actor.Monster;# A: n# \; J+ D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 K% n6 q9 a7 Y" l" h& v  S
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    - d+ H$ W. u7 \. ?9 g* ?) U' k

  7. / M% d8 {/ Q/ w6 e+ p
  8. public class BattleSimulation {
    ' I$ J: L: b8 h
  9.     public static void main(String[] args) {4 E! S7 C9 ^% e1 Z: U5 ~
  10.         // Создаем монстра с начальной атакой
    , h# D/ I: W6 C) Q+ H0 b
  11.         Monster monster = new Monster("Дракон", 100);
    - B: N1 r( A. E7 ]3 \# w

  12. 0 s2 J& z* g1 }; d9 s
  13.         // Начальная фаза
    , e. N- y- q0 J0 [! z
  14.         monster.executeState();5 A! Q& T( K7 E  I# B
  15. 4 `4 U& L0 l- D+ D
  16.         // Переход в агрессивную фазу
    3 `$ @1 B+ ]1 J6 s$ I( c
  17.         monster.setState(new AggressiveState());
    4 q5 e: u! [0 Y. |: S" B
  18.         monster.executeState();
    3 y+ D8 k' D, S. v) N+ Q

  19. 9 P6 s2 s" P% h2 G8 Y" Q$ @. K
  20.         // Финальная фаза  B( X. Z8 `1 ^4 P# k$ o4 w
  21.         monster.setState(new FinalState());
    ( k% s# ~9 B2 _, h1 O3 P7 R
  22.         monster.executeState();, e2 c0 U5 A7 D* P
  23.     }2 V4 [7 ~1 j/ Z' P7 }" r
  24. }! W# N. }3 m: T
Скопировать код
: ]2 V1 D  e- u, q+ d* w% y  [" f$ L
Комментарии по структуре пакетов и классов:+ Q; i/ R4 q1 _, [
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    5 w& s6 h% U; @. O
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
  V( Q" y9 |9 i2 ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!3 z: p8 p8 K  Q: k. b
2 j1 F- E2 j. x) f  v- V
, Z3 R$ ], D6 q: s, E

8 e' Y, ?( i0 ?: }5 S* A3 z& F1 b2 d2 m) W' G0 K' P* a1 c
* C& D. h5 A' l* L0 S( A% Z4 H4 i

6 ~" F8 b$ U* t/ C0 K# d+ T7 V& V# @0 a) p3 Y

  M. d$ d, V" l0 o; j
* K0 j: p- T! W
6 Y3 p7 I! M0 T1 _) T2 k/ T
0 F/ f  \& Q- k& q" k- l' P
" f/ ~1 K% ~. {) d# G
1 f. n6 U( ^4 f1 H5 T; T" @! \6 X6 |7 H: M- R
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04; f% q5 b9 ~. _9 N% w% E
Для управления сложными взаимодействиями, такими как  ...

& I- ^9 V" k% U( n' f* nОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:211 t5 P  m" Z$ Q- c
Отличный подход! Использование шаблона "Состояние" де ...

* c; V9 W) z9 r4 |3 H9 gХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" N$ C/ i0 o2 k3 E1 }& y$ \% T" [* |, A" J4 z' d  v0 M
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 u0 D9 C5 U/ J! c

, F* q6 c6 c) u2 o" Y0 q  f
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( {4 g4 W$ D, R
  2. package org.l2jmobius.gameserver.model.actor;+ O, Y4 O+ Y8 k0 {7 g- g9 e+ i1 Z4 u
  3. 0 x* Z" U% ^" v" F# O, w' C% q
  4. // Перечисление для типов атак+ J/ A- Z0 q# A, A  @! R
  5. public enum AttackType {0 v% t7 y; s' c
  6.     PHYSICAL, MAGICAL;
    - b( v6 a* X0 }2 p  }8 j" D
  7. }
    2 w4 j+ ]( D9 M+ Q
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
1 r% W( \1 O# ?4 ]8 H0 FОбновленный класс для агрессивного состояния монстра:* I/ J9 |0 i! N4 Y% T

6 n! e7 w. E$ @8 W  N5 ^' W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # G3 C) l! O/ \, j0 O4 E5 w
  2. package org.l2jmobius.gameserver.model.actor.state;: T+ c6 C3 Q4 S; |; c

  3. ' S+ z) M. [/ i* P
  4. import org.l2jmobius.gameserver.model.actor.Monster;: Q6 t6 D6 z, n2 I; M
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ' E$ C$ I" P& y- n& l
  6. % [' U5 C" w, V# V! o. v. r
  7. import java.util.Random;
    , V9 H6 H8 O, G" K' G3 u
  8. + B& o: K& a# ?" e2 h% o" y
  9. public class AggressiveState implements MonsterState {. I! n7 y# a* J- X, H& v8 x
  10.     private Random random = new Random();
    ! k, U6 [5 ~# Y1 ]# P
  11. 1 J3 a" E  I, b7 R3 \( }8 z& A
  12.     @Override/ ?1 P, ?, Q0 I! T
  13.     public void handleState(Monster monster) {6 Y# g% a+ ]4 C% q( X
  14.         // Выбираем случайный тип атаки: физическая или магическая) r! x) Y! R1 l2 y( k' ^
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- G' w7 M$ I2 ]1 I* ^
  16. 2 P6 H0 c) {0 {7 t' ~) `
  17.         // Логика для агрессивной фазы боя: `; Y8 A3 {0 i8 `! b' C
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    + d$ K/ ^6 ~# u& D% G9 q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");# U# {: p, i- j
  20.         
    1 |/ {4 L2 ^8 p$ a6 p% h7 w2 C
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    . |% H7 P- d& R
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;/ L; F$ x$ B! ~% q$ H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);. r, k9 E4 ?- t- o- W
  24.     }7 W7 r3 @* m' B- `
  25. }
    ( r% k3 @) e  ~& ~, M0 t% \
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки- Z# j/ Q3 s: x* k) k& v: Y7 H

% k& ~/ Y8 |# w5 r8 Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 l9 s6 u" g  x4 B4 E
  2. package org.l2jmobius.gameserver.model.actor;
    0 `/ w$ U. H% M" }* U" ^

  3. ' B) T1 m. Z, a2 v  W; E) X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' U4 T+ B, u( l- w0 @/ ^2 I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . Z  u; ~5 l2 E

  6. 6 t$ A/ P4 M4 O# T( U0 k* S
  7. public class Monster extends Creature {7 L# B' P: K2 R8 B
  8.     private String name;$ n4 B) u. X2 i6 y7 M
  9.     private double attackPower;
    ' Z! }* [' D* m/ o2 A; Q$ Q' Z0 ~
  10.     private MonsterState state; // Текущее состояние монстра
    ) x# _2 |7 `$ ~8 d( Q! b
  11. 9 l" G2 L, W5 C* n+ F
  12.     // Конструктор монстра( Q- k% v: o1 Y
  13.     public Monster(String name, double attackPower) {
      d' o" y; W: y) r! j4 N
  14.         this.name = name;! e$ T. }; f+ |6 ~, C9 M6 ~3 R4 Z5 I
  15.         this.attackPower = attackPower;
    5 L; {8 v7 T  V+ x! U" U
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию8 ~! Q5 a9 |" j
  17.     }& Q6 I: \# W" B8 v0 c) M- w
  18. 2 @6 @! |8 ?* ~
  19.     // Метод для смены состояния6 e, K+ c$ l. s5 @6 c
  20.     public void setState(MonsterState newState) {
    2 L6 |( K) B% p" \+ }( Z
  21.         this.state = newState;- Z" k# n( p1 t8 A
  22.     }
    & O5 C4 }0 @6 j3 M# M$ P

  23. 4 F, y' ]5 i  T
  24.     // Выполнение действий на основе текущего состояния) o: M* G4 y) V% X
  25.     public void executeState() {
    # u' L) g2 n1 @3 M! Y
  26.         state.handleState(this);! W7 K6 |2 Z3 u! R3 s, i8 x
  27.     }
    + g8 T9 H9 `' Y* @& M
  28. * Q! k- m, f2 M0 Y* A4 O
  29.     // Геттеры и сеттеры
    9 H3 _) B2 p2 s9 {
  30.     public String getName() {
    " j: _* j- z' N' Y+ U5 p. L5 n5 V
  31.         return name;
    / d0 T( n) u2 {1 @2 A# K; Y. K0 t
  32.     }  R* l$ p$ c( o( Q4 M  O/ k9 |2 A3 k
  33. 2 C4 _5 I2 Q" X
  34.     public double getAttackPower() {5 p! z2 ^' J4 R, |. H
  35.         return attackPower;
    6 ~6 {! U( Q# O5 E% H, d$ O
  36.     }0 `; k, [7 ]5 i5 D
  37. 5 m3 [) [  c! r; r
  38.     public void setAttackPower(double attackPower) {' s: W9 k, ]' k4 k! }  v
  39.         this.attackPower = attackPower;
    " C$ Q( ^. O9 |
  40.     }
    + A0 ^1 `1 U% |6 }- e# e% X
  41. }
    8 _$ ?  d9 j) r$ ^# t$ O) T3 h
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 E8 u( |9 R2 J$ {8 Y" q

! g4 \& `3 y* c% ?; r% j8 I; u
  1. // Пакет org.l2jmobius.gameserver.model.battle& }0 Q5 y* L8 o- N4 q5 d
  2. package org.l2jmobius.gameserver.model.battle;6 w% G% d. Z( @+ g0 H* @0 ^, ^, p$ A

  3. 6 Q- a; R/ ~8 l4 P' h- P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 e5 s% z( R$ V1 J7 ]( S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- h; H) c0 I3 k+ o. x' D
  6. # W3 l, ^8 W: S& R, v6 u6 \( r8 j# B- m
  7. public class BattleSimulation {2 R3 T, i5 a* r/ y5 n" d. ~& j; y
  8.     public static void main(String[] args) {
      V/ p% X+ Y' u  K  J
  9.         // Создаем монстра
    4 V" E- C  {7 a# ~5 C" f% C) U, m. j
  10.         Monster monster = new Monster("Дракон", 100);; b5 y, ]* z+ a- _% h( j5 l) \
  11. ) J- l% G! \; ^" `1 f% ~
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак$ i9 ]* h5 H) G
  13.         monster.setState(new AggressiveState());: }7 l. h1 y  `, h7 H# _, ^2 {" R
  14.         monster.executeState();
    / R% e* h4 ?; O" D+ D9 S
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ' w7 p; A" O( g) ?. _3 p) p
  16.     }  i. T! U- @; H* U/ T8 ?: s+ P! s
  17. }4 P7 F6 v3 p. x8 O
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.! W, ~$ H1 o/ f. N! j' d$ ~
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
8 s# n% G: A, o, X! \3 j' J' K9 i6 X
" b+ M  x' P1 d3 F" I
0 v! s1 i# f6 L5 @* ^
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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