Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
: w! Q# \* T/ D- S  R! S, H0 k# ~$ J
- ^$ b% ~3 H  c- C; S* e
) D% M3 w1 E4 @2 r7 H- `2 d( t
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы./ ?' b0 a, S- A) @. }
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!# E1 L9 a/ b  Z8 V
Астралия ?. j& W; D1 k6 M( d% |
$ f' L- V2 h: ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
4 N2 y+ B. u; i+ V) L, r! qВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
& l3 U' Z/ Q6 [
2 b, u" S: A' L6 F5 n
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ! y3 n/ U: y9 I9 N; d$ U# n  @
AlexCoder опубликовал в 2024-10-16 18:312 W; |' E& ]" `
День добрый!  J8 i( @7 r1 p! c; t
В статье описано взаимодействие игрока с N ...
3 J) y, C9 ?  D9 B
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 W6 g% V" S; y+ u" I
) _  ?& M; c- KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
% c2 c: x: ]1 w. V2 v4 D. w* N% H5 m8 J) l4 Q: p' f7 t. G
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
1 b* o+ R7 I2 R$ R: p$ L$ l9 x3 p: q" t" a# k9 ~9 h" X6 U
  1. <font color="Green">// Пакет для состояний монстра</font>! j6 W5 o1 e4 y7 T/ Q/ S$ G% b
  2. package org.l2jmobius.gameserver.model.actor.state;/ H2 f0 ]; R( I) M& p. C
  3. <font color="Green">
    7 d% h1 v9 R/ }
  4. // Интерфейс, представляющий состояния монстра</font>
    1 l% I' q+ T0 K: n3 N; i
  5. public interface MonsterState {0 B4 u8 F" n6 O. T8 K
  6.     void handleState(Monster monster);
    9 ]4 Z) n2 J  T
  7. }
    4 K1 J0 y1 n% R+ }4 n( e
Скопировать код

4 `* C# W1 T, {6 gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. l4 {: ^( v% ^+ h* _  K% F

1 `  o/ ~7 K9 _Класс для начального состояния монстра:) H5 z1 \- Y$ `, @7 e
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* C# O$ _0 |& s. t3 v5 t
  2. package org.l2jmobius.gameserver.model.actor.state;# A% A$ y' r0 U
  3. * o0 `  U# D& r3 ~; z
  4. import org.l2jmobius.gameserver.model.actor.Monster;" R6 |3 b0 A8 G: G

  5. - o  c( o; ^7 U) W
  6. public class InitialState implements MonsterState {" w0 O8 O! u, P% ]' T7 K( T
  7.     @Override' w4 w' c7 U$ o$ S& v' X# \
  8.     public void handleState(Monster monster) {
    6 U' Q3 u: k5 Q7 R# e: z
  9.         // Начальная фаза боя$ C& ]! b# T( s6 d: Y1 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");' {( p3 P/ D' C& F( I0 X3 q
  11.     }
    + C, J3 Q! |! ?* a% @; `9 H# P
  12. }
    . W% F( f, D7 }% F) t3 {" V
Скопировать код
+ k4 ]5 T' N$ U9 Y1 P1 S
$ V) ?9 s4 |5 `( @% }

5 T$ ?8 i5 r6 M% [' [! H; P$ I' X2 D& a  s9 ?& n/ [1 V1 t

: `8 w2 I- Y$ a3 P
5 S6 ^8 P( ~/ q& N4 h9 E) [' K3 _+ d
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - @4 |& T1 v& Z

# H4 N! N1 ]# kЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.8 n& t3 L! j1 T, R' i: J( W

2 v# |4 B& |5 ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: y1 O7 j# m* _6 I" F+ W5 ]
# Y) I# L% [/ G% h; F1 x( }) ?
  1. // Пакет для состояний монстра
    * k! K% |1 _3 t
  2. package org.l2jmobius.gameserver.model.actor.state;2 p1 k8 E3 B; H8 |
  3. 2 X  q) k9 |7 E. m; Q1 T
  4. // Интерфейс, представляющий состояния монстра
    6 h' i/ ]; J' Z: I9 ]
  5. public interface MonsterState {
    ; j/ P3 F  E& g4 m- `
  6.     void handleState(Monster monster);
    - M4 k# S/ F! A' N9 A% g/ P+ \
  7. }8 K3 c1 d1 d+ ~: P) d2 _6 m/ ]
Скопировать код

# b! J: c  S; F8 m7 \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
% T- P& P8 {" y4 U; T- n' |( o7 W1 q, w: T
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
: M+ e4 o/ h/ L1 H5 z& }6 W. O" e; l+ O3 y! @: Q
Класс для начального состояния монстра:
7 f3 e; R9 c6 p+ J. J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % \5 `; _6 c$ C, @; U
  2. package org.l2jmobius.gameserver.model.actor.state;/ |$ T, K' a" u  S& R
  3. % k" K0 x, T- }% r) _, R
  4. import org.l2jmobius.gameserver.model.actor.Monster;; u8 F/ y! ~5 M- N) @2 j
  5. + a+ ?7 c$ u3 o8 \6 g9 o* @
  6. public class InitialState implements MonsterState {
    + ~. \7 n5 \" @6 z2 d
  7.     @Override+ X. B7 B4 t2 h7 V1 _' Y" g
  8.     public void handleState(Monster monster) {
    : ^* M$ O8 K$ ^* W/ `  d
  9.         // Начальная фаза боя
    / g0 ?7 Z( g8 y7 R  n! G
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( }0 ^% I1 E/ h: G4 [6 l5 p
  11.     }0 \5 f9 q: G) a2 @4 f. ?
  12. }
    4 G: H4 y2 b* {0 `' |8 g: O) R& f
Скопировать код
Класс для агрессивного состояния монстра:
4 {6 a8 ^8 e9 e6 `* f
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % T# V$ S2 @- \
  2. package org.l2jmobius.gameserver.model.actor.state;
    / N4 P: I+ u# E' s& H/ _, ~

  3.   R* N3 O3 i$ R4 R  T
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - ]( a* l# G% w9 o4 e
  5. % v# ^7 Q- L/ Q1 D  q. l" G
  6. public class AggressiveState implements MonsterState {7 _% w8 a9 N' @/ |2 |& _
  7.     @Override- y* W  x' x, A6 \" @# ]% P
  8.     public void handleState(Monster monster) {
    9 B& ?2 c3 `8 l# g7 e( L9 }
  9.         // Агрессивная фаза боя
    3 _. d( R9 w% v0 b) s# v
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( }& i8 \' N8 @; z" U+ P
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    , H4 t0 P! V& f$ u5 X* Y* w
  12.     }) |4 g, C1 o! P2 P
  13. }' [# C  D, Y0 p
Скопировать код
Класс для финального состояния монстра:; \" |' |- `( K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. ?) d' ]% X: p2 ?- X0 W+ X& \: P$ S# ~
  2. package org.l2jmobius.gameserver.model.actor.state;3 ^2 K( A' m! E2 S* h5 y& m

  3. ) b9 s  u( `3 z2 {# B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , e+ H2 Y. R$ `7 Z+ G

  5. / Z9 b: f- d6 O7 E8 x, F% s6 ^0 H6 C
  6. public class FinalState implements MonsterState {
    2 `& n) m1 c3 W; u3 _
  7.     @Override
    % h' ~8 Y5 b  _$ I" d) o, g
  8.     public void handleState(Monster monster) {: I6 M3 N' l+ K: q  e9 Z5 ]/ _& C" ~
  9.         // Финальная фаза боя
    ) E7 V# D* c7 z, ?
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    + R! K: ^9 o: K3 |# m
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 m1 _4 F2 u$ l
  12.     }* V& n$ s0 g. i: \" q! ~, H
  13. }
    4 k4 z7 x4 ]& K7 s$ Q
Скопировать код

: w7 W1 u) h9 Z: fШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
2 Y- F! [" Q! u2 o! U  Z+ i2 e
  1. // Пакет org.l2jmobius.gameserver.model.actor& L) T# a4 l0 A4 g- V) `9 A
  2. package org.l2jmobius.gameserver.model.actor;
    : Q+ T, h, @8 j% m

  3. * d/ H% R& \0 `( D6 c+ @9 A
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    / {9 e% L% x6 a3 R0 d2 H8 G' A
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;% ^- Q! {3 J- c5 ^( A

  6. ) r( ^/ |6 [- A
  7. public class Monster extends Creature {
    ! h' F& a% c- u( S
  8.     private String name;4 R0 v3 G+ d" R; d+ D' X
  9.     private double attackPower;2 I) @  r2 s' ?) g9 x( t
  10.     private MonsterState state; // Текущее состояние монстра
    ) p: Y7 j/ z# C: Z) t. A! K

  11. ) V& }. k2 ]. G/ @
  12.     // Конструктор монстра
    5 V% t" {+ f) }* I" j. ]+ p5 w
  13.     public Monster(String name, double attackPower) {; o' P* d9 @' F; W/ g
  14.         this.name = name;- s- \( F, \! K$ d+ e
  15.         this.attackPower = attackPower;: B& P* Q+ \) k3 Y7 V
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    * D5 m3 W" b5 G( Z' Z1 Q
  17.     }- }* |$ X7 T8 ^# r
  18. 0 o: p) g2 j2 J6 V( @* s
  19.     // Метод для смены состояния
    ! g% _4 a2 F7 P0 C
  20.     public void setState(MonsterState newState) {. ~" x1 R% j7 u
  21.         this.state = newState;2 f& G/ ]& P6 ^2 D
  22.     }3 M1 P6 K- O* C+ D7 [! ]; {  C

  23. " n' a8 X% ^# U" V6 W. |1 z
  24.     // Выполнение действий на основе текущего состояния
    , r1 v  S5 @- Y' s" ~' G, D/ j( G
  25.     public void executeState() {
    ( u" U6 ^% P( U$ S  H
  26.         state.handleState(this);& f, W+ ^4 Z5 B8 l# `
  27.     }
    % X1 p; |# H) j1 l, S* d: a
  28. . w. C0 a+ g; W0 _
  29.     // Геттеры и сеттеры3 U& n5 T% c- D+ [4 Z" c* T0 j
  30.     public String getName() {
    ; T1 \$ d. q5 D/ v
  31.         return name;: n5 C% G) m+ I$ ^
  32.     }
    + O$ M9 ]! T7 `& l+ f3 T

  33. 3 d# g) a9 Y) l: F: n1 y- n& ^
  34.     public double getAttackPower() {% m/ B. ~% _" q/ i  m( \' p
  35.         return attackPower;
    ' e/ c( A- c4 {
  36.     }
    9 S) {' t( F- g4 I

  37. $ i9 W7 O' s% J3 z# y
  38.     public void setAttackPower(double attackPower) {
    ) \1 Q9 O! |5 M5 [" d; x: w! {
  39.         this.attackPower = attackPower;6 y- W2 r1 t# S9 A# K
  40.     }
    % B: P" n% `. |
  41. }
    " n; W, D: s: \5 S, Q0 ?* a0 D
Скопировать код

4 z+ r+ ]& G! V3 oШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.8 k' l. f' T2 y# _  A* E9 J
: l, H1 D* T/ f. D# m3 W8 \& ~
  1. // Пакет org.l2jmobius.gameserver.model.battle
      p# B* L1 d) a7 z5 W( v$ ^) I
  2. package org.l2jmobius.gameserver.model.battle;
    9 j5 K( {% ?- t0 u) r% |7 |  B% Q

  3. : m2 p! \( o3 ~& Y2 d- D
  4. import org.l2jmobius.gameserver.model.actor.Monster;& l: R) A3 V( @9 \* q1 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  I$ h- ]* V, s% K+ C8 Q  j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    , k" x4 }1 X& E( I9 [

  7. / W: d8 G" B! A5 s
  8. public class BattleSimulation {
    4 c/ U/ m3 Y5 N* `
  9.     public static void main(String[] args) {( @1 J/ e2 A7 {9 w  Z8 U0 h- W
  10.         // Создаем монстра с начальной атакой
    4 W% _. o5 v. S" E5 v( A
  11.         Monster monster = new Monster("Дракон", 100);) g2 R" i( ^% s/ o! p  Y0 \: u/ }
  12. + ?; k, @# p& `; O3 E  x
  13.         // Начальная фаза
    / l; a0 e; e% i7 ?
  14.         monster.executeState();
    ( Z  |; E& Z3 C6 e

  15. 4 ^" {% {4 p0 d3 L# O, r# a
  16.         // Переход в агрессивную фазу: H8 m; W6 y1 O. r: h
  17.         monster.setState(new AggressiveState());/ l5 L% d' [) ^
  18.         monster.executeState();% l( ?% G# W/ X5 x
  19. , t6 a8 n# j' m7 g2 s/ L
  20.         // Финальная фаза
    ' h0 S1 ?& E1 x4 v3 h1 N" g, ?
  21.         monster.setState(new FinalState());+ S# e$ i/ k$ k+ U8 j1 @
  22.         monster.executeState();5 }) Q4 m* X5 A: |& ?9 S
  23.     }
    " a0 m& \5 G5 ^6 b: c; ~+ z7 @! j0 c
  24. }
    ( S* {6 m, u3 ~
Скопировать код

3 x# u- u* f0 s  MКомментарии по структуре пакетов и классов:
+ c9 M1 m" L6 e6 M+ a9 ]
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.8 z4 w5 a0 Y8 O: T$ F$ _7 @
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.9 Y0 J1 r  w) I# G
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 b- L6 i7 G+ l
5 V7 q4 p0 v' s
( [8 z* m6 }( L+ d

% `- {4 P( I. `4 K4 G
# O$ X* A$ r+ H' C9 ~( C- _; K

4 ?9 [0 ]. I! |, R5 z" P3 z: N) a
# m( j% Q& M) C; R( d- Z- g& @+ b( q1 B; c

; v3 A& b$ o( w9 Y! K) ]8 Q  }& b4 O: C( ~2 }# c2 ?

, [" F0 q4 H7 b0 Y, y/ `2 r, V$ F/ q8 \( U4 m
* b# ]$ X8 L' c) i; ^

# `8 G' ]2 G" `5 h8 r& f9 y
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:048 M7 j1 @' w0 d) n
Для управления сложными взаимодействиями, такими как  ...
0 S. u: j- l5 j  m" Q
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21; _' H: M+ H. |9 \! k
Отличный подход! Использование шаблона "Состояние" де ...
2 Q& c) k; O  z4 B7 u9 V/ p) P
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
+ F0 v0 d2 M# I& o" F* ?) k
- o1 e9 _% ?1 }( j% V/ kШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
5 ^5 \4 a& k" \. K3 O, K
, _. y# z% s: ~$ P6 U: W( e6 W; M8 O! t
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 r8 G1 `+ Z' I3 ^/ ^. m
  2. package org.l2jmobius.gameserver.model.actor;8 N* e' S& Y9 K* {4 x
  3. + U( a. i$ ?' [% `; F& g
  4. // Перечисление для типов атак
    & e3 O% T6 x% Z" t4 d
  5. public enum AttackType {" e$ f6 x& u3 A$ r- f5 o+ P8 C2 s
  6.     PHYSICAL, MAGICAL;
      G7 c9 ?+ J5 d( R& k
  7. }
    0 ^& y' n9 P& B3 h; E0 v  k
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.( _9 k' W7 R1 I( A. x; t5 d
Обновленный класс для агрессивного состояния монстра:8 S& P/ z! W7 f) c

: t; t1 c, U1 ~+ z7 g) T  N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, K- B- a9 j1 k4 J
  2. package org.l2jmobius.gameserver.model.actor.state;" f. m$ z2 X5 z3 t- A! l

  3. , r; f' t8 u" r% q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 g+ a: O6 r- g, ~( S
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    $ n: T5 p, p9 s0 l2 e* [/ n1 u0 \
  6. # t8 W1 S! l2 ]( X4 C
  7. import java.util.Random;# w# J. p" c, l+ l& \1 z
  8. ' |! I+ F- j( p
  9. public class AggressiveState implements MonsterState {
    7 z+ E# d# j- ~
  10.     private Random random = new Random();# ?" h7 a1 \7 p/ ~* F7 I

  11. + _( N$ v7 e! Z- K8 p
  12.     @Override
    ! p5 p; Y# m2 x1 {' g
  13.     public void handleState(Monster monster) {9 ~! ]4 e6 r& B
  14.         // Выбираем случайный тип атаки: физическая или магическая- w; k( p3 `( I& s" i3 ^! N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    3 s1 e7 o/ C, ?3 s# ?

  16. : X7 }! ^8 r. c- F
  17.         // Логика для агрессивной фазы боя
    # s% g- N9 J( Q. j! P4 C$ b
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 x6 g% X' p1 m6 H+ W% G
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");4 H  o5 j9 M2 Y2 X" W, p
  20.         
    + g1 ^& L5 Q1 S$ g
  21.         // Увеличиваем силу атаки в зависимости от типа атаки: f$ I% t( A) o' a
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    & R" H$ b! x8 h; ]# v
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);+ C" V* [/ P* I. H& l8 s9 `4 R, ]
  24.     }$ v3 r: [* |" @. L$ \. D
  25. }4 U" M* p0 S! b' j/ j! m
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
, z! R" k4 D5 v- l  V9 F( S2 b+ ]; m  I$ c* Q6 M+ d& S( h
  1. // Пакет org.l2jmobius.gameserver.model.actor4 v9 x; U; R; b( y( T
  2. package org.l2jmobius.gameserver.model.actor;# ~# j! W' S  i
  3. $ j) D2 @8 W) L) {) f3 c: s; h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    1 r3 l; B  B1 ]( g- y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 P5 G! C* P& {6 W2 d

  6. 6 A9 F) }3 d0 r% S6 R9 t: m# h. G  d1 Q5 E
  7. public class Monster extends Creature {
    % S4 {2 {( M$ s3 Z
  8.     private String name;
    " k- q- B5 |+ S8 l$ }
  9.     private double attackPower;4 {# A6 j' T3 ]; m, F" @
  10.     private MonsterState state; // Текущее состояние монстра
    * s& y* j5 K. T
  11. $ Q3 ?; u3 T( U5 t: l9 m
  12.     // Конструктор монстра# y  }3 k7 o  F$ Y
  13.     public Monster(String name, double attackPower) {. f! P9 n* u( I3 c
  14.         this.name = name;. W* h% j1 y/ G
  15.         this.attackPower = attackPower;
    * O. ~/ g6 A* g& ^$ _' d
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию1 u* J0 T5 i' K9 R
  17.     }8 {- ]& b7 ]2 v3 b( }# g4 @, H3 c
  18. 1 H) K4 @" r& [! e1 Z! t5 s' d6 Z- {# E: N
  19.     // Метод для смены состояния# Z+ V0 D8 M4 `( R# i$ S
  20.     public void setState(MonsterState newState) {4 P6 n* H  Q0 W! L. w" ?/ F
  21.         this.state = newState;) m. M/ ]+ K) Q# I" }# U- c7 @
  22.     }
    0 Z, }. G/ x- _8 t% X
  23. . H4 E: ]  M$ _/ F9 \. {
  24.     // Выполнение действий на основе текущего состояния
    0 k, @- ?" ~/ [. M3 w  \& f: v! Q
  25.     public void executeState() {
    9 w" X+ f& t  q* L
  26.         state.handleState(this);
    ! J9 `  e' ]2 p- T( I
  27.     }
    ! r. P8 t2 K" {4 T1 j% o

  28. % ~: a3 ]8 y* l3 H6 y
  29.     // Геттеры и сеттеры
      n  G/ ], P: H3 q
  30.     public String getName() {  `% U6 X' K9 @6 }
  31.         return name;
    + W4 n/ b. d* d, [! h3 W
  32.     }
    , m8 P* x# p6 I' ], X
  33. 2 M; @3 o3 R# }8 m8 f9 ^8 O3 r5 z2 T
  34.     public double getAttackPower() {" w9 }; V8 t) |) m% n6 A# z
  35.         return attackPower;
    % I" T8 J) |! b) U# v
  36.     }
    5 G' R. g2 Y2 J+ S
  37. ' Q7 q# {2 B% k9 }$ K
  38.     public void setAttackPower(double attackPower) {0 k. k  p) ~* `( z
  39.         this.attackPower = attackPower;
    ( y- G, Q7 p8 E3 j1 w. H+ j6 L1 N
  40.     }) w3 L* ^5 o6 G. w
  41. }4 \* n% E* Z6 {1 y
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
, P+ {0 O, _+ |( d2 ^! \8 B, U  I
  1. // Пакет org.l2jmobius.gameserver.model.battle4 i/ e! ~6 W3 y/ t
  2. package org.l2jmobius.gameserver.model.battle;
    1 l6 b3 A0 |5 c5 ^! I! k

  3. 7 T( \4 `" {# W4 h5 u# F
  4. import org.l2jmobius.gameserver.model.actor.Monster;; B: t; u' M1 v" [. l# `  @# Y$ Z5 L
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) P$ H0 d: R/ c: E% l1 g' U0 j/ }
  6. % z) I( N& @. m- n* e
  7. public class BattleSimulation {: i6 V( D9 q: S9 c& ~* i+ m
  8.     public static void main(String[] args) {% U& V1 [% m& W7 [" A- m
  9.         // Создаем монстра
    . M; L: t( F8 P
  10.         Monster monster = new Monster("Дракон", 100);+ u- \/ G1 q2 [$ j

  11.   X; `) t0 R! i
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    7 D. F. u! W9 A0 c' W
  13.         monster.setState(new AggressiveState());
    ' M0 h$ Q, Y& W# M- [
  14.         monster.executeState();% \' w! w& N/ Q( {3 K
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак% F' a% G" X8 v6 r) |
  16.     }( v: F* R  b5 B, h( Y: U+ O
  17. }! s- a0 V1 Z) E  W4 T+ n
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.& J; i* C# W2 \
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. ?! J1 _2 u8 ]5 |
; D. J( Y; C, O/ m
6 s; d  c$ g0 b! D4 x1 r( V" Z2 ?
0 s; B/ v. G# w) _
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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