Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
4 z: S) _6 P% v7 \* [
8 c! I6 J  v& x3 W" R2 g0 s, |
! d; f( v) {1 d% `, y
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
6 ?3 U2 w% U  L% y" {, T1 c! f6 wЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 q. K# o( j  \& Q# s" `
Астралия ?
& V, h, h- V! {: ^7 V0 I
2 s9 _( b- C6 k: e  |

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!( D. S5 f8 U% q5 i! f, c
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- ]3 q( z: l3 c; M- |
' f# u4 u- _2 m8 V
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
% Y) c1 {3 @: _
AlexCoder опубликовал в 2024-10-16 18:31
7 c! ]0 {3 U; Y9 sДень добрый!
* f! Y- B5 ~8 dВ статье описано взаимодействие игрока с N ...

2 s2 Z% d3 b3 D5 }Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 R2 i& E" O) o7 W1 a

  s; s/ X4 C1 HЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: e! p+ P/ G6 H

) x$ \( W4 _: G% w, u2 W$ A2 dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 t7 M  [, A8 P2 _
$ B5 s' z3 A' z6 E+ H+ i" {" n0 n
  1. <font color="Green">// Пакет для состояний монстра</font>/ |" i6 k3 C$ S, z2 ~) O8 ?6 _
  2. package org.l2jmobius.gameserver.model.actor.state;) }* w1 g: D, p
  3. <font color="Green">( K8 l/ v$ J* ?6 y, u
  4. // Интерфейс, представляющий состояния монстра</font>, |3 B# x5 D+ y) s( D
  5. public interface MonsterState {
    " f# S8 `. `9 z% |- f8 u. \+ P
  6.     void handleState(Monster monster);/ z) k5 h* k; Z2 Q. v6 _
  7. }! d- x1 Z: d. F* d4 g1 m" i
Скопировать код
3 i+ X% B* S3 e3 \. d' ~8 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' N" D! l* k1 B- u/ G5 O5 A
  `6 P% A: _8 z/ R% _' K' ]3 L1 s* O9 M
Класс для начального состояния монстра:
; i; F' `5 ]1 V8 Y: N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 T/ c0 H. b& b; V9 B; V
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( R5 O' Z% n1 {; v

  3. $ q, O% N* c. `; ^; b' l, i# B. J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 d1 z0 [) h2 {

  5. ) t9 b# m0 T7 K# ~
  6. public class InitialState implements MonsterState {
    + J9 |  {2 v6 e9 D  |" p
  7.     @Override
    ! K6 \' M- M6 P3 T% R
  8.     public void handleState(Monster monster) {
    , h8 `: s9 w+ M6 s
  9.         // Начальная фаза боя% h1 G; M+ X& @- b- A$ }/ }1 M% ~1 [
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 H; F! }9 o* h/ p7 l1 ?
  11.     }( N! E8 I3 B* u4 I) o
  12. }
    # U7 U! r& S) @. h$ K9 F; y, {
Скопировать код
/ i- ?7 R, K6 Z! @

/ [7 y1 \, {- A" ]0 Y  m6 q8 u( r4 E* c/ I8 [, C& [

2 e) T6 t7 P9 o( \1 n& t2 g/ X' G5 o( ?, e8 P4 t( T

# e0 _' F/ j5 N3 N6 Y
+ m( j3 O3 H7 b4 V
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( ^1 \9 }5 B, q1 V6 J8 U! u4 {# J
" s2 o. b7 K! A7 X7 n0 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 i  j7 n* y  {" e3 t8 y
3 d- C9 P0 _- J9 D) lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 _, \& J  L% ]/ D9 T" ?3 H6 {" p$ D. o& J& y* A9 e
  1. // Пакет для состояний монстра0 [) z; q8 O  w: r
  2. package org.l2jmobius.gameserver.model.actor.state;
    : f! o; q+ l! `9 Z
  3. & z# {' i) Z; L2 `( t( R% U
  4. // Интерфейс, представляющий состояния монстра  t7 ^% Q3 M. ?6 x+ Z- a
  5. public interface MonsterState {) t2 S* p! i( B5 i
  6.     void handleState(Monster monster);
    2 z; q1 @5 l" w- o: M( _/ I- ]6 c3 ^$ ?
  7. }
    + l3 }* [# Q* s8 N
Скопировать код
/ T$ r( k6 A) U5 D5 o  U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. . s& j5 x6 o% R# ]% l8 q0 H
0 o3 G( f' M( w
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# D3 ]+ l  j7 r

" a. Z- n  ]) z+ P4 ?+ S2 {Класс для начального состояния монстра:
- N! j- ?3 n& i, [5 x1 p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " e" w0 Z3 }6 f3 Z7 n) D
  2. package org.l2jmobius.gameserver.model.actor.state;: t# E+ M# y: ~6 A, m! P

  3. 4 Q' v( X4 ?& e! W3 ?4 g4 d! Y$ f
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 b4 ?5 i, m* r! U+ F

  5. * w8 r7 W9 k! B. _" l
  6. public class InitialState implements MonsterState {
    0 X8 \, p& Y7 B1 }% T: W
  7.     @Override% ?8 ]' @) ?; ^8 _6 z( a& B2 X
  8.     public void handleState(Monster monster) {5 `6 S, H6 l& U4 u/ O2 T. t7 y
  9.         // Начальная фаза боя% _" D1 [# N( t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");* N* `6 w5 U. |% X/ l$ S
  11.     }
    # R: X) `, E2 z) O( g: r
  12. }+ x& @9 v: W# I" @
Скопировать код
Класс для агрессивного состояния монстра:0 o4 W1 U  D; Y  _2 G2 L( D. A" \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) C$ x  S% e. S! B6 ?% f
  2. package org.l2jmobius.gameserver.model.actor.state;, |; r7 w9 }0 X7 @

  3. 6 `% ^, G( n: x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 S9 V! J- T8 m( U0 _5 p

  5. $ _3 S* R0 \! \" W3 R9 M$ P1 ]! l
  6. public class AggressiveState implements MonsterState {& ~4 t* O* l( c3 W" l
  7.     @Override2 s4 |. }; a! f9 R# [) a1 c6 C( u
  8.     public void handleState(Monster monster) {; D8 I; Z% Q* H$ S0 ?5 l+ u. \
  9.         // Агрессивная фаза боя- I8 r. g& P& v0 [1 e
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 }) N& ]( e" i% K  P  y& W
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    2 {7 C9 Y, L1 \
  12.     }9 l2 B) e4 V8 s; k9 s/ e
  13. }
    $ g8 i, a0 f+ X, ^1 j- t6 ]
Скопировать код
Класс для финального состояния монстра:, Z) S- S! k) Z  E' S: X1 P6 y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state+ h% K& e! D5 C8 j
  2. package org.l2jmobius.gameserver.model.actor.state;$ u9 m: p2 v4 ~! m. Z  r
  3. * j; U2 w' t" C' p' _5 i: X) x$ U0 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;* ^2 u# {% v& y* v

  5. 2 j% {8 A( Y( y& ?
  6. public class FinalState implements MonsterState {, ?  L7 I# ]' y
  7.     @Override. i+ E9 A( }% ^* n  s" ^& z
  8.     public void handleState(Monster monster) {1 m% ^2 D) E3 s
  9.         // Финальная фаза боя
    # P0 k3 }' ]. `, h
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");6 Y( C2 ~8 u3 ^$ @: H
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( I' L! D8 G6 `, O* H
  12.     }
    . ?9 G9 J/ {. h; \  U/ ]
  13. }
      e3 U+ o0 k, J
Скопировать код
7 ~& D) I/ B0 d$ E& Q; {
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
& [& t2 `; V) P! d5 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + Q& t0 Z# I4 O  u/ U
  2. package org.l2jmobius.gameserver.model.actor;
    : j, y! K5 p6 @% P5 k; Y$ X
  3. 8 W- |" S# N; _' X+ a0 D: t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& ]! x' U9 T; ?% _+ ~2 I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* d, \6 k" \6 f5 W* A6 _
  6. : g; {& |$ y1 H' P
  7. public class Monster extends Creature {
    % F; B: m) W% o: K% E# h
  8.     private String name;+ D: m7 L: K1 c9 y
  9.     private double attackPower;  |( y/ Y) ]! N1 F9 a
  10.     private MonsterState state; // Текущее состояние монстра3 }  P4 Q: S9 l! S, R

  11. 6 U  [0 j" O+ Y* O$ R8 R3 e1 D
  12.     // Конструктор монстра
    & {+ n" y; u6 G+ h# w3 G( @
  13.     public Monster(String name, double attackPower) {
    % [* G0 c! t, }" ]: U
  14.         this.name = name;# O7 l# J. N! G
  15.         this.attackPower = attackPower;: t8 L9 q: S& F% _& p7 Z
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние. ^4 l) ^1 E2 f  H6 Y# p0 X
  17.     }0 v/ }3 Y/ v5 X" k9 v( S

  18. ; }) d0 R% o% [
  19.     // Метод для смены состояния
    % v+ p: }  R* ]: d+ k
  20.     public void setState(MonsterState newState) {
    % n& ^$ }% D# {  l6 H
  21.         this.state = newState;
    / n5 p% ]9 N& c
  22.     }
    * a7 u  t  H0 ]  H4 V% i/ u' u6 [

  23. - n* R" F- x8 C: E
  24.     // Выполнение действий на основе текущего состояния
    $ B" z. A- P. N1 _% i/ u
  25.     public void executeState() {
    # ~( {/ t) f! J: f
  26.         state.handleState(this);
    " t: X0 B  X" }
  27.     }
    & X1 K) b0 s; [3 V

  28. " v% t) O& C3 X) ^7 q9 J! p" P5 t8 v+ ]
  29.     // Геттеры и сеттеры+ Z1 a: P# |+ T- a& J$ t' W
  30.     public String getName() {  n) F* A# I) T6 E6 e. w
  31.         return name;
    0 q7 _% e1 g/ V0 H8 Q
  32.     }! y7 I7 E/ w8 f/ Q( [* O

  33. & b0 g9 H" y% ~% E
  34.     public double getAttackPower() {
    1 W( D$ i* ?* D/ H& {9 p
  35.         return attackPower;
      O6 w# ?+ [+ y+ [7 \  s
  36.     }% a* \% x6 S; r' a8 a- B4 w; W; v& b
  37. ( c6 p3 _; C- L6 C, S$ P$ }
  38.     public void setAttackPower(double attackPower) {; s9 u$ h$ u/ G* j4 \4 P
  39.         this.attackPower = attackPower;, ^1 K. m2 b, a( Q# A, c
  40.     }
    , B, r/ u9 n) I1 l' t
  41. }3 z1 a5 ]4 j2 b  R" B8 B( \, h
Скопировать код

" A9 w: l* P$ I) e1 U" t, ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ G2 ?9 O6 s- F- x
6 ]' n: e$ ?1 w) i1 n8 ~- p+ z
  1. // Пакет org.l2jmobius.gameserver.model.battle$ z$ ~; w/ v" Q
  2. package org.l2jmobius.gameserver.model.battle;5 }5 C. D8 G/ z  o$ K
  3. 8 j  w: U7 p5 q3 ^' u5 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 _% p- ^( l3 H6 P: M( G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" i$ S  n$ k5 i. f
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;# P, c  ?! q2 x' D: i
  7. ! ~0 y( t" Z  P* o  H
  8. public class BattleSimulation {
    4 F; q$ I& Z! b
  9.     public static void main(String[] args) {$ A, Z7 }. F/ H% m
  10.         // Создаем монстра с начальной атакой0 Z, O7 W# n* E% Y: O2 b
  11.         Monster monster = new Monster("Дракон", 100);5 p1 ~5 q. J% v- Z

  12. 0 V" f0 H: j8 x3 _4 y, r  A  R
  13.         // Начальная фаза- o. P4 F5 |& C/ l
  14.         monster.executeState();
    2 Y) d/ R. Q9 A* |( m$ M
  15. 0 d- D! Z) }3 t3 P) B
  16.         // Переход в агрессивную фазу7 C" R/ y8 ]) V) w6 h3 I
  17.         monster.setState(new AggressiveState());
    7 a$ M+ P' Y+ U5 A# L/ N. `
  18.         monster.executeState();
    * `, G; ~& |( l! d& g4 V' P: J. V
  19. ) _7 a* O  p. `
  20.         // Финальная фаза/ D' W) Q8 s6 e8 Q
  21.         monster.setState(new FinalState());
    0 \( h/ I1 w/ b* z  \6 W
  22.         monster.executeState();6 H2 }1 x6 i( O2 ]. W0 I
  23.     }
    5 P6 K& L+ K  D; C% x2 {
  24. }# S( |$ m/ N) s8 h7 O% F
Скопировать код

4 X; A. M# s5 u, i3 @Комментарии по структуре пакетов и классов:
2 z; t* f( u0 s( N
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.5 a/ Q! r: Z$ x9 M& G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
  Z& ^/ A6 J4 A3 n9 i6 sЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* e$ t& g3 m) Y. b7 @2 r3 ]' \* q7 {
3 v% x! W; e. I3 B, s
9 w- B" Q# c2 W  {

  G( E/ G4 e, D5 m5 o1 _2 P) E( V
  b; ~. _) m- r% S! w/ Y- e7 |+ J

4 G2 ^! x! d/ T8 h4 J
& L- p+ t3 _  C% y: ?; u! m5 W3 o# e( \: ^; {! M

+ E0 `, E7 T! E1 n; M. `0 d- U/ u2 X0 m% O- t% ?- J

. t3 c9 W7 D% ~  q2 m- ]" M
2 K+ A. |. ]1 N; o  m  y1 L% w
% O  C: s7 B  V, n: G
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 h1 `5 b8 ]. x: NДля управления сложными взаимодействиями, такими как  ...

$ X! Z! p( t; _/ A+ rОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
  ~) W4 a+ g: ^; J1 O8 H: _Отличный подход! Использование шаблона "Состояние" де ...
( n" z" I5 i6 {. t1 G! P4 U) B* V
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.7 [0 K" K% d! s2 H
: J  N" }/ B) n9 W  Q" m5 d: O1 L' j
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
$ \% d( `5 L+ E% q+ F+ I, ~
; h" |- C) U* x; }7 X+ W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " {( I6 m* M0 T5 l
  2. package org.l2jmobius.gameserver.model.actor;' Y4 T* u4 A; B) B/ h) u  W  U

  3. ! ?5 O2 p: t! X7 z9 m
  4. // Перечисление для типов атак1 I1 I" [. Q; g; b0 ~
  5. public enum AttackType {! b4 q6 o* G2 f
  6.     PHYSICAL, MAGICAL;& b1 q6 y* Y8 d# g, `% `
  7. }
    / [5 c  Z5 C" s; ^( F6 ^
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.) X$ L1 [1 S' h4 U( f6 y3 y. p: u
Обновленный класс для агрессивного состояния монстра:
5 E2 E  ]( w) }* R5 E  t( N
( N) P* ?) \7 z! f% q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 c3 }5 k' l; q
  2. package org.l2jmobius.gameserver.model.actor.state;# g. r- f: Q4 O+ S) p

  3. 0 g( f5 l; V8 @1 p; B4 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 r; ?! y3 O. O! H
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      f" q( U0 g3 A1 Z1 m4 W
  6. $ m0 m( R" S* {# I7 u, A- i
  7. import java.util.Random;. r. ]7 |. M/ I" W3 R- c/ X
  8. 1 x- t9 d8 U/ d% Z; v
  9. public class AggressiveState implements MonsterState {
    & ?: ?4 ?8 ~0 d3 C
  10.     private Random random = new Random();) X3 z& W1 c) |' w7 _* {: c: i

  11. 6 V& B2 F% T1 D+ h% P# T
  12.     @Override0 s( D1 t0 {- D4 l/ g
  13.     public void handleState(Monster monster) {# l/ E) O* ]7 R* j% x, d! t5 I
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 z' D! u  U: I2 J' |
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! g+ l/ z, }& h6 w! o7 w) v; C1 w
  16.   Y8 W  n5 z9 N8 D: |
  17.         // Логика для агрессивной фазы боя+ J1 F( I2 h& a; r3 T& K" o% Y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " - r/ y/ l& ^7 w: `+ D
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
      A/ F/ f# R: h; @$ C' g
  20.         
    2 `" g: O0 v; j) X% u- `8 b
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! v% W! t# _5 R; T( Q# T6 j' s# l2 M1 Y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ( n0 p4 x, W) J/ x( B0 G6 p) L
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ) _0 Z& t: K5 D  {: Z9 p* Y
  24.     }
    " U; |8 V- \; S# b8 t6 _& A$ G6 |
  25. }5 G' y& S9 `9 \- b/ a+ s
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки  D7 b! m4 ]( e
3 n9 D% n/ i3 E$ @2 n7 S6 k9 l
  1. // Пакет org.l2jmobius.gameserver.model.actor% _7 G" B( ]% Z
  2. package org.l2jmobius.gameserver.model.actor;
    ' @* K) q6 \+ g6 \# G

  3. 8 u% u9 W! l4 y9 Y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 k/ m3 a4 O+ {( h5 Y( X, m" H+ W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' s1 y6 `" K; X# _

  6. - K1 ?! P# x5 x" N  a0 m' u$ Y
  7. public class Monster extends Creature {( _) }: r0 ?6 m( `
  8.     private String name;- \9 A# B, Z8 o, m
  9.     private double attackPower;
    1 _8 T7 n: o5 D. K
  10.     private MonsterState state; // Текущее состояние монстра& O4 Y9 H1 b1 B. N; A
  11. , j! u( P" y/ Z0 J5 ]% x
  12.     // Конструктор монстра
    : v( h# ^6 M2 I# X; j: G
  13.     public Monster(String name, double attackPower) {
    ) ^2 D, M6 J" c
  14.         this.name = name;' R0 A+ t/ T7 G0 E! r: D
  15.         this.attackPower = attackPower;1 l" g( i" ?  l& u( O$ \0 M
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    " w. I) H; b; F2 F$ \! S
  17.     }
    # y9 e/ ?. b3 Y  p8 I% v! D* C% f6 A
  18. 9 W2 }3 O! @9 @7 D" t0 P( B4 X
  19.     // Метод для смены состояния6 U# R' T' B* V' }; V1 `/ a, I& ^
  20.     public void setState(MonsterState newState) {! I( H. G5 m9 l1 P8 C: G
  21.         this.state = newState;( ~2 b8 D- H* d0 v8 y
  22.     }
    + Z$ M9 e6 g8 \+ H/ I" {' W2 D
  23. * V! f4 S% T, M3 i1 e( K# S2 f
  24.     // Выполнение действий на основе текущего состояния8 O- ?1 y# s) w
  25.     public void executeState() {
    ) p9 H: D2 {4 T; Q2 {
  26.         state.handleState(this);
    # `, C9 u* L: }7 v- Y6 Y9 I( d. G
  27.     }0 H9 ?& Z( L2 J+ J* W1 N
  28. 7 ~1 e" \* G9 G8 N. g7 y
  29.     // Геттеры и сеттеры
    0 @7 ~/ j& v) `
  30.     public String getName() {' k! r/ @& ]; O2 o
  31.         return name;  c" x/ Z$ y  a) x
  32.     }
    9 u# {6 H& s/ g  s3 D

  33. ; y" R9 S( O7 }: q: ~0 f( Q- d
  34.     public double getAttackPower() {
    3 a5 K! E$ W0 _' t8 o# N( X9 ^
  35.         return attackPower;
    + C3 z8 x  C: r' j( L5 s
  36.     }
    / z) a9 J9 {* d) i- a

  37. 0 }, V/ H' ~6 e: |) B5 f) g
  38.     public void setAttackPower(double attackPower) {' e' w' u3 o; Y( G9 h) \7 u6 G, f
  39.         this.attackPower = attackPower;& Z/ ]. a, N0 R* G0 I8 R; p/ s
  40.     }: Z7 G# Z( d, ?: h4 U" H' L" r
  41. }
    5 [1 b" Y) o. g1 a4 [. R  v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
; w7 ]& V8 B2 K/ o6 H3 A
' s( p$ G" d1 r4 X
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - U. l/ c0 x1 C' a
  2. package org.l2jmobius.gameserver.model.battle;
    ! T/ k6 Z- p* f& W( S' W% `8 e5 g+ n

  3. + O5 Z1 k5 ^* v
  4. import org.l2jmobius.gameserver.model.actor.Monster;  `: {9 p! Z) l
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) h9 v# Y/ ~+ \

  6. 7 S; ~! u# D3 ]" `8 v; S& r6 k+ M
  7. public class BattleSimulation {
    8 ~2 \' Z$ ~" y1 K# y9 ^) x  x
  8.     public static void main(String[] args) {6 H9 N1 k4 Q+ g0 [
  9.         // Создаем монстра! U& O( a2 A+ R3 v
  10.         Monster monster = new Monster("Дракон", 100);
    7 q9 X0 T+ w+ F: W7 |7 ^

  11. 5 a* l2 x8 k, R$ Y
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    $ a0 p. ^( x2 V3 S3 \
  13.         monster.setState(new AggressiveState());
    + {* S5 Z- V% y
  14.         monster.executeState();7 u7 s4 O9 H- L+ T$ ~
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ; h$ _1 l5 r5 w; o* j& |2 @+ s/ s
  16.     }
    ; c* L% Q  w3 A4 N! j
  17. }
    3 D/ O5 {; D+ y% ?4 {9 T; a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.) D, e: y& v0 ~. G9 G
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!, O8 Y. x5 d% v: K

6 ~' d3 C% ?8 k# P; ]3 c
1 S' H, A, G5 {% e' K. b
5 L+ a/ f9 ?- o" R! b+ s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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