Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
5 m$ h, N* ~2 W7 S, u' z  Q+ `' `0 e, W; @5 c

4 f: Z) Z! }  @5 O: uЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.( g' |  Y* m- m9 E* j
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!1 ^) ^* g5 X) x* z3 c
Астралия ?( H% X$ C$ a/ X# W
: @8 I1 L/ H9 d$ F

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
  w8 c& C2 k8 Z- WВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
/ \; G2 s7 x. D+ G4 S7 F
8 F& ]2 e" j) E& s7 r3 d
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
3 |8 t+ D" m8 N2 i- s# \
AlexCoder опубликовал в 2024-10-16 18:31% ?" W, U* r+ z
День добрый!
8 x  }" j( m$ Y% F9 i7 G. L; k& DВ статье описано взаимодействие игрока с N ...

  H! J7 `7 ]: c" S$ a9 I: U/ VДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 R& T. {- h0 F2 b1 {3 \
! r$ C* n4 Q4 b, ]) |3 ?9 tЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: I- ~, y( ]" D- H& F
3 j" G' }& G4 C  x2 x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* z# p- e$ ?8 a" B" v8 t4 t% Z: q8 f, e4 @( S
  1. <font color="Green">// Пакет для состояний монстра</font>
    . t+ z+ D1 f. }3 f' n
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 @& e8 ~8 B2 O! a3 P. \2 P
  3. <font color="Green">- `  v5 M; |, Q; H5 A; k. v
  4. // Интерфейс, представляющий состояния монстра</font>/ L/ i; x# s8 b6 q
  5. public interface MonsterState {' E" ~# S4 {/ S# e" A, Q" a  ^: e0 R
  6.     void handleState(Monster monster);2 a: Z3 d! O/ L3 I2 }
  7. }
    0 [8 i3 E4 ?& P/ W- T; A9 j
Скопировать код
2 q% ^; A2 x" l$ C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 z$ b+ P- g% h- H  E7 \' {3 i% @5 d" t, ?0 I
Класс для начального состояния монстра:. A$ {0 F8 s! o1 I; v/ v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    1 c7 ?7 `0 H" G, A! u2 l% ?+ Z6 g
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ X( H0 x. P! }8 }
  3. . N6 ~" O4 D& @: \, d
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 I/ K8 U' F0 u3 j0 t: l

  5. : O! N# T; y; _2 v  v2 q5 [
  6. public class InitialState implements MonsterState {
    5 p. w/ D( e) j; N0 ]& @
  7.     @Override' o9 C+ |% E; O/ k+ T) P, V* p
  8.     public void handleState(Monster monster) {8 D$ s1 A1 x8 q+ l  E% d9 U. b& A
  9.         // Начальная фаза боя
    ) W/ e- S! t$ F& T% i" P2 B
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" y. c" C6 n$ a/ {& P1 x
  11.     }2 s+ J- w' J6 M: ^0 f
  12. }
    $ R1 U- A' N6 l4 }. \* R3 w0 l. Q
Скопировать код
# v# S! t! v- V3 _0 ^# ^2 A
, P5 i2 P+ I! j  i! W/ `+ }* l* B, @
4 J# E- i6 \5 F: i( T( \) v& u
9 i9 r% E4 M6 @; [- P: `, p9 X
) P8 u$ d( r1 K, a$ W! S( R

. {" R3 _# K) U0 x0 t* K' J+ j' h7 K  K& r1 x
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / `( p3 l" P3 h/ a( W
6 O2 N9 {" s1 K* G: i) }+ R6 j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* T2 \- V- x- D% O. N3 O8 N! d* V: T7 s: S" T. Y6 \% A- S% {
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.: m3 ~% ?+ X  t) X$ L) p% q
1 l; d) ^2 O4 q% i5 {' z6 Y0 I( G
  1. // Пакет для состояний монстра) c" u8 |! h1 K0 o( i# n
  2. package org.l2jmobius.gameserver.model.actor.state;
    " y9 r: M8 n- R1 P6 P& [; }, y
  3. $ o7 e7 j! b- [& a3 n
  4. // Интерфейс, представляющий состояния монстра
    ' T+ A/ W4 o3 Z$ F% i3 D
  5. public interface MonsterState {) c/ J8 N$ M5 e1 P2 F* [
  6.     void handleState(Monster monster);
    ) v; y* ^7 X9 H& [& q4 Y7 C
  7. }0 ?" }, q6 [$ B- |0 H! j
Скопировать код

$ k7 Y( t0 }7 b, |! gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 m% R' E) ]" S# V) l
6 e# C8 k+ l+ f: K
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! V9 I& r( z9 u3 H- o" p  R1 U
2 b. `+ @; a8 C9 D$ m" o
Класс для начального состояния монстра:; L9 Z9 [( \. u, C) l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 a8 |3 H% T9 O( J
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 l( W% |# Y8 |; Z# _
  3. ! |+ a$ y8 b/ B
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 |' x0 M8 A' g/ l8 I& {& C" m
  5. " r- }, X+ q6 j% u1 T% h6 v* O" R
  6. public class InitialState implements MonsterState {6 M% H! T1 z2 a" _! V
  7.     @Override& M1 G# K% d) ?$ s5 J
  8.     public void handleState(Monster monster) {
    . i3 O3 B" r) e9 f8 l4 P" \# c
  9.         // Начальная фаза боя
    " f( l& Y" Z% L+ d/ J# W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( G# D: M! n7 K( x
  11.     }
    5 |- d0 m" ]( R% b
  12. }
    3 ]- g% d* j! `5 v0 @
Скопировать код
Класс для агрессивного состояния монстра:
. u+ `" _9 c  N4 }7 t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 @9 o& B9 F) k+ E/ ?
  2. package org.l2jmobius.gameserver.model.actor.state;6 k( i1 _/ J# A. z

  3. " s  ?: m  B, N4 j$ z; X9 u( B
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' O# q" L' j4 S( T7 i, ^! p

  5. ' u4 H& o8 q1 Y- [  L
  6. public class AggressiveState implements MonsterState {# m$ L" \/ r2 m) \! w* c+ C: P: S. M/ Q
  7.     @Override
    9 u, G: ^+ j  o" J! u8 ]
  8.     public void handleState(Monster monster) {7 |0 Y5 d5 ?& V* Y
  9.         // Агрессивная фаза боя
    " K+ p# f5 T' \( @1 r
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! X" ^3 K  _- P3 @# W1 N
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    # x8 u: [* s5 g
  12.     }
    . m5 x% c  a2 _$ h
  13. }0 F5 S6 Z8 e+ N$ X
Скопировать код
Класс для финального состояния монстра:6 h. m- S/ C! Q9 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 k* ^& m/ J- H* R1 |: E& f6 X
  2. package org.l2jmobius.gameserver.model.actor.state;
    - M. {5 y. Y' Q1 T; o. l( R% A+ b
  3. # d6 r, z$ S: G9 O9 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * O* d) {/ b+ N( I* N
  5. 4 U6 d# y; K% q1 s
  6. public class FinalState implements MonsterState {
    8 t; v4 B+ C* d) g% b: M
  7.     @Override. L5 @; ]" P" ]- ~
  8.     public void handleState(Monster monster) {
    ' C# z( i3 K* @' `- k* w5 A
  9.         // Финальная фаза боя
    % }/ O, o+ S4 K/ L; K7 Y5 ]$ R/ N% r
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");. q/ V# {% b0 R2 y! d* {5 [! E
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    & G: D( S8 d4 p) O+ ?
  12.     }* b2 `) d; ~  ^4 E( i* X
  13. }: B4 u1 R, J6 @. l* P
Скопировать код
6 ]3 z, Q/ o" u
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.5 u! G. M- Z) k+ ]$ Z  Q" }+ Q
  1. // Пакет org.l2jmobius.gameserver.model.actor/ n3 J: B" i! o8 ~
  2. package org.l2jmobius.gameserver.model.actor;
    % ]% g& ]  z. I- ^% _) y
  3. 4 Q9 q% X& I8 c2 M+ F; {# Y$ H
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    7 X4 z$ j& f3 P% k  @. ?
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* Q- s3 g$ z1 _- C. A
  6. & U! K/ @; i0 n' G/ w$ X' b4 f% j0 ~
  7. public class Monster extends Creature {
    + U* J' B  o( z
  8.     private String name;
    6 J( X+ v5 d% U. P4 a; u7 B1 e$ `3 f
  9.     private double attackPower;/ \; S' Z6 L* ]5 U
  10.     private MonsterState state; // Текущее состояние монстра: R2 z, O2 ]( [4 b
  11. * v; E# W$ n/ ^% b6 u9 I
  12.     // Конструктор монстра5 ^* A- w: B& D9 J( Q( o) T
  13.     public Monster(String name, double attackPower) {( X" S( f+ N! m6 H  C/ J/ U  c
  14.         this.name = name;; s4 Y$ k7 U$ B6 y( a) _
  15.         this.attackPower = attackPower;) T; |5 M. W2 ]0 @) M
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние5 e: g: I) h$ u5 N$ `8 k
  17.     }
    , l8 k7 u9 F( `8 o1 z" l

  18. 7 _, q3 h3 W2 V& x' k
  19.     // Метод для смены состояния  V3 o+ x- q" A/ f0 e' d
  20.     public void setState(MonsterState newState) {
    & |, h# {6 J0 [6 @9 I# `
  21.         this.state = newState;' g' a4 l3 Z3 @1 J, K
  22.     }  l( i- c, L" R3 z4 B* X. A

  23. , j  A$ T) j5 `. z& p  s) K% e- L
  24.     // Выполнение действий на основе текущего состояния
    3 @7 q# V  O# J6 S5 Q3 c. I# t+ G/ b( H
  25.     public void executeState() {9 s' E2 y: |8 F
  26.         state.handleState(this);1 p$ _/ z9 j: M4 c+ H3 G
  27.     }
    & @2 t% ~( s" O9 O0 w; s: y) Q* ]
  28. 1 x) z+ V2 j/ r( t* [$ Z! o
  29.     // Геттеры и сеттеры
      @, ?' G" t  |0 Z+ H
  30.     public String getName() {
    & J" ?) \* q& x( I" E7 D2 f
  31.         return name;5 P0 C8 ]# \3 B$ e
  32.     }* E: z/ O( A+ d( ]/ w

  33. % ^! Q7 u! p5 I& y& l; q
  34.     public double getAttackPower() {) ]" ^7 N) J4 }! x  T( }; v
  35.         return attackPower;1 n1 y  a' ?# X* j7 Y' H' v
  36.     }) G1 T& C6 M% O" i
  37. 3 m7 A( Q8 [6 z1 W% x8 g
  38.     public void setAttackPower(double attackPower) {$ W* L+ S" e9 {; |% @
  39.         this.attackPower = attackPower;
    ; V! {/ s" G# [. G# n0 t4 b, A
  40.     }1 W2 p& `" \' b6 Y
  41. }
    $ H" C6 R% y% Q. W* e
Скопировать код
  r) v; U5 ]9 c. E: B' \
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 l( ^: [. {. E, ^" E! ^) w
- N7 G" D% u' D' W
  1. // Пакет org.l2jmobius.gameserver.model.battle; m' S' r$ Y  O7 Y2 _1 ~
  2. package org.l2jmobius.gameserver.model.battle;
    7 k6 F$ G8 O7 R9 m# {( ?

  3. 9 U: Q' j0 M% d9 a5 y% v( f5 h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 q6 x# ]4 R) n) n3 i: U
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      g6 E: x: i: f1 L; `5 K. {. a" A
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    , N5 t" e$ [/ M& z6 t
  7. ! @/ ?  i0 b1 D1 S3 P7 e3 P5 u
  8. public class BattleSimulation {1 s, r1 v! G7 c, d) s1 Y% b
  9.     public static void main(String[] args) {
    1 e' O) F9 {/ ~& `
  10.         // Создаем монстра с начальной атакой/ q3 z5 u/ H6 ?3 X3 T+ ?. Y
  11.         Monster monster = new Monster("Дракон", 100);6 c2 i& l# C; t( @! I: W, k
  12. 8 X0 c6 A6 \2 d2 r8 _" L
  13.         // Начальная фаза# T$ c' ]6 B5 L3 k3 P$ v. T( J. `
  14.         monster.executeState();# h4 |! j+ [1 C" z" c* @3 T2 s

  15. * g: O: X- R4 Z, i( D, n) n$ `, }
  16.         // Переход в агрессивную фазу
    % s" f2 U2 u7 e; y+ Y: w1 w8 N
  17.         monster.setState(new AggressiveState());  u3 Q3 H" W7 y# ]- R7 r
  18.         monster.executeState();9 p$ S) b, x. R" z, K: I$ c
  19. : D4 z3 O) X; t' g9 l/ \6 z3 ^
  20.         // Финальная фаза0 H. [& O3 F) O. D3 T
  21.         monster.setState(new FinalState());5 q* Z3 V/ L- T( `
  22.         monster.executeState();
    1 o$ j/ i! S$ _* D
  23.     }
    7 C& a+ ~" z$ R3 d  J: P$ X
  24. }, E5 L& k! D! a# [/ _, F
Скопировать код

2 n. Z4 [6 a& bКомментарии по структуре пакетов и классов:
- R0 D+ m2 f3 g
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    % ?7 Y/ a  a5 b
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.7 Q$ [' s8 z. ^( i3 z8 ^  T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!9 k( a6 R% N4 N( E3 m9 |
1 T( ]8 l2 p7 Y( i( s
- u3 a+ e% z: T$ j

  C  A" a: e& \# L! w3 L3 I; A; Z% k, `! c& B

8 V& |& J9 r- V0 A. M0 V
% r0 B& u" T+ n0 B- R* ^% t; o9 T. g# ^
- M: A3 ^1 e5 z6 {, D
% `  C5 e: T! k; M' Q+ \, ^
* x2 L/ a1 S; t2 q
+ N% Q& o/ V4 c1 E0 w2 j+ L

$ X* L+ X1 u' n" ^
6 I9 L* E, c. T0 `% [( J6 h3 i: P/ }0 Y' o5 W  f# B
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:047 |8 _* s  j3 [* V) |
Для управления сложными взаимодействиями, такими как  ...
, s: B/ v! P1 Z9 H) {
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
! N; p, I& _( e1 u' zОтличный подход! Использование шаблона "Состояние" де ...

: {" W$ U& `( [" e0 i9 Y7 fХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" {& R. q2 M6 H% o
! M0 y+ z% N, _! Q# C1 S6 Z# DШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
) M& y# G5 ^! h( {6 Q9 n0 s
: F& M' V) b# v: M$ g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 Z3 O' R: ]$ K& a2 u& m
  2. package org.l2jmobius.gameserver.model.actor;# P. V- k. C& r4 T
  3. 7 I# ~+ e7 ], Q( X2 f% P
  4. // Перечисление для типов атак, \5 X: j' q6 O1 g" v2 U' |/ R
  5. public enum AttackType {
    ; s) I- h+ i% R( q" o
  6.     PHYSICAL, MAGICAL;0 H) r$ u9 S/ i
  7. }
    0 n+ T( G, m* l: X- y9 l
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.9 o& G8 f0 E- R3 S2 z% Q) y
Обновленный класс для агрессивного состояния монстра:' R* ?8 O) A# k  ^, T; K: j/ R

! Z: ^3 L0 h6 C( ?# x" N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 F9 E# L! C" Q) U+ s2 B8 _# p
  2. package org.l2jmobius.gameserver.model.actor.state;
    - @# |! w. W7 T
  3. ( H6 X: C! U* t+ g  {% o. }5 R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . n5 N# _- ]$ e" A2 W7 ?
  5. import org.l2jmobius.gameserver.model.actor.AttackType;4 |% k9 m  K# a8 i) V
  6. 9 S9 ]# ^7 o. ?
  7. import java.util.Random;( B9 _* D6 n  a$ Y
  8. 7 v0 Q/ c. U) Q
  9. public class AggressiveState implements MonsterState {" r5 x4 H) X# H4 s) o
  10.     private Random random = new Random();6 s/ W- G: D: a8 i& T0 D3 h; H
  11. - s, T8 e: X4 q" @4 I) M
  12.     @Override7 K, @3 {, h8 `* a
  13.     public void handleState(Monster monster) {9 ?. b$ X. e/ Y" s  S/ `; Y' v
  14.         // Выбираем случайный тип атаки: физическая или магическая. i1 D8 F9 V2 `0 c7 V) l
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! E! Q5 x+ o" u! k2 P& v. q2 V

  16.   t$ W* q6 F) u  V, H
  17.         // Логика для агрессивной фазы боя' ~$ X7 V, k/ r( @1 `/ A% j: `* s
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 9 R$ _3 k/ j6 |) y2 F
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");2 G/ M1 B! m4 ]* \$ B
  20.         
    , V; E! l/ @' ?1 s' x. ^
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, t* W6 W9 q/ ^5 d
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    $ H: r7 w6 b0 y  I. _
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    " }! t% e2 z. A1 g
  24.     }$ ]- H6 Q! x* `% F& `" P
  25. }
    3 i3 r- _( P6 Y# H9 d# ^
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки. Y2 F2 J2 V0 ]. q1 H2 P' z6 u
2 i, \! m5 a. e) G
  1. // Пакет org.l2jmobius.gameserver.model.actor; Q' P% k! \( {! [1 i) x
  2. package org.l2jmobius.gameserver.model.actor;8 Q! x$ D. r- _

  3. % L; n4 |# S( |2 b. W  p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' a+ k- X3 t+ N5 A; L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;0 A% `: R$ S  _5 \9 Z$ n
  6. 5 l9 S5 |) K* A; _- v- s
  7. public class Monster extends Creature {) l* e: X3 @' h: u$ {* l# r
  8.     private String name;4 S$ A( I6 i* r
  9.     private double attackPower;& A3 {" d. f0 P. {
  10.     private MonsterState state; // Текущее состояние монстра# n& V# \3 u4 E# i( }- B
  11. $ [$ _/ R7 K. `4 `6 X
  12.     // Конструктор монстра
    ) F6 h- u$ Q) ]4 ~6 W5 _
  13.     public Monster(String name, double attackPower) {( C# _2 t* j9 n' z, _2 G, p
  14.         this.name = name;
    8 m( N+ O( n4 S' E
  15.         this.attackPower = attackPower;0 q: ]  c6 A' U! A! d
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию& L; i$ a/ w. C0 x# L
  17.     }# G  K8 G5 n2 T- V

  18. 5 M8 t! ]3 S. U' K
  19.     // Метод для смены состояния; l2 I1 m7 F9 `$ @0 b
  20.     public void setState(MonsterState newState) {' Y; a7 c2 d1 |) `, N, z
  21.         this.state = newState;2 h& \. c( L( i
  22.     }  }  G1 L' j* E+ v4 w; O

  23. ' y8 V4 l9 |1 A: G/ l8 ?
  24.     // Выполнение действий на основе текущего состояния( p2 ^+ b, w: Q
  25.     public void executeState() {7 r' {2 @" O. ~* m0 Z
  26.         state.handleState(this);  F4 M7 F1 M, l7 n/ p# Y+ F4 k, t
  27.     }
    . t* y8 S, A% p' e: B  d
  28. 4 M* c3 _5 D! ~2 u5 u0 E& r
  29.     // Геттеры и сеттеры
    ) ~+ K+ q+ X) R: S1 x$ e' q
  30.     public String getName() {
    / G; M4 X5 {% L' l0 l2 ]) ]" \
  31.         return name;
    ' U# W9 b3 b& j! r. O
  32.     }/ j' |8 O5 o* A+ {

  33. 8 }# u! w9 o! M! ]% U
  34.     public double getAttackPower() {
    6 G0 d6 R1 _5 k7 T) h
  35.         return attackPower;# R. E7 B' x- H% n# m" `" H4 z$ v
  36.     }
    4 ]9 {. F- y: h/ J1 w' n( E
  37. , R7 |3 I" ?( K7 Y0 C5 ^$ }+ ~: q/ @
  38.     public void setAttackPower(double attackPower) {
    4 @/ [1 [& N* @4 {7 [
  39.         this.attackPower = attackPower;
    2 T2 i9 F; A" F' i
  40.     }9 W3 K% d: C8 n
  41. }
    & J5 @3 x* y0 s  A: x% `1 y
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 `( M0 h; _6 V- n1 ^" I
8 l' C# d! U; K6 a( n+ O
  1. // Пакет org.l2jmobius.gameserver.model.battle. D1 g5 \  w0 s1 S+ A
  2. package org.l2jmobius.gameserver.model.battle;
    . D" ]% g  e) O1 n4 V
  3. / Z1 e8 S/ x5 r! i3 `
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 r+ I" o$ k; f/ x& c% e, J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    # q% I4 ^- D# D3 ?7 i' g
  6. , S; F& `. T) v3 D1 _6 [
  7. public class BattleSimulation {" p# N8 m9 }& I; d" \, ?; U
  8.     public static void main(String[] args) {
    8 J2 m. P3 e0 l# p+ p
  9.         // Создаем монстра
    , Z6 Q& \5 E' I1 }; u
  10.         Monster monster = new Monster("Дракон", 100);
    ) c' f3 S7 ~2 p  U
  11. ( `( P# ?- I, v/ U' a
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак! K8 e& M! M7 E/ f- u  Y- B' L
  13.         monster.setState(new AggressiveState());$ c# Q! q% |$ R0 f
  14.         monster.executeState();
    . G& B2 B" G% j. M
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак. x; p( f% ~  S6 `& @2 b; l
  16.     }
    ; v% R1 |2 \' d/ Q9 T6 m7 i$ {
  17. }
    & h- J5 I! W- F& |8 |  p
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
  ]& v8 |8 l! r0 BЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. P; S  B; d5 ^: v# K& ]0 B8 `  q% E  [. x
/ O1 ^! J4 X" |2 q0 F7 W

- T; y5 R* s% M: X2 F( M4 W% Z
: B' z6 e9 ~! A& p& P7 ^, a
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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