Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
$ e9 h2 W/ G8 F" }7 j% {; f. K: Y- ^$ t7 H
: ?) v9 B4 }! |5 H9 G6 d
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.6 f3 }7 f; R& O9 A9 S
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
6 [( Q. N% V/ ?2 FАстралия ?. `  E+ p& }: p
& T8 B. D$ M% @: ^: r/ y8 L

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
  ^8 x! N/ v, g% y# s8 nВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
% [7 J8 v# |4 P) A- T
. D) C  ^* e3 \; o* ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 2 q* c% H8 d( f8 ?
AlexCoder опубликовал в 2024-10-16 18:318 C" B1 ~8 `! ]+ {& y
День добрый!
% v+ ~+ v; v; g1 z8 vВ статье описано взаимодействие игрока с N ...

, ?% m7 w/ w3 Y6 j1 n0 k6 hДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 t7 h/ `( t/ i- i) B$ c' R: o1 i6 m+ T4 @1 K' s( W+ q3 X
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 x8 C5 ~- P8 D2 {( @: U8 U7 t* E3 Q3 q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 S0 j; u5 M; a5 m

2 i8 s! J' I  ~6 k' |, g
  1. <font color="Green">// Пакет для состояний монстра</font>+ U6 |. U6 M- u% I( `  b) P4 C+ M
  2. package org.l2jmobius.gameserver.model.actor.state;
    + O& t# P4 ]6 t+ H7 p
  3. <font color="Green">2 c( L5 a4 C- D, N" T8 B
  4. // Интерфейс, представляющий состояния монстра</font>
    & R' X  U6 n: E, g8 C
  5. public interface MonsterState {
    # D' X: r$ [8 q9 ?
  6.     void handleState(Monster monster);
    9 ?% ~% w. t; x, o- t! d2 v
  7. }
    4 _. [+ e5 b6 e4 K1 d' [  F( ?
Скопировать код
! y* J. O7 |2 P4 J0 Q7 S. A
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 K1 K- c- N9 M/ {( n2 M0 a, e: W% Y: }* s1 ]/ F! L6 d! _) r
Класс для начального состояния монстра:
1 B; t) A6 U# E% O, a
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 ^- I+ ^: r! o# T/ S0 L
  2. package org.l2jmobius.gameserver.model.actor.state;) d/ h, ^5 X3 N/ [% O8 _* `
  3. 4 g+ F$ w: F+ b  J; k0 {. N$ K- ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;" K9 a! ^: z" n# d6 P

  5. 3 z% ~, i  _- [- @7 Q0 c% A
  6. public class InitialState implements MonsterState {
    : R8 ^# {8 d! A0 e2 j+ H
  7.     @Override
    2 \7 c0 |; I4 |, F  R4 B( l
  8.     public void handleState(Monster monster) {6 l1 k, D% D* j; o+ G( y
  9.         // Начальная фаза боя
    3 u4 e% _+ t6 e8 q+ {' C  E
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");: ^5 f( e. r7 [5 t7 e- _
  11.     }' |: h1 `7 f$ ^+ O& R& L6 E5 c1 d
  12. }$ V- j; E, t1 N. P; F  h& O0 Y, B0 Q
Скопировать код

! {$ R3 M& q) B( E/ V
1 c+ F8 K* z. q1 M- @9 s& G3 i4 ^% W1 C1 j8 k! U0 [6 I

4 w8 C' w' i) z  n+ ~# d- n  [) n6 k- H- r' c* C$ C) e* n1 Q

/ l, c# z$ ?$ O$ q+ T9 F) C
/ F, y& Z2 o/ Y! Q2 a
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( m, d! `- p+ A% X; |. F( _) p3 h0 a
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 o4 O1 A8 J! t3 Q5 q4 O
# I$ C# `% r7 c+ q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
0 f4 F! V( |6 H% k
5 R7 T2 L1 c* C; |% o/ F1 p
  1. // Пакет для состояний монстра$ y: m0 X( ^) {2 }  W" {! J# @; {8 V
  2. package org.l2jmobius.gameserver.model.actor.state;  C. r9 t0 D4 F: j8 B1 e9 @2 L
  3. ; g  e! e6 @- O
  4. // Интерфейс, представляющий состояния монстра
    ; U3 {* s- j* S+ A5 K6 C' h+ u
  5. public interface MonsterState {" d: }3 t6 r: N9 u- Z5 |
  6.     void handleState(Monster monster);( [5 [/ L) l$ e, |2 u/ c. J- f# p
  7. }. \; _: ^" J* ?0 s
Скопировать код

; K$ ?  V" J1 l% }% w4 dШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
1 J0 B; I  C3 H( E6 {4 r! J4 N$ a, @* d* F6 S! c$ d
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 i. M5 B6 n+ s* T$ ^# i/ F! D# A( V7 g1 H: ?- y
Класс для начального состояния монстра:
  |: k+ c" F3 o- @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    1 @% r9 V9 Q, s1 X6 `  G) F
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 [/ T/ g/ d( Q4 Y2 f

  3. / Q& y$ S7 o4 S& `( M
  4. import org.l2jmobius.gameserver.model.actor.Monster;- s- m) n) W/ d8 d7 {4 O# p- d$ W6 o

  5. / D/ L& s, B+ K7 |# d. P, e& X
  6. public class InitialState implements MonsterState {9 z( |, D- A% r. j6 E, ^0 D0 I
  7.     @Override& D' W/ R( {  }. e' C3 w
  8.     public void handleState(Monster monster) {
    1 C8 J- Y% K* O& l* I/ l# @' d6 q
  9.         // Начальная фаза боя
    0 g2 _# y, m6 l: _, o9 B
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ; `7 j6 z6 a. j9 A& q& t  X1 t  B' t
  11.     }! m+ ?3 G) I' K5 x* V* ]; ]5 d3 \
  12. }
    4 I: R& D6 G$ r/ R( h
Скопировать код
Класс для агрессивного состояния монстра:
5 z" y7 t; g# t" k6 j  J) U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& _* {- r3 |$ f" l! G1 h
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 S5 A4 Z, f, ~5 h9 T

  3. # U0 R8 W7 w. W; O4 O% z1 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 L0 @- `) e+ \* t5 }
  5. 2 e- Y$ B' z0 t5 s5 c; n1 {3 I
  6. public class AggressiveState implements MonsterState {, I9 K8 v0 j1 ]9 Z/ m8 N
  7.     @Override
    $ \9 h; s/ s( r% F
  8.     public void handleState(Monster monster) {+ p% K% |0 R- c7 N
  9.         // Агрессивная фаза боя
    ; ?: p( L& _& I# w3 S5 ^
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");6 P  z' u5 V8 q. c! r
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    : e0 q4 x& U0 R0 B- x. Q6 D* e
  12.     }  R( y: O& N' u4 `( j
  13. }& U( o# P6 H; C# I0 h9 `
Скопировать код
Класс для финального состояния монстра:+ D2 {) e& s- `5 k4 F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      k7 w: X3 l* I0 x. t
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ c% P( P) e0 {% d# G7 q, C

  3. 3 C3 Z2 n; A& G* B) C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 F8 m5 x8 v6 t4 e2 z3 E$ ]

  5. 8 S+ a/ ^: P2 B0 p. \# Z
  6. public class FinalState implements MonsterState {, A+ i8 M, Y. N$ Q
  7.     @Override; a2 n2 D6 C  |5 \+ o& ^
  8.     public void handleState(Monster monster) {
    - `4 }) |& H: q+ w
  9.         // Финальная фаза боя
    & G" T( s" x% _4 _7 g0 n5 m
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    : n" {$ j# z9 ?- x8 t9 I* S( B
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" Z1 J( i7 a: s3 \+ w+ d/ ~9 J1 n
  12.     }- v5 Z! {' v, G
  13. }
      V" g: e5 O" D0 D
Скопировать код
$ r! S5 @9 N! c
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 D% @  [( B# Q6 r$ l* _  S- L; X
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 {: |, {' X7 Z% _5 w. B6 C- J. b
  2. package org.l2jmobius.gameserver.model.actor;) o' S5 D2 F, ^8 Y( i7 r

  3. # t9 P2 p: ~5 U2 l2 s, u
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ! K! }0 A( K% g( Z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 ~5 p$ l/ X* c. J; |
  6. 4 g- X: W- C9 h" O
  7. public class Monster extends Creature {; ^% c& O8 J/ m; b3 n7 d
  8.     private String name;" Y5 U1 t* k% e# ^9 T' D
  9.     private double attackPower;
    $ f9 B6 z( o9 h9 Y1 g- t% U8 G  x/ |
  10.     private MonsterState state; // Текущее состояние монстра
    4 P4 t& U9 @- \4 K2 h: w5 V
  11. 1 f2 h5 q: p7 @' t3 C4 P
  12.     // Конструктор монстра
    3 g2 u4 F( J5 l7 V
  13.     public Monster(String name, double attackPower) {- t3 z4 z2 E  C' i6 W( a  {& N
  14.         this.name = name;  v# D: n; C* _9 o' H
  15.         this.attackPower = attackPower;2 ]5 G  ?% R9 \& i, k0 S$ M4 g
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    $ l! w. A6 X7 q, Z
  17.     }+ t' E8 {; x- _3 t3 T

  18. 9 E$ E* _9 q* P/ G5 U+ p/ V; J
  19.     // Метод для смены состояния, w- |7 _- [; U. ?1 h9 \* B- p
  20.     public void setState(MonsterState newState) {, V* I' w( a# e' a
  21.         this.state = newState;
    : z& Z/ R" o/ \, ~: m% W
  22.     }
    8 v7 k; r) z3 D: C. f- z
  23. , t) k8 \8 s7 O
  24.     // Выполнение действий на основе текущего состояния8 j# y, I$ U! C( M' K
  25.     public void executeState() {
    5 P7 o9 }' ?" ?! e7 R) V
  26.         state.handleState(this);
    % ]5 `2 b) Q8 d
  27.     }' _9 m0 d  g/ J1 l  ?
  28. % P' z% H5 z$ {% @) p7 d6 G/ ~( X
  29.     // Геттеры и сеттеры3 Y3 [; C; i7 [8 B* W. R
  30.     public String getName() {/ B; h+ ~" Q' f2 Z& f
  31.         return name;3 U4 P, h/ a% f2 K
  32.     }' }) L5 U3 h  q
  33.   D: B& g" B# s1 S8 s( @
  34.     public double getAttackPower() {
    & b; ]6 c2 R2 {' @
  35.         return attackPower;
    / k8 N( n6 D0 U6 v0 `( S- `1 {
  36.     }# ^7 m% n9 w! c/ u( S) w
  37. 5 E4 I" a6 P8 \+ Q7 H# l% w
  38.     public void setAttackPower(double attackPower) {9 S) H! ]' \& S
  39.         this.attackPower = attackPower;
    $ w6 I3 M" S) a2 d$ b/ V! l; `) }
  40.     }. o5 U4 W3 k4 r1 T, `
  41. }
    , [+ x5 @; i2 Y& v7 s" ~! D3 u( {
Скопировать код

! C! |# _# I4 m3 E4 p9 o8 xШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. _* @" Z$ d* i( W, z! O4 @$ O

7 K# I' D3 z; o4 k* D
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) X9 M( _4 [7 u& J9 l1 ~* i8 i3 I
  2. package org.l2jmobius.gameserver.model.battle;
    6 |4 z2 N5 Z) u8 x" d5 S
  3. ; K5 m9 O( A2 l; P# J! }7 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; s. y' ?. h8 N, `6 T" Q( N8 j, W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- X: ~! y1 F$ z# A$ z' T
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;* d3 c, [- N# l4 @4 c9 ?9 l
  7. / d$ c  m% x& _, {2 Z
  8. public class BattleSimulation {
    ) ?( U9 `$ ?# c! X1 h5 l
  9.     public static void main(String[] args) {# w1 y" b0 I, d% C5 g1 t- x3 \* X
  10.         // Создаем монстра с начальной атакой, Y  R2 f3 w; ^$ G6 |
  11.         Monster monster = new Monster("Дракон", 100);9 w, ^+ c( v0 `9 y, u

  12. 4 A1 s9 ^6 V# D% p5 t# @$ E7 v
  13.         // Начальная фаза
    ; R2 ~$ s- q' v6 o! H
  14.         monster.executeState();
    $ `5 i2 o! f6 u' U5 O
  15. 9 i3 r# C; v. h* ]( s
  16.         // Переход в агрессивную фазу$ o5 L! M$ c' q  y) j0 _
  17.         monster.setState(new AggressiveState());
    ' L. @. J( T& J) C& r! t/ X
  18.         monster.executeState();
      S; W8 U6 B7 b" V/ _) D6 k8 H1 i
  19. ) e7 C" g0 ^  _) f  T6 B- C, M' z$ P
  20.         // Финальная фаза' g: m( v, h: n, F& G% X
  21.         monster.setState(new FinalState());
    . ^' a0 _- h* m
  22.         monster.executeState();
    7 m6 s; ~( m0 H% u3 E$ B. v
  23.     }
    3 W; O* v2 F! }5 Y+ H( \
  24. }5 M2 s' {9 i6 q: Y: c6 K* \
Скопировать код
7 ]+ H: |- l; T9 {( d
Комментарии по структуре пакетов и классов:5 h$ I5 D2 t5 o, z+ l  V/ e
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.2 l: J3 E( U0 |( m$ R# V% Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) X. g6 P( c: Y# w3 K. D
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 N6 w/ z9 r; r$ I/ E  h) z! d3 ]& q1 r& ~6 U/ [; O  E9 s; B1 o
, j% S1 l$ R" h1 ~: W
# h8 y; L5 |0 Z  T

4 y, N3 a( q( S7 a3 f
* G( [$ K  ]6 X( W7 i1 G+ q2 W' b- H) Y! n4 F

7 r% B, a8 S5 g2 _# t0 [
5 ~5 G0 y/ `3 X7 D9 `, `( U; ]9 M" {

+ B6 [) U5 S) [. h% |; m/ |7 e; z, c: `! D9 H/ R( H3 q
. e3 Q2 Y5 m9 W6 @2 |
7 f$ O0 l3 ^3 x* n

- m6 c" X& @2 I# |) v* e6 H
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
5 y7 S4 F) `6 b2 PДля управления сложными взаимодействиями, такими как  ...
7 H( h- s. T. O0 N6 I0 R$ o
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
" U  j. n% [1 D3 _" Z* W3 H$ hОтличный подход! Использование шаблона "Состояние" де ...

3 S1 }* D/ b0 g5 |Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
2 Q" ], w$ c$ _5 e' j* @( @+ r3 U. Y& y2 {' ^6 M9 i
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; u" I1 F6 p7 y- a

9 i( X4 E/ l. O  Z5 ]( D
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " d/ u) d1 e/ Q% I0 u# f' `& D
  2. package org.l2jmobius.gameserver.model.actor;6 C2 X7 A9 i* a, H

  3. + B, A  O0 T. F
  4. // Перечисление для типов атак8 k( N3 Q* N9 p# {- C% L
  5. public enum AttackType {
    * T: t% W: B7 r2 u% V1 v
  6.     PHYSICAL, MAGICAL;1 O* K0 ^$ s0 H0 T3 u0 l3 b
  7. }
    . R: U; ~3 K% D0 |: j
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.  e& u, m9 k( V/ F) @& [- q' z9 m
Обновленный класс для агрессивного состояния монстра:
) ~; W; X' D, ]; i3 k- e7 z5 G' l! H2 H; }" B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 }2 @4 e4 E- P9 m6 }6 T, T
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 \0 s( g' r& a; ~& V7 F3 o8 r* z
  3. & O* ^5 w8 f! _4 f" ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 m. h5 X* U+ i- A2 _
  5. import org.l2jmobius.gameserver.model.actor.AttackType;0 A  l& L  f) s( B

  6. 1 y) l7 s( s' r& S3 w3 Z3 D4 W
  7. import java.util.Random;3 }% H# f3 g% p& \8 {( r

  8. ' r* `6 Z6 {; y; r+ I% G
  9. public class AggressiveState implements MonsterState {8 P/ w" Y# P. U, Q  T
  10.     private Random random = new Random();$ B8 G. N: x& F, F8 b0 n4 R* D

  11. ) @, [2 N+ R, _. w
  12.     @Override
    , B# Z; ^4 {7 q' u
  13.     public void handleState(Monster monster) {! t9 T2 T: X0 b) y- _
  14.         // Выбираем случайный тип атаки: физическая или магическая
    % d* a" G$ d* ]4 m1 e3 R% k' V
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;) t- ^$ c1 N* M: W

  16. 9 w0 X* N  p& }! J9 E+ \9 {+ V9 k0 }
  17.         // Логика для агрессивной фазы боя
    % F; K) `- A; q# A6 z: g$ K( V6 B
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    5 M- w8 z. E! M
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");& C6 Q) j) j* o! V6 Y
  20.         # v- e' P$ j% @! \
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ) }& v9 w5 [( B
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ; d+ N( p1 ]7 r! y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , j; E! D/ \+ x4 Y% J; M% L3 [
  24.     }, |- p8 O  z: [: h) ]' Z( `
  25. }2 D+ j* n# `8 t3 t; P
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки% I4 B0 Y9 J, V! x- ^

: ^! K# `% Y- ^( ~/ b: a8 J1 F
  1. // Пакет org.l2jmobius.gameserver.model.actor- o4 F7 Z# E/ M6 R. I
  2. package org.l2jmobius.gameserver.model.actor;
    4 U; a% l  ~; m" g8 m2 I/ H: U8 k

  3. 9 Z7 m5 U# s1 r3 R! E, c3 ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 ^- a! Y& h8 ^/ L( z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 Z7 P  L* }' x! S% H

  6. % R3 G. H+ h' H& w
  7. public class Monster extends Creature {& o8 }$ s4 W5 R- G, Q2 {  ^
  8.     private String name;
    + L) g5 ?# O0 z. S/ k9 n8 u( y! X, j
  9.     private double attackPower;( {" G: Q9 `- `# X  c. N: v
  10.     private MonsterState state; // Текущее состояние монстра
    & @+ ^# `! S/ j" l' q. Q" u
  11. 6 u( a  k  z5 v3 ]6 w6 L
  12.     // Конструктор монстра8 z3 \& I* l% o2 k9 c% T% Y
  13.     public Monster(String name, double attackPower) {
    % l9 ?6 K/ u# n$ t6 q3 {
  14.         this.name = name;
    9 ~/ Y2 A* b( ~4 b, ?- o0 z
  15.         this.attackPower = attackPower;
    4 S' r! P( T# K2 i5 Q% [
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & Q! U. N( A) Q# c/ L7 i- s
  17.     }
    0 _, b7 f- P  w) {

  18. ( \( j4 b+ }; H1 S! m& r) T
  19.     // Метод для смены состояния
    4 V& C8 Q, I; h* X
  20.     public void setState(MonsterState newState) {# ~9 t! {( ]! d8 q( q2 m
  21.         this.state = newState;& g" D, @% j1 P) G8 L
  22.     }
    ! ?9 P+ o' L  U) L0 D7 G5 O
  23. 7 H7 ?+ T4 Z: x3 o- f3 Y
  24.     // Выполнение действий на основе текущего состояния
    ) b5 W; T4 o% }/ A0 C
  25.     public void executeState() {
    * i, y4 I# j; e: w
  26.         state.handleState(this);
    8 l* R- P, r2 N0 i
  27.     }# g, t8 P# i/ S* S
  28. ( H6 C2 N/ `- ~. ]  E2 y3 ?6 _* t) a
  29.     // Геттеры и сеттеры" v, P5 C2 }; g2 r0 q
  30.     public String getName() {
    ( \) ^9 @1 H# j; z5 |7 K. Z
  31.         return name;
    9 P/ e0 B, w  Y3 v; E( K
  32.     }) A4 m+ y3 g2 ]6 R# E) ^2 V$ r( n
  33. " }( e5 e' r+ c; P2 w
  34.     public double getAttackPower() {2 G7 ?- @2 X4 i5 W) @$ v2 V
  35.         return attackPower;$ f. X9 D( y8 s
  36.     }' K- y, }5 {+ c+ }/ r$ }9 y

  37. ' K5 M& b4 z" r) d
  38.     public void setAttackPower(double attackPower) {3 @$ }+ P9 G1 o* S
  39.         this.attackPower = attackPower;
    . ]: y( x2 }* G, l1 S7 e6 c5 |
  40.     }# U9 t5 f* j* ]2 N
  41. }
    0 F- @* q8 U: F9 B  z, P0 |' |, `4 U
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
+ d" o9 {: E6 _& @( X1 \
% e7 s! X7 U: K5 g& g: d5 w! ]
  1. // Пакет org.l2jmobius.gameserver.model.battle
    % l4 w; c8 a' D- m0 E
  2. package org.l2jmobius.gameserver.model.battle;
    : \/ a+ @4 M, Y& G3 z  V

  3. 4 M) Z( n, S3 b- W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ |$ t3 O' k# B
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 L  r( T7 H7 G- h' K2 h
  6. ( I6 b0 ?8 H+ M) c! O
  7. public class BattleSimulation {+ o+ G% R+ w2 ]6 B. U* P) b6 v
  8.     public static void main(String[] args) {
      }/ y' ~; l3 p, @. ^. P0 }7 ?
  9.         // Создаем монстра& H- D2 n2 \$ [5 z$ Z
  10.         Monster monster = new Monster("Дракон", 100);# A5 _# y5 y6 q& R$ J
  11. 3 s9 H( f2 _  u4 {2 t  M4 e, E
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( q' w1 @* x5 W, {6 V( Q
  13.         monster.setState(new AggressiveState());+ L6 @. a$ ]' u& O' z3 ~* ]
  14.         monster.executeState();
    + w/ g- j$ V" U
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 a2 P: z; l* d3 s7 x7 ~# y
  16.     }( h0 y# a8 K$ Y% b
  17. }
    . v) J" E$ V5 K3 z/ U# l4 Y$ U
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% P4 m7 m% V/ o
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
' Y. X9 Q- n5 }% j4 x2 |. b8 V8 r- C# H% ~: K" B& C
4 F/ h6 `2 D& }: p

7 v( d% K+ @$ f0 J0 G
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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