Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# T! i& \# z( ^( J
; \! ^0 j) T* g! j5 c

4 d# ?& V& ~1 b- wЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
$ y* n  |7 r* f9 d' P5 b/ xЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!4 G; U+ I) z+ a( |# v
Астралия 🌟! L: O8 P+ L2 V0 c# z$ ~1 z9 g

% m, J9 Q  P1 a' w. X

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ S1 B* T, t6 R0 v, h- ]) y. JВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 C; y  l/ G  L3 M6 x/ @2 Z& `( Y& G1 F! L) J7 ]1 ~0 L
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
, H  C! v; k9 R2 k# q
AlexCoder опубликовал в 2024-10-16 18:31
& I! K( Q: l# p; H; oДень добрый!
& Q+ J; B1 C7 g4 IВ статье описано взаимодействие игрока с N ...
, F- v3 |, i& B" `  {% Z+ x5 V& K- _
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& d1 r$ u' v2 b, m) X3 }- R
& J$ ^9 R. Y- tЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 S' \' l7 K2 U: I5 q: `: d$ v3 f
9 q2 Q' }/ a: p$ s3 zШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& `$ {5 a0 d/ _( q

3 n: j5 H* H5 V) j& n* _
  1. <font color="Green">// Пакет для состояний монстра</font>: y: ~, |+ ^, F' a
  2. package org.l2jmobius.gameserver.model.actor.state;
    # t$ Z! G, x1 \/ q& I/ y6 x: @- `
  3. <font color="Green">
    + ~' W; _3 t+ }0 O: w3 y
  4. // Интерфейс, представляющий состояния монстра</font>
    % Z6 ?9 D+ v& w6 S5 x' d7 L* M
  5. public interface MonsterState {$ v. X, W4 B  O! S% _& W* O
  6.     void handleState(Monster monster);
    ; g9 M/ m# c2 v2 [3 |9 h
  7. }
      z' ~. F9 D3 ?6 ]; ]
Скопировать код
/ A+ Q# F" @, ]
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# u# ^1 e: ^6 O

0 z$ t( }' J2 E/ g8 xКласс для начального состояния монстра:6 D6 S0 s7 V8 o. ?- W
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    " |7 ?# j% G5 \3 P6 G0 c8 s
  2. package org.l2jmobius.gameserver.model.actor.state;& l. b: N% Y" B9 k; i1 s( r5 |

  3. % t! `. G# V+ u3 k: w
  4. import org.l2jmobius.gameserver.model.actor.Monster;* c6 ^; p, ?, u8 r4 N+ N
  5. ( ?& O& A  e$ h) U
  6. public class InitialState implements MonsterState {, U" j/ T/ H! H* {0 A
  7.     @Override
    . k8 u6 [$ a+ d. [
  8.     public void handleState(Monster monster) {
    8 z& [( k+ M" x; C
  9.         // Начальная фаза боя/ v1 Y, w5 g" F" u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & Y7 `: l9 b$ k# M5 r
  11.     }
    ! u$ ]) y2 G7 Q8 I; E; U+ k5 E* e- J
  12. }
    7 ?( w& V2 Z' o4 [! H  @% A
Скопировать код
3 T( t; \7 K" c% j6 G" Q1 ^
4 {# E4 X6 D6 t' M- I+ }2 T) d
/ n3 k3 o5 F# Z' B6 s
, F/ W: i. g9 H+ F% @3 A
* \9 O/ y+ w9 T
" l( g. G% w& P: y6 h
3 r0 V6 ]. P8 L; c7 I1 m
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
5 V/ m* w+ ?$ n0 Q; [5 {! i8 M6 M5 i1 n; S
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* I9 A3 _- Z( \; C$ S& W' H
: }" J" P- ^6 j) ^- I8 [5 S. I3 pШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 _2 E% B3 e; B( {1 N3 u9 ^
1 _' s, C( x+ k* M
  1. // Пакет для состояний монстра
    7 c8 g1 s4 f& N$ B  _; B& j
  2. package org.l2jmobius.gameserver.model.actor.state;& L  I* Y2 k# g& n4 K

  3. 5 m: [# a( y4 A  |# h' ]$ }
  4. // Интерфейс, представляющий состояния монстра; s0 Z$ y+ W3 n. E5 w3 ]; H( r
  5. public interface MonsterState {
    & O4 s! J0 g8 w$ ?  Z8 P
  6.     void handleState(Monster monster);
    ; v) j! i' g7 w5 [4 J! W
  7. }
    8 L4 W/ p' e2 n/ y# d
Скопировать код

% r' q* s' v" p1 R- f5 O' l$ [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
' G: A. a, j% i% T$ }' L
+ F- H; v8 J9 VЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 x& _* P7 b* `7 B9 V
9 N3 j+ E  q# ~# ?" }; zКласс для начального состояния монстра:1 P9 M8 b% j% h$ g$ i# b: F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & b. m/ }1 z5 R1 o. N2 o
  2. package org.l2jmobius.gameserver.model.actor.state;2 T, A8 g+ C6 Q0 e2 G( }7 R- y8 R

  3. 9 l' m+ ~1 L' [7 p6 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;  w3 J$ m5 g' o

  5. ) G9 g6 j) p7 S1 p/ N+ }5 x
  6. public class InitialState implements MonsterState {# j! R5 M5 [9 R
  7.     @Override# F" B* ]7 r; @  F# r
  8.     public void handleState(Monster monster) {- n; `/ {6 e! r( q* y" w4 q- g
  9.         // Начальная фаза боя0 f. N0 ?$ K0 m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  q  s; y+ f% g: c. p
  11.     }4 V* W2 k& c: v; r. [; t, {
  12. }
    + B6 ~: P  R3 M. {
Скопировать код
Класс для агрессивного состояния монстра:
& H7 n1 d8 I6 C# L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, R; x& E/ H& E) Z5 G
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 H& C& {" `% n6 |
  3. * L! q$ K. c) m1 t* ^/ t
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 F0 R) m( s5 s& _- z; T
  5. / O3 w* x7 V  _2 B
  6. public class AggressiveState implements MonsterState {. T% u- U9 F  F
  7.     @Override
    , a5 J; v, K" g
  8.     public void handleState(Monster monster) {
    3 ]: Z; b7 r9 c% z
  9.         // Агрессивная фаза боя: i: e; c7 A, u2 Y# Q3 ?) d" f
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    6 c1 p' j- y' j5 Y
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    4 E1 |5 P9 D1 f, {# n# z4 u) j
  12.     }
    $ l" ^3 a4 @7 n* e* g9 U' ^. _7 m
  13. }; \& J4 Y1 `4 B8 Q6 d. c
Скопировать код
Класс для финального состояния монстра:: }4 K( k  e" @7 @1 \2 p. C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : g6 g0 ^5 C8 V6 B( ~1 x
  2. package org.l2jmobius.gameserver.model.actor.state;
    * M" J5 b$ p: \  C
  3. 0 L' A* T5 V* j4 r1 _: E
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 A/ N2 w! g# y9 K

  5. 3 o" q7 w' n' m+ [
  6. public class FinalState implements MonsterState {% q8 |; y" v6 i. v; _
  7.     @Override: o  ?" |/ D9 K) n5 |( l
  8.     public void handleState(Monster monster) {
    $ p0 t* n3 Q, A0 S3 v& |+ V! |
  9.         // Финальная фаза боя5 T+ |7 \0 Y- ~. R+ p5 e
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");: D7 O1 `  l) E# o6 `* ]
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    # T/ Q2 L( m- v0 Q. ^. j  m
  12.     }; g3 _+ N+ r7 |+ p& z4 D7 s
  13. }5 r3 F" A+ {7 T; W
Скопировать код
" b! M8 t* i3 H$ ~
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 u* `0 T& j: X2 Q4 Z/ _: }
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ B2 w+ L* G0 V6 i. K
  2. package org.l2jmobius.gameserver.model.actor;' p) Q/ H# C0 a  w3 a

  3. , V+ f4 z- d4 N6 h3 P0 p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 h$ A! Q: v6 E  @: e7 e' @
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . p1 P( U1 f$ Z# j: _- {
  6. . q3 G- B4 A) I* L' n% V
  7. public class Monster extends Creature {
    3 x6 u/ L3 B6 e1 [
  8.     private String name;- L: q: l9 x0 D% |+ I
  9.     private double attackPower;1 F1 W( O  `" F8 j" ~( [
  10.     private MonsterState state; // Текущее состояние монстра2 J/ u( z9 b  e+ b
  11. . Q) D# F8 p) g6 {
  12.     // Конструктор монстра; C' a# b  O0 h4 m" K, u  [/ Z
  13.     public Monster(String name, double attackPower) {
    ( k' ^  n) t- n1 K6 ?& Q
  14.         this.name = name;  m3 |6 }; V( |7 c* t
  15.         this.attackPower = attackPower;& e" a; Q& ^9 {) ?" I' y
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 `' Z- x1 z/ M( I# X
  17.     }" Z/ E3 R) B0 {* C3 N$ _
  18. 9 S/ i6 K0 J3 z' `7 k" P  f
  19.     // Метод для смены состояния6 n/ [2 o7 s( W9 F; u$ {
  20.     public void setState(MonsterState newState) {
      q# x3 o6 y- U
  21.         this.state = newState;
    - i7 D6 p7 R1 _
  22.     }
    & y  F8 \9 ]* ]4 _

  23. ' O6 F! ^4 m  e* p. l
  24.     // Выполнение действий на основе текущего состояния
    . Q$ J7 v+ ]( W* m) w
  25.     public void executeState() {
    8 U: j% p# q' Q' [
  26.         state.handleState(this);1 r4 Y3 J  e' U: Q" R
  27.     }( O& O  L6 b+ L" e: b
  28. & w# w! O) q/ {
  29.     // Геттеры и сеттеры
    7 z: i: h, `- k( y9 t
  30.     public String getName() {
    " U3 ~, I! \' Q) {) M4 O
  31.         return name;
    8 r1 i: O0 Y" O9 U
  32.     }7 C3 A  @9 V0 t6 W* W
  33. " p+ D, G9 l$ T+ ^) t! h) ^* [& e) {
  34.     public double getAttackPower() {
    ! \6 ^2 ~  g5 I% S
  35.         return attackPower;
    6 o: r6 x. E0 \- J7 |
  36.     }5 V& t5 Q. U" O/ r( ^! o# x

  37. % U: T* L8 L7 B/ H5 t4 o; o7 m
  38.     public void setAttackPower(double attackPower) {; ?6 O0 k" L* l; {
  39.         this.attackPower = attackPower;
    % T$ \( n4 u5 @) A, u- u
  40.     }
    % `* A- n5 S9 F% j6 `8 I/ K4 Y% `# P
  41. }; _1 u4 t$ o. x
Скопировать код

! m2 k! G4 I1 L# }0 ~* k( pШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
7 h) ?0 N0 T* t' v# s; \
( r5 k+ c; O5 b/ {
  1. // Пакет org.l2jmobius.gameserver.model.battle
    4 h) A- d* n1 x) W' y6 w$ `
  2. package org.l2jmobius.gameserver.model.battle;
    ( o8 u4 `8 }6 G0 t" b

  3. " Q9 Y6 }  D) Y3 q1 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 L, V- K5 ]* |1 d* e7 q. s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& L3 Z4 Z  Z% {- r: [% Y- N% k' a
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' S8 @, U, J( A1 Z

  7. # i7 J  Z: l. L  x
  8. public class BattleSimulation {
    ; h* T: {+ g) U) ?
  9.     public static void main(String[] args) {
    1 s# l3 ]# I9 B) j& i9 C, G$ I2 ?$ w
  10.         // Создаем монстра с начальной атакой
    ( r* ]! E* k& u/ w: w& B7 Y: @( Y
  11.         Monster monster = new Monster("Дракон", 100);
    $ D2 c! C7 M& ]: T& D) d
  12. * y; U3 y( T- _+ u  q
  13.         // Начальная фаза) l* c7 I# ?& ?$ d) D
  14.         monster.executeState();' r% z  p3 `( m- u( ~( H* o" l( w

  15. : `, u: z" j  r, L& A) I' {1 O
  16.         // Переход в агрессивную фазу
    6 V: ^$ u: _9 m: A1 C
  17.         monster.setState(new AggressiveState());/ |4 P# n7 I: N* X
  18.         monster.executeState();9 q, H6 I! f# w4 v( O

  19. 0 b8 u- o" K0 c+ r' @$ H
  20.         // Финальная фаза+ N# X) p0 B5 ]$ S* K
  21.         monster.setState(new FinalState());" x  v" S9 ?6 M2 u1 r
  22.         monster.executeState();4 F* m+ I0 l- w% G: a
  23.     }* N" B/ l4 ~" k! _3 {
  24. }
    , K6 @6 Z& w2 c8 x
Скопировать код

9 C6 R1 m% G& ?/ w; pКомментарии по структуре пакетов и классов:8 [9 e' i; O' l- W7 V
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    # _& p2 W# C% a: a
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.  C- E# _% X  o
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
- |+ x1 Z- w$ \0 \' M3 y4 i6 u; R. _1 n' [; }. }8 C

2 A# Y5 `. D' i3 g7 o7 R% y
: ~3 X6 J+ G# p) o7 k4 m2 m- d
4 w3 T+ H& M( w% s4 g; g. n) o" B
9 g  C. F( z- M1 C( O/ b/ s5 e3 u- ?- h4 k$ x3 q

  g5 E4 J, o! U+ A1 ]5 h) k' D5 W  {+ o

1 @& W7 R! G& w# N# H; {) Q
% x/ m7 g) d% e1 J
( J  u4 ~; t! ]; ?: J
. m4 k% s+ ]0 k4 n. Q
8 q! e  Y+ \( {# Y
2 h" E  L. B0 i
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04" I* v# K/ j; q
Для управления сложными взаимодействиями, такими как  ...

! S, Q$ W2 p- X0 [; Z* fОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21  Q. S$ {1 d4 y& U
Отличный подход! Использование шаблона "Состояние" де ...

" J2 r& g. j0 X; vХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.8 p5 f, t3 m5 \: C

# f4 b9 R6 Q( y& |6 _- [7 W; yШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
! x9 j2 U4 [0 R2 G0 w( b& r1 c7 S
. g0 X6 g0 D  t# G
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * K) S4 g0 f: }! b0 c
  2. package org.l2jmobius.gameserver.model.actor;
    0 m# H9 `* _. k- M7 e( l* y

  3. . S7 S- {, W# D
  4. // Перечисление для типов атак
      k9 D1 R- I" P' v; _% y
  5. public enum AttackType {3 I# r5 |7 f) _7 Q" ^
  6.     PHYSICAL, MAGICAL;2 {1 R3 O- ?, u6 Q
  7. }
      i7 N! @' e( \5 j- N
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.9 c$ h& l2 @' S* S/ r
Обновленный класс для агрессивного состояния монстра:! x( b/ J/ G4 \, U" u# J2 q

6 F/ r6 a% T& x: e% p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / r" _4 W3 J2 V- U, R: _% P9 T
  2. package org.l2jmobius.gameserver.model.actor.state;2 y/ v& a4 V% S& k2 d

  3. # |& U0 w7 p+ _0 u5 G% \. g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 [3 B. P1 g+ e7 N: D
  5. import org.l2jmobius.gameserver.model.actor.AttackType;4 E, @/ H0 Q0 `# E8 i0 I2 o

  6. ( g. b( G( k2 s: Q; y9 A
  7. import java.util.Random;( V" \! i0 l2 m& D. i

  8. : l$ V# q3 C- [' ~! S7 Q
  9. public class AggressiveState implements MonsterState {6 h$ `+ B7 {7 Q
  10.     private Random random = new Random();
      N+ x$ X6 t$ W4 ~, \* ^& ^' Z

  11. & b: p$ T  J# |- W, T
  12.     @Override
    : p& S8 F8 l# i/ ^% m
  13.     public void handleState(Monster monster) {
    + G% N: J5 u2 f1 n1 [
  14.         // Выбираем случайный тип атаки: физическая или магическая
    + ?' m, H- \# C  J
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;- |; x) z3 [3 _9 I

  16. " |% }1 Y% ]+ @/ _; {+ D
  17.         // Логика для агрессивной фазы боя* Y2 o/ n$ d+ {
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 0 q: l; t8 l% J0 s* C
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");* z3 J. z1 M1 q. u& |0 d4 q
  20.         
    / ^% d" r" X: M( R
  21.         // Увеличиваем силу атаки в зависимости от типа атаки( H2 |1 ]/ T8 u6 ^- _0 o
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    2 ~5 u% C- x- g
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    6 _# I, h) P. D2 P
  24.     }
    3 ]1 u5 \; z: G3 N1 D* o& t' [
  25. }
    " Z! q0 V4 W5 s4 Q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки+ t2 S$ i! x! ^! f5 n: T& B
& T& b4 w# @2 b7 \3 V
  1. // Пакет org.l2jmobius.gameserver.model.actor( b- A% F# G2 I& p1 }9 T6 M, p
  2. package org.l2jmobius.gameserver.model.actor;+ }5 p4 S# t# v

  3. $ A/ T0 z5 R" K  W- X6 O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    2 P5 X7 o. H( s
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; e6 ~( f8 I6 [: K* ^! \

  6. " G% c% b& `* |! q
  7. public class Monster extends Creature {
    3 [3 W  M' ^0 j7 q3 B
  8.     private String name;
    0 T0 g6 f9 s9 B* Q) n
  9.     private double attackPower;( O3 I, }9 C3 {8 d0 o4 [" p4 w
  10.     private MonsterState state; // Текущее состояние монстра
    0 R! z# b, R4 `, G  @) R

  11. $ S5 K% z* y8 `* {) z" l: `; k
  12.     // Конструктор монстра3 R( \, D$ l  a
  13.     public Monster(String name, double attackPower) {  D% P. h' h% W% |' d: g
  14.         this.name = name;. M7 V7 g4 z+ g0 [
  15.         this.attackPower = attackPower;. O4 L% ~6 o7 |; q: o* Q6 i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    - i9 ]: \, v2 m" i4 T7 f% T4 f
  17.     }
    " p: j/ A( e( I3 c  _4 \- }) d
  18. & X0 n5 R6 W* F9 r
  19.     // Метод для смены состояния
    5 {# }7 Y7 ]6 i$ |- C
  20.     public void setState(MonsterState newState) {% e# {- Z1 _* G6 g0 q0 H6 h" g
  21.         this.state = newState;
    6 c% y$ i( W; l+ _
  22.     }
    1 a+ E; E5 `+ q8 ?
  23. / y& x& T" w5 r6 |+ f4 n4 a) F$ ~
  24.     // Выполнение действий на основе текущего состояния6 t9 O+ x2 G6 J6 @
  25.     public void executeState() {3 D% u1 X- D) y  @2 M
  26.         state.handleState(this);& X4 w+ y5 m6 [% H
  27.     }
    : N" ?- W4 t+ U' b. f! i% y- e" m; |

  28. 5 s3 j. k$ O- D8 R( z, a+ B
  29.     // Геттеры и сеттеры" |- H4 A7 S' e+ ?9 |4 v
  30.     public String getName() {
    # ^* g" @6 a- x( O( ^, d" \4 C/ n
  31.         return name;2 H% Z. z1 Z. J) j' g( ^
  32.     }! q# W' L9 b/ i, ~( y: N: n
  33. ; ~- u0 d' o) G5 c2 O. t0 F
  34.     public double getAttackPower() {* q! b% o3 \5 {
  35.         return attackPower;/ u4 }' h2 b" t0 ~
  36.     }% e; f5 ?! X/ p! P

  37. ! |, l5 Z# [4 D- X" u3 b# ]7 |
  38.     public void setAttackPower(double attackPower) {  N) j- }  W" v' V/ i3 a: t6 T
  39.         this.attackPower = attackPower;
    : a1 `: G, j2 \; U) j$ U
  40.     }7 L" ~3 F2 Y; `6 i1 W0 f7 B
  41. }
    ( |9 M7 x. ^, x
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: G4 ]2 R8 s: c
. w9 A, {) q: R0 `# `  f2 @# K6 ^7 u
  1. // Пакет org.l2jmobius.gameserver.model.battle$ ~( V1 n1 c% }: G) ~
  2. package org.l2jmobius.gameserver.model.battle;' O& W' |# A  g% q7 B
  3. % L0 Q9 h% [% f) g9 a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ ]. Q4 F. ~4 l3 ]9 v7 i
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 i4 A+ R5 F) s2 X- S8 c! y( O/ `. R9 d

  6. + [+ E0 X9 f/ N- J
  7. public class BattleSimulation {
    ( Y3 \/ Z+ t$ s) S
  8.     public static void main(String[] args) {3 w9 G$ H6 g3 q2 p2 k6 I
  9.         // Создаем монстра8 z/ k  \7 G, J3 ]% t  F
  10.         Monster monster = new Monster("Дракон", 100);' z+ j9 d6 J) r# p, b6 j1 H, q0 ~( Q
  11. / D2 w$ w: E& H8 b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ x3 D( [2 j+ t; F  X8 v2 }8 a; x; O- }
  13.         monster.setState(new AggressiveState());
    4 w# y. l* w  k  r, L1 {
  14.         monster.executeState();: H0 e$ y8 M2 J6 q; Q- D0 V
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 Z3 B- C- n( H& V" D" B9 I
  16.     }9 q: i$ H  R. I* ^5 M6 G2 C
  17. }) x0 v& a+ D; h5 K1 {
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
( o: I6 a2 T; ?Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
  K1 d+ [7 C. U0 \' i& v  `2 l+ j, a& Q

" y7 R# f* v% D4 v3 f) C
) R! v7 u4 P* j) k7 D, Q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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