Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
) c( X6 f& O& _* O2 ^/ i1 F9 o
5 U  i  i5 J; Z' p. `5 e  t
( x) a! ~, [" g0 U( I7 |
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.# _) T: Q2 P$ }5 S1 U
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 _$ o/ o+ L2 S- }: e' J+ u
Астралия ?& u' O  D2 N( l  Z* ]8 }

; m9 s6 I: Z/ r2 p. ^: J

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
2 K( ?+ ^# ~3 f1 }, k0 Q$ GВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
  p0 R2 r3 a4 X1 v& c3 h; B9 G; t
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 # R+ C9 _! q; f0 [2 s7 n
AlexCoder опубликовал в 2024-10-16 18:31
  U2 e3 ]* e5 p: A2 q! U  nДень добрый!* t  p+ s2 a' |3 J( G& Q
В статье описано взаимодействие игрока с N ...
' v2 @* I7 [; G- ^/ \* ^/ a+ {
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
, t6 C3 `8 b: m# {, o/ l& {+ i, p3 ]  G
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
& X0 M# `& J3 }+ U3 c! E+ E
6 Z6 R0 F% I' \) [* U* p" `+ JШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 t3 w- P0 ~9 c0 _% A8 N& ^* _- t& B
+ F1 O* c/ S; F! L: M$ @5 z0 e! A
  1. <font color="Green">// Пакет для состояний монстра</font>
    : {' \" t( [) `- U; I7 a: n
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 Q* U8 p1 O/ _6 W) _
  3. <font color="Green">( W$ T6 o* Z. \1 V+ t$ V
  4. // Интерфейс, представляющий состояния монстра</font>5 M3 R0 O: v" M  _" e( V
  5. public interface MonsterState {
    4 s% n/ U% i. D; z
  6.     void handleState(Monster monster);
    7 V# M$ _3 R* d
  7. }
    + d, D# o6 i% @. ]& I
Скопировать код
5 v- o6 D+ V$ B, U, G
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! L  |  A1 ]( O3 H% _' m9 C

& G" o+ F& ^% t3 ~! ~) \6 F5 CКласс для начального состояния монстра:: ?  p7 D: L. I3 s' _2 h  Z
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ; J: X* N) Y: M& Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    % b2 g+ d& L8 e4 X

  3. % l* o8 k5 q  P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # M( j+ n) y5 Q3 s: E: M% |5 X

  5. - S4 B: O! M+ T/ p- v8 T
  6. public class InitialState implements MonsterState {% }) w1 W: ~' V. l% X: y8 o7 |# o* o
  7.     @Override& _" k/ M; L. w4 w' g
  8.     public void handleState(Monster monster) {2 F+ U% d7 J7 j& O
  9.         // Начальная фаза боя* E9 F5 O) W: J  r! ]8 D% z/ _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 J$ k  o( n: V
  11.     }
    7 y. w9 S2 {' U" k# F1 j
  12. }0 b" E0 e7 r+ Q* E8 @( R: S9 Z
Скопировать код
$ z4 }3 F( G3 L

6 ~# k$ @& M( C$ e3 W% o: B5 {! E7 U; m- f5 ]* ]5 t

6 l8 g% r2 l; @8 h6 p  W2 R
! \5 E3 ^2 Q. M  O- b
( I/ v& V: s; F6 ?5 ]
5 ]9 Q6 U8 R6 Z% X) e+ c4 S
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* `! @5 h4 n$ p2 M0 i: B( @' w: p
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 {& U' r: H( M8 ~
8 j' F/ k# G! |/ s. j+ S% w1 k
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
1 l5 L% s# b- U$ c: T) j0 K+ i) ]% M( F6 M# k$ i) Y3 s+ }
  1. // Пакет для состояний монстра* {! b. y" D- }* f
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 m. m( m. P+ w0 Q/ c

  3. 6 [6 w* _! ^0 f: f9 S% m
  4. // Интерфейс, представляющий состояния монстра- K8 u  n* X5 q* \: X
  5. public interface MonsterState {
    0 `7 `1 y; o5 ~& A
  6.     void handleState(Monster monster);% P, e3 F1 I0 V8 Q
  7. }8 h4 |' p# f$ T$ j
Скопировать код
! p  ^4 d* _3 l2 h+ K
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
/ ?* d2 {. ?' n4 r
4 Z- G" R9 H/ a7 Z  ?Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( n/ ~9 o2 \7 w: ^1 Z0 W6 E/ }

. `5 l( r# l9 L! u6 _Класс для начального состояния монстра:6 g6 |8 I* i0 @2 t0 l/ w8 N0 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 h7 }. Y1 S: K9 L1 t1 R$ P7 K
  2. package org.l2jmobius.gameserver.model.actor.state;* L0 R; d, K/ R4 Y! D5 a
  3. ) {: h1 ?3 e' K
  4. import org.l2jmobius.gameserver.model.actor.Monster;  J4 b. ^- ]* p* A: o
  5. ) R* Q: H8 [2 G: X1 F
  6. public class InitialState implements MonsterState {
    ! a) ?. q% m) m) K) Z! d
  7.     @Override
    6 D9 ?2 o1 E; U( T3 }5 i; U9 S3 }
  8.     public void handleState(Monster monster) {8 e# T( z" v4 }( c) Z
  9.         // Начальная фаза боя
    % x( c: G/ W% J- {4 V
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 k4 _- Y, B% w# X2 q$ l
  11.     }8 h8 [$ ^1 j; c
  12. }1 [7 P" I5 [$ J& x. N
Скопировать код
Класс для агрессивного состояния монстра:
" ]1 b2 `. W! u- I3 A6 z' y7 g  K7 @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 P- S4 w+ ]% f, D4 U
  2. package org.l2jmobius.gameserver.model.actor.state;
    . R) Q* u3 k# {: j3 L

  3. ( q( Q% C6 F% X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , e4 r% _8 b5 m5 _' }5 p, c1 a+ c

  5. 8 l" z$ K/ \% ^0 D! u9 D
  6. public class AggressiveState implements MonsterState {
    + Q1 Z! w4 H: h7 J
  7.     @Override4 I& I: [6 \/ \/ g4 e$ x
  8.     public void handleState(Monster monster) {
    " P8 \  f6 @) N: q6 J2 B
  9.         // Агрессивная фаза боя* S6 o8 D9 j+ Q$ _" d, s% s
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    - W3 h+ y; T) [! N8 C" o
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    1 a+ ?# a6 `1 f/ @0 |
  12.     }
    6 R0 Y. |% Y: ]7 u6 Q/ I
  13. }" `6 ^% I7 l) b9 F/ [( e
Скопировать код
Класс для финального состояния монстра:$ K5 h" C" p  U: o$ H) }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% U# o5 U5 G2 M# I( [
  2. package org.l2jmobius.gameserver.model.actor.state;% z9 _6 K8 b% Y: R/ Q$ H6 j: O- E: j
  3. ! p$ H) h. ]; T- U5 T' h& p
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 H! B4 S) U! r4 t( Z- D
  5. $ w. f2 M/ Q, ]$ i5 C
  6. public class FinalState implements MonsterState {
    $ b* y" p$ S7 x7 M) y
  7.     @Override
    * j; m4 C- E1 T/ c4 z% v6 ?
  8.     public void handleState(Monster monster) {3 O3 N* h3 ~' ]# \
  9.         // Финальная фаза боя3 f) ^) E+ f- N1 J; e6 n
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");, g6 [( K) E$ C% D% V1 e
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 J5 y. ~1 O! s6 ^2 e9 O- r
  12.     }
    ( R" ^! f" k. W1 L
  13. }
    1 j- r5 u% `1 \7 P2 z5 A; H
Скопировать код
7 j, h/ j2 L! n$ l
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* x  p& q! }5 X8 @
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 ?  [+ y1 T+ W" g
  2. package org.l2jmobius.gameserver.model.actor;
    + H! q% p1 A- l. V5 F
  3. " |* R' n- G( ]
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' m2 a8 y/ @5 X  w1 w6 Q4 E+ P
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 t; {4 Q# `- ^! m; G
  6. 1 Q7 A* f- e5 r% J; W7 m2 i
  7. public class Monster extends Creature {
    . M4 d6 V2 T' ]* I3 j" L
  8.     private String name;  I9 u( K/ i, o. d% C& p5 R5 Z" y
  9.     private double attackPower;& P. d3 A0 K2 f+ [9 D* J8 N& D- _0 Z
  10.     private MonsterState state; // Текущее состояние монстра2 ?( P# S) x$ q. u: U; F% A

  11. , r% v5 P; e) b3 d/ m/ H: [% @
  12.     // Конструктор монстра! v; }' r' l+ e7 u
  13.     public Monster(String name, double attackPower) {
    * g% J/ o& p8 q  q
  14.         this.name = name;/ x8 F; G' ]4 K
  15.         this.attackPower = attackPower;* y& g4 W2 p$ b! I4 q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние* H2 E1 o) w. H( p) v
  17.     }  X7 Q2 y. H/ g. g
  18. - u* {3 E6 I0 t2 I7 B3 P- P
  19.     // Метод для смены состояния
    & I- b! f% l0 V, A4 V6 h1 g' A9 e
  20.     public void setState(MonsterState newState) {
    ; J" a4 Q9 k7 T5 H, ?& O1 O2 l
  21.         this.state = newState;
    3 ]  M& |+ A% p+ j+ s* E
  22.     }& X0 R4 }9 [& K( ^& l# G3 X

  23. , _2 a0 X1 Y- r" A  q$ _
  24.     // Выполнение действий на основе текущего состояния. e8 ?+ Q) u* ~: ]  f
  25.     public void executeState() {9 c* B0 Q' C, k+ ^' B) _5 @
  26.         state.handleState(this);) w6 P, S9 [3 P( k; a5 n
  27.     }
      p; }8 Z$ o$ |7 b( W2 ^
  28. . j' M1 U) G) S5 M' Z# Q
  29.     // Геттеры и сеттеры
    ' ?% ?" v7 K; ]' A  ?
  30.     public String getName() {  d, n' w4 v5 W
  31.         return name;6 _# A; @6 F, H3 ?
  32.     }
    % f9 d9 r4 }" x& r
  33. - @" s/ |4 a# k
  34.     public double getAttackPower() {  Q, {  j3 g+ x$ v, Q8 [5 g& `/ m4 W
  35.         return attackPower;% J& m% n' T% l4 l3 {4 P: p" \
  36.     }
    ' ^6 e- E2 |1 E) ?7 j
  37. ! G# L3 J' O6 E0 p
  38.     public void setAttackPower(double attackPower) {( T4 ^7 e2 d9 J8 K  h
  39.         this.attackPower = attackPower;: k/ G6 j4 l+ ~4 H8 H
  40.     }, ~/ W: K& u: N
  41. }
    ) A6 C/ t2 w) ~4 J  t: ^) S
Скопировать код

8 R2 k+ q. f: G8 j& bШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
- |) d7 \# N/ I: M- f: v
0 r1 t" w' B- H6 v; N$ s
  1. // Пакет org.l2jmobius.gameserver.model.battle
    " \9 ~: H0 r7 T
  2. package org.l2jmobius.gameserver.model.battle;
    : P$ a4 f3 J$ v( V# g

  3. % z5 x& s5 X% n: ^! v2 k9 ]$ G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) Y- k  ~7 @; _, e( s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    & G! K4 P, n) _5 e
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    8 j! V# G  S  ]# r$ G! s* c0 j$ B2 q" p
  7. 3 W0 n9 g9 D3 b5 B
  8. public class BattleSimulation {
    8 e0 ~- e( e, m4 G. H
  9.     public static void main(String[] args) {& |  U; K# l! g
  10.         // Создаем монстра с начальной атакой
    : e, E3 m0 k; ]- ~9 Q. j, H
  11.         Monster monster = new Monster("Дракон", 100);
    ) K3 a3 F' `( y$ N% A
  12.   h8 E9 w8 {9 T! U6 a4 `; \! J
  13.         // Начальная фаза
    * t, n% O8 Y. {7 r
  14.         monster.executeState();6 s, {; a; O5 ?7 \
  15. 7 t" w2 t' Y, x" Y& m+ M4 `
  16.         // Переход в агрессивную фазу+ @; u' M; r) |' S; U/ ^5 Q. _
  17.         monster.setState(new AggressiveState());
    ! q0 q& E; U; V
  18.         monster.executeState();
    . F- H8 j) ~" S5 u: H

  19. ( x3 t  I! k4 n7 K* Z3 [* `
  20.         // Финальная фаза
    " `4 P/ \2 ~( f$ D6 g
  21.         monster.setState(new FinalState());
    # ?  v5 i9 q: r- }5 F5 u( T* |' x6 n
  22.         monster.executeState();
    4 _  E0 c8 j* b' ~
  23.     }# o& }6 ]0 ~3 }) R* X
  24. }
    % E1 w0 \. D+ A( \# b' v) I- ]
Скопировать код

0 Q* _6 l* L! u+ ?/ u& y3 S! LКомментарии по структуре пакетов и классов:, h$ U$ R# s5 V7 v
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.1 B  y' j! M  P/ ?& S: }' y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
9 U' Q! ]6 r4 @7 \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!' \' f$ D6 g0 J7 {1 E# _

. T& ^, \, C- u; m* F9 M* F) j6 D9 M# M, Y+ F& ]% T
+ e( W0 `5 ?8 D

+ B/ C% K9 ~( s, m; W
' n+ c) X: }8 Q- k. ?! V! W1 D* n; q' h

7 ~1 g' k! t+ g
; _& e, H2 @! S: A( M7 }
* N# X: t4 Q; ~+ ?8 U/ m' m. A6 Z3 ^

1 f7 X& m5 u  d1 e+ U! ]
% D2 {2 Y% x8 @6 [- C  r6 Y; a% k/ O3 D3 p0 b, h6 P# b3 R

% Y8 y# l9 [( x- S# G
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04( i/ w0 @+ h" |) g
Для управления сложными взаимодействиями, такими как  ...

+ N5 A4 e; N/ |Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
0 \/ ~/ Y: A7 ]8 r, j3 L; TОтличный подход! Использование шаблона "Состояние" де ...
  n" z: \& [1 L, {8 X: L3 x
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.) z, I: ?% a& l; d
; V7 S" o% U  f# h5 L8 W
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.# ~" Y; I+ M* c6 h# @& w! Z
3 }5 [5 {- g- ~
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 t. @! U: s* D1 d: H
  2. package org.l2jmobius.gameserver.model.actor;
    & h* ^( ]! i" n; r
  3. & o$ O6 E5 U% B3 q
  4. // Перечисление для типов атак9 n# h/ u( E9 K$ s; _- H8 ]
  5. public enum AttackType {
    . `% Z# a6 E8 ^, ~
  6.     PHYSICAL, MAGICAL;
    - P2 |- A0 J& F  K
  7. }
    2 J8 z+ }1 S; `: I
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.0 O; x1 Y( L+ i. a# c
Обновленный класс для агрессивного состояния монстра:, p9 ?8 n; z6 A: E8 d: H

- o3 V4 a. ?* b" `7 M9 {" a( {& A1 c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      d) W  L& X5 C/ _2 A* L" R1 i7 F
  2. package org.l2jmobius.gameserver.model.actor.state;1 ?5 o. U9 r1 \6 }0 m1 U( P

  3. , l! S8 W) o# k0 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / t2 G3 Y; B- M: A7 D
  5. import org.l2jmobius.gameserver.model.actor.AttackType;3 b% f1 N) ]0 ]1 G

  6. 2 ?) w  r3 [+ Z. ]+ @1 m( d
  7. import java.util.Random;8 C# D" c2 }" k
  8.   Q" z+ ~4 G: `% o: }; e; Q
  9. public class AggressiveState implements MonsterState {
    - g: ^1 W5 [, A$ g# e5 s/ r
  10.     private Random random = new Random();
    , G: j1 M1 s$ s' u

  11. 1 n. Y% T+ O; h! ^' f$ z. N
  12.     @Override7 _3 a. D$ y; T/ A! J) ]: C
  13.     public void handleState(Monster monster) {* {" M9 E  n9 K: q' ]5 L% `$ q- X
  14.         // Выбираем случайный тип атаки: физическая или магическая2 p8 I; R8 c3 e; V; i/ z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ( h2 @3 ^5 A. M! ]/ F
  16. $ f) y* O1 j* C. G
  17.         // Логика для агрессивной фазы боя7 }$ C: D: Y" Q. R" w
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    7 ^. s0 P# X' w5 G2 J  D: l; s' _
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    6 d6 a2 Y0 H# x- u$ I
  20.         * n6 B4 j2 Q$ d6 X! w8 n' f
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    9 @; |, u: U9 D" Z
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;- b$ S& a6 C2 w
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);# F  t$ r5 H, g( ?
  24.     }
    $ r4 F: D  \  Q) G% K" j3 g
  25. }
    ! J- N) L( n" X
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
# v$ [: U2 ]5 R6 P& z9 X2 X$ t% M7 W  V
  1. // Пакет org.l2jmobius.gameserver.model.actor6 Y) ]+ ?( b  h
  2. package org.l2jmobius.gameserver.model.actor;6 d$ O" T9 y( h( g+ T+ ], Q

  3. ) U" \% {/ `4 N  [% f* p1 q/ X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 E/ U9 c- @3 a' C* C& w, R
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! {9 Q4 d  o% o9 S: d- d5 V
  6. & g  |7 U# }  J1 ?1 \2 \2 s+ Y
  7. public class Monster extends Creature {
    6 Y$ k; `( `- y
  8.     private String name;
    * C8 A. E3 f5 N
  9.     private double attackPower;
    ' |9 p5 `7 r: B. H4 {$ J  y0 r
  10.     private MonsterState state; // Текущее состояние монстра5 v; ?  H  X5 @, h
  11. 2 c1 D- l1 B5 v  U  p7 z' I
  12.     // Конструктор монстра. F# T3 `1 @  _) ^: p
  13.     public Monster(String name, double attackPower) {
    6 \( \& O$ S! v$ x6 X! `
  14.         this.name = name;
    8 l9 f) Z- ^% V5 Y; M
  15.         this.attackPower = attackPower;
    ) E) l, Y0 m8 F/ {- J2 [+ K
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    , y# ?# Z0 S" S
  17.     }3 \# `& W9 J% q: k) U7 z) a
  18. ) h! e+ R( _, @8 W
  19.     // Метод для смены состояния( B. V  I+ O4 M6 [( ^  H6 Z
  20.     public void setState(MonsterState newState) {$ B+ x! R8 [4 l( _- ?4 N
  21.         this.state = newState;2 f6 @! \7 B& z% K& G# \
  22.     }. \9 t1 D6 A+ Y; V$ z( ?3 N  K+ ^; D

  23. . g5 \% t8 q) m# @$ m. Q
  24.     // Выполнение действий на основе текущего состояния# |0 @7 B6 u6 l3 F  }' @7 g
  25.     public void executeState() {
    - w& z4 E, C' c2 b% u
  26.         state.handleState(this);
    + Z6 ]& n# ~) w4 m' b
  27.     }8 o! R" `7 Y: L0 L7 P9 n! X
  28. 4 h; S  ]3 j$ `+ {8 c, d; u. A3 Q
  29.     // Геттеры и сеттеры
    $ S$ J8 q; n, t
  30.     public String getName() {
    1 N* Q. l/ {/ S/ |! M, {; H$ Q) t
  31.         return name;+ g2 D: t: _9 N. E
  32.     }9 P0 r4 Y0 H. N* {. `) O7 X( ]! z

  33. # Y  m  Q; V# @2 ^
  34.     public double getAttackPower() {9 e. a3 \$ s) S# k
  35.         return attackPower;! V+ n) J- Z. L; h
  36.     }
    + T1 h) l/ f8 G2 ?! j% F, ^$ V- c5 i/ b
  37. 4 [5 K, ~) ~2 d6 y
  38.     public void setAttackPower(double attackPower) {% f6 B8 w' Z6 D  G# L
  39.         this.attackPower = attackPower;
    0 [8 `8 O" i- c! c8 E; v; Z
  40.     }
    * W: w$ c9 h. c: `; z% Z- J- m0 O
  41. }) x9 v' d; E7 M7 w+ H6 C6 Y2 ~* y
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.6 R# e2 N9 E" z0 j& Q/ U4 w
) |, V4 T  @# L* t5 Y& V
  1. // Пакет org.l2jmobius.gameserver.model.battle6 i" C. ?. a  r% [5 E
  2. package org.l2jmobius.gameserver.model.battle;
    % l6 H) S# w" J
  3. ! _7 ~: N+ t% z) ]$ e+ |' ~0 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;, _" ]6 ]; D; e: u$ ^4 R
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;8 A4 r( t: f/ y% Z  o% M

  6. * L" j9 o/ d/ l1 Q: c: U
  7. public class BattleSimulation {
    ) I% ~2 Y8 j, k. v  o. Z
  8.     public static void main(String[] args) {
    ( n" c, T$ n3 p5 f  a8 a; }$ s( o
  9.         // Создаем монстра
    ' W/ P0 r: P( z5 }2 ]
  10.         Monster monster = new Monster("Дракон", 100);7 I2 W2 P  p) B: e

  11. 2 E+ v! m/ p5 I/ {! L  f& I
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак& y' D' B$ i, m
  13.         monster.setState(new AggressiveState());, a, o$ {: m! Y8 Y( x) l# e2 L
  14.         monster.executeState();6 j6 K" p, U5 x* p+ E- ~3 Y8 b
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    2 z( {, V  b3 s  A( A3 F( @
  16.     }( g2 i9 P  F' e" Z3 f/ y! T, F
  17. }
    ) E8 S/ u' N* @  Z& }' _
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.7 u8 N% M0 D3 Z. M; b) _- d
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
- q$ y: S  i' ?. D) f( |" z' M. N) N, t
& u1 u" P2 O3 n2 e

! S5 h; P8 s% `. s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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