Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
8 h  ]) l+ Y. J- M
' {& i* d1 g4 w: Y/ b5 `/ q

+ k% a* U! y+ b" \Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 {" Z* T1 x" c; V7 p" S2 w
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!/ s+ q5 S1 A8 P
Астралия ?
- C* c; y5 z0 l7 r' S! j* x7 F

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* X' w# _  N( C7 M7 q+ I0 {
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
) m) ~5 }  F. }. `' d& y3 m* M% A+ {3 j" A% w
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ b$ i& Y& \' a. Y
AlexCoder опубликовал в 2024-10-16 18:311 t& D$ k: u. V! ?
День добрый!2 D3 T  F! P: o2 b+ b, W
В статье описано взаимодействие игрока с N ...

7 b& I0 b+ j' a  Y& ?  Y6 l9 I- s  U: y" @Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( w* o8 z% j/ {* k  m' s, b- s" ?  b- e9 d
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
0 i+ Y+ V! y) v9 A7 U
8 i; y: g1 R% GШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ z: G- ]) _. z: i
# c$ z% z  [  n. j/ o
  1. <font color="Green">// Пакет для состояний монстра</font># |5 T& _* I6 M+ |
  2. package org.l2jmobius.gameserver.model.actor.state;
    . E/ D: K$ b4 I) n% ?+ U' X
  3. <font color="Green">5 @/ V5 J; f; F  A
  4. // Интерфейс, представляющий состояния монстра</font>
    & F# c# V3 @( @8 t6 c& _* r6 J
  5. public interface MonsterState {
    : V1 V; u* o, ]) c( `( i
  6.     void handleState(Monster monster);
    6 C1 @$ j+ T- E' U& t8 j3 B) ~
  7. }2 z6 U  J8 d: A- V$ z2 }
Скопировать код
: H% a6 n- p2 S& G0 F
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( j: @% {& _3 |+ e" R% e/ X

# J9 a# v7 X$ w; [/ U: N; S9 x  N: ^Класс для начального состояния монстра:# G, R8 e7 c& ]9 `/ a; l
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    2 O5 q' Q* C; @6 E9 M
  2. package org.l2jmobius.gameserver.model.actor.state;" s5 y' c$ l) Z/ b: L( o: Y* z
  3. 4 B; P8 ]4 }, [8 U8 `' `
  4. import org.l2jmobius.gameserver.model.actor.Monster;% D5 A1 J' q. H: [, }- @! a

  5. 0 P+ N" N9 O- w
  6. public class InitialState implements MonsterState {9 v* I8 `' u; _. V% }5 r! R
  7.     @Override
    # P6 u6 k0 `1 t. K+ X
  8.     public void handleState(Monster monster) {" T2 e' `: m0 ?& X8 F7 z2 k( Z
  9.         // Начальная фаза боя8 Q% y6 Y; n/ C% u; l; ^1 D1 Z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");) y, E( S( r( Q* p: a
  11.     }
    $ e# x) B, r# M( N/ A0 y& L5 x
  12. }. u- s* M' T  _, ]% s
Скопировать код

; x* u' E- J: v: E3 U* Y4 O4 `/ r; B& R7 h0 w  X! p3 M% s9 Y7 G" Y
4 A" u7 m# v+ z6 j

" s8 g  q" ?' y: F
/ S8 m3 T+ Q" p
' N5 U! Y. H/ a- J
( b- b8 B/ m- L( x8 P. g
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 9 R" E: j( k. m! {0 h

, X1 u/ D* w. z3 e# O$ nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
6 \9 L  ]% h$ N1 D7 n* u5 s9 Z  M$ ~' n
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 ]9 }3 ]; W2 C4 J
' x) {6 W2 s, h' U' @* d
  1. // Пакет для состояний монстра: [9 `1 o" H  _* }* [
  2. package org.l2jmobius.gameserver.model.actor.state;# Q& y) i( y/ d
  3. 7 p3 R1 Z+ ^, F
  4. // Интерфейс, представляющий состояния монстра
    5 e# E. h( I) ~1 G: A# i; {0 Y
  5. public interface MonsterState {8 A8 I" @; Q0 ?4 Y! x) V% S
  6.     void handleState(Monster monster);
    ; n/ x( Z/ R" r7 N( e; ^3 g& h4 P7 ]
  7. }1 w8 ^2 d8 g  }9 m! l7 D2 \) L' K8 W
Скопировать код
1 o: ]7 M- m) U. s2 [5 d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 J% ~( j$ G5 a- t7 ^8 O
8 ^+ m+ C+ r6 `3 M* A
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.: h2 B/ ], W6 }# E: M
: {' t+ O2 s: c4 j" a8 K, B
Класс для начального состояния монстра:
. @8 u& i% h5 P% F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 q( W1 X+ p7 d6 p+ \- c
  2. package org.l2jmobius.gameserver.model.actor.state;. ^1 Q/ F5 ~% b0 _5 t$ O. M6 g* d

  3. ' x8 x: D2 r5 [3 a8 E% b# ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # k% V* _5 l8 k1 D9 B: l
  5. ; r( Q4 l, ^5 r3 I
  6. public class InitialState implements MonsterState {# l, k* Y) o& d! i/ {
  7.     @Override5 O6 l: M) \2 M+ M: N' o5 A
  8.     public void handleState(Monster monster) {! m" U) |) {* M
  9.         // Начальная фаза боя; L& E: K; S5 ]$ Y$ Q. l( {% i' J: W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");) n9 F6 ~! M) o8 ^  R6 }
  11.     }$ a$ A+ Q) \" J) M+ d, x
  12. }- p& F" {& f9 }' v
Скопировать код
Класс для агрессивного состояния монстра:
: J' D& v# v1 w% u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " L% q* m$ {1 I! s8 J
  2. package org.l2jmobius.gameserver.model.actor.state;) ^6 _2 Y4 j8 D& W

  3. ! d# P2 z( k4 f* E0 K
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 s, T5 C: o" _* Q' `/ o
  5. 6 Z# @. j5 |( ]% y/ B4 |2 Y
  6. public class AggressiveState implements MonsterState {, p  W( e; Q, o. s- ^* H
  7.     @Override# g) S  K3 E* A" P2 E7 W
  8.     public void handleState(Monster monster) {& q( ]- r5 y7 I" m' d
  9.         // Агрессивная фаза боя
    6 z) L- Z3 R2 t
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    7 j+ N* N! e. v' ^0 G
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки8 [) A) [) A0 t, V1 }. X
  12.     }( x0 ?+ |, w& f
  13. }
    ! z9 k7 T1 A2 w& P% J# b- }& Z
Скопировать код
Класс для финального состояния монстра:9 n7 u# ?, \3 m6 x  L
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# e7 |: n' `* c% j: [% T8 y
  2. package org.l2jmobius.gameserver.model.actor.state;: {+ f5 M+ F( e! N- I% M6 O
  3. $ f- ~7 _5 K$ z8 A; H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 w  S5 u4 d# j4 o; R
  5. / A$ \+ k! |8 n& Z/ {
  6. public class FinalState implements MonsterState {# c5 P1 K" y7 _
  7.     @Override; a( n' w; n8 V) v- @5 I1 g
  8.     public void handleState(Monster monster) {4 Q$ d2 [8 H" _9 K! R; M/ F/ k7 e0 Y
  9.         // Финальная фаза боя
    & i  }3 I: V2 v& C: _
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");' r- g$ ?7 R$ X' S/ d# Z
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! [2 P, U) v6 @8 B6 W: J, [1 Y. X
  12.     }8 K) p, _" i2 X1 n* I  ~
  13. }) B1 `" G: r4 C8 M; f# X3 I
Скопировать код

* i6 D* V8 C% z& qШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 N7 E0 Q, X# _- L2 o* E% T( W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    & d; w1 A6 p% {
  2. package org.l2jmobius.gameserver.model.actor;
    $ `$ F9 a% H5 e' ?. s! p5 R) H3 h
  3. # k# O; U) _" T, ^& \
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;2 s5 ~! p6 D3 g
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: Y) I) @' s# t: y) i& S( c

  6. 6 I* u% _4 F4 W9 d
  7. public class Monster extends Creature {
    ; F: }- o0 o! t1 @/ q
  8.     private String name;# q8 t4 w( v6 Q, g+ ?
  9.     private double attackPower;2 |8 ?/ t# J) E  J0 V% ~( S
  10.     private MonsterState state; // Текущее состояние монстра5 Z2 e$ A# c1 D2 ]! p  n' S

  11. # @6 U6 e# \5 a# ]$ f$ ~
  12.     // Конструктор монстра# H. j$ D8 g2 a$ ~
  13.     public Monster(String name, double attackPower) {
    7 m/ y- I2 N- U1 g) f8 w0 ]2 r" Z6 d0 w
  14.         this.name = name;
    # e: s: [+ i7 h1 X- @
  15.         this.attackPower = attackPower;: s+ n8 F- V, `, a* u7 e
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ) D/ F. j+ i8 S
  17.     }
      N4 ?3 |. H, l7 c, @

  18. 3 T# T; B6 a: r2 J/ v
  19.     // Метод для смены состояния2 I" r% b) }: x) m% f: e  k
  20.     public void setState(MonsterState newState) {2 v( a# l" i  h1 H" X% L) c% ~! `- F
  21.         this.state = newState;
    ) s$ f2 a0 |! g1 Z$ _) L0 Z4 d8 B
  22.     }
    $ _. L2 }* U$ T/ _+ P) d4 h

  23. 1 I2 r) Z, Y, o8 P: E/ Q
  24.     // Выполнение действий на основе текущего состояния! N# ~" g% `4 z3 f+ u! J% Q
  25.     public void executeState() {6 w& X: @9 ]+ `; e% P5 A
  26.         state.handleState(this);; Q% A# S) ~! t& `: ~7 a
  27.     }, m" V7 H& B8 k6 I- v( n6 s4 m  s

  28. 6 e( _" [9 I' U! b- S
  29.     // Геттеры и сеттеры0 G8 H, O- ]- t4 x3 F) h- m
  30.     public String getName() {, t  @6 R$ k! L  G7 m# P5 X+ A
  31.         return name;+ I2 j9 g; \/ |0 r+ ]- h
  32.     }
    5 V: p* t2 ^  x5 q% p. \
  33. % y( l9 }3 O2 Y7 [
  34.     public double getAttackPower() {
    8 X0 z+ m- B9 @: j" `+ l1 p' @: X
  35.         return attackPower;2 R: z0 z) j4 `9 @5 H1 `8 y- i9 D
  36.     }' {& K$ P0 u! f# z6 d8 W; Q8 p! ^

  37. 5 f" w9 ^! X4 b9 T3 U; U: D
  38.     public void setAttackPower(double attackPower) {, }5 K  J% Y6 z' G0 [. m5 O/ `1 G
  39.         this.attackPower = attackPower;( C4 W: a2 j" T- d( e- G
  40.     }% e. m! l6 I. v+ v: E
  41. }
    7 h) z) _/ ^* D; ~* ?+ b* Z1 e* k
Скопировать код
( h( @; R0 \. i% {* F
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. D; u, o0 I. ]. @( S4 n7 E- f9 |5 r, E1 ?* ~
  1. // Пакет org.l2jmobius.gameserver.model.battle! N& U. F7 T3 b$ Q# f+ B8 E
  2. package org.l2jmobius.gameserver.model.battle;
    7 ^0 u, K# C$ r! N
  3.   r/ |  z" e) i* w. U8 K0 n8 g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 L3 G" l, b4 T
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 u4 @5 N) v# p+ {; Y
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    5 w# l2 \$ e/ a# r# ^

  7. - P! x- F- J7 |( C% [, r9 J
  8. public class BattleSimulation {
    8 ^/ `$ t6 E, M! c
  9.     public static void main(String[] args) {
    6 L$ X- Z* e" J2 d/ p- Y/ H
  10.         // Создаем монстра с начальной атакой
    0 w  V& |; F: o$ s6 h. _
  11.         Monster monster = new Monster("Дракон", 100);5 G& R- u/ e: b# b
  12. + q1 [4 {$ r) R# x  C
  13.         // Начальная фаза) E( S0 e6 {: \8 {  v) p% Y
  14.         monster.executeState();4 |( l& Y' x4 a: G  `

  15. # b' F& T; K' m) u* O- z
  16.         // Переход в агрессивную фазу( `) j) c& E! a6 i: d
  17.         monster.setState(new AggressiveState());
    9 @! I0 X. `! x' x
  18.         monster.executeState();
    2 ~( v2 h: P/ h# _7 f- H
  19. 6 |' R, J, `! H1 K( Y9 ^4 b8 B
  20.         // Финальная фаза
    . S( q" v- z0 \' R" K6 h0 ^) |
  21.         monster.setState(new FinalState());
    0 h3 j6 ~: j9 B/ _2 @! e* W% ]' w
  22.         monster.executeState();
    & K8 l5 ?% N, H
  23.     }& v# C, ~  k! [
  24. }
      \* W! c4 w1 y& @9 f! z$ |- \
Скопировать код
! \7 g; `# V# }
Комментарии по структуре пакетов и классов:. I5 h* z9 \5 [* {5 w6 _. E7 b0 Y
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    % \- }6 G8 t* \
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
6 N+ X5 E/ C  wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!# O1 N/ E! v& R1 _/ i

% v: B: f' W4 `% T7 k/ U5 _0 M% D
2 G8 B$ {' ~- C* |1 y2 u/ V4 r; s( p$ R, G5 ?
: ]4 h6 Z. m/ D; @
* ]2 H/ u6 s) n( X7 z$ {$ j
8 I1 ], j' @1 k- y! H2 w$ _; R% T; v! }

; Z: F$ x4 m1 j8 i" ?4 s7 S3 F3 m" T& A2 `' j' U: m- I2 m
0 p$ |) E# X  p" U8 c/ j" t/ `

# g: B8 p; n' g5 D
1 K: Z( j; e( E: m
9 f4 S* j/ w& O! Y
4 {9 q2 V: }3 l! b7 R4 l3 r1 K+ k# f' z( i. T. ~- K8 G' }% A( W
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04. [+ i) R6 A& m9 q& ~9 C6 s/ g
Для управления сложными взаимодействиями, такими как  ...
  _3 w) F% ?0 G$ M4 ^/ B6 P
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21/ T- c. ~" w( A( l# j! ^( ]
Отличный подход! Использование шаблона "Состояние" де ...

! O# V4 z! ~5 R8 q" m5 e# _" \% ~Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
9 o- d9 U5 F$ s/ Q8 ~0 h. m, Z$ k0 d
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.- E4 z7 h/ L( Q% Y2 r: R  ~

; ?' Z, d& B8 l) W. G% ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( [! k! d+ r2 W7 I1 M7 s3 ?3 G+ O
  2. package org.l2jmobius.gameserver.model.actor;& s" A( n: L& |$ |
  3. 5 m7 X4 P3 ]2 B! q
  4. // Перечисление для типов атак
    / W8 `  ?5 `, d! N# U
  5. public enum AttackType {( Y; Y& z# O- x
  6.     PHYSICAL, MAGICAL;; J$ [  h5 A' V' H% {
  7. }9 g3 t  c. W' I( i- C
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" a+ M& h! N. s: tОбновленный класс для агрессивного состояния монстра:
$ ^* `  p& n; f9 l
7 m$ Y& R. [! x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. }; I& g4 ^3 \- a- E
  2. package org.l2jmobius.gameserver.model.actor.state;, Y. y2 G  F0 s. r  a  ?% B& i

  3. 6 r/ }8 s6 f* z/ T9 T4 l5 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 s" F% q' {) G( G$ |. U
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    0 q1 y, S* ?7 a+ v2 D
  6. ' \* R0 o% W/ V4 [* Q
  7. import java.util.Random;$ z1 ^# X$ c, \
  8. 2 y, H" J. G# I4 z0 ~; z) Y$ ?1 e
  9. public class AggressiveState implements MonsterState {
    2 V/ ]7 ^( Q2 ?' j( v5 m
  10.     private Random random = new Random();+ P$ C2 _$ X6 h, F, A( v; U
  11. 6 m  b$ x7 y! a- H
  12.     @Override
    9 D( K; F' _/ Q3 G& I7 ]+ ?, W
  13.     public void handleState(Monster monster) {
    . I) [8 h) j8 f/ U8 k5 I
  14.         // Выбираем случайный тип атаки: физическая или магическая3 |0 s$ x# m: q2 Y; ^* E! H
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;( U( x: O" z( c5 l8 T( c9 v

  16. & h* T" |* Q& H# ~( k
  17.         // Логика для агрессивной фазы боя
    , j5 B8 u# h! W8 q* u8 |
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 4 q7 x( z9 l% Y$ j8 i) j+ X
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");% Y4 W, f$ @+ k4 Z, i
  20.         
    & v# f, l1 `) w' m  r
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( n7 }: q& v9 M, P' f* u7 I- H' K
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;3 k% N9 ]- m0 r, S) l
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    1 s  p1 K/ F  b! a% x7 C9 z5 \
  24.     }" A0 l; d& z; r& A8 U3 p0 j
  25. }
    . X9 R) P2 l* H9 l  V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки5 l. M  A* {$ Z3 x: r

) \/ N9 K6 I8 l
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 ?) q  l0 X$ E1 [
  2. package org.l2jmobius.gameserver.model.actor;: K6 C$ c* p7 r& b

  3. 4 F, X$ L' s( b9 ^* ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;% W* M4 P% X) U9 u( d8 P) x/ C1 u' ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 s+ m- S( t/ o9 `# r) g0 }* n# |
  6. - N0 Y; `8 R: m$ e. q1 w
  7. public class Monster extends Creature {& l2 C" h: g" ~7 F: i8 f( r! c8 n
  8.     private String name;
    9 W7 d& J% W" m* _
  9.     private double attackPower;  e7 V' c6 f1 m& e" L% U/ G  A
  10.     private MonsterState state; // Текущее состояние монстра4 p9 X) [  E, C+ R7 q

  11. . v" T% T/ }& d- j/ f% b
  12.     // Конструктор монстра
    8 v( y8 d* |7 F7 z' r' N
  13.     public Monster(String name, double attackPower) {
    . B3 W" x7 l: K% S) V* m" o# A3 w
  14.         this.name = name;
    - `- @8 J3 Q) o5 ^
  15.         this.attackPower = attackPower;
    0 p- s7 f1 H$ [# W$ C7 W& p9 K( K
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию! g4 q8 O1 X) w7 Z2 X# |
  17.     }
    , X/ F; m& d% Y9 d: Z% L8 j5 M6 r
  18. & k4 k2 q" c9 ~  G  }/ G
  19.     // Метод для смены состояния* c6 l6 ]0 y7 g+ H* [
  20.     public void setState(MonsterState newState) {2 N; a( X- v1 M% B4 k! I% K- p
  21.         this.state = newState;: g4 u( w' a3 ?+ s8 x/ E
  22.     }
    / ^; ~1 w4 x8 ^( I$ P- `

  23.   F7 P+ V! }  `9 X( O3 Q5 W
  24.     // Выполнение действий на основе текущего состояния6 Q9 U, M7 B' D' W" b( Z; {
  25.     public void executeState() {
    3 H$ U4 P; V7 Y6 }
  26.         state.handleState(this);
    : n8 r5 h- G3 L4 {
  27.     }
    0 J2 L2 L( n1 y1 g' \' }: X
  28. 3 I8 p8 y/ w; G, \4 _$ N
  29.     // Геттеры и сеттеры3 \" {: i2 b; d5 o+ r
  30.     public String getName() {( d! V3 X0 R9 |; u) {& l
  31.         return name;7 g/ U0 d( A6 O9 n# H% B! g
  32.     }7 N' U+ o7 b3 K) \

  33. ! U( f# _! E1 G. w
  34.     public double getAttackPower() {
    4 t$ n; U( o5 v
  35.         return attackPower;
    3 Q& b2 o$ O% o0 f+ k
  36.     }; E4 P- H6 V/ e$ v$ y
  37. 8 h( v. \1 W$ Z/ F% o1 X- \
  38.     public void setAttackPower(double attackPower) {  s1 `$ N! }: C# p' m5 X
  39.         this.attackPower = attackPower;6 J( j, b+ l' |6 n
  40.     }7 ~  B, K; u5 E
  41. }
    ! K! o7 ?6 R6 i. @
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  P' f0 F( \) V) h5 M7 V! w8 l2 d  ^4 l$ l6 e8 Y# F
  1. // Пакет org.l2jmobius.gameserver.model.battle9 {8 H3 u0 Q1 z7 c: P4 y
  2. package org.l2jmobius.gameserver.model.battle;
    * X/ J" _& J- H6 R. R, `

  3. 8 ^2 s& b: ~. m" `
  4. import org.l2jmobius.gameserver.model.actor.Monster;* E6 G# c, p# y- }: S: o
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % i2 b8 i, n9 _$ P" @' z0 g; V
  6. $ E2 h% N9 ], s
  7. public class BattleSimulation {, h  j7 v8 D: r1 C+ m# b: X
  8.     public static void main(String[] args) {& g# o# N  Q0 ^) G5 k
  9.         // Создаем монстра) O$ `% T2 V0 ~4 _
  10.         Monster monster = new Monster("Дракон", 100);0 B. R3 G8 O" y
  11. ' [' S$ r* Z1 K- v+ v4 H/ b
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак1 v, U" r/ q9 y2 j+ N' n. v
  13.         monster.setState(new AggressiveState());
    & S# }" ?1 j. I* N& m/ ]
  14.         monster.executeState();2 }% j5 T, a( J+ a0 s2 S( n4 ]
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак" |& \; P+ e* H5 ^) @* u
  16.     }
    * F5 {5 O# F* L! l2 K7 k  y8 P
  17. }
    " X: Z* c& K( _0 }: ]
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% U; B, R7 ^* P2 T5 d/ {5 G
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!  i: ?) G3 T$ l$ }$ a2 h

( F/ x! P8 \+ |6 e) X; g
  L- v; N( V, W
4 P  b6 w; N3 X8 K$ B3 a8 a
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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