Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
/ [; i5 Q2 ^( X
; c0 @5 k$ S& ^3 k* N
" |" }+ ?4 [* j+ [1 b  X; @
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
1 w1 ^- C: k8 b- P9 e, fЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
6 J/ v  v# u5 o5 }+ ]* v0 J) qАстралия ?
0 N# [0 p0 o4 i+ t% W$ g, k/ r+ j5 F. X  g% `$ f+ R# Z

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!& x' y5 `: K3 e( ]6 P
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?" K- h: m, G$ ~  |3 V+ c; P7 D
* s: R7 k% W5 \: }
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 5 [3 M' ?% N5 e7 q) [* U
AlexCoder опубликовал в 2024-10-16 18:31
- |5 }$ T) ?  B9 y1 {7 aДень добрый!% J! e2 W/ q6 J! g5 ~
В статье описано взаимодействие игрока с N ...
- \0 V  I+ i7 y$ L! l# i
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& y  v, q- m$ B) g1 s2 o1 O2 S/ f' J# L; \3 \
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.5 g* T  m7 }$ t2 D
3 D3 [! W; G* C; H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' G" B" ^6 b% w$ B( V4 s
5 \4 x) ^" |6 k  E! `5 y( ?3 w
  1. <font color="Green">// Пакет для состояний монстра</font>. A7 _8 `& x' `9 F, e7 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 F# D! Z- L6 t  i  T( W
  3. <font color="Green">
    ! I) h: z2 U6 ]7 g
  4. // Интерфейс, представляющий состояния монстра</font>  E  e' ~4 p$ ?$ x* x3 Q
  5. public interface MonsterState {7 q$ ^: W$ D% V. E
  6.     void handleState(Monster monster);7 k! O7 z5 H7 Z7 ^+ C
  7. }" P$ S* n( r3 Z0 X
Скопировать код

. y8 T7 Q( K6 E% [2 a- O; rШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' J2 O& q2 P0 J/ a4 H' Y# H3 Y0 d$ P) t# m; ]
Класс для начального состояния монстра:+ N, \* h2 k8 _: b
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    9 Y: K0 c; V" o' X( ^' Z$ ~1 f& s& ~3 w
  2. package org.l2jmobius.gameserver.model.actor.state;
    , G  M" v. |+ i- Q+ U1 D; A8 M
  3. 9 z  g; B; K  n
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 E$ L  |' _1 z, B! w% S" j
  5. . J# d( \9 S! v
  6. public class InitialState implements MonsterState {. O7 J- e9 R4 Y. D
  7.     @Override
    : c- {% H; L! `6 ^( X. |
  8.     public void handleState(Monster monster) {
    ' }9 I; p8 e- P& t% }5 m
  9.         // Начальная фаза боя
    # N5 v, x/ p4 ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # w9 L1 a9 ^0 l5 u
  11.     }( G+ l0 |1 `; ~7 ?1 X% W# V' W
  12. }) [- W; }! d$ P% H+ X' c
Скопировать код

$ y* i5 k" f% N( U5 D8 ]8 T, t, f) m$ F3 z) E5 t7 i2 T2 A* B

8 w, j4 O/ ]  z9 [
2 h0 i, p" Z0 f: x' ?
& [8 f5 a" |, g0 c* t6 q2 n5 R# N' ^# \( z5 l

' _& @6 _+ P3 z5 ^' T; w- R5 `
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) Q5 d9 o' l9 l( e! `4 y- r
$ P5 T2 J- s* p# w  i  Y4 f5 y& j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 l( m4 V" ~# I% R, O. \! T
  K* Y7 B6 C: @! h
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  `% W8 {3 c1 N8 ?" ~

( I+ G& j- y: m+ v
  1. // Пакет для состояний монстра) w$ ?/ z1 n( x. c/ Y1 a
  2. package org.l2jmobius.gameserver.model.actor.state;: ^# ?" h4 {8 ]7 I, Z/ G

  3. # K* z) ~% U8 N
  4. // Интерфейс, представляющий состояния монстра
    1 ]; H6 x$ s( P5 D) c. L1 a
  5. public interface MonsterState {
    : T- ]. y* B+ M' U
  6.     void handleState(Monster monster);; l+ v- V0 l% O, J+ e) n+ _0 g
  7. }
    - j* j, u/ A  f0 H0 T# r
Скопировать код

5 f7 a' ]2 T. m6 e. _+ S  AШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + S' @  D2 |8 L+ _& C( H. n

2 B- w1 ?" X/ c$ ]( j9 `Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# z9 H* ]# P. l# J+ I2 R/ A
1 |9 N; H2 P9 E) c' X) \( T8 W& D+ W1 bКласс для начального состояния монстра:# s9 F3 R& X( |, H, z( Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! i: x1 {. z. \( j
  2. package org.l2jmobius.gameserver.model.actor.state;9 b3 O0 F2 s0 k" L2 h0 J
  3. / X5 s8 H7 W( [, j/ _! @" b
  4. import org.l2jmobius.gameserver.model.actor.Monster;' _0 F" ]0 a+ Z. a& L

  5. + f; z& |2 F+ I3 d$ Z7 L; _
  6. public class InitialState implements MonsterState {
    # e) Q/ W1 ~- C, F
  7.     @Override
    1 d0 w7 z* w. a% d. i( [9 H6 _
  8.     public void handleState(Monster monster) {
    ! a. S( m- D- D
  9.         // Начальная фаза боя( k% A" [* _* \6 i$ V' L* u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ! }4 [) i3 S& a1 X4 ^
  11.     }
    , E7 Y; n$ f, r
  12. }
    $ i7 Q. @& g( i6 g
Скопировать код
Класс для агрессивного состояния монстра:
* S9 g+ J7 E; ~6 d$ j$ y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & ^) Z2 ]; q* P- T# _3 R
  2. package org.l2jmobius.gameserver.model.actor.state;
    " d/ q# P, W* L" v9 a
  3. : ^0 L2 h6 y# G, p6 \; C. @
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 l. x8 I7 `' @- B
  5. & S2 d% a" C+ e; ?4 t
  6. public class AggressiveState implements MonsterState {+ ?/ W0 E! m( R- `8 v
  7.     @Override
    0 o0 h8 @2 E# w
  8.     public void handleState(Monster monster) {; x1 Y* w9 ?3 J8 A8 W1 M2 O+ h8 ]
  9.         // Агрессивная фаза боя
    . q0 K; ]! P2 Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");0 [$ A3 G' r2 v  x/ T. l
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки4 m( U" y  f& G# i, ~2 I7 l( H
  12.     }
    $ F# k" S. r# @1 N0 I! o% @
  13. }# ^) x7 ]6 L7 `
Скопировать код
Класс для финального состояния монстра:* k4 _! J2 R: u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * i- _/ r& I0 C2 ~$ l. H  m  f* K
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) N# l6 R7 Q9 n, Z+ M
  3. / W3 E' }. P% O* }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * j5 ?2 O1 }% t& t
  5. 5 ^& _" v5 |& M- ^: {4 O0 q
  6. public class FinalState implements MonsterState {
    ) u8 T6 I) u8 U6 E# d+ M
  7.     @Override
    ! _8 r9 W3 U! f7 w; c$ y. U; Z, ^3 A; }9 X
  8.     public void handleState(Monster monster) {. o% g: P( y7 b  f  b7 l
  9.         // Финальная фаза боя4 `+ m' F) \. L$ H0 R) ^
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");0 A1 h& [0 f+ o4 e/ W5 E
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ! a# M' E4 S! z9 n; Z- U) u+ y
  12.     }
      o: H3 c. f2 w, G! f
  13. }7 V. ?; f( x, n5 T
Скопировать код

, l, h4 ~) v# s! tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: V1 x, t/ j6 o
  1. // Пакет org.l2jmobius.gameserver.model.actor* P1 [0 L" z/ F, N- R4 e
  2. package org.l2jmobius.gameserver.model.actor;
    5 k; n) T$ k6 d- E  ]+ ^( h8 V/ |. F
  3.   V0 c! O" ^9 c  w, W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; u0 ~% M" t5 v7 @1 [& F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;( o8 ^0 B' s  g' p

  6. ; x# z: ~; G6 S6 A6 y
  7. public class Monster extends Creature {5 n3 M1 C  c$ m8 u& Z. h  [
  8.     private String name;) f. e- q, J" w: {& E- }
  9.     private double attackPower;2 L; N& K3 S0 T. ]4 q
  10.     private MonsterState state; // Текущее состояние монстра  n9 R3 I1 L% T( m3 l. V

  11. + m& R$ B2 j0 \+ a4 O
  12.     // Конструктор монстра
    3 _2 f, A. K! j$ Z0 W- I0 U4 Y% W
  13.     public Monster(String name, double attackPower) {6 q% ]2 A, B  I6 Q; O" E" @" m
  14.         this.name = name;! ?5 |9 Y/ F2 j: K
  15.         this.attackPower = attackPower;
    8 F" i: `! p9 d7 Y5 R0 Y/ H
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    5 h. ]0 t4 C$ j  X( o; J& Y
  17.     }
      t' ^! n" N/ Y- O1 i4 A

  18. & Q& N" _; F6 b! O, D! ?1 L
  19.     // Метод для смены состояния
    * A. D9 b3 o! z
  20.     public void setState(MonsterState newState) {
    - A; A3 G  l2 i+ j
  21.         this.state = newState;7 L5 E# @  V9 J- a% U, Y1 B, u
  22.     }$ d8 r& `  y: D0 q, C7 k

  23. 5 g* D- i4 ~; B  b% p( V
  24.     // Выполнение действий на основе текущего состояния
    % C# D& ]( r' M
  25.     public void executeState() {
    5 V5 S6 E2 o7 z9 s( ]
  26.         state.handleState(this);
    $ V, Q3 r1 R! g5 N
  27.     }
    / ?& s) ?' j) R

  28. . _/ c+ B2 U, P; F! i8 m
  29.     // Геттеры и сеттеры
    0 n, p# C# }8 c. H$ p
  30.     public String getName() {
    " U, d6 o" m! n8 A. \, k, ~
  31.         return name;6 N) ^2 W: ]5 _  Z( F
  32.     }5 Y( ~: Z1 V. d# z6 y1 u

  33. 2 E; y. X6 i/ ?% z8 r
  34.     public double getAttackPower() {
    & _4 P( ~/ m$ B. `$ `7 j) M
  35.         return attackPower;
    $ b: ^, g1 e# X% A
  36.     }
    2 H$ @0 l* ~$ \' b" h8 B5 J7 g

  37. : A5 ~: w: p  ?6 G+ B
  38.     public void setAttackPower(double attackPower) {, c6 u0 i$ `7 p2 P" _$ [! {" L' [3 b
  39.         this.attackPower = attackPower;5 |$ G0 d1 |* p4 z7 j) Q& b
  40.     }# r3 Q$ Y( q4 B  V1 E  w6 _
  41. }
    $ B/ I0 q/ J- @- r# j" p( r
Скопировать код
  E; t" j, |+ ~* c9 x' L
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
; T0 L- v- p/ T1 o
8 G0 `$ x2 k0 ]+ {6 ~' L
  1. // Пакет org.l2jmobius.gameserver.model.battle. E  V: c, v7 b. Q7 D0 h6 W* U! m4 X
  2. package org.l2jmobius.gameserver.model.battle;# i/ \* g  n( N; f: b
  3. / \, \. J5 ]% c5 n- `: I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 [# I) N) F7 L; S4 M
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : ?  |: O+ a% Y# w5 L2 a" K( }
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    0 a8 t0 o- f. Q3 W) I/ q# }7 ~
  7. 7 z& R- f9 E" W8 I3 \* K# i
  8. public class BattleSimulation {5 ?4 ?" J! Z& C; u$ |
  9.     public static void main(String[] args) {2 M$ T! u0 }# @' o9 C( a, J8 Y
  10.         // Создаем монстра с начальной атакой
    ; E! R" B# L6 m' c7 J- n2 p
  11.         Monster monster = new Monster("Дракон", 100);
    . h3 I5 j; {9 D6 K8 Y) Y( v
  12.   h. z: S2 Q6 r# u" ?
  13.         // Начальная фаза
    + ^0 L6 s0 q$ \9 p4 n
  14.         monster.executeState();. S( q* B7 [# H

  15. 9 U$ O8 p9 j& U6 E" O
  16.         // Переход в агрессивную фазу
    " k' ]0 Z2 I9 ~/ C
  17.         monster.setState(new AggressiveState());
    2 [; b5 ?; l/ A7 Q" }. F  G
  18.         monster.executeState();+ g9 p; H3 m4 s3 z9 m
  19. ) w- o9 s1 e' h2 ?4 H" B
  20.         // Финальная фаза5 U! O- p7 _' j2 s
  21.         monster.setState(new FinalState());
    ( R7 [% {6 x6 J9 k) G: n9 E
  22.         monster.executeState();
    1 L% a0 s  w' |, M
  23.     }4 i0 G2 b2 e) I* v+ E0 f$ G
  24. }* ?7 r% b5 j( B# `- W1 b4 ?, o
Скопировать код
$ j6 n  g4 \6 h
Комментарии по структуре пакетов и классов:9 e( j! Q# S4 k  b; u1 U( a
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    $ ?& j/ `& O9 Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.' S& R5 e( M9 {1 s  ~9 A
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: E, {3 }4 ?: `) @' T( H

# s" @* c* }3 Q8 B3 \2 c8 y7 {5 R/ B6 r
% F: N8 Y( l1 {! |1 ?# U1 c8 ^

2 m5 V- i4 s' R5 C3 G* H: W  q9 }
2 D- s/ d) s) A9 O+ X0 Y9 c& t, m$ W% ~. ]6 {* A
) \( z* k5 J  [7 j* J
( g! s! b- E  B* d9 z# Q0 c

) W0 K8 N; J0 g6 I- ?
! M( d( O  N2 A, B8 e+ G8 B- }: O+ p2 J
# M7 g8 R4 p* a. U5 j3 Z$ s4 M" |

& D3 H/ f2 f1 ~7 g
$ }4 y; q  n- I& ?( A
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04. _3 U) o# f4 a
Для управления сложными взаимодействиями, такими как  ...
" z$ y% i, n  c+ i1 s9 s; @
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
1 _- N0 l9 s$ I; U3 n( SОтличный подход! Использование шаблона "Состояние" де ...
. X6 m3 S6 I- k, \  ]& o. b
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.! G( _8 i4 p2 k1 W0 v2 ]
$ f  ^0 Y: N1 C( h) ^
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
% e% b# n0 c* j; m( `; J( R1 \: G# c$ |9 O8 y0 F% l" Q' T. T* ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    2 m9 @: z" m& ]7 y/ n3 ]# }8 }
  2. package org.l2jmobius.gameserver.model.actor;& m: m9 F* ^/ g. U& V4 h0 Q
  3. 9 W! ^: }! a5 a" ^
  4. // Перечисление для типов атак
    + r- W: I  g( G2 T# r+ z6 B
  5. public enum AttackType {
    4 r7 S3 a/ x4 F
  6.     PHYSICAL, MAGICAL;9 j  L, [/ E$ G8 p$ n) g8 m. d
  7. }
    0 h3 D; z! Y) ^  i
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.# o# f+ c5 ]- m, T, L# z
Обновленный класс для агрессивного состояния монстра:) _3 p9 s* E+ c" z1 X8 O6 Y

% a9 E  y3 X1 D" g& M# n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ K! E4 l; |8 t$ }
  2. package org.l2jmobius.gameserver.model.actor.state;* p" s9 N  n8 Q5 L% @5 s

  3. % v" V( y8 |2 R. C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / {6 V  P: P! {  J; _
  5. import org.l2jmobius.gameserver.model.actor.AttackType;/ n" \5 X. q0 h* a

  6. 3 z5 u  ]$ Z) ~
  7. import java.util.Random;5 R0 |$ g" _5 U9 q, L  ~8 u
  8. 9 ^% W; ~' J" n' B% N3 c! n
  9. public class AggressiveState implements MonsterState {
    4 h! m$ R* F$ G; [) r5 ^4 F
  10.     private Random random = new Random();
    . Y8 A- W0 E) P1 ~

  11. 3 F0 X% _, A) l9 R! F: f
  12.     @Override
    ; x- W" B  Y6 P- Q
  13.     public void handleState(Monster monster) {
    $ B8 w- ?* Y5 ?. s- t& \
  14.         // Выбираем случайный тип атаки: физическая или магическая
    , ^; u6 b6 J1 ^
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- J& @" V  T/ A( o( C

  16. 9 S$ |+ L' P1 ]! r% l3 M& L& @5 S
  17.         // Логика для агрессивной фазы боя5 V( r; C: u  A6 t
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ; f' k$ m; I  `0 c. ^8 f6 o/ Q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");* Q: M  y0 U- T7 S/ X  `, I
  20.         2 \2 |1 D% l3 `$ f+ Q
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , u6 a0 N/ _0 H; q. F
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    5 T5 p1 ?2 {* O7 T
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    % n  |1 C( Z  `$ ~  H
  24.     }
    ( r2 J8 f9 Y4 f4 y
  25. }
    0 t5 A* `  M- L
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
; n2 t, a' {+ n5 z/ y3 v; K9 ]! t" J' \6 O' o, S
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * P8 H$ y, c! Y" ~3 J
  2. package org.l2jmobius.gameserver.model.actor;  _4 d/ S+ n# m  o8 w

  3. ; l: B& u' T) c. x+ p; a: _/ R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ( d" _% s# N) _' b$ s5 W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    - Q- S: s1 m, p* I
  6. 5 ^. S( z1 p' ~. @* `/ X) C& O0 a$ R
  7. public class Monster extends Creature {, b; v4 f: u7 [5 i8 g
  8.     private String name;
    9 s; ?' I% g4 Z$ V7 ~: K! S& b
  9.     private double attackPower;* e+ T% D" t- f% D7 d0 x
  10.     private MonsterState state; // Текущее состояние монстра
    $ O' U4 G+ S5 {# i" @8 S
  11. - u. _$ H: c9 C$ D: G
  12.     // Конструктор монстра& |8 `& @9 R8 Q7 _  D
  13.     public Monster(String name, double attackPower) {' u% e$ Q7 N0 f3 F' X
  14.         this.name = name;
    % Q/ Q" J7 f; ^! |  |
  15.         this.attackPower = attackPower;0 @9 J5 t6 c: a- f
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ! w! o, d2 @- M/ s: P9 r# s
  17.     }
    8 ?6 I# @3 C5 h" U: R5 a
  18.   R% s- @* T& ~: @# \* \
  19.     // Метод для смены состояния
    3 b: i1 O# u3 [+ a2 a
  20.     public void setState(MonsterState newState) {; \7 o& A7 t. y) b. G
  21.         this.state = newState;
    . e+ T9 R" B3 Y0 @) {5 c
  22.     }" g* ~5 W& }) W9 G; a5 Q3 G7 V

  23. $ M! K2 ~5 c) y3 _/ [
  24.     // Выполнение действий на основе текущего состояния
    6 y- j* c* A( U7 o% }
  25.     public void executeState() {
    ; {7 Z  V& b7 P8 Q" X2 }
  26.         state.handleState(this);: F  u' a" ~  G& c
  27.     }# [: H; p/ i0 G8 z

  28. 4 H1 O# M, h  W8 |( t  e/ ^7 N
  29.     // Геттеры и сеттеры
    . Q$ I7 r) X1 M. T$ a- W
  30.     public String getName() {
    3 x- [, V( c) H2 s0 ^
  31.         return name;+ J: V, p5 g1 o' X/ X4 ^6 `! a
  32.     }
    2 {, Q# M' T  @6 r7 @7 Y8 J

  33. ( U. {: m6 a2 [$ I
  34.     public double getAttackPower() {/ G0 n% J4 @! q' D* P! D
  35.         return attackPower;
    4 r" N" I4 N) Q/ m- @
  36.     }
    " G. e6 p$ W. J& c
  37. 2 w- S& m3 B4 b# J9 k4 W$ N
  38.     public void setAttackPower(double attackPower) {
    * Q4 d  ~: ^% ~: {# H
  39.         this.attackPower = attackPower;
    5 Q' p/ E  @" H1 h; o
  40.     }' d" g* P9 X! C9 s% h& U% E) b6 `
  41. }5 ?( L* T  c& y" u" E8 H4 `
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
) _( k1 G- ]- G9 }9 T, a9 z
1 l3 N: H5 ]( M( U" Z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; }  z9 y% e& }* V  p, z7 V
  2. package org.l2jmobius.gameserver.model.battle;$ e6 |  ?% I5 P3 L6 `& y, w
  3. . W3 G1 ?6 I+ \5 y, m6 x6 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " Y, ]' c# M$ P1 h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    & j0 E8 I4 g% {+ F0 p; |9 ^6 t' @; p

  6. 7 E6 t2 i; I! I1 _, Z' j
  7. public class BattleSimulation {1 d  r9 J+ N6 z& g
  8.     public static void main(String[] args) {
    " C# y8 u/ }' N6 B% [  c$ P+ ?
  9.         // Создаем монстра
    ( O" c. J5 L, g0 u% f
  10.         Monster monster = new Monster("Дракон", 100);
    $ I9 B' f1 u; ~2 A. n
  11. 1 P, ^# V: ^4 k; U2 G* M2 ?* {
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    - s+ u; `9 @1 C5 J+ ]
  13.         monster.setState(new AggressiveState());% Z, \. H# v: {; U$ d5 ]1 \
  14.         monster.executeState();" u( n! G, h7 o/ W4 l
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак' y$ J$ q5 |- X: [. n
  16.     }# N" b3 |5 O4 [4 q7 ?# D
  17. }4 I7 D8 K1 q2 s. {# {9 D7 c9 b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 O* z+ n; |  m7 v+ kЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
) K, ?3 j6 Z. |% O; Y4 n& e+ s4 _* y& G  ?% g$ K2 T, a0 D
- A: d! O* ]6 ^3 g# F
+ q; {6 g/ ~/ v3 q9 m
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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