Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
1 N3 x+ p; C( y( N9 h1 @1 o$ t/ e/ S" B: b

2 H, n* t) T) nЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
- D9 q9 B& t* R; ~- VЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) V7 Y6 E: z, l" D% X  iАстралия ?
) r/ }# _( r7 w: C2 g4 s4 c( l0 x7 O& t! B! W

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!+ ^9 B, Q, Z4 d/ K  ?
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
' Y% Z2 [+ ?) J" U. f7 v* p4 i! J0 y9 |& O1 N" q
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ d. \  t4 e* z3 t; m/ x6 k
AlexCoder опубликовал в 2024-10-16 18:31
! N0 K7 K: Y5 n0 ~4 @День добрый!
$ n: t) W. p0 K9 i6 `В статье описано взаимодействие игрока с N ...

) @5 _* u, l4 Z8 b5 f7 S; sДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" c7 x5 x6 [% k9 }4 Z) @9 _8 V& @- @/ }, E3 r1 x
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* X* d2 o! B- J! `6 I3 d8 t, z6 \" H* U' Y) F4 }: E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., U( _, z8 s* w+ [0 A4 S# a6 e+ e
9 z0 F4 n1 Y' V7 g. a3 m" h
  1. <font color="Green">// Пакет для состояний монстра</font>
    5 p) U, ^0 N# t: W8 e
  2. package org.l2jmobius.gameserver.model.actor.state;
    * L, F3 t- u; s% ]
  3. <font color="Green">' S9 }( [- ?9 ^' u3 ~
  4. // Интерфейс, представляющий состояния монстра</font>
    2 p) x, D' c/ m4 l7 e) F7 k5 L
  5. public interface MonsterState {9 r* q; ~2 m( M$ U' `
  6.     void handleState(Monster monster);
    ) S6 v4 N4 r2 q6 U
  7. }: g  Y- Q6 T5 S' v
Скопировать код
+ m: t2 m) t$ d" m+ K
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ r  z; }; K7 ?) z9 A0 c( _7 d* a" I. u: _" s! m- o8 S
Класс для начального состояния монстра:# O, e& o4 q3 C" S* N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 n% Z9 V! }  e: C2 h
  2. package org.l2jmobius.gameserver.model.actor.state;- p* j+ M* M6 i  s/ x

  3. ' J9 `5 m4 u' x' L7 ?; m7 e& M& i, V
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % C5 A9 E6 I5 J0 i+ _$ h& e

  5. ' y# m7 y5 f) }, B: P* I
  6. public class InitialState implements MonsterState {1 W+ |; E$ G6 s3 F5 j% A
  7.     @Override6 M/ E& o4 g7 j. F
  8.     public void handleState(Monster monster) {
    . M$ G$ ^# p/ e$ b" @* U* x2 u
  9.         // Начальная фаза боя
    7 q5 z( }. e1 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    $ n3 n1 l5 s2 X% X5 r
  11.     }2 x& `0 Z) Q8 w, o7 [
  12. }
    * ?" R% o; p7 I2 `+ n% H) e/ C
Скопировать код

) G1 u( z5 \7 U  p7 ]5 ?0 r
( w: U; f+ M3 A2 l3 T/ u- \1 D% C3 W* D9 s8 k5 ^, b7 j

  k. K$ r( k( Q- j, t0 z
5 g' V1 d5 d2 p6 b; }0 {3 ?. b& a$ L6 D4 V9 c

$ k6 D. A) C+ O# r6 E2 v" F
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 a2 ^$ |( {2 j( Z  q0 F, H- @7 z3 k% c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. [/ j$ f* @* R* T6 o& N
9 z  L$ m9 D# O0 Y$ C' J8 v# s! Z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% a6 M/ f3 U  V) d+ C5 g
% o2 ^2 B( `7 i) l+ N# a
  1. // Пакет для состояний монстра
    5 U# i0 V5 E$ |
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ u3 v- U0 K9 i# |
  3. ; E$ V3 `! c. e+ C
  4. // Интерфейс, представляющий состояния монстра1 ^1 [2 ~) W; R6 W2 `
  5. public interface MonsterState {2 c. z+ `1 y- {$ Z
  6.     void handleState(Monster monster);4 M# w$ G9 c0 Q# ~' L, L: r. o
  7. }1 G7 _: z' _" W
Скопировать код
* m8 O' ?1 \0 k  ?& W, I1 Y1 M
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- L+ w  `( }! }* I/ P% G( p4 T2 E' ?* o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ }" O- q$ f# f8 \
: g0 z- [, C1 L% M1 c3 [2 }: ZКласс для начального состояния монстра:
8 w1 s$ B( ^+ |& N7 U9 H5 V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . b0 m) x" I+ n
  2. package org.l2jmobius.gameserver.model.actor.state;( f. F0 {5 T' G" T. m
  3. 9 q9 h& h3 V! N& U  B  K
  4. import org.l2jmobius.gameserver.model.actor.Monster;% I9 m# L/ N& u0 g! {

  5. : S4 _. @6 @6 S' G" h
  6. public class InitialState implements MonsterState {
    ( X- `8 A5 M6 i, m
  7.     @Override; }: E  _0 q. F1 b
  8.     public void handleState(Monster monster) {; ]/ e+ a% t! h$ v
  9.         // Начальная фаза боя4 m; j: L- D) o3 z  V2 l' f$ m4 _- [' U9 g
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 S# R) f& W2 T2 d7 M, C
  11.     }" d0 g# t6 c5 M" r( M( C5 v# `- F
  12. }2 U' X# T2 J4 y, C) P' @
Скопировать код
Класс для агрессивного состояния монстра:
8 L5 Z2 N( p9 ^8 v( C/ N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , I) N) o/ `* G. r% k- `( z; }6 `
  2. package org.l2jmobius.gameserver.model.actor.state;
    " p0 j2 g6 {1 i1 a8 b

  3. / J7 E& g' n) ?0 F7 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ x- v+ |# o' L1 w/ w  q
  5. 4 o3 D2 Y( y4 C8 A% X' l" f
  6. public class AggressiveState implements MonsterState {4 r3 o; I% \) B9 S) M! f, r
  7.     @Override
    " E; b. z7 r0 X
  8.     public void handleState(Monster monster) {
    & x) Z' Q4 s9 Z/ \% h  f
  9.         // Агрессивная фаза боя4 [( L2 x* }. w! D
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 u: \2 l' c; h3 ^8 _  {2 w
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки5 v( e5 f$ K+ j4 v6 \7 L
  12.     }! r. X2 Q1 U; w6 T1 ~
  13. }
    4 a4 L6 Q  z* o2 K0 {
Скопировать код
Класс для финального состояния монстра:8 I% C; [( o# o7 |) u4 o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 p# D& L' \( ]9 u5 D8 s3 \; I
  2. package org.l2jmobius.gameserver.model.actor.state;2 J# k) b8 ?, o. e1 ^4 f4 ^0 a
  3. 2 c& H. |  m  }  T' X6 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      B) q) m- _/ s# Z+ k9 k) \

  5. 4 u* h8 _# O# z9 H  f' p
  6. public class FinalState implements MonsterState {
    : |: J8 n; p8 A
  7.     @Override
    / h1 I8 x$ g8 l7 J4 A& C: t: ^
  8.     public void handleState(Monster monster) {1 Y& F4 e% K$ I  I" G6 Z2 J% n0 h
  9.         // Финальная фаза боя* {* f+ t9 p# J3 C9 A- g
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; k7 {, q7 k4 J8 h) V8 M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. i0 Y* E& o+ @% V( X4 ~0 H
  12.     }) y1 ?- b, l( [! B. w" f
  13. }
    ; ?- M0 d- B' v$ ^# O4 I
Скопировать код

. \$ K8 W  f+ L/ SШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
7 g$ f+ Q- k) Y8 T2 M
  1. // Пакет org.l2jmobius.gameserver.model.actor& h* ~6 h, y: M! o$ t% e
  2. package org.l2jmobius.gameserver.model.actor;
    % L( y% G/ z8 t

  3. 6 S6 `3 P8 @3 Q/ {( ]5 }: |
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 K4 N& F+ x7 P6 p2 g1 ]& w7 i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 g- p' j6 n0 {4 t
  6. + G# K; @0 V- G; e: z
  7. public class Monster extends Creature {# I  R; W0 `/ m! L5 h" C
  8.     private String name;
    & @6 _4 C/ M( s! Z& X
  9.     private double attackPower;
    3 `$ {4 E3 z' J+ K4 ]0 p6 W( V
  10.     private MonsterState state; // Текущее состояние монстра
      a1 `$ Q% t: N. B$ p+ ]
  11. ) b9 R" O6 X9 V% _6 r0 u% I
  12.     // Конструктор монстра
    ! N9 }3 U6 m7 s% v
  13.     public Monster(String name, double attackPower) {; I1 H1 a; Q  ?* J$ w2 c" O
  14.         this.name = name;3 `5 {& n9 I. w3 `
  15.         this.attackPower = attackPower;8 D, A, P' z5 P: ?4 Q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние, J3 s* g' Q+ u( _
  17.     }+ N8 m, r" m+ M5 h0 ^% m; i: `& F2 g

  18. 6 g6 f2 r7 K# W! k
  19.     // Метод для смены состояния$ y% T* }4 Z; r! [
  20.     public void setState(MonsterState newState) {! J( u. C, g, m9 X
  21.         this.state = newState;
      C3 F: C3 u& j, o5 R/ ^3 ^* i7 {
  22.     }
    ! M1 W* r/ ^! j) z2 `, `9 T3 O
  23. / L) b9 j1 s: z1 J
  24.     // Выполнение действий на основе текущего состояния9 @! V9 t4 r. V$ _
  25.     public void executeState() {2 K: l' Z% I& d( X
  26.         state.handleState(this);
    3 j, s- K! @$ }9 w8 g
  27.     }
    " M& e3 A' v  ?  i" a+ h) F1 K: `* x

  28. 8 L" w$ J1 r, B) ]
  29.     // Геттеры и сеттеры8 i* y; n8 J6 l* L. W5 N7 r
  30.     public String getName() {* O/ T& s2 h, z  {
  31.         return name;5 ?; ]4 d- _; W$ T$ j
  32.     }1 J1 W+ G( g; p: h
  33. 8 k0 a, b2 E8 K* v$ N7 M' z. {! j/ Z
  34.     public double getAttackPower() {, n" {8 P2 k0 i
  35.         return attackPower;
    ; f' r6 r+ d3 S& U2 C  R9 E
  36.     }1 S  }3 i' {- y0 t$ M$ G
  37. ) H& f2 D5 e+ P- k
  38.     public void setAttackPower(double attackPower) {
    ( Y- B, |4 h6 a9 _: D- w$ E3 T
  39.         this.attackPower = attackPower;6 D. I8 K3 r  C  i+ L1 e
  40.     }
    # M) M% w* H8 I) O1 {
  41. }! D4 ?# S, Y' ^6 r
Скопировать код

, }: p# i/ n- F6 d7 c. CШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.! a2 k4 Y/ P) }& Y& k9 {3 L

! I2 R2 K" g9 M' O4 {! y7 y. M
  1. // Пакет org.l2jmobius.gameserver.model.battle  Q1 G$ S9 H# i5 S- W
  2. package org.l2jmobius.gameserver.model.battle;* K- m  ]* K2 d7 A( {. j; d' V
  3. 5 M7 K$ Z: {, X0 F9 q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 p# l& G* d7 T+ f/ G/ W. Q  r
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  p9 ]$ Z+ j" i) @; Q  r
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
      x, d) ~' C7 N* m* `

  7. ' |9 r0 _  v& K6 C, [
  8. public class BattleSimulation {
    3 {  v  }; u/ g4 w) U/ K+ Q5 l
  9.     public static void main(String[] args) {( H; a6 Y  K1 Y7 W! y7 P; b: z( x
  10.         // Создаем монстра с начальной атакой
    & @5 I  v' `8 s9 d- \* v
  11.         Monster monster = new Monster("Дракон", 100);: W- A9 F9 T! z' z+ K7 [* Z

  12. 0 T6 i8 p2 i0 S6 j, q
  13.         // Начальная фаза, T( j, q3 ^/ U% b
  14.         monster.executeState();
    ) c( U  ]0 u$ m# d3 u- W

  15. " ], o( g. E  A& e4 D! P
  16.         // Переход в агрессивную фазу
    3 O0 }) ^8 H7 y" P# A
  17.         monster.setState(new AggressiveState());
    4 D. c0 _! d- F" t" z2 G! t0 H/ [- A
  18.         monster.executeState();
    , H/ L( n/ V5 i) q9 q5 y

  19. . C) K" u! J) Y% {
  20.         // Финальная фаза1 P" K  C3 r& B% p
  21.         monster.setState(new FinalState());2 t7 q2 m1 M$ N+ L1 w
  22.         monster.executeState();7 A( `! a. y, R" \
  23.     }- [' F7 j/ Q, @- A. V
  24. }) Y3 J4 v6 e3 v' ]! D
Скопировать код
; z) b% L$ V8 v; E
Комментарии по структуре пакетов и классов:
) h; Z  {6 W# Z7 f
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    . X3 L  x+ n% e# a
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) f' Q$ U; y/ R4 E
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!# Y" J3 ^8 _$ d! p' S

5 y  y# P* e: ?0 w
9 Z* O1 ^5 s. m1 c1 M& T7 z
; A5 Q4 u: @( ~5 Y( C# ]- j! x) }# P; _7 n! p1 z$ w# _( _
0 m' I8 H, i* W* ^- x; j

- q' I! S- r3 G+ f  A7 L  \! b7 Z& h+ g! o
+ V! x, `% C& ^$ n9 j

1 |6 a6 t% c% N7 m" k
; P* E- c: w& b: E
& a( D$ k0 P9 j" ]: n- M( d# i5 P; [# b) E* ?: `/ O: C! o
3 n7 |, U4 O3 @0 c' \

+ }/ Q- `2 b( H9 `* ~
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
% e, U. C# A. p+ ]$ E. j( z7 zДля управления сложными взаимодействиями, такими как  ...
, v! a" ^- j( E( q7 h! ~+ M1 N. A
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
: ]; K, b: @0 v+ l; F6 y2 c$ {; ?Отличный подход! Использование шаблона "Состояние" де ...

9 v0 m) w8 H. r( H% I) I7 {Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.( q4 w8 F- t& b$ \3 ?

. Q+ j9 T5 N5 D; ~# Q) w$ O" BШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
2 k* R. a1 b0 L
, |5 ^) {) e/ d9 G- P# d* A; ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * z, f8 e4 U: K! u# ?/ i5 h
  2. package org.l2jmobius.gameserver.model.actor;! S) O  J. E- k
  3. 2 S6 W  m% n' ]# l
  4. // Перечисление для типов атак
    9 p& D0 K1 Q5 i) k. {
  5. public enum AttackType {3 V3 B( Y) V! U7 G4 s) r4 s
  6.     PHYSICAL, MAGICAL;$ U! V$ h: v! k+ a5 }1 O/ x( z
  7. }6 u3 B+ s# h3 a  [
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.0 h9 }) v5 X! }) B  g6 F9 c& q/ {
Обновленный класс для агрессивного состояния монстра:% I& k& @, U2 N: u3 [- q2 O
0 n6 O% \: d5 E  ?1 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 D* o' f& g: B+ a
  2. package org.l2jmobius.gameserver.model.actor.state;1 Z/ C0 c' i/ ]& C1 ?

  3. * m* F) m& I6 P/ K' C; T* O
  4. import org.l2jmobius.gameserver.model.actor.Monster;. b/ ?( D5 P5 h6 r
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    . R$ E1 L4 X- o; O; d

  6. 7 F( Q, Q& H$ {  ]! a
  7. import java.util.Random;
    + r, g6 ?. T+ P% k5 W" u8 [9 d; o9 T0 b

  8. & s) ^$ z  s; e0 O" H1 o
  9. public class AggressiveState implements MonsterState {
    % g$ I" o, q" J
  10.     private Random random = new Random();& }. y0 r  |" M: P+ J; I
  11. - q7 g1 _$ G" M8 R0 |! o) k
  12.     @Override
    5 S0 o8 s+ U# f6 A! z" D
  13.     public void handleState(Monster monster) {6 n' v+ F7 }! N/ T. o6 ]
  14.         // Выбираем случайный тип атаки: физическая или магическая. @' Z: a* o& @6 Z; Q( _
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    9 [2 W4 b) `  R1 x2 R
  16. ( F  u' j1 N  m
  17.         // Логика для агрессивной фазы боя
    , n/ R4 D/ Y' w8 d- _% B
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    2 Q3 u( V0 u- D( J
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    5 I) ~0 [7 w# ]: J( ]$ B% o" {2 q
  20.         4 c+ u4 ^( r/ R
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    7 Q2 n# h$ U/ V& @" G- ]2 ~  e
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;) w" l& h2 \4 x8 _
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    7 j( ~" G' z) K8 F% h  C% L
  24.     }
    2 V4 l  i) m5 A, O+ \
  25. }
    - C9 r% p6 I% Q, Z  e
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
0 n8 J% h: U+ Q& S# A6 f6 `
9 G- H" U& G- y, p4 x/ @! Q
  1. // Пакет org.l2jmobius.gameserver.model.actor* [6 ]1 k3 L3 y# V- {! y
  2. package org.l2jmobius.gameserver.model.actor;" E- n' \& l* Q
  3. , l$ Y" ^3 a9 k) s( }5 W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- K6 D. N7 Z& n9 {% W/ `8 w
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    0 a! Z9 @1 z, s. f5 J
  6. 6 C8 w5 q0 B, h+ A4 Q/ W
  7. public class Monster extends Creature {' {6 s2 ?6 q/ u* K3 U+ L
  8.     private String name;$ J3 \( T" [: f; j; p
  9.     private double attackPower;
    % j1 n" |3 x" c( u$ z/ H- C
  10.     private MonsterState state; // Текущее состояние монстра) c, ^/ {9 s# d8 O
  11. + o' E1 \7 u5 C+ \. k6 n
  12.     // Конструктор монстра
      C+ L6 d/ f' d
  13.     public Monster(String name, double attackPower) {
      \7 X; ^6 J# p/ u& T
  14.         this.name = name;
    " L. T4 C5 {2 p% P9 x
  15.         this.attackPower = attackPower;( c: v, R' O; T+ c, c( i- W) Z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию0 Y5 u' ~8 d- E
  17.     }: X" w9 P" }0 G* h8 `6 r

  18. / E1 {. ?! ?1 o9 ~" @! c
  19.     // Метод для смены состояния
    2 U7 t1 ]) ?* Q' f- I$ M
  20.     public void setState(MonsterState newState) {
    9 a) J7 Z! \( w
  21.         this.state = newState;
    $ H6 ~5 G1 W9 Q- A! j( X) i* H; F
  22.     }
    - ~8 f. \2 `' E0 P
  23. & D: ?4 i3 @& U( x" J9 F& w
  24.     // Выполнение действий на основе текущего состояния
    $ a: M- A8 E; K. R  K0 C
  25.     public void executeState() {# }+ c( |3 t, m! H3 a: o3 h
  26.         state.handleState(this);9 F# Q& D# K- o" |' I
  27.     }7 w4 Y6 t4 N, L1 i
  28. . z. ^8 B- A+ M- h* s- T, ~# [
  29.     // Геттеры и сеттеры
    / O0 u$ L6 K; r. M
  30.     public String getName() {5 m" M. T: O  `
  31.         return name;
    , @# U2 S/ O2 w# J. H3 P
  32.     }
    4 Z! c, z) E5 ^  r6 T; }

  33. 8 `, ~- r7 I4 h' V) ?8 {
  34.     public double getAttackPower() {
    ' D- {2 s, t1 |% V8 ?, R3 z5 t( o* a
  35.         return attackPower;5 g6 n( y/ L: y( Q% g
  36.     }0 i. \! ^" c5 v4 G
  37. / C+ A8 D0 L- }( }
  38.     public void setAttackPower(double attackPower) {2 m* ^+ O0 y5 M- {1 u
  39.         this.attackPower = attackPower;: l0 P6 ~3 j4 B+ J
  40.     }
    4 T; j3 ^4 f- W6 |% p
  41. }. S% h3 y* {  e
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.' u" C" o6 o9 I( @; n, A5 K9 U: }
& m/ j: i  Y, I4 q! G. e
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) W& \3 _- k, M7 ~% [; n8 R+ R' G
  2. package org.l2jmobius.gameserver.model.battle;4 O2 k* |2 j7 _/ {' `
  3. * N0 v! x/ [: Z8 }! c
  4. import org.l2jmobius.gameserver.model.actor.Monster;& Q2 p3 p! q3 ~( y/ d& k( j
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    $ j9 i6 n% s% J' u  |6 i# A

  6. " P) i4 b$ R" j( ]3 e* |3 w* \
  7. public class BattleSimulation {( Z, O; o6 B) z1 z
  8.     public static void main(String[] args) {7 I2 g2 h2 k- c* i& p
  9.         // Создаем монстра( `" ]' l  b4 }, Y+ y9 @) v
  10.         Monster monster = new Monster("Дракон", 100);+ H3 w" ?. m7 h$ k4 a  R1 Y  N

  11. , W; ]  e& W$ A) X
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ z8 ~- X; \8 f8 l7 ~4 v8 B* n
  13.         monster.setState(new AggressiveState());
    6 v# Z/ X2 S% W  O
  14.         monster.executeState();8 I) p+ S3 H7 g. a% J3 y
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ( c' {& v7 w8 y5 O
  16.     }+ b* t) V' _% x
  17. }
    # l. F9 u0 N+ [# [! Q) u# b5 _6 v
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, y: H4 E' i& P4 GЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!: v) R' W! w1 Z4 ?0 D' c- N

) g7 o9 |8 E, a8 S1 q4 F9 u* A( \8 n8 Y! v

5 D, O7 B" a* ^: S
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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