Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!8 Z: S; n4 k# ^

9 C/ X& O4 |1 U2 O6 k: ]

% l' q/ t5 d# nЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.& ]" f3 W) G9 u6 G
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!7 V  C# Y5 h( ^6 n% f8 P
Астралия ?  L; p+ d/ u: u, w. h, p# \& e
# y# v$ I7 a, j0 H

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
) H$ C! q4 v& _# U; A( tВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
" O8 W( F7 ]5 D+ @. D
; c3 g5 P8 A4 I9 R! x( Q( R" B
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
5 T+ }3 C. ~3 ?( t" Q8 Y( n- ?9 v
AlexCoder опубликовал в 2024-10-16 18:31
  w' o$ @: K- [! `% I$ G% m2 N# XДень добрый!, C! K, Q2 Q- k* }, s( R2 f, O# Q
В статье описано взаимодействие игрока с N ...

. \6 g4 @; W2 K+ P' }# }* oДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 M' C# t$ F9 O" _3 \9 Z

9 {9 y# L/ C0 Y/ x$ N6 aЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( M4 T4 d2 b3 ^$ N- T/ u
3 t! I: c$ d8 \Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 ?- M# M; K7 w7 M! P$ {

/ f  [" X. r1 z7 b9 J) w5 T
  1. <font color="Green">// Пакет для состояний монстра</font>
    6 ^$ }1 r$ R) a4 ^& p5 H
  2. package org.l2jmobius.gameserver.model.actor.state;; @" L4 V! m9 u" i9 [: r2 s2 v
  3. <font color="Green">
    % V9 W- B3 q& C3 g# @8 P6 h
  4. // Интерфейс, представляющий состояния монстра</font>: ?& Q2 \3 M: ~/ Z: D
  5. public interface MonsterState {/ [3 g( {9 ^2 j. q; _" f* L
  6.     void handleState(Monster monster);3 c+ Q6 Q5 R" ?, X7 j
  7. }! e. Y. t6 H0 ~/ |9 |( ~) p
Скопировать код
  A0 f1 ?3 U. m4 A: ]0 ^7 b7 y3 z  @
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; ^' X6 `% L5 P" S1 F' ^- ]

; u; O: ^7 I( P7 i0 g2 [Класс для начального состояния монстра:8 ?1 Z3 R9 l' N* E; B
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    7 s! \+ e/ ~! E5 k/ b% b; O
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 A" V1 N$ {, p0 c9 G7 ^

  3. & d. O8 O* M! ]& z% d
  4. import org.l2jmobius.gameserver.model.actor.Monster;& ]2 Q8 B) q1 I8 X

  5. 2 |# U; g0 ?- o+ S7 o4 {5 O3 u
  6. public class InitialState implements MonsterState {2 K, h1 K% W& O4 b  K/ K0 I
  7.     @Override
    4 k1 f, Y0 u" P6 U3 }- z
  8.     public void handleState(Monster monster) {2 P! P  ]" }4 k8 q5 _
  9.         // Начальная фаза боя
    ' U' `7 Y: H& c, M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* E! ?, A# K" z) _5 F- j
  11.     }
    . g# N# ]8 ]5 l7 b( @; \0 H
  12. }7 @" A9 [8 L; q" o' V9 O
Скопировать код
* ?( B  F3 l: {# f9 [/ A
& T! b8 B! E6 A9 A4 [
5 V  s& z! }( b3 ^2 D% ?- x6 w

) o4 w, I+ e3 N) F8 t. O- J  O  F* n6 M2 [3 c  d9 _

5 h8 @+ W7 f) _- B; ^1 ~: T9 N: h% y+ e' n- E" w; T
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). " N4 ~% n5 o1 |- ~; ?7 W$ |

/ a' B! W9 T. K6 GЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% X! |. z% q; P* C# b6 O" D

. P; d# L5 W: o  j5 \+ z$ YШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 y0 g. s4 T! `

/ U4 Y6 D: S9 [+ R
  1. // Пакет для состояний монстра
    ) q$ C5 }4 m( V9 _" j' _
  2. package org.l2jmobius.gameserver.model.actor.state;3 E, q) X2 A- R* v  O& R1 w! L

  3. $ y0 e4 S0 p& n: F8 ~
  4. // Интерфейс, представляющий состояния монстра# T5 C. {7 H. \$ d6 ^) z7 v& S+ D
  5. public interface MonsterState {# G1 w) X( ~) a# S$ K1 B8 j) E4 j
  6.     void handleState(Monster monster);
    + i/ \' s# _. |* W$ Q) ?9 _
  7. }4 |* i- N; R  u
Скопировать код

1 t4 r, N& C% R! b  K& ]% WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. / a  J1 m9 f6 w( `$ O

4 Y% Q/ t) Q$ v% ^; Z7 QЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 ?& U; a9 ^' u+ P* W5 x0 i4 y+ n6 v& I! J5 @
Класс для начального состояния монстра:) \7 Q) }+ t1 }4 R) Z; L% ^  t) B3 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 Q% F: }% `7 c
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 F) z$ V" r1 W) r2 B1 q
  3. 3 I( j6 O; V- w1 e) y) A% S  W0 @/ J
  4. import org.l2jmobius.gameserver.model.actor.Monster;' m! S! G( Y+ D; g$ j+ H: k4 D& l
  5. 4 q+ H! `; Z5 g% R. j
  6. public class InitialState implements MonsterState {7 _# e; c' K) L3 T5 B% A0 H
  7.     @Override1 z: K4 F; O7 B1 r
  8.     public void handleState(Monster monster) {# Y2 G0 R9 a0 j8 P2 i' f9 N* c# \
  9.         // Начальная фаза боя( p/ a: t0 B/ y. J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 i! p9 ]3 v& t2 @. d" y
  11.     }, @: W2 U6 x- e) t: k8 G" p8 x
  12. }
    7 M2 r# b% d% Z; M- @: }( x
Скопировать код
Класс для агрессивного состояния монстра:
" ^8 J  K( F6 `" f  L! O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + W0 {! q( Q7 n* S3 c! L
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; h1 L* x/ S# j; p  U

  3. . y3 x/ Q% M: O+ k' c' m
  4. import org.l2jmobius.gameserver.model.actor.Monster;# e% `! F/ G7 J( B$ z6 f

  5. - H. }4 Q  ~# B, R- L- J; F
  6. public class AggressiveState implements MonsterState {
    7 O7 w) F" H3 E- T# y0 ~: J2 [8 m( P
  7.     @Override
    0 C# i4 ?+ n- N" ]+ n
  8.     public void handleState(Monster monster) {
    8 k4 T, L- _0 C, e
  9.         // Агрессивная фаза боя8 n) [" O/ _+ T7 n4 c3 ~8 \
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");" p* B6 k6 G! r
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ! w7 w/ ~# n) b* H
  12.     }2 s) _( L. @  o, e$ ]3 O
  13. }- M( V" P9 R3 p# c' d
Скопировать код
Класс для финального состояния монстра:% t/ N1 \" G4 V: f" p! |3 g" t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! x, P. D/ s- C3 d
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 c% _9 x6 T" P% `

  3. 0 M1 d  Y9 h" K3 a; X9 W: Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 `  t3 W# `) E5 d5 ~

  5. - m' O( X7 `5 q3 `+ W5 C  l# m
  6. public class FinalState implements MonsterState {
    9 @9 a9 A3 @" a+ \! e. u
  7.     @Override% S$ `/ n% `( r/ I2 ?5 @0 G
  8.     public void handleState(Monster monster) {
    ' O+ R1 }; H. O6 W! _
  9.         // Финальная фаза боя
    $ m  P+ e0 n8 X' S/ {4 o4 i
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 W: R: |# v0 w- g  ]$ q3 i, F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    9 t1 H% f3 C  Z7 u; C+ J- Q
  12.     }
    , ^% a4 e3 x2 h* c& @# d
  13. }
    7 d( Z( h' A+ U2 y( g, [7 a" h4 W) _
Скопировать код

  n1 `6 x' o- X: @% [1 z# C/ pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) ^& G$ ]6 k0 M" {& C" t
  1. // Пакет org.l2jmobius.gameserver.model.actor( N' M6 r) n# S7 [' E: ?0 C. U) s
  2. package org.l2jmobius.gameserver.model.actor;
    $ W8 ]& r1 {( ]. S
  3. ; t$ y5 a0 q9 f( \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;# K; s: c! V8 B3 V7 i' |$ i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ W* r+ x# Z9 R; m3 Z& h5 `
  6. ) b- e( F6 q4 J8 A
  7. public class Monster extends Creature {
      C4 z! c& C: |1 W( ?1 u; p
  8.     private String name;
    , P; Y: J+ F5 q. X+ w: n; s$ ?
  9.     private double attackPower;
    ' n/ ]. |5 {( i  ~: t. s
  10.     private MonsterState state; // Текущее состояние монстра
    8 ~4 `1 b% O: J* _6 H6 Z
  11. 8 ]7 V0 |* B' C5 D8 `- ]; p5 m
  12.     // Конструктор монстра* _" Q9 o3 s9 t7 C; J' L2 a
  13.     public Monster(String name, double attackPower) {
    8 p% _& w4 l- B3 `
  14.         this.name = name;
    , Z; z9 A  c* M
  15.         this.attackPower = attackPower;
    5 n, f+ ^6 P( f' E) I3 o
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние* ~! h9 m( b$ Z$ E
  17.     }
    # u/ H/ [7 {7 @( |0 ?' J4 b/ A" M

  18. 4 y+ C( U/ ^+ M. b
  19.     // Метод для смены состояния  K& v/ B. C, a" B$ A
  20.     public void setState(MonsterState newState) {
    3 d5 w% c8 M- |* k
  21.         this.state = newState;3 m: L1 s% w" J; H, d* W3 v
  22.     }
      Q+ l  v* M' {. a4 ]9 d- P

  23. 1 g1 D' U) |; l2 r" t- f5 E
  24.     // Выполнение действий на основе текущего состояния# a% Q" ~( Z4 K- x8 P$ C, U* R
  25.     public void executeState() {
    + ]1 e* t  G# h1 h4 j! a* K: ?- ?
  26.         state.handleState(this);
    + P2 R+ j' O, j. }4 u( Z3 S2 }$ y
  27.     }
    # X1 c: j) D9 Z5 |4 g" c
  28. 7 {( L0 d5 z* q9 M
  29.     // Геттеры и сеттеры6 a+ h! ]$ [3 Y  ^
  30.     public String getName() {
    2 J. a1 U% p+ F9 |: T9 p* a
  31.         return name;  V0 w! q& Y0 X# h+ d
  32.     }
    ; n, e/ q- s! e
  33. * [# Y8 h/ n3 S6 _
  34.     public double getAttackPower() {- x: w2 o' o( _7 V4 m4 ^8 ~, z
  35.         return attackPower;
    ' b3 p6 F+ v  o% P) y( X# H
  36.     }& e6 t7 D8 G5 p7 u) K0 {2 U; ]4 ~9 K

  37. ; t; z- f3 M, X6 t
  38.     public void setAttackPower(double attackPower) {# e$ e  S: H/ g5 X+ J5 d
  39.         this.attackPower = attackPower;
    4 T% u' P! V  }+ Z7 d1 C
  40.     }9 ]- A+ m# Y0 t" h8 @- \$ `
  41. }
    / L; @9 M" L  o3 c+ u1 _; g/ w5 B8 _
Скопировать код
2 P! O2 A4 x& n+ j+ Q1 Z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
* S- e1 P5 u, c
9 a0 m3 e( g6 w0 k* b
  1. // Пакет org.l2jmobius.gameserver.model.battle1 ]) Y$ s, o# Y+ s( b' h1 W( S, a
  2. package org.l2jmobius.gameserver.model.battle;# ?9 c. ~: }! i, ~# U
  3. - _) z2 U! q2 C! {8 l& y
  4. import org.l2jmobius.gameserver.model.actor.Monster;; ?3 s( g6 \$ D, o% V2 J' ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ! i% ~/ W% X: b% P/ T# x
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % ]. @+ ~) L& m& f- }2 F; A: B' I
  7. ; H$ v5 L4 d9 y- O8 X+ n( E
  8. public class BattleSimulation {
    3 {/ M; e- d8 ^) @9 K7 _8 p
  9.     public static void main(String[] args) {  s- w- D) Z3 o  Q4 ?$ j" L
  10.         // Создаем монстра с начальной атакой
    , p, \9 u; r1 D( Y
  11.         Monster monster = new Monster("Дракон", 100);
    # b) W* y! n4 l- B' V% |
  12. 6 s" C1 w1 o, Y8 X( H% P+ M+ B  n
  13.         // Начальная фаза
    5 _, I- {# |' G/ {3 w
  14.         monster.executeState();
    6 C: q( L( a( @0 A3 D- e  A
  15. - ~7 Q* [- i! o4 v& O8 \
  16.         // Переход в агрессивную фазу; A: c5 g$ x7 m" Z+ u! C3 f
  17.         monster.setState(new AggressiveState());
    1 o& ^1 d6 Y9 S' R
  18.         monster.executeState();7 _! z5 F6 r1 `$ j$ E# Q' O
  19. ) x$ b, c5 n; W+ j3 l' N' R
  20.         // Финальная фаза5 d, ?4 O5 T) \8 X+ ^& x
  21.         monster.setState(new FinalState());
    ( G; d; I. U/ K4 m: H
  22.         monster.executeState();
    ! b- M1 b1 \9 I, `
  23.     }
    7 M0 n/ d/ r$ s- v" y5 X/ q
  24. }2 Y! r$ w' H# ?0 K0 O7 {( p$ e) [
Скопировать код

) q- V/ }: N" a% b6 uКомментарии по структуре пакетов и классов:8 B  `2 ]$ q$ |5 V
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    # z3 t; b2 C# {$ r5 d1 n0 ?4 ?; k
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
# e8 m0 Q0 P% k3 V9 t# Y- f$ AЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
$ C+ F' G1 P8 X% i0 z; y3 p9 r# @4 B2 q5 g: F0 l

' I) i- {( ~! Y. v1 i- F. O* k+ e2 |, ~2 Z) C3 c

8 R" o5 t4 E0 A6 l, j3 s
  q" L! k% W; J9 e: L& W' E( _- I; f9 W/ F. _
% h$ T1 I+ O6 C, O
# P4 J/ W# _7 ^- q7 j
/ v0 ~8 e' Q3 E! k4 D. G2 h
; B3 h3 [% ]3 D# X

' k0 ~) R  D6 d& R0 h: G3 Y
; [4 G$ l1 S5 n2 h0 t! g: \, J
; N! g/ }4 C; a( X& G
9 y* E; i/ @' K
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04) `7 V  J! p' J, z
Для управления сложными взаимодействиями, такими как  ...

; J3 J+ L, |1 |( }. Q5 aОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21; J4 |* p) Z  ^' J$ O
Отличный подход! Использование шаблона "Состояние" де ...
# l( k" J; _6 B; e  _
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
* O( p. u- {% a$ V8 Y% a# t
& p9 @  V, b3 ~. ~8 F1 N+ g/ r* u( pШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
& {8 O) v6 m# d8 m5 R# {5 f6 v0 B+ l. P) F8 N% ]- L
  1. // Пакет org.l2jmobius.gameserver.model.actor5 ?; N# w. Y! D0 {9 x
  2. package org.l2jmobius.gameserver.model.actor;
    3 `( h1 }  u" ~

  3. $ b2 X9 d5 a+ Y: j% c' H
  4. // Перечисление для типов атак# }, O6 P7 }/ G" M. \- i6 _
  5. public enum AttackType {% K' ^5 X- W2 W+ T6 ^/ \+ X% h
  6.     PHYSICAL, MAGICAL;
    9 h" w, f. O% \$ o6 N
  7. }$ _6 U2 y2 a; ]# U3 ^- q
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.# n& k6 }, G$ s5 Z7 G
Обновленный класс для агрессивного состояния монстра:
& z& B1 C( v) s5 p, ~! P, \3 }, a0 `8 w* }( u0 ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# f3 b6 B1 g, q
  2. package org.l2jmobius.gameserver.model.actor.state;
    . Z. m5 f& v7 C0 F+ K8 B

  3. 7 Y; k# n: D  |2 B* G7 X! O7 S8 [
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ |& e( y, h  k9 Q8 g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    % Z" B! |! c! _  o' m3 C

  6. 2 P7 M) U. ~/ `+ t. P$ ]
  7. import java.util.Random;
    - X) L3 F, s% g, i' M" ^
  8. . g$ d$ A  l2 p8 \; q  D) W- h% y  S
  9. public class AggressiveState implements MonsterState {) k6 N. A; u) b' C5 X1 t. S
  10.     private Random random = new Random();
    5 W" a0 m; M( n- b5 h; T% g
  11. 4 ^1 f2 L" }1 A8 C  D* o$ S
  12.     @Override
    ' h- V) ]- D9 ~5 ~1 y
  13.     public void handleState(Monster monster) {
    - {4 A- O9 Q# W! [/ M. G
  14.         // Выбираем случайный тип атаки: физическая или магическая
    + p+ J8 `" a" U; {/ u& @/ Z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ( S4 p4 B9 v; s" W$ m9 l9 Z

  16. * l& Q1 @6 ^* J# C$ u* W9 Y; \
  17.         // Логика для агрессивной фазы боя! L5 Q4 Z6 U, z, {! d/ g4 J
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 5 `* }% O. B' T
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ; e7 V8 I' G5 s5 a" H5 u: z6 m
  20.         
    / u4 M/ C+ j5 e5 P9 j$ S
  21.         // Увеличиваем силу атаки в зависимости от типа атаки" T7 h2 t# N2 E9 y' y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    + B/ X0 a3 a% x8 x
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);' f6 o% r  ~; r6 c! w8 P& @; `0 N
  24.     }3 {- U- _+ _) K% P6 d) M/ Y7 K
  25. }
    " |' f9 ~% B3 f/ E
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
0 E) T9 h$ N9 c" H% Q8 ?4 a, g4 X7 C, x, L
  1. // Пакет org.l2jmobius.gameserver.model.actor4 j& F( G' E& I9 b  G
  2. package org.l2jmobius.gameserver.model.actor;
    0 \4 C9 Z/ z, }7 M" [
  3. ' y( d' K, H* k: Y, X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' _7 g0 i" Y: J; \8 f% D
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ j& u; W# F, B

  6. 6 h. ^$ b# M) D9 h7 o- F5 {
  7. public class Monster extends Creature {- v! V# s% P6 A! G2 z' l# ~
  8.     private String name;
    9 \# Y5 N; E$ Z  c# C0 e
  9.     private double attackPower;
    5 f; a6 v2 C% y) ]
  10.     private MonsterState state; // Текущее состояние монстра: H& y7 q0 q5 ]0 ?1 J& w" Z& `/ H: x
  11. 9 q# ~# o$ a: G$ ~: k
  12.     // Конструктор монстра; ]1 R9 |# [, F$ M0 ]5 L+ h
  13.     public Monster(String name, double attackPower) {
    : @; N$ S( _1 }) j, Q
  14.         this.name = name;0 \+ S9 K) e9 s
  15.         this.attackPower = attackPower;% Y% S! ^2 v6 p) J) r2 G
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    , F3 o2 S' H- P7 Y- l
  17.     }
      c( Z' a* j" D8 ^; b! w$ R
  18. " `+ O. P, t3 i
  19.     // Метод для смены состояния9 F  h: x4 o2 m$ x7 Y8 u2 r
  20.     public void setState(MonsterState newState) {
    2 ^7 l8 ^1 G# d/ V, K+ g+ |( x
  21.         this.state = newState;
    + Y% G: S* R! B. d/ O  m# h; s
  22.     }
    ' V! i% z4 Z8 ~. @7 y
  23. ; C/ w* P& x' R) Q3 |, r
  24.     // Выполнение действий на основе текущего состояния
    " E$ {8 z1 D% Q" y7 m
  25.     public void executeState() {& Z  z5 a7 `( K
  26.         state.handleState(this);
    7 I  j8 ~/ u- ^0 c  n3 h2 K
  27.     }
    + h! I) c5 b! y' R$ ]. U

  28. # ]* ?* F! ]8 r$ Q+ E1 b
  29.     // Геттеры и сеттеры% D! \+ x& c: k# E# y8 }7 t  y. a  {# k
  30.     public String getName() {
    & C9 v& i0 N: X+ p6 H3 u& P. Q" n
  31.         return name;
    $ Y+ _+ ]  W' B2 Y& o( Z9 f
  32.     }* X7 t" Y0 [# X  G4 _& g( T
  33. ) Y. T6 x# W" [1 T
  34.     public double getAttackPower() {, `& h" U* `2 i; H
  35.         return attackPower;
    ) U2 @- v8 m( p& j: u5 b7 n9 }/ O* L1 Q: p
  36.     }( y3 n, d9 c- G3 X

  37. 3 ~8 \- X* _* V: Z# C  \: S5 a
  38.     public void setAttackPower(double attackPower) {5 N3 M" `8 c# f
  39.         this.attackPower = attackPower;
    2 ]4 w; A" B/ p2 {9 C$ e
  40.     }
    % j0 K" D6 H# r- e6 K; h: E$ a. i
  41. }
      M" g& X% X& z& X
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
2 q1 {, I1 o7 J. S6 z, {+ T0 ^( y6 G4 z. b) c
  1. // Пакет org.l2jmobius.gameserver.model.battle
    2 \. s  K$ P. c
  2. package org.l2jmobius.gameserver.model.battle;
    ! {4 _8 R1 v  F( g6 ^7 d! P+ g
  3. $ G* e% Y! e* ?5 _0 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;: E/ P5 I8 _7 W& n/ A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, Y5 J/ Y2 Q' z2 F0 ]: m
  6. . g* _. d. ?- P, a! n! d& S
  7. public class BattleSimulation {
    - a( @  _% L- \0 Q. |. E/ J6 L
  8.     public static void main(String[] args) {/ u7 M9 B% p5 V$ N- ^" [
  9.         // Создаем монстра5 w$ p# h$ W. q8 f8 d+ T* S, R- x
  10.         Monster monster = new Monster("Дракон", 100);  s8 n6 Q( `- o9 Z

  11. 6 z9 r9 C- s  j& e/ a
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак8 ]; t  N, V" R! r
  13.         monster.setState(new AggressiveState());
    # l" {; `$ i! m! V- Y9 E  l( p. C
  14.         monster.executeState();
    4 G# L( S3 m8 M& V* x" i
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    6 x5 ^# X$ X5 ?7 @; o0 g
  16.     }
    8 F, W5 e8 A8 K3 H2 B0 M
  17. }' t: ]1 J, Y( B9 a( Z% d# z% Q
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.' Z0 H' K; i* J1 D' c7 |& `
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!3 ~0 |( o' O! t2 O) G- c) w* O
- _1 C7 n7 R9 m7 d# t

3 W7 D* v% Z9 M: O  Z9 o3 \0 ?& n
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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