Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!9 C' h6 b( X8 `: u( @
5 A' g. ~1 b" N. ~

, [: F  V) p1 GЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.. ?2 ]# G9 l2 ~
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!- j$ ~) v% d6 i, ^, s& ^
Астралия ?1 P, W* O+ E4 m7 X0 d( w
1 W" R& J/ I0 U

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
4 o( Q" e! U- k+ m/ E' gВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?% H' M+ c: _- P. P3 z  r
' a( Y: D. g; |* Q5 x* s4 C$ Y- A
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
9 w  T0 {9 R! |9 ]* y2 Y& _
AlexCoder опубликовал в 2024-10-16 18:314 L' q  H2 g7 t/ T' ~$ w
День добрый!+ p; _' c0 |  X  t# W
В статье описано взаимодействие игрока с N ...

% D0 {& t, e+ i% _% ]/ i( ~0 \# EДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ \, V5 D; C8 E

( R( x# x) C, D0 w) X( RЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.$ f+ E6 X, |7 c* v

* S1 L3 Z" Z$ A1 \8 _+ _- k$ VШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ p! i# s1 l3 X, k& P/ K* d6 I# P
6 C0 K- S# X6 p9 E& ^
  1. <font color="Green">// Пакет для состояний монстра</font>
    / c: T' z  S% p  p" t
  2. package org.l2jmobius.gameserver.model.actor.state;
    # F8 k6 D( r7 k/ W3 i( t7 Q
  3. <font color="Green">1 |8 h0 q% g! P: R
  4. // Интерфейс, представляющий состояния монстра</font>
    ! P8 A- C) w! ]& s! r+ `
  5. public interface MonsterState {
    3 G1 ?! u) [/ @0 w& c% Z7 b5 `# V
  6.     void handleState(Monster monster);
    4 N1 N/ t8 d8 I# r# Z# K; K
  7. }( j1 C- Z8 k3 b/ P9 W; j/ t
Скопировать код

1 g5 s+ U% h  Y2 k# k$ Q! qШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) H& a+ F! n/ X' ^# `. K) e
) j0 b9 X% W6 @% yКласс для начального состояния монстра:
0 r8 Z( q# G6 ~( s3 J, a" y
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    / J4 [6 s& S# c
  2. package org.l2jmobius.gameserver.model.actor.state;  X; `: Y6 J# b% R9 ]

  3. - I* N2 c" V8 b- t
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ C5 c6 @& z* K8 o) O
  5. 1 D  B' `* R- r7 f$ ^
  6. public class InitialState implements MonsterState {. h0 h0 _0 j  i5 h. G, ^5 T
  7.     @Override
    9 _( _" }" b8 B9 s3 _
  8.     public void handleState(Monster monster) {
    2 n; G$ `( L: X' O7 E9 Z
  9.         // Начальная фаза боя& ?! o  b2 ]4 [' V
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    6 q9 N& W$ f6 n) n
  11.     }8 h/ M- C3 ]+ O& Z4 [6 M+ ^+ M
  12. }* a. W8 h" q6 f" ]: G
Скопировать код

& n8 c- Q4 e; P+ T; m. D( T1 k! ^! z7 B7 \. g* W) @8 u5 S% E

4 [3 w: Q, Z9 ~5 o* n- ~+ \( E# D
! g  u  P  h* \
( b5 |# Z, [! J# s: v( h# @, o. |+ t1 j( }* O# H( m' v

( Q  P( T: D( q2 p; ~) D
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 g! U* b5 d" H& g
9 r& t6 v* J) w7 f* G; P2 NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.! b/ c; V6 K  m$ t
5 ~. z3 j/ T$ M. r3 f2 m
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.) P- \+ a( ?- o: l6 O

$ ]; u7 e1 I/ N3 E# ]) Q7 i4 F4 W
  1. // Пакет для состояний монстра
    0 r7 P* Z; N; s0 E7 Q
  2. package org.l2jmobius.gameserver.model.actor.state;) j8 [% v( T; l& |6 U( A
  3. 3 k5 C1 Y/ b0 P5 @+ S. Y
  4. // Интерфейс, представляющий состояния монстра* v  W4 ]0 s0 }" c) P
  5. public interface MonsterState {5 v, `3 U1 Q. L, D
  6.     void handleState(Monster monster);
    * x* z9 l: g/ M% Y) ^; X, G
  7. }
    # _) n, A/ e5 _, u- m0 w2 j
Скопировать код
2 E- p% A* f7 ]7 ~3 |5 ]- K8 g
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.   ~3 p7 I7 {/ K' Z- u

9 `, B% k4 I# G! WЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 `8 v8 e# o, b) u  ~4 h
9 E. `& |. O7 qКласс для начального состояния монстра:) e: w/ {4 M$ O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; e, U8 @" |" b% _* l* X7 t
  2. package org.l2jmobius.gameserver.model.actor.state;$ F4 G' Q4 X  |9 y  r

  3. , ~- t2 G1 U# K" p
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 r  x2 j+ z& [9 \! ^- f* P
  5. 4 a" E" s& f5 N3 q6 _9 Y) {
  6. public class InitialState implements MonsterState {
    4 m( F1 q: l  a! P( A
  7.     @Override
    3 u, I5 Z: s. M7 \
  8.     public void handleState(Monster monster) {
    , U! L, V2 C( r& j
  9.         // Начальная фаза боя
      t( B+ }% N5 G' t+ Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 U1 Z" ~0 K0 i7 I  x
  11.     }
    8 c0 U, s6 x6 q0 z; R
  12. }3 q+ ?' [( P' m2 g' x) E& k# E* y
Скопировать код
Класс для агрессивного состояния монстра:! Y. F8 q3 c) O- H% O" Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& z% d$ ^4 U) p) N( `
  2. package org.l2jmobius.gameserver.model.actor.state;1 N% l7 |; X/ n8 i- A0 c# i- e

  3. 2 N# S  q9 Z6 R: z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # h, @% k3 Z8 c& k; s; m, f

  5. , U6 O; |- U- v7 r
  6. public class AggressiveState implements MonsterState {$ w, T: q3 R4 J5 n
  7.     @Override9 ?3 z# }+ H6 g
  8.     public void handleState(Monster monster) {# I) V$ r- S' `. \, A" w' q$ I
  9.         // Агрессивная фаза боя
    8 A/ o: ]7 T7 P2 i" w
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ! a% T6 `" Q1 U' \; \' @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* m2 A% y; V4 n1 f4 [6 a0 u1 E8 M
  12.     }$ }5 H1 z( ]" h+ C
  13. }& H) J" r5 x8 M( i3 h1 e6 w7 U; c: X* j$ v
Скопировать код
Класс для финального состояния монстра:
( q- e: [5 s6 s7 t' c; Z3 [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. p* H/ v: q$ u  A( t: N4 v2 V
  2. package org.l2jmobius.gameserver.model.actor.state;2 f* |" x) h% S$ ~# o: e% P
  3. + ~8 L6 V, N, N# A4 Q/ T2 j4 Q/ S
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ u  e8 _5 h2 X4 u  K' n

  5. - t6 k$ B! Y' F* S! G* G! s
  6. public class FinalState implements MonsterState {+ p3 V9 k$ `3 \; Y
  7.     @Override6 c$ ~  u) r. V; }" X
  8.     public void handleState(Monster monster) {/ p+ `: }: C! t
  9.         // Финальная фаза боя
    : M+ e1 H; S8 D. Y! y
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    . d- Z. `2 F0 C6 Q0 ?1 T$ R; p& g( n
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    0 b  |& c6 {. h6 j
  12.     }
    $ L+ x' h8 h9 \' N' |; u  {
  13. }* Q  H7 B+ X. l
Скопировать код

1 H, M( V( [( J7 V. |Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., |8 S* P; H' ~
  1. // Пакет org.l2jmobius.gameserver.model.actor0 l% G0 q1 _  A5 ^6 S% f. c9 T
  2. package org.l2jmobius.gameserver.model.actor;; B! {% F& h0 Y* B, ]; D# x

  3. 6 S+ t/ E0 m* Q, k* K
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & j. ]5 o, [/ ~* S; w' U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    " e3 E! k' z+ k( M7 i
  6. 9 @8 R0 B5 b: D" _5 ]) @1 e
  7. public class Monster extends Creature {  K4 z# N( N/ W. m4 _& q- c
  8.     private String name;
    + }+ h2 E1 o) M% p2 F3 I
  9.     private double attackPower;$ O! |3 m5 T0 \! s
  10.     private MonsterState state; // Текущее состояние монстра
    3 Q. s' A5 [$ M! o0 Y3 L: P

  11. 3 A$ S# g9 p- |2 v! f4 }5 J
  12.     // Конструктор монстра
    8 s! M  B# @' z( r# s5 Q% L/ Y+ e% T
  13.     public Monster(String name, double attackPower) {2 o! f1 ~- T+ }. t. h
  14.         this.name = name;
    % r; |" p+ w0 \6 g. l8 ]. {
  15.         this.attackPower = attackPower;/ j5 O, f+ b/ g  E- K" r
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние7 J9 ~3 m4 V) r$ d6 V4 ~
  17.     }
    9 a" u" k7 U; N7 G
  18. 1 u! g4 Q% p$ C4 P6 ~1 ]5 {6 P
  19.     // Метод для смены состояния& ~) B( L* L( R2 V# ?
  20.     public void setState(MonsterState newState) {
    ! {7 i& Z. O# b' f" g2 h
  21.         this.state = newState;
    2 {3 [( g) O* M% h
  22.     }8 n0 y2 s3 n) @0 n) @; o
  23. 8 Y- [" U3 }3 o: Q3 K
  24.     // Выполнение действий на основе текущего состояния
    ; Z, h% `0 _, y2 g  y- i+ Z
  25.     public void executeState() {8 W, Z4 ]! u3 W
  26.         state.handleState(this);" O: x+ ^: N4 L; T; `" L
  27.     }
    1 c! T/ f  q5 x2 h

  28. - x& h* y# i  l
  29.     // Геттеры и сеттеры" V- z1 H! U8 ]3 x% C8 ~! e
  30.     public String getName() {) s1 ]  Y/ E+ o  l
  31.         return name;
    8 X6 T) \: K! f! F
  32.     }* r3 o8 `! ]6 Q" r) H

  33. 6 u9 d* V6 o: N( ~
  34.     public double getAttackPower() {
    ( T  @7 |' B& ^- B: P4 `* P6 a, d
  35.         return attackPower;5 Y  j; }8 g; m
  36.     }
    # N7 H* F) ^; g7 @' `

  37. / Q. l2 M. }) A, k: F
  38.     public void setAttackPower(double attackPower) {$ X: f$ W$ u( K+ T* e
  39.         this.attackPower = attackPower;
    ; J* A1 P+ j. x6 Q& X  C
  40.     }
    6 |7 h! C4 z7 m! ~5 O" H6 S0 s! E
  41. }
    ( Z( m6 w5 U1 H; `
Скопировать код
) q7 n' u  k, T' V8 E! I$ |2 f
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* F3 i9 F9 K9 F  c. f

3 |7 l  ]% a7 |
  1. // Пакет org.l2jmobius.gameserver.model.battle
    4 ^$ ~$ s9 i) r! h
  2. package org.l2jmobius.gameserver.model.battle;# p+ |( Y0 N% N9 U0 v9 a

  3. 7 i" z- o" ^7 Y& D: ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;" Y7 {1 @) @0 n3 o( W+ k
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : J2 U- K2 e! `# M* n! U. J6 g
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % @2 I) Q) Y# _* U* J
  7. 2 g9 {4 y0 j- [. |) k9 u) j
  8. public class BattleSimulation {( R3 D9 K; e6 k- C. G
  9.     public static void main(String[] args) {
    2 \7 w  \- t$ A8 y# s7 O
  10.         // Создаем монстра с начальной атакой
    , B& m7 ~8 K6 K; W  }1 [
  11.         Monster monster = new Monster("Дракон", 100);9 f4 m1 k  H) A) X  m

  12. , O! R! y$ D! R4 d( B, a" Z( e
  13.         // Начальная фаза
    ; n; d( F! e: U( j1 l) a" r
  14.         monster.executeState();
    ! n2 O3 i, B7 d
  15. ; U! [2 {( ]: v; y' P
  16.         // Переход в агрессивную фазу  Y  x! Y4 o* n
  17.         monster.setState(new AggressiveState());- A' h: o3 l+ `9 S4 U! ^
  18.         monster.executeState();9 \( V5 R8 Z; m* U2 U
  19. % r$ L4 V' j! V: _$ G
  20.         // Финальная фаза8 X: N, u7 n( w8 a" B1 {) }
  21.         monster.setState(new FinalState());, Z# o) q, k+ h
  22.         monster.executeState();
    ' f4 Z/ |- i& }, Z
  23.     }
    1 A# _3 T1 @. W) E; ~) P
  24. }
    6 }& L9 H, \2 k6 t2 t2 U: l
Скопировать код

+ f, i9 l0 }1 S. @1 I9 ^2 g7 cКомментарии по структуре пакетов и классов:. F* Y' G0 i6 p
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    + Q% m4 ?  O* M8 o0 V" U( D' {! ?; Y! ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ A8 M: f& P4 r  g% GЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 i$ i0 C& {0 K& o( f$ b& U' j8 g( }+ p" X3 o4 f9 F

% z) X( ^0 H8 B8 u% N; ^, i
7 b' n7 K' a# x  ^
# L: m3 A! \% `/ R0 {
* N" K+ N# }9 Z5 w" k: M7 x4 ?. Q9 E8 M6 S9 B* A
5 {' u& w2 _* @" D5 x
' J/ s" e7 D( O* Q

, W4 W& n4 H9 m1 l5 ]
7 |* F5 ~' \$ X9 D2 l- _
/ x4 v# c3 Y! H( H8 K7 R) u6 x: P' b* S- ?" g

& X) o1 A9 K3 [5 d* w
" {" E5 q+ L. b9 h" }3 ?2 V
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' S! N2 j4 P7 S2 B; N# S  U6 Y1 rДля управления сложными взаимодействиями, такими как  ...

7 Q& q. E1 A6 H6 GОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
( P( \) p3 e8 OОтличный подход! Использование шаблона "Состояние" де ...

% ^: A- J% C6 o8 ]* G( g; CХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
# W4 d( H+ ?( Q6 L( m. d8 R! M
+ N$ _" N8 ~5 _) T# r! NШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
! N. {6 Z' Q$ v  p' Z3 V
6 {6 w- B0 O# U( x1 E$ g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 e$ L$ i& e0 t! f% F7 c- ?5 p
  2. package org.l2jmobius.gameserver.model.actor;
    $ ^' C4 c2 y& t$ p; @8 g6 k
  3. 9 ]* ~" t, l# i% J
  4. // Перечисление для типов атак/ K( S- z0 C& E- S/ @2 ~8 E
  5. public enum AttackType {8 i" a( D' u# i! N1 q
  6.     PHYSICAL, MAGICAL;
    2 ~& F0 T) _* _( e
  7. }
    " V. F- c- F8 y' X! R7 E
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.6 V# M0 S+ R# d+ o
Обновленный класс для агрессивного состояния монстра:
+ |1 H/ J* |! X& S9 S" A. @0 i' q9 a( Z# [  r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + l4 |, }/ C! l+ i
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 o0 t, y; W8 @4 n# q, G/ M

  3. ' G5 D# _* O4 V$ H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " Y! O7 v' N/ Y2 C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    & c3 @+ c3 ^7 ^) F$ P" L% Z
  6. 4 ~# ^# J2 c) t
  7. import java.util.Random;" T1 y/ v5 C# d# L) M2 [6 ?' V$ k
  8. 2 @& Q$ Z  y( i9 w4 J$ r  l
  9. public class AggressiveState implements MonsterState {
    / r% D! E0 K( S
  10.     private Random random = new Random();, o7 T9 G3 t6 w" T! K
  11. / @  U( [. e! G
  12.     @Override
    0 Q7 _) I# e  [7 \' d3 V- R  L
  13.     public void handleState(Monster monster) {
    * s- r+ a, I( E' {" Y, Y7 C- b
  14.         // Выбираем случайный тип атаки: физическая или магическая' }; V" l4 U# j2 f6 K5 A
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;5 |. b$ E. q- o0 ]4 ]% u2 X, l

  16. ) R$ U: \$ q( M, H5 S
  17.         // Логика для агрессивной фазы боя. y  t' |/ P) ]- ?" K; A
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & @. \- E2 L6 I& A2 D( S5 B. h5 ^& X
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");/ e1 M0 L, f( U1 C) c! F2 s, K
  20.         
    4 C0 u% p7 D  s' K' B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    % {0 p+ t: x- G
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;. }. C, M1 d: g9 c3 ?
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);4 u! g# F0 t6 Z
  24.     }; V+ x, S" E; R( R0 f3 M
  25. }
    2 ^) ~  V+ I  f; J3 \2 l. h; q
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 o, u% p" `- o9 U' L% G

7 l  \- v2 u+ H! n' h8 C1 g+ Z0 t9 p
  1. // Пакет org.l2jmobius.gameserver.model.actor% g, a2 b/ p" l4 m6 t
  2. package org.l2jmobius.gameserver.model.actor;# T0 z# g8 R4 n3 }* i
  3. ( j# a/ T! |7 x7 M- n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    & C8 S3 i3 s# I  r3 u. j
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  S; Q3 w! `# X$ o
  6. 5 J6 m. z- w  ]1 O$ j; F7 O
  7. public class Monster extends Creature {) w) P3 j9 X3 p% S6 {
  8.     private String name;
    6 l; I/ S: A2 B5 M$ C
  9.     private double attackPower;
    3 |4 w. Q* T- }5 j
  10.     private MonsterState state; // Текущее состояние монстра5 W* p3 l$ V. `" y5 Y$ S2 C+ L
  11. , C" G* j/ s3 d/ O
  12.     // Конструктор монстра( C0 `3 t- |; T& t+ L* E% D
  13.     public Monster(String name, double attackPower) {
    ( W! X, z$ v* _) Y8 ]
  14.         this.name = name;
    5 K3 f3 y: R7 X" f7 y
  15.         this.attackPower = attackPower;
    % N, E3 v7 J2 w3 D2 S2 m+ W
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ! ]1 g# ?) x9 d. M
  17.     }- y& p1 M1 z% \
  18. ) J6 m# a3 m+ x) M- Q1 `  ]$ n% G
  19.     // Метод для смены состояния& }! v0 T& e6 ~! B
  20.     public void setState(MonsterState newState) {
    7 i% h9 N1 c9 F! ~5 o0 Q: ?6 C
  21.         this.state = newState;* L2 L* J( G4 G1 m
  22.     }
    1 D; S8 |- S1 j  Z  c$ o

  23. . \$ a& l8 V: c
  24.     // Выполнение действий на основе текущего состояния
    & ?2 P* `1 o* m+ h: s0 w
  25.     public void executeState() {  H+ |" O3 x3 ~& L+ X6 ]+ O5 ]
  26.         state.handleState(this);1 i; t  J4 l9 y( `
  27.     }& D3 B- c: c& r/ `- I; e, Q
  28. 3 E  V9 o5 a# g, y% K* b
  29.     // Геттеры и сеттеры
    0 U. M2 F2 w$ y* I( h
  30.     public String getName() {0 C% t9 e* r0 L: p
  31.         return name;
    " p$ F7 p! f: P! f
  32.     }
    5 T2 C* w  z' z) g5 K4 g# E2 L; n
  33.   b6 ~) g1 b2 k. B4 Y" u
  34.     public double getAttackPower() {  @0 ]2 ~+ S3 }4 z
  35.         return attackPower;
    7 G4 g" S# H6 F/ r2 m
  36.     }
    ; m1 S, ^+ i9 e- `& {

  37. ) Q" Y/ Y2 K% n( W( U2 G
  38.     public void setAttackPower(double attackPower) {6 D( f% ?& b2 D
  39.         this.attackPower = attackPower;
    ' c$ d( R: e/ |0 z" |
  40.     }5 q  n$ Q8 d# n) C' v6 G0 Y
  41. }
    & E8 D2 h8 w4 v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  L6 j# ]# N( G" s0 A( c5 e5 m" H" t
  1. // Пакет org.l2jmobius.gameserver.model.battle% t, O( ?% N( l3 L( r+ L* ?! @; a$ _, c
  2. package org.l2jmobius.gameserver.model.battle;
    + I" C, q1 ]' z$ I" Z

  3. . D' ~) U  e9 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 J8 a) e9 t) W% I9 _" P) s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;$ I/ A, D; N9 c9 H

  6. : a" `4 O5 ]) L( Y/ h: Q
  7. public class BattleSimulation {4 x# f# ]0 G2 A4 B
  8.     public static void main(String[] args) {6 H, g! c, Z' ~' V& G# ~0 i' M  n, q, s
  9.         // Создаем монстра
    8 v6 e2 G8 S' ~( W& e' b9 n9 B( T
  10.         Monster monster = new Monster("Дракон", 100);
    0 b8 T3 Z# a$ {9 y2 H1 t' z, K; z

  11. 2 J0 B" Q7 L2 U: k3 O( G2 t
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    & i- y3 h( P, x0 ~: }& u6 U* ?! d
  13.         monster.setState(new AggressiveState());- J4 g/ n* D, `( T  i
  14.         monster.executeState();
    ( ~  x: R8 N$ ^2 k2 B5 R
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ; V0 k! ?9 A0 `+ I! F) E9 N& @+ Y
  16.     }
    9 N; P2 r# @) P; t0 f
  17. }
    2 p" N$ {. r4 u2 z  V: {
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.1 |; d4 N+ q+ ]. d( L, P9 A" d
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!+ i! r1 M% [# q; K! ]

+ e# }# ?/ i1 p1 }; z' d  ?( r2 a; e$ D

8 Y* g8 N3 p4 [) J% I( p8 \
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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