Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!. x% C) p" G- x5 m1 j
  p& b2 z5 D8 K- i* p2 K2 ?+ L
. p5 u% s/ K- D" d( ~5 f& V6 R9 D
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
. _  u/ K6 L2 ~1 U9 tЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
! A" i, l. k- jАстралия ?
; e4 \+ J, r# i
( c3 p  B1 X" F, d$ W

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
: L1 U9 g/ o8 A, ]В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
1 m! x* `' K  H* }. b1 q9 B1 e+ _1 \. c
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 0 `% X* I+ r  `1 m) a$ ^2 x( K& w
AlexCoder опубликовал в 2024-10-16 18:31; h- Q) K1 r" x( y
День добрый!* _) o! A0 V/ }, k7 z. i/ m) P
В статье описано взаимодействие игрока с N ...
& Q3 I( Q- r$ O8 U8 f6 E
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). , C: l& k9 Q  J( a6 m" U3 G  M

" H3 V5 q/ k2 h8 F" zЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
3 P: {: A2 x: v: |& U& C
! W: s- M  Y- i2 bШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 G  A' a( c3 X) F/ Q* B+ w" U  U/ ~
  1. <font color="Green">// Пакет для состояний монстра</font>2 Y+ D7 H1 o# o9 J: n" P
  2. package org.l2jmobius.gameserver.model.actor.state;/ X4 l0 L  v# U' M
  3. <font color="Green">, p1 C4 f% y+ J% u9 y! \
  4. // Интерфейс, представляющий состояния монстра</font>
    : U0 L- `$ G7 r
  5. public interface MonsterState {& E; {- G2 \4 J  U" v6 p3 L
  6.     void handleState(Monster monster);
      Z7 m$ `4 \# }: S: ]; P8 B
  7. }
    ; ~0 @: O% {% T7 `, L" A
Скопировать код

% h/ g1 e( \! C9 k+ [. ~/ JШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.2 r# S% @( m; ~2 Y5 h6 M
8 C( c: O. K, j. t- o# W
Класс для начального состояния монстра:
4 r0 Z7 p6 C1 [( B3 N" ]
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
      J0 ~$ u3 _$ U4 t% G
  2. package org.l2jmobius.gameserver.model.actor.state;
    : Q3 E  t. q7 @& |/ n3 p

  3. ! I. ^# c: t  v% F* y; }7 q. a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      Z. H# X# v- y  _) f+ p

  5. : k$ H: O4 w" d: l, i$ X* E, m
  6. public class InitialState implements MonsterState {6 T: [1 ?# G: J$ z
  7.     @Override0 J  N! t7 Z6 g; _) K3 `
  8.     public void handleState(Monster monster) {
    & s: y, ~; @( e1 L, ~+ P# o
  9.         // Начальная фаза боя
    " K/ m6 R' J6 ]) W+ u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 M3 O" Z$ h3 B
  11.     }5 S$ x- r& I7 L
  12. }
    5 V  k) T" k0 R
Скопировать код
7 x! D3 N; S/ g
4 e* h6 u' e: R* k: z" A) f
1 q' Q$ O7 I% ?" \. @
7 D; |8 Q; y+ i4 T) g
  \* B8 @  k5 ^' r6 k9 ]

4 l6 q7 _3 y7 I+ W4 r( y; W& h3 {+ l6 t' S5 K9 g4 r
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 ]+ z: ]# P) Q$ `* y: v3 ^- k  r5 E
" T* T# x; Z/ i7 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. u: C, f) w8 p1 ~0 l& x. w: \( h. K- Z4 \3 t6 Q& Q6 t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 F! [4 h2 A: G0 ]& V. H( u

& J; u# ]3 p4 }: G$ h; U* P8 D
  1. // Пакет для состояний монстра
    ! Q/ k) O" h0 z3 Q$ ]0 @6 T
  2. package org.l2jmobius.gameserver.model.actor.state;0 r- u1 t& l7 ^2 D, E7 V' `
  3. " V' \8 J" h5 w$ q3 I+ h' J# I% L
  4. // Интерфейс, представляющий состояния монстра
    % {  K4 _, C* ]2 U* w
  5. public interface MonsterState {
    ( D/ V: V) p  o- V
  6.     void handleState(Monster monster);
    ; ~* P  H% T9 [" D# n+ f5 c
  7. }
    : V, o5 {" ?) V0 O: M$ D
Скопировать код
: p2 P8 X5 n6 j2 Y
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% b, ]4 V0 V, B8 d7 Y7 V9 e
5 v3 ?+ K. N. l) Z1 pЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( |8 G7 t6 \+ a6 ?- {, b' j
5 b: Y7 O1 }3 X$ s+ o
Класс для начального состояния монстра:
& O9 o! p7 }) A4 E) W8 A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 k3 H) u7 ]* r  n) t
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( m4 }- F1 L3 g! B3 m& J) A

  3. 7 `4 G+ y$ b+ P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * U0 T/ V  c, h" |6 Z) c
  5. , I9 |9 k. K: N% `# F; M) q
  6. public class InitialState implements MonsterState {: D  _5 R# V$ U0 r4 u: H" J; M
  7.     @Override9 P" e+ g' g& X3 J7 V3 W2 i2 R# M
  8.     public void handleState(Monster monster) {# o5 M( M% `3 e" d
  9.         // Начальная фаза боя
    - E  i, |$ R5 @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ' q, y. o/ P; k0 X3 f. G
  11.     }" k8 U9 L( r) w: U$ i1 C. V
  12. }
    / E& b+ E+ K: X0 X% h
Скопировать код
Класс для агрессивного состояния монстра:- E( `$ P' w+ S# b+ s* i/ F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - `9 N+ e9 q/ \- u8 _! b' X1 S
  2. package org.l2jmobius.gameserver.model.actor.state;  s$ T2 v& N/ m
  3. 3 k. T) y) A6 U% S, O8 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;; C# t7 R7 [5 t
  5. / e2 F" M8 v- X; i
  6. public class AggressiveState implements MonsterState {8 M$ C& @9 @6 [" G+ ^
  7.     @Override
    + b' O, l" e0 n  l. z6 a+ g
  8.     public void handleState(Monster monster) {
    % e, E" s3 k$ `) S, n6 B
  9.         // Агрессивная фаза боя$ K- |: y- z: c& h$ M6 C& n
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    7 v( C. w) z( z1 ~# D
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * |+ J- I7 |& J& d1 ~. E
  12.     }
    ! G+ p& n% k) F# n# o
  13. }7 B( B9 e7 T$ q" Q, d) a
Скопировать код
Класс для финального состояния монстра:; |8 _  c2 {. D2 [) B5 T) k2 e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; Y+ t( S* {# g& v) w! z
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! C' T# m9 W. F+ V5 q4 i# x* q
  3. # l' k; l0 c" q; F5 L; R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 {9 P  s7 Y! Q7 ?0 {8 u) |+ c* }' Q

  5. & T! c2 s9 H; T  i( l1 u
  6. public class FinalState implements MonsterState {2 `; b* ?  K0 Y; R- _
  7.     @Override6 {* V8 F% |4 ~5 ~  X' _
  8.     public void handleState(Monster monster) {
    % P* R( Y7 o, M( C4 Q' x9 o- C4 e
  9.         // Финальная фаза боя0 b, @2 m: |- v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; u& p6 s* O9 X2 E! O
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( n4 J+ R! t1 ^
  12.     }+ Z* p% j& C- J) V
  13. }; @4 |' u/ Q8 M& |) p0 Y
Скопировать код

- y+ t) Z" O  q" D% ZШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 D: M# y+ e0 K3 H0 c# b! i* C# k
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( g& F, `% G4 U. D& V
  2. package org.l2jmobius.gameserver.model.actor;( D. i/ j/ O& O) N% a
  3. 7 v! x% k8 @* L4 D( k- z# ?0 V
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    7 h' ~2 ^* z4 g- m
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . {1 T. v* @8 ]

  6. * k: O# \! v% Q/ [: f
  7. public class Monster extends Creature {
    $ y1 C& C3 c8 l7 I& G
  8.     private String name;$ s/ t* J& Q  u6 S" `! D
  9.     private double attackPower;
    ) W) r2 Q$ D+ m1 Y5 L
  10.     private MonsterState state; // Текущее состояние монстра5 G/ J: _2 t  L2 W, C

  11. % D! A( C0 m' }6 H% F/ K% K4 x
  12.     // Конструктор монстра
    ( t5 q% ?6 ^5 T
  13.     public Monster(String name, double attackPower) {
    * V& M$ z( e. ^. n# l' g
  14.         this.name = name;
    & [1 H, y: }, V+ M0 T5 }8 c
  15.         this.attackPower = attackPower;5 F+ W& U4 z4 g
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ( ^2 S: G2 K% d
  17.     }5 T  n! R& b* B% }  R" D

  18. + H$ w' R5 k; n3 R& l9 ^' K
  19.     // Метод для смены состояния
    3 C- a6 y- ]! t  `3 ~9 T
  20.     public void setState(MonsterState newState) {5 z/ f( B# }& d; J* a% q& {
  21.         this.state = newState;) a2 f+ \: _5 k, W
  22.     }) ~7 q; {& i/ n7 c1 |
  23. . \+ f% U5 l+ C# e
  24.     // Выполнение действий на основе текущего состояния
    4 V" ?2 Y/ N9 T) O; t+ F& U. P
  25.     public void executeState() {
    4 c+ [7 E7 J% V8 Q" s" t/ L
  26.         state.handleState(this);
    ; R, a: L7 @. N( |) ]5 i
  27.     }$ R: q2 R) `: q# C6 C1 a
  28. 4 j3 s( _2 n0 Z1 Z9 P6 c
  29.     // Геттеры и сеттеры
    2 q+ K. v# d' \
  30.     public String getName() {+ Q5 i6 y, Y6 {" G% h! r
  31.         return name;
    . R3 O& V& R/ }' Y% [
  32.     }
    7 X7 h; w$ y" N. \( P) E. Q

  33.   c. ?. j) I5 o6 V; \8 k  t
  34.     public double getAttackPower() {5 G9 {  ]/ o' D
  35.         return attackPower;
    " g* B7 D1 Q# a6 h3 e' A- I- X
  36.     }
    : ]! }7 f8 b# A8 q& j

  37. . E9 A; @0 U5 Y' f; {- p' @- ^( q) a
  38.     public void setAttackPower(double attackPower) {2 N8 f& o3 G& l% e' ]- E  Q
  39.         this.attackPower = attackPower;
    $ C3 ^/ _' \) p. F3 F$ w8 Q2 `  P0 A
  40.     }; p& _7 O2 [# L: x  F3 `2 `
  41. }
    2 s3 I, M% L4 _  Y+ l
Скопировать код

% ^5 ?3 D- U2 M" q* v2 ?; Z0 fШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
$ L) G: S/ K6 F+ A" x$ B0 ]- @1 k. b
  1. // Пакет org.l2jmobius.gameserver.model.battle
    / ^7 ^" H5 w' i. L& \5 O# a0 P
  2. package org.l2jmobius.gameserver.model.battle;
    ; O$ Q0 _/ m! ^$ n' j% \
  3. + S# Z- U0 |( ?' {
  4. import org.l2jmobius.gameserver.model.actor.Monster;. Z- T4 ~' K$ m- @$ V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , J8 b& `2 w+ z) \. ]# ~6 B
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;5 B: U7 f: M) k+ \4 u7 H+ O" J' A
  7. ; }' A* A2 C$ z2 C6 y8 ^% C9 [
  8. public class BattleSimulation {
    $ a( o% ~, n" G. V8 I) }
  9.     public static void main(String[] args) {: c# ~- [/ m- y' A% n# o
  10.         // Создаем монстра с начальной атакой% H( ]9 l/ X* |7 V- ~
  11.         Monster monster = new Monster("Дракон", 100);
    3 _  d5 x  L: f2 e5 @5 A) C6 n# H

  12. ( N- P! t& h& ^( X. ~1 m" G
  13.         // Начальная фаза
    ) l5 p9 |# {7 C6 A
  14.         monster.executeState();
    / k+ d9 f8 x% ^7 {+ {" O: d5 P) _9 W

  15. / q4 G: S+ Q9 O9 i
  16.         // Переход в агрессивную фазу1 o& i+ I% u) I" W$ Q- N5 I1 T
  17.         monster.setState(new AggressiveState());) o6 \! W  F1 f7 z7 R8 v9 }9 @
  18.         monster.executeState();
    $ r- H& R! p* c$ v. G" N1 P6 \% s
  19. % {" O; D/ e, M9 t' \
  20.         // Финальная фаза
    9 E- h* b' V& {; l2 w
  21.         monster.setState(new FinalState());; k: K: F) u- p
  22.         monster.executeState();- f: |7 l: C; n. Y0 ~! t- U
  23.     }
    " {: }# ?) L4 Q# R/ X, J
  24. }: X( \- S1 k6 |6 f, v, }
Скопировать код
* M5 Y5 p5 a3 b! `( w
Комментарии по структуре пакетов и классов:" Q6 ?+ d: ^9 |8 b
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    6 I, k$ ?& B" H+ l0 W2 f) F2 ?
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 j0 W+ R3 p7 n4 b
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
6 h" y2 i* F' Q" X, R5 l8 f) l( s

( a; L  f8 S. [% v5 J9 C4 [
1 O. f6 I% n: b) R0 r& }6 ]) m5 z
: r/ s  _8 Y& Q0 F- d% S( _( r  D5 \: C# t' h' K

' w2 p4 l4 `7 @/ S  g
3 r* D+ W# x/ \7 K) o1 r* H+ k6 X# _" m

: W( ]7 g3 ], ^- L
- ?) ?. v' ~/ O) u$ _
, m0 P6 b& [4 B$ `" K: A$ ]2 L9 a' q$ R: r& M) W9 h! l0 t

# p5 F1 Z# q$ Q0 j3 n9 u
4 D( X# ?' U' U5 J% Z. U, ~* F
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
5 n0 i$ v3 h  t9 G0 K8 ]Для управления сложными взаимодействиями, такими как  ...
' Y. |' T" B% a: H* N0 e) T
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21* L% D9 ~: C7 m9 N/ R# X
Отличный подход! Использование шаблона "Состояние" де ...

, g$ X. I/ e) K  N- TХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.2 ]7 r' l* N$ K- @( {

9 n, k5 j0 [0 t7 M6 \( p/ KШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: ^8 `- w; @- w- n9 ?4 Z  j
7 ], y3 q0 R( x( s7 R6 o3 u5 |
  1. // Пакет org.l2jmobius.gameserver.model.actor. P& u: j1 K1 X- R5 v; l/ w
  2. package org.l2jmobius.gameserver.model.actor;4 g  X- h. v' n2 x& E& w
  3. 3 G* S4 d% S2 z! z: F# T0 ]
  4. // Перечисление для типов атак
    & `, i5 P. ]' _: j  D8 w: ^
  5. public enum AttackType {+ f" V: u& |( u  \7 S
  6.     PHYSICAL, MAGICAL;
    4 J3 H6 o! C+ B6 _3 H; ^6 L
  7. }
    4 f, r2 i6 M4 b% X. z
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак." b' C/ M& Q  z* \& d
Обновленный класс для агрессивного состояния монстра:* j) g* u; g7 i" s0 q

, `4 J6 K: a1 w/ n" I, E* ^! u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, F! f5 t6 o5 y4 G: e8 W
  2. package org.l2jmobius.gameserver.model.actor.state;
    . E4 H# h! ?4 I: D$ g/ H
  3. - o# U4 W6 g$ [# w- b6 v" H% E. h
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 `7 `$ f; x: l6 _* l0 P
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    % u; Z7 f2 M1 S- L$ ]% |

  6. ; c9 E, y( e* O/ f, C! `  N' X6 x
  7. import java.util.Random;
    # d; u1 ^$ p. H. j

  8. 5 |7 D( |7 |" j" s" I" X
  9. public class AggressiveState implements MonsterState {3 ^' `, o( ?% }" @2 W- G  K
  10.     private Random random = new Random();
    7 D6 _! @8 }: u1 N& N

  11. ) X) }5 a- d( m$ [
  12.     @Override
    - r7 A. W0 O  y& |( ]
  13.     public void handleState(Monster monster) {7 q* L7 E! Y) E6 i, M3 g, E8 V
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; {. d# t/ G- R8 |* Q6 q
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    3 @0 ~' c  h2 y! R* y% o

  16. 3 m; v! N8 [5 ^$ }; U
  17.         // Логика для агрессивной фазы боя5 _8 G# K" d; h6 M* S
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " % p# Q( ]& ^/ b# @9 c# d0 ?
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");0 m$ B: b; I' ~/ h
  20.         
    , w' N" S9 ]& Y4 K0 H" Z
  21.         // Увеличиваем силу атаки в зависимости от типа атаки' h0 h( I! W+ ^3 R, N* U) z$ c
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, x, h9 g2 U0 l2 f' ~; z! i5 f
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ( ~  i( _* L& e
  24.     }, g, H& I: w$ j2 G9 @+ |/ \! d3 j
  25. }
    # f, S/ b3 _: t9 B: A8 Z7 D
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
8 a8 Y. r$ J. B8 |% ?2 B
# h, `5 C, z- s9 K% t
  1. // Пакет org.l2jmobius.gameserver.model.actor* I+ }& z3 o" |( o
  2. package org.l2jmobius.gameserver.model.actor;4 Z& R6 A  @$ g# T

  3. % h- F) v2 \, J1 H, _9 X. R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 m/ q0 B, Z  t& d8 f7 W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 [  G2 p* C+ V) M* w) c

  6. - b8 s) H0 n% \' s& |  e+ B- I1 f) u
  7. public class Monster extends Creature {
    # ~3 m+ r' L; n/ I5 U/ @( S" F$ G9 J
  8.     private String name;  x$ X( `% ~* @7 S% a. t. }
  9.     private double attackPower;
    ) I' S" ^8 z% ?! w
  10.     private MonsterState state; // Текущее состояние монстра
    2 @* r$ q( G( q6 ]; M# d& q

  11. 8 ?6 L' e9 d/ j7 X
  12.     // Конструктор монстра
    . G7 s8 _" M* b8 T: @) d& Z
  13.     public Monster(String name, double attackPower) {
    ( A$ m9 q9 p  t) Z9 }% v6 e
  14.         this.name = name;3 a* y+ w" N  x/ n# l! |
  15.         this.attackPower = attackPower;
    . p" W* Y3 e! X3 E
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию+ V% X0 p1 f- H
  17.     }' n5 P0 g# }" }2 h7 }* a* M
  18. 5 J. S# `: G9 M+ b, p. \5 @1 f
  19.     // Метод для смены состояния
    0 H+ k: [0 {  L' u
  20.     public void setState(MonsterState newState) {% n0 P5 [2 Y8 e7 T9 c
  21.         this.state = newState;7 i( }& b+ R5 U2 m. Q* g6 E: b
  22.     }
    % M7 l; m0 K' @- {
  23. " E' y$ T  p  J9 d/ N
  24.     // Выполнение действий на основе текущего состояния
    9 V7 s5 X4 o+ X4 y% E) B
  25.     public void executeState() {
    1 A$ Y3 [6 Q* }6 ^
  26.         state.handleState(this);
    / ~/ S8 v4 w3 X" j; A( i
  27.     }0 p; k, {5 k+ \7 Q# F

  28. ( u6 A$ X7 R" w$ z8 N
  29.     // Геттеры и сеттеры& Z8 H) [( b2 @  e( D$ W
  30.     public String getName() {) D: ~: h- L6 V9 k8 d5 s
  31.         return name;
    8 d! i( \' ^3 I0 S/ j" `9 X
  32.     }
    4 w6 [. m+ T/ v5 O) k/ j

  33. & \5 g9 `4 r0 }$ s' w* @
  34.     public double getAttackPower() {8 Y4 t- V$ i  I- x- M
  35.         return attackPower;5 q; d4 s: k# T0 P- e9 a
  36.     }( {$ r& B) ]* X. G$ Q' M% B
  37. - P+ V) X. p& f) m2 q4 b3 }
  38.     public void setAttackPower(double attackPower) {
    . e2 k. n  t8 D7 M  F# {
  39.         this.attackPower = attackPower;! v" F; N: i& z$ L: o
  40.     }# ^1 P* R/ d& T+ `: c- B! ^" h9 s
  41. }
    6 p/ s& u2 y5 w* r. O8 z/ p
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
# t2 \& F; K' V2 [9 l* t% U# d2 n2 Q4 r5 C5 b
  1. // Пакет org.l2jmobius.gameserver.model.battle/ C2 {! ?- M( z) `& o5 t
  2. package org.l2jmobius.gameserver.model.battle;
    0 Q5 Z1 S( w5 [$ ]! j( |& M  y# M

  3. / X5 Y8 H6 z3 s6 C! Q, I$ _
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ r1 k( P" f  D+ B/ L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 g  T8 _& B$ W( V. c+ Z, `

  6. + ]8 `1 q- ?; m4 z
  7. public class BattleSimulation {
    9 R. ?# n' @' D3 p8 _3 o
  8.     public static void main(String[] args) {! C! N% m* P$ c! M8 H; P$ i# Z3 q
  9.         // Создаем монстра
      p  P  f8 O6 _' ?
  10.         Monster monster = new Monster("Дракон", 100);, q4 _3 F0 w; W
  11. 7 v) p$ `2 s9 S+ a
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ ^/ l" q. y' H4 ^  X8 c3 _
  13.         monster.setState(new AggressiveState());: e$ Y+ S) w& z% w7 u$ ~
  14.         monster.executeState();
    ' ~! q5 A$ O! E/ }+ s/ ?/ v" P" |
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    4 v# z% q8 ?' P2 x) \
  16.     }, L2 N) u! z; ~1 O1 M7 J
  17. }8 F1 I( v' c3 e/ U$ P& X* B
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.6 Y/ x5 o; z  }( L4 P0 N3 a, G% U
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!% i2 B1 F! B9 J

) {, c0 k/ |  r) G. s
- Z' ^3 e) f! W0 Q- n0 c- N! J) o# U0 [9 V# m- g8 T& G0 c) U
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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