Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!' H' l+ L3 \" `8 a7 p& X  f# ]

) i$ u' N) i! N8 V
0 K. Q# H8 i; y+ q; Y2 X- @
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
% J* z" h: P& C8 `% _Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!; ^! p* R% v4 w7 B6 d/ `8 J1 ^
Астралия ?
5 c. s. r7 K, z) X, D: r) C0 X" X. m

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!/ r# c! }6 ?. J* D! X! b
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
7 y7 V6 {) o; H' I( ]! p# C6 }+ \$ G0 f0 m$ E
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 1 g, j, P: L" }
AlexCoder опубликовал в 2024-10-16 18:31  }/ n  b: X/ N3 g: E
День добрый!
# v4 ?1 y, k, p  j0 n5 ^В статье описано взаимодействие игрока с N ...
4 e# g, X$ f. o" M* A
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
! E; E6 \+ O. P* p+ L4 @0 ]1 N  @. l7 R9 V0 T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
: [8 Q' H  i, \- N' J
& R6 p& q) o( G) q8 jШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.# _( B9 V8 |8 L# O
2 b# V. G0 j( J
  1. <font color="Green">// Пакет для состояний монстра</font>
    1 _9 ?4 I  h1 c9 q# y/ F
  2. package org.l2jmobius.gameserver.model.actor.state;# c; i/ v+ x/ B8 ^$ r0 u& e
  3. <font color="Green">+ i7 f8 T" X  I- E# j+ \
  4. // Интерфейс, представляющий состояния монстра</font>( w% R6 @4 ]1 z5 Y) o9 S
  5. public interface MonsterState {7 ~- y7 R9 W+ z$ ~* s* q
  6.     void handleState(Monster monster);
    . d3 e9 X  g$ u! D( z, b  U1 o& C
  7. }' h* e  R$ c' S* O
Скопировать код
1 k9 L  U+ h$ Y4 b  @
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  G1 ^& F. N0 n3 d  l6 ~6 y) r; I- A9 z6 V" h+ o
Класс для начального состояния монстра:
0 |3 b+ `4 F* H
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    8 d0 ^* N. s1 M- r$ x7 x; V4 [
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 L- N1 X( v1 Z8 K0 h

  3. - `. _* y9 o) X2 q" c- E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) t! W; p, {! q# a% G4 v1 G4 Y
  5. / s+ ~; ^) i0 m  g4 R" ?, U
  6. public class InitialState implements MonsterState {
    " R7 L/ M* ?; x- z( ~8 }/ p5 v
  7.     @Override
    ; j" W' L! S0 r, T+ i
  8.     public void handleState(Monster monster) {+ H3 M6 _% Y1 _' B
  9.         // Начальная фаза боя
    , r; B. S# `9 H; O
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    9 U9 H  w. Z1 n
  11.     }& R1 u5 @3 {8 i7 I
  12. }
    6 N) ^- i+ O- n7 j
Скопировать код
8 f9 @: t+ R- e

. X6 j6 L& [2 G4 K' A
9 e: r8 b, }3 z6 U" C
! c: c$ f; a! T5 t0 _8 }
* _0 N6 M+ l* c* f3 v0 ~
8 \2 n/ q, p- |6 l5 r5 r5 X" O" m' ^) R" G- r, u0 w
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . B8 G/ W6 R( {' B3 `" `- |# h

7 y/ [- l4 \0 W  N. G8 E) WЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- N2 m9 f) ~' ]  }1 s' p- d
: ^1 k" n6 `6 Y. C, sШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 @8 y) o+ p% Z, ~# y  K' K2 m$ A# u8 P- R  r4 g4 O
  1. // Пакет для состояний монстра9 j; t) [+ x! }% {. |1 T& X5 w
  2. package org.l2jmobius.gameserver.model.actor.state;: V+ \/ {1 x3 |2 `: E
  3. 1 N2 H1 }7 B5 s, S. b7 v3 d
  4. // Интерфейс, представляющий состояния монстра& j1 t, ?; O1 t" R/ o4 \
  5. public interface MonsterState {$ U  ?" J( ~1 l
  6.     void handleState(Monster monster);+ g4 u' s# J4 L1 e) p. M. [
  7. }
    , f! ^% I$ D) J! n$ T) G
Скопировать код

' I4 T* J( `2 DШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 V0 a- I7 M+ J0 q

$ b5 w5 o7 w( S: s2 z+ E# rЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
6 H; S/ }; z: r2 X) ?  i1 j' o# M
Класс для начального состояния монстра:
& q. z1 ]+ O4 `; U3 f0 l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. f8 \( g4 X5 n* f
  2. package org.l2jmobius.gameserver.model.actor.state;
    : C4 l: V+ G/ q- z+ j4 J2 ^, b
  3. , x2 @+ L  V/ p5 v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * P  m* B+ ^, K+ ?6 h# t; [# }, |
  5. ( w& t* I' F5 i9 k5 \5 l
  6. public class InitialState implements MonsterState {
    9 V( g/ G, g" Y' R  d" `- n* t
  7.     @Override3 y8 J+ L7 N% o' F9 `1 l# y5 `* k
  8.     public void handleState(Monster monster) {/ ]5 I; J- c: v* [6 E' h
  9.         // Начальная фаза боя5 I) K' n* u5 _- z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : I( j/ H9 f9 \7 L% c8 T
  11.     }$ T& n$ g4 z+ k9 T4 C
  12. }9 F1 q' K1 I( ?% C& v' r
Скопировать код
Класс для агрессивного состояния монстра:% G5 q# X4 ^" k# O2 f4 x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - g) k! g) s2 z5 Q/ b% q5 u, z
  2. package org.l2jmobius.gameserver.model.actor.state;; P5 m0 E9 z; o: _; P, J) G3 s8 z

  3. . v* z3 H; j1 P% j, j, J* m9 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 W1 b$ {& h  M" A0 j

  5. % l, J$ ~2 |. l+ a+ f- `0 V
  6. public class AggressiveState implements MonsterState {
    ! m; m4 [4 l! l7 p- `8 m" x# y
  7.     @Override; s/ o2 i: z1 f/ q; y' x
  8.     public void handleState(Monster monster) {; s" u% m6 a/ b8 p9 A) |$ K- N  i
  9.         // Агрессивная фаза боя
    1 }/ n. i1 R, W; g& \: l" `: ~
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 s7 x5 u/ u( [0 P% g
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * o6 P) o5 t+ T8 M3 ?' x
  12.     }
    + l) x+ l8 `' l1 N8 g8 w
  13. }3 S4 u/ h1 [* X4 t$ a- `
Скопировать код
Класс для финального состояния монстра:
9 t9 y/ z0 `% o% |& R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 V* h0 |, e, ~6 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 @0 `! X3 J$ L( v2 [
  3. + V  v* d4 X# D2 R) A& M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # g, G" L, f9 i$ r. r' G  B2 ~7 P

  5. ) C% u, k" k5 o) f! W0 k) q
  6. public class FinalState implements MonsterState {
    ' ?3 a/ Z) r7 `* I) x
  7.     @Override' x8 M7 m8 N. L- V+ }" v" e
  8.     public void handleState(Monster monster) {( J! ^" N4 a2 Y* j2 w3 p, K! c
  9.         // Финальная фаза боя
    . O$ T# G- _) b3 \
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");& h) S3 q' X3 r' z9 c( M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 D7 I4 r1 w- K& A% z. Q/ O8 U
  12.     }1 X2 T% G6 p6 z0 D( o
  13. }
    " c4 `; T% r+ n& U
Скопировать код
( b: ~  i% y* f% N% a6 R, Z8 E
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# l' S( |; l3 o+ a5 E$ e1 B, H" s
  1. // Пакет org.l2jmobius.gameserver.model.actor% W, g, ~7 S0 }  `* Z9 l
  2. package org.l2jmobius.gameserver.model.actor;
    4 @  `) H2 [9 p
  3. # y% w% K( E9 v  S4 y5 N0 x; L
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 p: {( p. J8 A; d/ o- z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 k) D& s4 D' @% p' K
  6. 0 c2 y5 ?+ i) s0 R# a. j
  7. public class Monster extends Creature {/ w8 Y$ M. x; q& q4 n3 j
  8.     private String name;
    & @8 t2 g% Q$ z3 ]8 v
  9.     private double attackPower;. v! O9 r, r* L2 X1 d1 ]
  10.     private MonsterState state; // Текущее состояние монстра. N% s; `& v  }% T* j+ I# G+ ]5 K

  11. 6 b3 f0 T* W% Z. m; o
  12.     // Конструктор монстра
    % j) s; B4 ^! i6 N
  13.     public Monster(String name, double attackPower) {4 x5 V" [8 ?) M8 r4 p. e+ R. [
  14.         this.name = name;
    ; I; ~0 @% s3 z/ l$ s$ _, ^
  15.         this.attackPower = attackPower;
    ' g6 b. J9 f7 ?6 Q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 S& i2 a) D  s8 }: j' b
  17.     }# r; h' [( \/ L7 R- @( _5 r* d2 G8 a

  18. + e, f* X) d5 U
  19.     // Метод для смены состояния; D& F/ N" q: J$ [, k" {9 f
  20.     public void setState(MonsterState newState) {3 K( m6 w+ }/ w& u/ [6 E
  21.         this.state = newState;0 Z) ]/ y! f% \' l' g7 N' [7 s
  22.     }
    3 v( w! c& R& t9 }
  23. % \; y* \5 L% w: n  J- u
  24.     // Выполнение действий на основе текущего состояния$ H+ e3 l0 r) q
  25.     public void executeState() {
    3 b7 e* j% [0 O
  26.         state.handleState(this);$ r* m5 H( p& ]7 |
  27.     }$ \  {" C9 o3 w1 L; t3 H: P; Z

  28. ' _4 ?; s, I, f$ s
  29.     // Геттеры и сеттеры
    $ u/ o9 @$ y" K& r7 _0 K$ |
  30.     public String getName() {: N4 o$ }9 w" n8 n# w: u) O# E
  31.         return name;
    9 b& }% B3 ~; Q0 g' j
  32.     }
    3 K; d2 J1 ]8 e4 L4 r, S

  33. ; e9 g5 \1 Q5 h/ l/ G2 T/ E
  34.     public double getAttackPower() {9 V: b& G+ @6 k0 G# @
  35.         return attackPower;
    : p( c; t8 F9 R# J- o3 P' H  W
  36.     }! R9 ~9 C+ h; R8 _
  37. " ?  x4 W) p5 }
  38.     public void setAttackPower(double attackPower) {
    $ L4 Q4 |% @+ t1 [  D( q, A
  39.         this.attackPower = attackPower;% Y9 a7 K9 }- e
  40.     }$ C. N" r4 ^8 j* T! f
  41. }
    % s0 }4 u, e1 m* |7 W  f9 X  k+ y
Скопировать код
+ j9 ^7 H# q& t% M3 I& u
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 i" I7 e1 R; m& L, B
3 N2 t# C# M, N) u7 x+ j9 J5 y
  1. // Пакет org.l2jmobius.gameserver.model.battle5 E9 }3 v# `: M& q' F
  2. package org.l2jmobius.gameserver.model.battle;$ W; ]* m0 |& ?  U
  3. , Y5 ?% b! W& u) @5 i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 S* I/ [- g% Q* e/ n( f; i- F! r+ I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 D: t# h- g# H5 n7 K6 R  k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;: R. M7 \, H) z% t+ K# M% p: S

  7. : L( V% m9 b( z' {; a( Z
  8. public class BattleSimulation {
    - @, s4 R4 a' L8 v+ t+ N1 A/ v' }$ t
  9.     public static void main(String[] args) {& g$ x+ N- W# x& e0 \
  10.         // Создаем монстра с начальной атакой
    , }8 b. Q( H9 H% a
  11.         Monster monster = new Monster("Дракон", 100);8 g. m# w5 D, P5 g6 q3 ^* Y

  12. , H8 P) t/ I5 e9 p, A, e# A
  13.         // Начальная фаза
      }4 m: h- r" ^8 `
  14.         monster.executeState();, s- q# O3 _" V+ f! \

  15. # ?" W! [# T: P! A' }$ ~
  16.         // Переход в агрессивную фазу
    ) ]; j" Y( m- o% U7 s6 `
  17.         monster.setState(new AggressiveState());
    $ H4 k* e+ h  j9 ?% f* t
  18.         monster.executeState();
    9 M  g8 d) L6 Q4 n+ \: ]
  19. - m' F2 I& T) V2 y
  20.         // Финальная фаза
    & K/ z0 f7 c; G. g* C/ z
  21.         monster.setState(new FinalState());
    - q+ _4 e+ k5 S' p+ k9 i
  22.         monster.executeState();4 b4 i! u/ N% S* q; n& R6 p5 S9 E
  23.     }0 O! f: s- k2 G. I& y
  24. }  m9 s; Q: f! G
Скопировать код

& l" X. n$ y: V3 M$ fКомментарии по структуре пакетов и классов:
; z% o/ @  q+ M9 p
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ' o/ I" K* _& i
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
  r: Y; U  E# \, Y0 @/ i! Q2 T/ YЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
% A: }1 {3 i! Z0 T, x6 G  n2 K* s- f; D: v+ \1 z+ O
8 ~3 m2 X4 C+ c' H1 c) Q9 F. Q
; ^" o9 t5 `( O; i1 R, f; F, |

# a& F' J" T3 F/ j2 H
3 w' J% X- j6 n& i7 o% B5 ~, `. ?) r
% O; o* I% z, s

3 }1 J  d4 m9 p2 K2 W4 D* R7 l/ Z) @4 u/ I2 Q  h
5 ^! [* u0 ^" L) }
" P1 N3 r: {  u& J* b+ d

3 \9 H) m' ~5 h- y+ w6 f
. Z% R6 ]9 k2 v5 \+ C3 M" |1 Q  g2 A+ a
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:043 }9 I! q% P/ s* F9 g
Для управления сложными взаимодействиями, такими как  ...
7 A$ m  x/ m5 s. c/ q2 F3 ^; B
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
. T  U& ^, y9 i$ [2 LОтличный подход! Использование шаблона "Состояние" де ...

' u' N2 E1 w- U( o8 lХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.- E7 J% k5 ~) \7 z) x

- `* {# v! r4 @. d; \- NШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.$ M9 s/ y: K4 K2 |0 Q

+ E! M! {8 Z  y# N
  1. // Пакет org.l2jmobius.gameserver.model.actor& {' M+ q* ]1 Y1 j. ~% X
  2. package org.l2jmobius.gameserver.model.actor;! V; I) U6 Y( r/ K& q

  3. 1 s! G4 |6 o1 e& F1 B" \
  4. // Перечисление для типов атак
    % A* m& Y' M; Q' [- n) R
  5. public enum AttackType {# j/ I& v0 T- F
  6.     PHYSICAL, MAGICAL;
    7 @8 x2 N. a- t, q3 e) K
  7. }
    ) Z' S9 c+ D1 e. h! w; R0 h; a
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.- M. Z  q$ w0 Y# k- n- i% D
Обновленный класс для агрессивного состояния монстра:
0 f! O" M2 D6 d. N0 r) D, ~( [% U0 j* }1 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 W+ _/ F, N) K2 y
  2. package org.l2jmobius.gameserver.model.actor.state;) I5 H) m; i, c* A* @1 E

  3.   d4 N& w" w2 D% I* H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 Q1 o* c- T% F& J* m* q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    , J! S$ ]5 x, n9 H5 k8 e/ v/ e
  6. : v- @+ H* W5 A* g" O
  7. import java.util.Random;/ Y: u) B5 _8 U0 ]/ F: C/ E

  8. : {8 U3 a) J$ U
  9. public class AggressiveState implements MonsterState {
    # b$ g) [& S% S) ]# [7 w
  10.     private Random random = new Random();) Y+ _. \* R' z$ r+ H) F  ~

  11. ! {2 k7 q) K! E
  12.     @Override$ ~: y' r+ v, ?: B3 p+ g
  13.     public void handleState(Monster monster) {
    / H4 N1 @; [3 z
  14.         // Выбираем случайный тип атаки: физическая или магическая
    " ]* }, ?- ?8 Q% v4 I- W8 U
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;4 M8 I' h3 }( _- v. z
  16. / ~1 A0 p0 U3 y1 e0 x
  17.         // Логика для агрессивной фазы боя; @# k9 L  O; L* E1 s5 |
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ) m, A1 v& t# X# ~4 W* {) L; i
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    # M' b6 _0 J8 ]* I0 W
  20.         " U, [+ V4 B  u6 W. {* s4 J
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    # S' |! _! Y/ i/ z5 A) _. B
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;% Y0 Y# n0 ~+ {$ R. {
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    4 s3 o3 X, k; H0 _; S, W' U
  24.     }& f' W: e7 x& i$ F. k/ ~: T
  25. }
    + ~, n- a8 B! e& L2 B
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки/ C7 \- z) H$ Q9 w
! `5 M+ a$ Y% c& j: s' y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + D  T4 [/ {8 h
  2. package org.l2jmobius.gameserver.model.actor;
    2 [. L* a) b8 i

  3. ; w0 l; V- H) ~2 C' V) X) k
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
      ^6 o3 \$ C! l9 T! ?( Z; [
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ X) F7 w/ V( b% ?
  6. % c& a3 R) y5 Z2 B. V
  7. public class Monster extends Creature {
    % Q& c) s2 ?1 L! l- H- V
  8.     private String name;
    : o0 d8 f. Z/ f1 R) D& W
  9.     private double attackPower;  o# ~; x# z" W  P5 @" m4 W$ V
  10.     private MonsterState state; // Текущее состояние монстра
    9 M& D6 H: W  {

  11. , t, }" _: C3 K5 @, S" N# A' n
  12.     // Конструктор монстра
    ) N; U' ]7 a+ r( V& J. g" n- q
  13.     public Monster(String name, double attackPower) {0 Z" l9 a& n1 }" i, B9 I" B
  14.         this.name = name;
    4 E1 ^# T, \3 c; r2 \5 i, |- K
  15.         this.attackPower = attackPower;( e2 [; r% T/ m( {( d
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию6 T. m; t. w0 f( O$ k* R, B
  17.     }- _4 U* D- ?# ?! h9 _8 m
  18. - @, s5 o' U! l9 q
  19.     // Метод для смены состояния! i, y" U% u% }
  20.     public void setState(MonsterState newState) {; w# h8 T( g6 b$ x
  21.         this.state = newState;
    * T3 F1 U; O- r- K) M
  22.     }
    - s  r) r% T3 v: x" s
  23. , {2 N" {7 Z* C; [0 s
  24.     // Выполнение действий на основе текущего состояния. d9 R# w9 E0 n
  25.     public void executeState() {
    + e  }8 S- {5 o) f* {8 J
  26.         state.handleState(this);: z( }5 M) Q3 U9 }. {
  27.     }
    6 n2 N* P" @& {& V* Y: S
  28. 9 E% K+ `& T. e0 [$ n9 K, ]
  29.     // Геттеры и сеттеры+ o/ A. K1 q( ]2 w6 `( A! y9 @" f
  30.     public String getName() {* F/ a4 M: N2 |4 a
  31.         return name;. \* A% G% i0 |6 m. O. m; r8 q
  32.     }) }2 J9 `+ Z9 ~4 @4 {; [) w

  33. " N0 l$ k" M% ]% K* Z
  34.     public double getAttackPower() {
    4 G1 T$ t1 M  G3 `) ~
  35.         return attackPower;+ `' B+ Y$ `1 ~4 A- W
  36.     }
    ( t$ J' p. D5 H6 w  y& B2 ~" o4 o

  37. - _( d; R! W, T3 o( r5 i6 Y8 d
  38.     public void setAttackPower(double attackPower) {
    $ W1 R3 Z. U+ t. M
  39.         this.attackPower = attackPower;- V+ s/ F4 g, A. c9 Y: \9 W! G9 b
  40.     }' @; |. F- g! n  V
  41. }
    % U- U0 O% n, y
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
+ j' C/ z! F+ f* [& p  p% V6 R( o$ s3 x: a
  1. // Пакет org.l2jmobius.gameserver.model.battle% e. U- e6 X8 j3 e! ~2 |$ a3 z* x/ w
  2. package org.l2jmobius.gameserver.model.battle;
    + m+ G$ w& N7 ^; p2 F

  3. ' Z5 C9 ^* x9 Q" ]3 M0 q' g6 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;( n; N" H9 d( b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 t2 U4 A/ V8 u6 Q# j
  6. . B( h  e* }: y+ g
  7. public class BattleSimulation {
    8 G; t. Q3 d* ^/ x/ H' }0 \
  8.     public static void main(String[] args) {
    " I. v# C/ X; J! [( h  A# S
  9.         // Создаем монстра
    % o" I" ]+ O- I/ w, U1 x  x
  10.         Monster monster = new Monster("Дракон", 100);: @( F! C( Q' z& e/ o% F" {
  11.   {, X7 N& `" B7 m" P3 b8 e$ B
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак( ~4 [2 {$ Y: \( [8 N( \
  13.         monster.setState(new AggressiveState());3 X5 n: P! V1 I: ~' q
  14.         monster.executeState();
    " D9 Y3 d6 _: I- g5 x; ~
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 g: h* q/ h* m+ c, f0 t. x
  16.     }
    , v. ^6 l) ?( T" u
  17. }
    ' O3 J  q) W+ L6 f% _6 }* v( K
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
' \) q: N& E. K3 sЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
8 l3 b/ @( _7 b0 I8 g' |8 z6 l
: S# g( ~' `5 W* Y* n. ]: M8 g0 J- `  E4 o

* a; g* e  n" ]$ z( R( j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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