Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
4 V1 B- Y  n/ a: O* V6 X8 C! J! Q4 l3 d! a8 o) ]
7 s' L% {8 Y& s( z1 j; d
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
7 [" [+ E4 Q5 J- b' Y# LЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
: b" H7 s* T1 g7 j/ n" ^" |5 m8 q" vАстралия ?
! \& ]) b  ~9 ^/ |+ }( s
  N4 ^, x* _! z: e; f6 f

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
5 _; ~! |+ c7 X# bВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
0 b$ J/ \7 y% Q# O6 @) R3 b
5 v) V- d% f- [, h# X4 p
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 % E% p2 Z1 C- K' L  A2 w0 ^
AlexCoder опубликовал в 2024-10-16 18:313 M9 r$ l% m3 e* d
День добрый!
# u/ G; Y0 q5 b5 ~) rВ статье описано взаимодействие игрока с N ...
& j0 y1 J6 h* \4 I
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
! Q9 v4 G! O3 [4 F3 K
' Z/ C1 A! T% W8 G( ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 a7 c, f; `) M" r/ x2 j4 q# [9 z! ]  b% B  w2 C, k: E( M
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* Q% l3 S- M7 I+ d' U& H6 L5 E0 k& Q. P* T
  1. <font color="Green">// Пакет для состояний монстра</font>
    7 `/ X, ~- k# a5 x4 v1 q7 |
  2. package org.l2jmobius.gameserver.model.actor.state;7 B2 l5 E; z  ~  N6 g
  3. <font color="Green">
    5 A+ C! D* s( d6 f! R6 o, I" t
  4. // Интерфейс, представляющий состояния монстра</font>
    " ?( ^1 q3 ~* o, M8 L' r% p- J
  5. public interface MonsterState {
    ( B0 c4 ?" @# x2 O% ^
  6.     void handleState(Monster monster);
    8 j) p8 [8 v" Z! d
  7. }& T) n1 j* s, j9 _, Q8 t9 D
Скопировать код

8 n5 X+ d0 J  D$ RШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 g+ T. e8 [4 B7 d9 s5 M! `' v6 A0 w# `7 @( X' V
Класс для начального состояния монстра:
: ]( T& u$ M, H( f8 Y. P/ K% [! p
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ( U( H+ ?  o: {
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 s3 H/ `- s' f5 V
  3. 7 b# R/ G! u& o. z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' o* |5 R3 c; F* k( K
  5. ' V! k+ v, S+ G* B5 X  [% y/ }& |1 d
  6. public class InitialState implements MonsterState {
    1 o% Z/ [! V! L
  7.     @Override' [" t, M( m2 e6 E
  8.     public void handleState(Monster monster) {
    % ^, Q" F7 x' V1 ~% g6 z# Z' E
  9.         // Начальная фаза боя
    . Y- s, V" a; W: C. O9 W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( m5 c! u5 ^1 T! [9 D
  11.     }% F6 U( [/ V4 p; ?2 o" I
  12. }
    ( I3 X3 c3 f. [+ R
Скопировать код

$ h7 m' ]! V$ I: w3 H, |) i
) T8 E  O* b" f: f# J
: a5 D8 W4 ]# G- i$ \2 V& T0 K# d6 {, j4 _7 `
7 S( z9 V8 F6 L5 `5 o" U$ i7 q) G* D

: u) y# Y, k/ W: |6 c" |
; a( ?+ H# x. i. V
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
% I3 Z0 `( z3 ?  D* H  \
8 m6 i& }4 A+ R# b) r) pЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 {* b  P6 T  n/ ^- Y

( I, R: h0 p) D/ J8 ?- p7 p4 @Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.9 e" p. f+ ]/ Q8 \9 z. V* y

  `# u4 S: ^2 X4 v" G# G
  1. // Пакет для состояний монстра
    * w* }. z! x% p' J2 b
  2. package org.l2jmobius.gameserver.model.actor.state;
    * K( ?, Q3 Q+ _' F% H" ^4 R7 {

  3. $ J- F2 z( i, q1 \" Z. g* _! `
  4. // Интерфейс, представляющий состояния монстра
    0 B. i3 A) x7 |8 x% l6 T. ?
  5. public interface MonsterState {8 m% [; d# _( G" A
  6.     void handleState(Monster monster);% n5 Z1 y7 `6 e! c* m
  7. }
      i7 N& B; R; h! D9 I! d1 j; a
Скопировать код

0 A' J+ ?. h5 a4 t/ lШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 r, v6 E9 l. m- J  h9 P1 U
; \" R- p8 M  j' g  f9 x/ ^; AЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% A  M5 H2 H9 M; s, F/ C9 w# g/ c* m# ]! y8 N, O2 S. b& O4 L- w; w6 L
Класс для начального состояния монстра:2 B1 ~4 p. Y8 I% m5 t; K* R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - P' B9 q3 D8 \$ V) r) @5 a
  2. package org.l2jmobius.gameserver.model.actor.state;- I* W; k8 l' h

  3. 4 Y5 V  f6 L  k8 ?6 Y- x  }4 s" w
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 L. w: T3 Y& M- V0 H7 F

  5. / K2 n' w. m; n9 [3 F* Q
  6. public class InitialState implements MonsterState {5 C( ?2 z" @' J# @
  7.     @Override
    2 P$ V$ }" q* C
  8.     public void handleState(Monster monster) {
    4 V  z/ J# E- I- U; v1 u- F
  9.         // Начальная фаза боя
    0 s, U, U# k7 \; f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ! P3 r/ M! k' X) j# r: ~7 Q( \! E
  11.     }- j- h' H. D3 g; n. P4 s
  12. }# D% u7 g- A7 \) w
Скопировать код
Класс для агрессивного состояния монстра:1 _1 {, s/ p8 J% m5 L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* @1 U' i8 _. v3 M. \+ u$ e9 S
  2. package org.l2jmobius.gameserver.model.actor.state;  E7 n% H1 n2 _9 a1 Y9 ~
  3. 8 i$ B: a( ~) w- u, H% o
  4. import org.l2jmobius.gameserver.model.actor.Monster;- p+ i; d# ], n  ^' U2 i

  5. 2 z. w. ]4 y$ O* H5 t4 k
  6. public class AggressiveState implements MonsterState {
    , M' j  R5 o2 S; W
  7.     @Override4 C$ K( I, Z( ?& _2 y% d
  8.     public void handleState(Monster monster) {& g5 |8 v/ o( I% T
  9.         // Агрессивная фаза боя
    1 j+ T' @8 c' J# c
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 Q6 N% l: D* h. l( N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 Q3 o* N! T' x/ d; F6 C
  12.     }
    , T2 Y: r( H( d' b) S% p5 h
  13. }
    1 N; G2 ]! y  Z+ q
Скопировать код
Класс для финального состояния монстра:8 S! [) {# @+ d$ G8 I6 c7 \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& q; R- l7 C. ]* |
  2. package org.l2jmobius.gameserver.model.actor.state;1 W% ]7 U: T, u0 V  y5 E8 H

  3. % J  @2 g, i* s, L& |+ ~. \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( k4 f# O. }* g0 S! C- S

  5. / J# p. }, X! p) k
  6. public class FinalState implements MonsterState {
    ; y! T4 ^2 E, H
  7.     @Override; B$ b3 O( Z; x. w% @
  8.     public void handleState(Monster monster) {/ O$ ^: {$ s8 @0 S; H
  9.         // Финальная фаза боя
    , s  x( C- G) p5 H2 G
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    , _3 J- v3 W8 t' U( E! E
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# W. U9 [: c' L. H
  12.     }6 r# ^: |3 w: \2 {
  13. }9 W) t0 b1 ^' r9 o2 \' @
Скопировать код

/ Q0 \! e* N  U$ a) {Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
, J1 ]+ M  C; l, Z6 s1 v
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / i4 u& L# [5 t$ l  K0 r3 i: g1 d4 W6 T
  2. package org.l2jmobius.gameserver.model.actor;
    9 ~# e6 S1 b5 {

  3. ; J9 A9 W: u% N0 R! B8 X+ ?
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    " j& y# h2 t* s* o+ v4 t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 }$ D5 x& _; y& e2 V5 L7 i) g

  6. 2 c& B. L' ~/ L- c6 G4 m) Q5 @5 E( q
  7. public class Monster extends Creature {/ T5 J7 \5 v$ u8 N& u, N, ]7 Z8 u
  8.     private String name;
    0 T: m/ a8 T+ B" X0 ~: w
  9.     private double attackPower;
    * r# W. h" [! R9 M& [  R+ S) z
  10.     private MonsterState state; // Текущее состояние монстра. R" G& j$ W! `: q  E. S" ^4 W8 r9 ?

  11. 0 D+ }" C& I" T/ F, E* ^
  12.     // Конструктор монстра3 R  i! c& ^. [9 V9 }
  13.     public Monster(String name, double attackPower) {; s8 H: T, `2 s0 ]2 ~
  14.         this.name = name;- K1 q& x" a. m7 m7 o# h5 s
  15.         this.attackPower = attackPower;- Z6 @9 }) d8 w. j7 C; \% i7 c
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ) o% M% }  s: ~5 \* [
  17.     }
    6 I! ^1 L, y$ B! C
  18. " A# ?2 d& S6 m
  19.     // Метод для смены состояния! M" B1 q1 a) n/ p. K
  20.     public void setState(MonsterState newState) {& y$ w4 ^& a; V$ R, V& b% j
  21.         this.state = newState;
    ! J- v; ]. J$ A/ x$ G* h  @- O
  22.     }  c. c% F! H( s2 a* W) v& p5 y

  23. " H1 e6 m3 d% e; b- I8 |
  24.     // Выполнение действий на основе текущего состояния
    / p8 C3 |$ A' P
  25.     public void executeState() {# O, ~$ B- Q2 ?
  26.         state.handleState(this);
    # W& t. C: B# Q+ n' ]* ?
  27.     }
    " O: h" @6 q: K9 A; C- i3 q6 ~

  28. 1 ^1 s% `: Q+ S* v! a. f
  29.     // Геттеры и сеттеры! g* C: w4 V: R2 e0 N8 O
  30.     public String getName() {
    % D- y6 m8 }+ k  b3 T
  31.         return name;
    9 M$ G' |6 n# g) ]$ q
  32.     }$ H! }! l& ~7 Q7 V9 V
  33. ' r1 a* B' D3 x# E6 \$ |
  34.     public double getAttackPower() {
    . ?9 Q1 Y& z6 q) X3 n
  35.         return attackPower;
    7 X: b( i% ]1 K/ q
  36.     }
    9 _: y* u& {* {' |

  37. , a+ R- P8 m" Q- p0 o
  38.     public void setAttackPower(double attackPower) {
    * M/ I  D$ u3 I4 j4 i; f  {- ]
  39.         this.attackPower = attackPower;5 D; U% p% k9 y8 _, z# ~: |
  40.     }
    8 p/ U# F2 _+ ~' {' b! ?
  41. }! \. Z1 ^, V+ U* _
Скопировать код

+ b& y' I) e; q5 A) |; ~Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 W5 P  {$ T1 h$ D
: j- x# ?" B, l; A' @& Y  s% [
  1. // Пакет org.l2jmobius.gameserver.model.battle
    5 l% F6 k8 [- M/ \
  2. package org.l2jmobius.gameserver.model.battle;7 y: S) S+ ]# M. X

  3. & I7 a% Q1 M6 h( M* X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 y8 _9 J, l5 q- B4 P$ [2 z% h4 x4 {4 h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 c. K# {/ e. I# s" ^& ?
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    6 V5 a) \3 P% @: b4 e% C/ v( G" G$ z* X

  7.   T) A# \1 b& |$ s4 d
  8. public class BattleSimulation {/ V% t  N. b' C  r
  9.     public static void main(String[] args) {
    & H& ?" b  y& ?2 L% U
  10.         // Создаем монстра с начальной атакой( s( F2 C7 b& K' X' I9 r5 \) ^  R  l7 a
  11.         Monster monster = new Monster("Дракон", 100);% }' z0 s9 g' b6 g( o

  12. , s% J' u! R$ p2 |. s4 o% z
  13.         // Начальная фаза
    * K- Q' q% A1 [$ s6 `8 A
  14.         monster.executeState();
    . I; B$ |# r! _- ]3 ?+ ^

  15. ! p$ j8 `; w+ T1 r+ o2 T
  16.         // Переход в агрессивную фазу
    9 l: [- J6 P; D2 y% y$ P
  17.         monster.setState(new AggressiveState());
    3 U3 E: b( `. n/ O3 v) M  j
  18.         monster.executeState();( c2 T, k  h) ^1 d: l5 v! A

  19. 0 a; D$ q$ S: \2 v2 |  C! Y9 T
  20.         // Финальная фаза
    $ \9 d9 g/ h, y; w) x
  21.         monster.setState(new FinalState());% k9 A' o, j: e) a% i& a
  22.         monster.executeState();
      U5 U3 L/ `$ v; W
  23.     }0 b7 e) x# C( ^$ S
  24. }/ g$ G: F5 ~+ t( i- n7 ~$ Q! [% _
Скопировать код
- B8 I+ v/ M; Q) w( E9 x3 Z
Комментарии по структуре пакетов и классов:
2 h3 D: t. f4 i& g# a0 }- O
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 q) R: Y* J: t2 _
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.4 L3 D6 a" {0 A2 T. H: K. H; f4 r
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 P" K1 p* v* O+ Q& c' Q
! I9 O( U! Y% }9 u; ^. c" a

, T1 y3 b+ ?' [9 _0 |
; l# Q) G" V0 }6 I" x4 L8 B  ?7 p; [
( M" n& b7 q; f6 S' C

, [& [/ C8 r9 `$ J4 v" w, l8 P! w5 e- j- U. f* r7 C
* N9 y$ c6 [' z: J: s6 Y& A: a
/ f# F* ~  ^& T$ k; ]9 U6 @

3 j! l6 u7 l/ T- O% g) u8 Q: L4 v  L3 b5 k/ I% A- j  ^# s

. e9 k# b0 H! ^+ U$ k4 j/ w1 J0 Z/ A7 t* w/ Y9 N4 Y1 r# D
3 I# |, H7 d, b0 q: v
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:045 d# U/ n  X; Y( B. r
Для управления сложными взаимодействиями, такими как  ...

  V0 x) o) {/ V" TОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
0 {2 ^/ ]* w* `Отличный подход! Использование шаблона "Состояние" де ...

6 Z9 J) h% C# t, ?) X; x5 kХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.$ |4 {- B+ g; d1 D, D1 [6 L' g
% K/ L2 u, M7 O- k
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
; t- N6 g# a0 m% S$ f3 \0 Q( t
# Y9 K' [# F, Y( ]  K
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 ^2 a: Y, I; s+ b; e
  2. package org.l2jmobius.gameserver.model.actor;5 G- r# `7 N- k9 F1 C( I
  3. 3 B6 B9 A' s& U& t& H3 G/ G5 H
  4. // Перечисление для типов атак+ n# Y9 N2 i2 g
  5. public enum AttackType {" ?  V; v0 ^' _) z
  6.     PHYSICAL, MAGICAL;+ X% f+ N! `! @- [0 p
  7. }1 p5 s! r- Z$ @0 Y' B; P: C/ h
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.( F, `' G$ @: ?! A+ ?( X4 \
Обновленный класс для агрессивного состояния монстра:/ l- L4 r2 Q9 j; Z

% x' e# a: h% u% ^% z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' ~  p9 F' q9 }! {
  2. package org.l2jmobius.gameserver.model.actor.state;- I8 ~/ G8 s& H  B$ l$ O2 Q2 L
  3. : B0 ]6 f5 ?' _4 Z8 b0 J/ B: A) a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 B  t, K/ G8 B  h$ g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    / g, t# K. @" V; }2 u) q, x; f

  6. 7 g, G3 q& Y* @/ ]- d3 ?# I
  7. import java.util.Random;
    9 T: M: b( T6 Q0 q+ N$ ?: J3 p  u
  8. $ {2 q! n3 S8 K7 L: T& K  e/ _1 ?. O
  9. public class AggressiveState implements MonsterState {% ^0 O$ ~5 }% c( O
  10.     private Random random = new Random();
    5 }  Z  s. s( |, S* r0 S

  11. ' D  U1 U# Q! o) D: M
  12.     @Override9 O/ ^& z! x) w. {% |: D; u
  13.     public void handleState(Monster monster) {
    2 l2 L* @) W& N& g; Y; G
  14.         // Выбираем случайный тип атаки: физическая или магическая
    , Z  j# Q, J2 S+ e
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;0 N/ [$ k  ~6 Y3 a1 n: q, F. {
  16. 8 X6 x* q/ Q; N
  17.         // Логика для агрессивной фазы боя/ b3 e) x( z# F* r' e3 p6 q$ Y7 Z
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ' _" f* Q" ^3 ~4 f) |
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");" G+ n7 V' X. [9 {# {! f8 s& U* J. h
  20.         7 a4 M& s6 _- u( h8 C" a& ?
  21.         // Увеличиваем силу атаки в зависимости от типа атаки/ b0 r3 L* [1 l9 g  W
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    1 Y8 J- i5 N% v' Y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);' H! Y; M3 B5 B1 y, R3 s8 @
  24.     }4 t# v0 O. J$ \' H
  25. }- z3 @9 a& E6 E  R
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
4 x) q& N& M; l( o* C7 |$ v0 Q! S3 C, }* u9 s
  1. // Пакет org.l2jmobius.gameserver.model.actor! {& B- c& X) W: z
  2. package org.l2jmobius.gameserver.model.actor;
    0 k2 l% y5 s3 ^# [, R5 i
  3. ) F: P4 s$ ?$ ]* x* R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & M' k; }: _& m# q0 w, T; l
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + Y: G5 {$ G9 X, A/ A- a. z

  6. 5 e  {. t+ K# X: ?9 _
  7. public class Monster extends Creature {
    # S% L  Z, O& g' w0 [
  8.     private String name;* R5 }4 d2 y2 p" O. v
  9.     private double attackPower;5 n6 G, l$ Z4 c1 F( x8 B0 N. j
  10.     private MonsterState state; // Текущее состояние монстра
    3 g2 S* `( _' Q; `8 t

  11. ! Z+ t8 }, o* d+ N8 s  {
  12.     // Конструктор монстра
    # ^2 D% A8 R" T0 b; M5 Z
  13.     public Monster(String name, double attackPower) {
    7 y* r$ e; Z3 p, p/ V6 `; U
  14.         this.name = name;
    # h2 W; E" {4 i$ p7 d/ N5 k# x
  15.         this.attackPower = attackPower;
    ( l/ e4 K9 b$ V. w
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию6 e) H/ ~8 e3 ~9 r8 M! S. |) o
  17.     }* k% Y  a1 d5 [; Q4 Q$ r

  18. 3 N' V* T" Q# P- E
  19.     // Метод для смены состояния
    9 {4 B6 Y! Y: A' s' o% [
  20.     public void setState(MonsterState newState) {
    # @2 p7 X, p8 u' T, C4 r9 {  ^
  21.         this.state = newState;
    ( A9 a2 y0 \  @' k6 v- ^  X
  22.     }
    # B8 j6 w  k: K4 Y" ^
  23. * q+ Z# z* h1 Q  Y/ [, I
  24.     // Выполнение действий на основе текущего состояния
    , O+ M" u* z) L9 U
  25.     public void executeState() {
    % \$ a+ x6 f' f
  26.         state.handleState(this);9 S3 f9 x! H4 Z7 b& R
  27.     }' n6 i, L0 q0 g

  28. ! p* S5 a8 ]) |+ z, g$ K
  29.     // Геттеры и сеттеры
    0 K. B9 t% [( v/ s5 E
  30.     public String getName() {
    5 k, y3 i& @; q( y1 f2 s# `+ |7 H+ A
  31.         return name;
    ' c7 y- l# N0 z  t' E& s  c
  32.     }
      A' A  |% p, _& T

  33. 4 |9 v; \& ^, u0 k/ ~$ z0 E! i1 F
  34.     public double getAttackPower() {+ B. k: X- u* ]
  35.         return attackPower;
    ! s$ A* {6 Y8 ^0 D5 f7 \4 W
  36.     }
      F* N. B6 G. Z% E. S
  37. 2 S# y8 n: }0 X, ]% G% Y) K- s
  38.     public void setAttackPower(double attackPower) {3 Z' m5 u( ~, |7 c3 s2 W
  39.         this.attackPower = attackPower;
    # m% O5 ?+ r/ m& [" h# M
  40.     }
    % K- |3 U7 z5 ?1 N' w# U% u3 S
  41. }
    - Q8 d3 {% _  |' H# j0 H
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.7 v5 u5 U& n. [6 r2 D

9 {" ~: Y0 D, ~7 N" `% o5 n
  1. // Пакет org.l2jmobius.gameserver.model.battle
    6 a' I0 e8 _& a! A; k- F+ M: k
  2. package org.l2jmobius.gameserver.model.battle;
    2 u* n  J) H/ {5 h, r6 `$ P

  3. - L, A3 G, b. ^- Y1 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! }0 y& x6 @  ]% m$ u* h. X9 `! A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% T/ {; {3 L. o# ^* m5 I9 S4 G  O

  6. + j5 d- n8 f" v# L
  7. public class BattleSimulation {+ K# c* V7 t/ c1 D4 P% b- y
  8.     public static void main(String[] args) {
    - N  N* Y9 m+ Z9 Q3 r/ i* ]
  9.         // Создаем монстра6 D: j: W% q! \! W4 R; P
  10.         Monster monster = new Monster("Дракон", 100);
    / g- d: @( \1 A# {, O

  11. " C' f- `' z3 ^6 G0 q7 w0 \
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 [% i: L9 v4 K  {. q. ^
  13.         monster.setState(new AggressiveState());2 u8 k5 S# p+ B8 a- X+ Q
  14.         monster.executeState();+ |" p5 P/ n, ]3 u; R5 b" ?
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ H7 @% S/ m; s2 H! j4 r3 Z
  16.     }( ~' s9 |1 D& J) x! W9 J, L7 u
  17. }
    $ a2 |' c' {8 K8 B7 p( g
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
* w- N4 [1 }7 C+ [5 I) qЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!% ^+ D2 B* `; W3 x! s4 r( E, N& s
0 r2 `6 A% C; u/ l/ q( C' {- g* m( x

3 b/ Z8 x0 X( K* p1 o+ p# l: Q( F$ a8 U5 H+ p) E" m/ p* ?- V. }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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