Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 @1 @3 `3 l( y$ I: ]! p, N

# \! m$ j7 a; s, O8 V4 _

: ~- W+ k& }; K9 v" {* ]9 ^Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.: b3 d1 H8 n& |" A) H! ~' n- n
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
7 k. y1 [  m/ x' r8 A. J7 K9 @Астралия ?! h9 `; F0 z0 v  D
- Y/ v+ ]6 d. t% u. c

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!7 p! {5 U- X* m. u" D; ]! Z. ~0 n" n
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?; o& W3 H6 r% \: S/ w

5 ^4 y- N1 o, N1 V6 ~
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ; U- z' o+ m" A, m: c
AlexCoder опубликовал в 2024-10-16 18:31  x( ^) }4 k* v; Z- R. T
День добрый!
$ d$ Q8 L7 L; k: cВ статье описано взаимодействие игрока с N ...

* v- ^, _, @1 Q; M' }Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 D$ W) p" ^, t5 }9 }9 X1 r) b
% v! [3 f( t' J$ S0 l; G7 jЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) y4 b) y5 F, o# O: ~
, Y, }! u3 {% d& p# h
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.& k, _3 [( z. t( V1 b) b8 ?
/ d2 v7 r: {2 F" J0 X
  1. <font color="Green">// Пакет для состояний монстра</font>; K' R5 X: `, E, Y) w. l
  2. package org.l2jmobius.gameserver.model.actor.state;( I; N! Q% h$ M' j
  3. <font color="Green">9 a1 x, Z9 V4 I$ z7 m  @
  4. // Интерфейс, представляющий состояния монстра</font>" z# s! r! `9 S$ Y
  5. public interface MonsterState {
    : `( l$ p' \6 a  [: J7 B( G
  6.     void handleState(Monster monster);  f7 v$ }! W8 d
  7. }, L7 s4 o! ^% ]& r0 F
Скопировать код
3 l1 m( o" q9 k& z* F; N1 u7 k5 p
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ h  Z# i0 V: t! W6 h
( @- m/ K* \% ]0 F) U1 m6 V
Класс для начального состояния монстра:  Z; C3 a3 o0 w( Q0 Z9 \- ]
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
      D/ R' \+ a4 V7 P- G+ M* ]
  2. package org.l2jmobius.gameserver.model.actor.state;1 w* T+ N0 d& [( N0 p
  3.   S; @3 J, S5 W: M2 u1 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;; ~8 y8 y6 ]* y, \/ s* \4 }% F" @
  5. 3 C5 ]3 r" [- E8 Y- K
  6. public class InitialState implements MonsterState {, B; J9 \/ G4 T% Y
  7.     @Override" W: j; a4 ?' r8 i) {
  8.     public void handleState(Monster monster) {/ ^+ l3 b' p/ W) Y" n
  9.         // Начальная фаза боя' ^& s$ E5 h) ~4 G! t  A7 L
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 S' m  b8 b  O; w; C' [
  11.     }( v5 [  [, @& }  x) J% [9 V
  12. }  }) P  M9 J% q2 t
Скопировать код
6 y% Y, \) M' c: @3 t

8 P  N; A! k# @: Y
3 S( \) p# @& H  A! {
' W& Y2 G5 n1 K7 X! B
* p0 u& M% i) X9 A0 b7 i" F; u
$ [" `6 ^1 m1 I4 V# ^4 k( w  T$ V: t0 z$ P# ^- L2 k% N- I
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 \/ |: C  r' c# \2 B
# \8 r" g" j6 B- _Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- i3 L6 n" Y7 R# q; F1 `
2 b& H- L+ k2 ^6 R) uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 b; t* E. I7 g4 {9 O; J' j
5 @, R2 X1 l& r7 h' d8 w& ?
  1. // Пакет для состояний монстра
    , S" r6 s3 s* [
  2. package org.l2jmobius.gameserver.model.actor.state;
    % @0 x# U4 \5 a3 D
  3. . I. r' u3 \! S; {6 D1 t3 z
  4. // Интерфейс, представляющий состояния монстра
    / L% i1 [& n7 S* _; T, N
  5. public interface MonsterState {2 L0 y* E: x7 j5 \0 m
  6.     void handleState(Monster monster);" a% v, a) C( d- R
  7. }' q! l/ s+ e. Q: a
Скопировать код

' i. c1 t4 V* Q0 H" MШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
! i# P6 {! `: k6 V) D9 b! E+ L# {# Q
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 a$ o  v& i9 M0 l/ J
8 b4 q0 q' I! F: \Класс для начального состояния монстра:
) y' G8 ?. h0 c/ g9 I% |  n; N& P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 E$ \: x$ }5 J, m& U% a- b
  2. package org.l2jmobius.gameserver.model.actor.state;" U. k- D: F- t% V
  3. - U' C0 L/ _7 n* B- {  e  O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 W% O6 ?5 E7 r% \) Q4 Z
  5. 8 o: U/ ~2 ]- _/ z5 W0 H: S$ u
  6. public class InitialState implements MonsterState {# b: X. C% d$ E( H5 O6 Z* e0 H3 [/ `
  7.     @Override) ]# R8 c- v2 g/ v9 z4 {, b# Z# T4 K
  8.     public void handleState(Monster monster) {
      T9 P& X" I' N3 _
  9.         // Начальная фаза боя7 d0 ^0 @6 w1 j4 o, L8 Q, Y/ S
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & x$ a- q- o" Z8 s9 T/ M
  11.     }) }$ w' ^8 t& B% J' |7 J
  12. }
    0 `* j  R( h' L$ V' F! j# y) D: Z5 [6 P
Скопировать код
Класс для агрессивного состояния монстра:
; L$ d2 N% n( f& Y' B" o0 j; o9 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , q- M8 ?; m+ d
  2. package org.l2jmobius.gameserver.model.actor.state;  h: _5 j, i0 Y, C3 D; v  D

  3. % s' w4 L& Q* X2 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 C. \& h3 J0 ]+ P9 n, M' I
  5. 9 q( `0 m7 A; O% L8 K
  6. public class AggressiveState implements MonsterState {
    1 U9 X4 I- K* @% o4 i' K0 t5 c" A2 w, Q
  7.     @Override
    3 |4 J, F! N" w2 n7 P9 P' E% Q
  8.     public void handleState(Monster monster) {% _6 h" Z$ n! c( p) D! `
  9.         // Агрессивная фаза боя1 W2 q- D5 w7 h, x! w, r
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ; e1 H& L# x2 }5 i8 O0 m, i
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    # G- M6 F; F% b, O8 y4 h
  12.     }
    , Q% R' |. u0 ~, G
  13. }
    ' E+ A0 }' r  U9 U! e  T
Скопировать код
Класс для финального состояния монстра:# B9 l  m  U% F6 b% [! B$ D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( V# D& Q9 q$ P. {) ?
  2. package org.l2jmobius.gameserver.model.actor.state;2 a, y4 O. G& x) j1 x* p

  3. 2 c1 a# |$ l7 b+ S2 M; g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( @( R. n4 [( |. j( g& |

  5. * N5 ]  E" n6 [9 d0 M2 n7 k
  6. public class FinalState implements MonsterState {0 D7 }# E$ S5 m8 u* r1 P  S5 M
  7.     @Override. c3 Y/ B4 _2 ]7 i  {- e3 M. e5 G
  8.     public void handleState(Monster monster) {. k+ ], d5 G1 W, A" K
  9.         // Финальная фаза боя0 a; X: g. ^, K9 Z, G( P3 `6 Z5 q5 n3 F
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    - l6 z. ]  Z( X' M" @3 p+ t/ X$ B
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки0 i3 E+ b1 t9 i" H
  12.     }8 e8 X& v. w5 C' U
  13. }
    7 ?; @' N+ _9 `7 u" Z* }  X. e$ N
Скопировать код
+ S+ Y9 N& x! Z4 v& I
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
* [, J% j+ ?' u& Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - D) o' Q" l. p" X* t) r, {* S
  2. package org.l2jmobius.gameserver.model.actor;
    9 y* G- p6 V' t  n
  3. 0 k1 o. D  [2 }' |
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' @: A  u5 g" r) k
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    3 V# p* U* P7 K& H5 ^

  6. ' j; {8 f+ U. F& D1 c
  7. public class Monster extends Creature {
    8 K& j8 d: J9 j* N) h
  8.     private String name;
    ) ^# ~' s/ ]( J8 ~& j
  9.     private double attackPower;/ j0 m6 L- S. v' y; D  \
  10.     private MonsterState state; // Текущее состояние монстра
    , Q9 N2 e3 _3 k8 ^
  11. . K! o/ t- H: N3 L3 B
  12.     // Конструктор монстра! \* j" Q0 w7 o$ h! D
  13.     public Monster(String name, double attackPower) {% x, I& B* z3 `# Y
  14.         this.name = name;; h7 r2 f9 I! b$ N6 W! J
  15.         this.attackPower = attackPower;
    2 q& y* Y1 n% s. X
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    8 r' e) D9 D2 T
  17.     }
    % L+ t% t* {( }  L

  18. 4 q0 V4 s6 q3 \. n1 I8 E
  19.     // Метод для смены состояния
    9 y0 U" M: a) S0 V/ |
  20.     public void setState(MonsterState newState) {; W9 R& q6 ]" p& x! q
  21.         this.state = newState;5 o! k9 a/ R6 _8 L2 @# n
  22.     }
    ) Y6 I& J$ y" y

  23. : w7 U  L1 m, e. s7 Q3 j; V
  24.     // Выполнение действий на основе текущего состояния9 s: D: Q- b2 s- Y; I$ c2 ^% T
  25.     public void executeState() {
    5 `0 S0 b$ l) V8 y8 `
  26.         state.handleState(this);
    & W1 D/ S7 v* Y: n* ]8 w8 u3 q
  27.     }; c4 A  ?* W6 \8 X
  28. 1 H8 Q# ?) j- `/ U  L
  29.     // Геттеры и сеттеры7 B( t! i+ w6 s- F% ?- N
  30.     public String getName() {
    5 s0 g4 Z* b2 f2 b
  31.         return name;
    1 [, i& G+ b# E. P
  32.     }3 f- d9 d! u+ C' a6 ~& A1 t

  33. . v& o% K+ t" t/ d7 R
  34.     public double getAttackPower() {
    5 `  t' r8 r% w) N# M: X
  35.         return attackPower;2 r% O1 Y# m- y$ c  Y
  36.     }; q7 y7 `* z6 C$ ?7 W; a1 g# t4 j
  37. 1 |6 G! _) b% U
  38.     public void setAttackPower(double attackPower) {' f1 s: Q* A5 I6 r, C& X) m) g
  39.         this.attackPower = attackPower;/ d" M7 q0 e8 @: p* r% p  Z
  40.     }
      z; n: j3 b4 Z, o
  41. }  k/ Z$ s/ u8 g
Скопировать код
0 w3 D" q' m7 B/ Y" L
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* h+ e. c8 w6 n$ _
+ d3 X  J9 |, A# n5 m4 h6 V
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : y0 |3 K8 a; r2 Y+ B& a
  2. package org.l2jmobius.gameserver.model.battle;
    1 A' d' m2 [4 y
  3. ) {* d1 Y' T( W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 N" I& l+ Q& m. h$ N2 W/ b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 n1 i4 a8 A; Y. U7 M
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;% B: Q  q5 [2 X
  7. $ f9 o) d5 y# y1 ]7 H
  8. public class BattleSimulation {: a0 v- F5 t3 s
  9.     public static void main(String[] args) {
    + p) x$ l! b" H) B2 m
  10.         // Создаем монстра с начальной атакой
    " J5 L5 i% @& x& h& p
  11.         Monster monster = new Monster("Дракон", 100);
    ) |  h4 Y6 s% H
  12. ) O* M8 v6 U0 i( R3 ^
  13.         // Начальная фаза
    ) Q! `; F; o. r
  14.         monster.executeState();
    0 g: T2 J- Q; k, ~8 _
  15. " K; [' w4 ~6 h* W9 O% L: F, p- s5 M
  16.         // Переход в агрессивную фазу
    # P, `  b. U& A# s1 R" v9 n
  17.         monster.setState(new AggressiveState());. ~' a+ _# I% U5 ^2 u; {
  18.         monster.executeState();: f& N. @/ T$ t/ d$ b# B1 K8 u
  19. 1 ^; _  E4 S0 Q8 n1 ^
  20.         // Финальная фаза: P) x0 y5 R' I8 z1 a" F: L3 Q
  21.         monster.setState(new FinalState());
    9 z( q( k. v( {5 i* b
  22.         monster.executeState();+ ?' ^) r# C: }9 ~" ~+ f% [+ T
  23.     }
    . C) q! F9 i7 K) S* }2 C9 o; W& O
  24. }  L/ b4 }; i+ a
Скопировать код
3 P/ @# a, i( v$ D! u$ P! E5 t1 j2 {& o
Комментарии по структуре пакетов и классов:; ?, q8 w( b6 \! i. l
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    5 i- j, M$ o5 U- i5 ?
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
7 V6 A, F+ H  a% D, ~3 z1 {Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. `/ Z. O! f: ]) k
- e. o6 O  q! |
0 ]2 G/ n/ i$ [- V& X; n; v

& R  x: o0 x( J9 h+ h6 b0 ^' t: D6 n' G1 ^7 L3 _# b
4 ~0 w& V. i- l# \5 V2 y

1 r9 T- i0 S; J1 K% h
- s8 ?5 `% r4 r" o  \4 f" W  j5 v8 v3 s- d. W3 a1 J
3 y% X( M9 b6 T4 c; M) T
& p9 \+ H8 \5 m# N8 k0 Y- T8 k& Z* C
3 L! E+ h. R, ~6 ^2 e8 B1 Y: y; o. Q7 W7 B
$ Y+ Q' d* m. y0 K4 Q9 r
; B. i5 f5 R- q+ Y# B

: t3 d7 @( }2 K+ U
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04+ d) T6 t3 }. _) h0 v
Для управления сложными взаимодействиями, такими как  ...

& ~" y; I- o* N, [Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21- b/ d- I% c4 _: d: ^! S7 h
Отличный подход! Использование шаблона "Состояние" де ...

4 j# Q4 z: {  l4 _% p* }7 I2 U2 PХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.2 a4 O( H+ F$ z2 X

0 o  v7 Q7 u# L. \; Y0 A% w6 kШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.0 ]( N( ]) `) |

8 k) Q% t8 A, T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 q6 N: A0 a3 ]" e' ?0 r3 Z- v6 [
  2. package org.l2jmobius.gameserver.model.actor;/ S' r6 [0 z) L# |
  3. % v, ~+ Y6 v0 U* J1 Y; X4 {8 z/ s7 E
  4. // Перечисление для типов атак3 q+ Z3 T5 Q9 y8 y* x
  5. public enum AttackType {+ w6 g3 }6 j2 z/ B2 G
  6.     PHYSICAL, MAGICAL;! e; E" k8 x) [: }* g
  7. }; [; c( r& J* j& L
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
2 R* \& y8 h: w- K+ R' YОбновленный класс для агрессивного состояния монстра:& N2 ?! f$ l8 j
- Q8 k- R7 t" C0 v9 I' i, Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      u  @* ~4 N# x
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( G, M; H; L' q& c+ [4 a, P
  3. * b1 D+ M, }+ H- l) `9 F" Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ R# q) M$ y$ {4 U2 ?0 v) d/ K
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ' C( T4 G1 H# H; i6 o
  6. 8 G# \0 T/ T+ X3 y: r3 G' K
  7. import java.util.Random;
    * l8 z$ X, \* }" p" X1 I

  8. ' |7 h, v* ?, c& J
  9. public class AggressiveState implements MonsterState {5 Z3 G0 I, H0 S  N  V
  10.     private Random random = new Random();3 `" K6 _! ^$ K: s
  11. ' E/ t' H  [7 }- ~) L& g. b& i
  12.     @Override1 K  }+ s. a/ |2 Y
  13.     public void handleState(Monster monster) {
    + E9 t) S; K- X; s" D
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ) X2 k# V- ?. Y- R" N( Z' V2 n! p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    / z0 [! i& Z. c8 c$ L

  16. ( G6 O5 a+ T9 F+ c, n: b3 \
  17.         // Логика для агрессивной фазы боя3 A7 @7 _2 A6 r& M1 `2 d, x0 p
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 9 q. L# r/ Y( Q7 y! r) e
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");( R5 a7 b* I9 M7 |: y6 o! s& o
  20.         
    ) N* e( o2 U. ^' X$ R
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    2 \, ~+ @* z$ t# R+ k
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;5 h; u' Y! r2 S* f( `! c$ c
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);; ~0 j. Z* }- r5 y0 Z
  24.     }3 l1 k8 Y5 v; n% i8 F
  25. }
    3 q- y) o( ?) {9 A
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 E  A+ G9 z/ ]) O4 u  w3 M; Q9 B

- Q$ m' f! `) U6 {- I
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % P3 O7 r5 S% ^2 C/ R' L: w/ x
  2. package org.l2jmobius.gameserver.model.actor;
    + ]& C. \9 M5 _0 k6 P

  3. 2 _- g0 ]# z  |' g
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    5 {. t1 b" v6 C& Q
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! K9 I( F; c' q
  6. 9 ~. w- i$ S( w9 g: j' K9 s
  7. public class Monster extends Creature {
    ' b% p" P3 ?- g9 H
  8.     private String name;) W! {5 _! c: H6 k3 W2 {$ G
  9.     private double attackPower;6 m! g2 n( H0 A$ z5 q' H
  10.     private MonsterState state; // Текущее состояние монстра1 _' F' O0 d# J9 t0 w. t2 {

  11. 9 |+ B& T, k. P5 A7 W
  12.     // Конструктор монстра9 {9 _/ \, A* M* Z. X+ Z
  13.     public Monster(String name, double attackPower) {; m2 W- v1 C- J9 \. v0 C
  14.         this.name = name;- h  x2 q% W: `! M8 g
  15.         this.attackPower = attackPower;$ Y) o9 T" S5 u' k" R0 g4 U
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & B  V2 N7 G$ M7 Z
  17.     }
    * ~' }$ y5 Q; i8 o$ |) s8 H

  18.   V5 s2 r8 `  X+ V6 A: p* }* a1 r
  19.     // Метод для смены состояния8 n3 x: s8 }# _4 g6 K8 q
  20.     public void setState(MonsterState newState) {
    # Z; j% C& r9 E6 D9 L5 l# P8 w
  21.         this.state = newState;, ^5 I  H$ M" F8 {# k" u3 S) N/ t
  22.     }
    6 C' u( M+ V8 f

  23. 8 u1 A; j0 Z( e6 p
  24.     // Выполнение действий на основе текущего состояния
    2 f1 t2 ]# @5 m3 Q$ Q" w' ]* ~5 q
  25.     public void executeState() {
    ' Z0 N# U; |5 `$ }
  26.         state.handleState(this);4 I- @, u  w/ G
  27.     }$ a. j1 L7 K$ r- k3 X5 {

  28.   w6 o: x# f! _" @
  29.     // Геттеры и сеттеры# h" I; o5 c: r8 @0 }
  30.     public String getName() {1 T' S% d( t2 Y/ s. K
  31.         return name;5 ^( b! }6 r) I+ V
  32.     }
    8 v, d4 E: @/ |" y- m3 |' M
  33. 8 x& q4 z% @5 P3 g
  34.     public double getAttackPower() {
    " m5 R/ Y+ Y8 P! Q. m5 M$ |. L
  35.         return attackPower;' r3 W/ O0 i, L; u
  36.     }( v! h* ?/ P$ L! Y( ], p

  37. / ]2 V% U, a5 R; u+ _' J: f
  38.     public void setAttackPower(double attackPower) {* e8 D! H% L! b1 Q2 Y1 O
  39.         this.attackPower = attackPower;  W' O9 F* t5 ?( {) f
  40.     }
    3 W& m, a5 N* A' Z  k5 N
  41. }9 c3 u% I+ ^: c
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
: a. W# w" [1 L; s* f3 b+ L5 y6 c  R5 a
  1. // Пакет org.l2jmobius.gameserver.model.battle
    / z5 z/ E. x5 g' u  J$ i) h$ N/ S; G; Y
  2. package org.l2jmobius.gameserver.model.battle;. ~4 \8 O! f/ ?9 X7 V

  3. 7 y* x+ P3 L! i  V
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 z- x7 @" \9 L, [7 |9 u, l
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    1 s! I% K; }( L) @% f$ i( \

  6. , T& @: E+ P  Q1 J3 g, r
  7. public class BattleSimulation {
    ' u- Y+ ~( d: O* t- S1 }
  8.     public static void main(String[] args) {! {4 y+ \6 w( V, G. v
  9.         // Создаем монстра# J9 S1 O* C1 c7 r  Z
  10.         Monster monster = new Monster("Дракон", 100);
    , i( }+ j% ~- T4 p  t: S

  11. 1 \5 u0 ~, A* |. }5 d3 w
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    " ]) H1 g6 W/ L' Y2 H6 |/ Y: I
  13.         monster.setState(new AggressiveState());
    ! a  z  D$ \* `* q9 f* ~% f3 x( ]
  14.         monster.executeState();& S2 d( S1 W. ~6 I" K
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & [" Q3 ~8 w! G: y. u$ |! c
  16.     }
    ; D& Q% o& f$ Q" B. V) T
  17. }, b4 I- ~: d7 y+ B; P
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, h: O! b" Q  S2 Q, V: l, w1 x& x' GЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!9 m1 ?5 o! ?  Y8 t, y
5 A7 U5 A( _- w( D- r

5 |% B, _# X/ v9 ~7 ^8 D3 H0 ]
1 ?: W% I% R# ]1 o! j1 Y# ?
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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