Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 X/ c/ C- R% A" v/ y2 P6 G5 a

/ l# c2 j9 e2 D3 |7 o  D1 }
/ X9 Y9 |) |1 h* b% F. V
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
* G# K; p8 F' m' n; oЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!/ z8 `0 ~. G$ p6 o/ j7 G3 n9 x
Астралия ?; @. z$ n! U- W! `0 m0 g- w6 v

& l& s. {; S! p' r4 G* W# b7 ~

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
& W4 ]0 \% p; XВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?) G; P1 }2 x' ~, k3 v

: ~  k7 J$ t, q$ w8 _9 o$ J  r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 1 J0 U& c0 [% e+ ]( C
AlexCoder опубликовал в 2024-10-16 18:31. l* @# _& B1 j! Z9 Y
День добрый!
9 ^0 X" j& Z" m5 N( AВ статье описано взаимодействие игрока с N ...
, z  u4 n0 ^8 O0 e4 g
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
8 a% [! n) v# g+ m! }/ n
! D* p. [/ i6 R4 n/ P+ ]$ V- Y: OЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
) a6 b, S! \% p* G0 M9 M9 Z9 q1 e2 ?/ F6 r, X' D
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. E% d7 H4 G# d3 X

# G9 p, Z6 D0 S& g. D  o
  1. <font color="Green">// Пакет для состояний монстра</font>" ]) X5 ?9 T; |/ q3 T2 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    : Q0 t! F5 R4 t- q
  3. <font color="Green">% }& S- o/ v8 b; y3 V+ G* \+ ~
  4. // Интерфейс, представляющий состояния монстра</font># y* \: D( ~3 b: K+ y
  5. public interface MonsterState {; U/ R1 r% N) t  Y6 ^9 E
  6.     void handleState(Monster monster);
    3 j* ~8 P2 p3 F' Z
  7. }: [$ h( g* h7 F) y% P9 C2 S) \
Скопировать код
/ ^5 F' c0 z0 O/ D# h. ?2 a6 B
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.) F8 f9 k9 z: v4 ?3 T

) a  \' o+ y2 ?Класс для начального состояния монстра:
) f4 \& i$ k5 o) h5 N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    1 i1 q3 i$ }& ]  W
  2. package org.l2jmobius.gameserver.model.actor.state;$ A0 d: W% Y6 G$ F* F2 G/ t
  3. ! @+ M+ C3 Q" F$ q) i
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ p& X( f8 W" S2 D0 V
  5. 4 W; h. b- q, p/ w/ g
  6. public class InitialState implements MonsterState {9 H. u) t: z+ l/ W
  7.     @Override
    4 z. C& l. X! I  r( K
  8.     public void handleState(Monster monster) {! f( _! c! {  b; r
  9.         // Начальная фаза боя
    ! b+ C  k0 h* j- P$ c- J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");- ~/ m) B& J& J& T) v% s
  11.     }
    & R& x9 Q* w: S) s$ q5 O9 \
  12. }( P/ s0 A6 m; E; z8 z' w) K
Скопировать код

( H, d! u! u* o& Q3 Z
( r2 T# V2 Q; \) C! z( {  m
8 m! y9 h9 ~/ w7 L/ ?' m$ r5 Z  B9 }! j  E* `1 E8 [/ L- f8 Y
8 C( Z7 N) n6 x+ C

, M& m6 b0 t3 n( e7 c
! _4 E9 t$ B. \% j" K# Q$ s  g
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
* l+ v8 V- G6 [4 U* e& U% H" V7 q' s
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., f+ ^; d# ]: G4 k0 k" _+ K

$ X6 i/ K8 a' o" NШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
, K; w) f8 y, |2 ?  ^: h8 ]& N: P
+ w$ f! f0 M0 ]& B
  1. // Пакет для состояний монстра
    , F4 v1 i& u5 }
  2. package org.l2jmobius.gameserver.model.actor.state;
    . d% |( D4 E5 p* _

  3. " [4 G7 D2 ^% y3 H, X
  4. // Интерфейс, представляющий состояния монстра
      b5 L- c( N9 h3 d0 j" |* y
  5. public interface MonsterState {
    8 l3 {7 Z/ ^) y3 K2 L2 s
  6.     void handleState(Monster monster);* j" A7 N( }' t/ X' ]
  7. }. B3 q* J4 F: \7 h5 w" \* `
Скопировать код

: b! c3 j1 K2 t* N/ X- zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 3 A+ F; X  H* r5 P) Z* k7 g
& ?1 A4 r2 K& l3 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 w8 U$ P6 J; i& o- \/ |. l
( @3 n% I& C, i9 F1 iКласс для начального состояния монстра:
* ]- n* N6 ]+ h4 M$ c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 o6 z, H. E% }2 f4 c" {& a
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' _4 [9 J3 t" _$ c# u% |/ G( T# l

  3. ; z: h1 O# X" p& v7 J% N& s& J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . M! }5 _4 G  c3 J( y, c3 ^' g. f

  5. " j. v- A0 e7 M" K
  6. public class InitialState implements MonsterState {
    * g/ W6 n. R( @( [5 x
  7.     @Override$ @. s$ w; J* p$ ]+ N$ o# k
  8.     public void handleState(Monster monster) {
    . Z6 u  q2 e' O0 g9 O
  9.         // Начальная фаза боя8 N: D, ?3 Z( Y9 _/ F# x# X/ B
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 l, S# _0 `! O4 D$ `
  11.     }1 A& V) f) ?" C# R# H* q
  12. }
    2 L7 u. w: |( I0 {
Скопировать код
Класс для агрессивного состояния монстра:
3 ?. E+ X: A: ?) C; \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 g% _/ B) H% O) f
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 H4 }/ P  ^7 A& Q1 V* p

  3. 1 @& x# {% S$ @- O& s
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ D2 j; U6 y! D& z7 |% q
  5. 8 E. E# `4 R$ L# p( I
  6. public class AggressiveState implements MonsterState {
    7 `& f' b' `% j$ R
  7.     @Override
    - T: ?) ?6 m* j
  8.     public void handleState(Monster monster) {2 B/ o: ]% Z8 t4 L
  9.         // Агрессивная фаза боя" J  {" a, z+ A: o& r! y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");- `. S' v6 ]; \# p
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ l- T5 \; p) i- O4 m% j, ]
  12.     }
      r2 E) a+ U5 U1 g
  13. }4 x5 X1 n* h' Z! _  @. |! }
Скопировать код
Класс для финального состояния монстра:
* J' v" l, G7 H' F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, ]6 [3 Z7 h0 F' E& T
  2. package org.l2jmobius.gameserver.model.actor.state;7 P2 c3 t+ q9 D! i( \" @5 H* Z

  3. : A9 k8 }2 ^$ d5 t7 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;- X3 g# g, o* g; f$ N, m
  5. 1 [2 L: w) r4 f& Q
  6. public class FinalState implements MonsterState {9 z4 M1 k# {- y* l1 [/ R
  7.     @Override
    - Y9 ]* A( A/ h+ N9 y" N
  8.     public void handleState(Monster monster) {1 S9 Q6 T7 e1 b- U9 K' l) K5 I
  9.         // Финальная фаза боя; ~; q1 c, d2 A0 W" ?8 f& t
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    6 X7 V3 F  {" x' V2 X9 Z3 q
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 F& Y- i0 y( x3 k: {9 c, A1 @
  12.     }
    1 F4 J! V9 J7 F0 V
  13. }
    * z$ u1 {6 ^0 P6 O+ h
Скопировать код
) B0 s1 S1 S6 b- s
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) c- [$ l( _& D& ]8 c/ e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 a% b2 q: e9 _2 W' F) K
  2. package org.l2jmobius.gameserver.model.actor;# C6 q1 o, R0 q, H8 R
  3. ) X* z0 u( l3 O0 P4 [
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. p- v& }& L% Z8 g8 l
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 b3 t& w( S; H% F2 C/ \
  6. " N7 {( Z! `, `: n( z5 ]
  7. public class Monster extends Creature {% ^, u, ?  o' r2 w5 M6 U" O  @
  8.     private String name;( l' w( T+ U2 J+ L. O: s
  9.     private double attackPower;
    & ?# `. s6 O+ A0 U8 b- W
  10.     private MonsterState state; // Текущее состояние монстра2 X  Y* a6 D* V. H) J, q% [3 I" N

  11. , ~+ B" G+ k" g! Y
  12.     // Конструктор монстра
    4 B* J" I& G2 t! h9 s
  13.     public Monster(String name, double attackPower) {1 b+ s. [# ?3 C# U7 a
  14.         this.name = name;8 F0 b. j2 J& r* a* v
  15.         this.attackPower = attackPower;$ J+ |% u! `1 B' V' z+ k
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ( J/ M$ f  b: K( a; l# x! `
  17.     }
    9 o) U) l% W7 z/ @

  18. % Z1 H, p; T" B" p9 I! f8 V9 ]
  19.     // Метод для смены состояния
    3 L: G. k% W& p6 p' i
  20.     public void setState(MonsterState newState) {
    ; N, E8 T" E2 Q: a/ Q
  21.         this.state = newState;& }/ h1 ]2 F& Y9 k% r
  22.     }
    , j# n- C  L* @1 D7 k* T2 G
  23. " _2 U7 R4 \* E- @' Y
  24.     // Выполнение действий на основе текущего состояния
    3 v9 A8 Z1 U: M% R2 E; ~
  25.     public void executeState() {* S$ ?2 C9 B. q- R- X5 g
  26.         state.handleState(this);" b" @+ [& F# j0 p% t  C. k: a6 h
  27.     }
    5 _# b6 G0 L& A

  28. . U; F: g$ `4 I
  29.     // Геттеры и сеттеры
    8 X7 x, y; b  n. h6 r9 }: t
  30.     public String getName() {3 H, i5 q9 {# O: U9 B$ n1 ~
  31.         return name;+ W, U0 M5 w1 D
  32.     }
    - _9 v/ u, q; m2 u+ ^: n, U8 H

  33. * f) v* @% ~; A9 @' l9 w& {! v
  34.     public double getAttackPower() {
    ; w3 u+ c5 N0 o' R$ l" W
  35.         return attackPower;
    # `, H, ?! d5 x6 ]0 q* P
  36.     }
    + U4 X8 w; m  R
  37. 0 \0 D) U) v. ?
  38.     public void setAttackPower(double attackPower) {+ x2 ~) L6 k* z9 Q5 q3 l
  39.         this.attackPower = attackPower;( t2 m" n; A; Q  I+ |( Z1 O
  40.     }
    - g% o" b0 a- V8 r, v- O
  41. }0 Z" w5 _" F  @6 v# `9 ~/ X
Скопировать код
4 i, C( _' y6 W4 F: A3 {3 w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 u5 D. L- X) s2 E; X* {0 l" ^9 w* M+ e! D3 {4 ?/ p
  1. // Пакет org.l2jmobius.gameserver.model.battle% F9 F: d' j" ?" m8 q( y9 C0 E
  2. package org.l2jmobius.gameserver.model.battle;9 x# K2 E% i) T6 o6 x
  3. $ B: x) c& l2 _4 h6 _* ]& y. w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      z# a1 [1 Y' k  Y( _) C- }
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  {8 u! e8 }+ x
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;0 w$ I, U3 v: Z" ?$ O

  7. . D2 T, k8 Y+ h- k1 R: V: n: H
  8. public class BattleSimulation {
    - j! \  w) B( k# c5 |  o  s
  9.     public static void main(String[] args) {3 [5 |7 E) e- G# C
  10.         // Создаем монстра с начальной атакой
      M2 a) t' ^0 `9 R# q
  11.         Monster monster = new Monster("Дракон", 100);
      g; Y9 Z3 \- Q7 `
  12. 4 O- G9 G" |8 z: ^: n# B) i) D) k
  13.         // Начальная фаза
    1 ~6 @: v8 X5 h+ P( r+ A7 k
  14.         monster.executeState();
    6 n& V" ?8 ^: J# c

  15. * E) O. V4 A! j  k( _' R6 D! `  B% |
  16.         // Переход в агрессивную фазу
    - r# ?  N1 ~( z# B& h. j
  17.         monster.setState(new AggressiveState());4 `0 T/ K8 D& p
  18.         monster.executeState();
    + p* l3 i2 G) @! {% `0 m8 G

  19. # K3 i% u7 ~# s& f
  20.         // Финальная фаза
    . [  d, \& Y7 r9 n  J* k
  21.         monster.setState(new FinalState());7 P% v4 z5 o" o5 M- F' h7 h. l
  22.         monster.executeState();
    ! B8 |9 N. N$ m5 l
  23.     }, N! Y1 B+ Q/ O: v4 M# x) c' I
  24. }
    8 }9 [( S9 q, L. S
Скопировать код
' Q8 D; F  s7 i2 r, y
Комментарии по структуре пакетов и классов:
9 V9 Q) `# t0 O! f0 b5 V
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.; `% n& [9 O( L- [9 D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; [2 n3 u0 ?2 Z6 @# M8 r; y/ T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
( M3 v) s; y% U/ s' i7 L
3 c" C: p& W: d6 Y* E7 Z1 C& V4 p1 Z" H3 g- u5 E% S, o

- e8 Z+ }* R# ]' o, f7 T% M; m, s& h2 M7 A1 E

6 L" F# K) k: }* D7 f+ |4 t1 Q& U& c1 V+ k, [1 S! l0 H0 U4 j

6 N# X7 ^, W& E! t
- n7 ]" i3 E/ l7 K
7 `" e. h& B  ]1 g& Q6 Q8 ]
2 W% }' ?* I" m. g8 S  ?! y/ o5 y3 M6 W4 C0 f

( ^: h& X6 |( I
0 g8 D6 G) Y; Z; e- [2 U/ _0 z& d( V% k6 @; K6 r# C: h1 ?
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:040 h/ n9 y0 F; X# u& N2 q
Для управления сложными взаимодействиями, такими как  ...

5 k8 y. b3 _3 oОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) M' X0 H! }( Y" N( G* X; Y
Отличный подход! Использование шаблона "Состояние" де ...
5 d& _3 B" R; ]
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.9 m3 N. X$ K2 s8 D  C9 G5 u) V* Q

2 M7 D( @! d$ q- }$ c( }Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.) v) |3 F/ O* G- g
, N' Y! H5 B1 z  E' q2 S( a
  1. // Пакет org.l2jmobius.gameserver.model.actor# ]1 g3 T, o  M& O. M
  2. package org.l2jmobius.gameserver.model.actor;
    + o: L2 ~  X* q$ f8 Z( C( Z

  3. 0 s2 w0 G0 Q9 H5 a6 t0 ]
  4. // Перечисление для типов атак
    - v4 Q, O- l  Q
  5. public enum AttackType {
    - E, Q* |" W2 @; k
  6.     PHYSICAL, MAGICAL;1 M- {& s! j. }/ k
  7. }7 i; o: y6 S9 M
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 a3 j9 B$ ^# xОбновленный класс для агрессивного состояния монстра:7 K( e( ^; J1 P& ^) C7 ~8 P

4 A' v0 Q- [7 @" y8 k. t* R& }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state% Q$ H% L) n1 a$ U6 n- A
  2. package org.l2jmobius.gameserver.model.actor.state;6 y! {, U: ]; A

  3. # ^. q8 ^" q' k- u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 J1 H& y+ }' `( z$ H. E
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 d9 u. h# S8 S# A2 K; r  v
  6. 1 T5 r& P; p$ d. L% R! Z% W
  7. import java.util.Random;% W7 U6 r+ t7 Q( ]! ~
  8. - b& e' B$ T6 I2 N; `5 a
  9. public class AggressiveState implements MonsterState {
    6 X* B5 z# ]5 X# j' }- b/ q7 ~
  10.     private Random random = new Random();+ p9 E8 q1 m( `+ p
  11. % I% {1 i, L/ y( v; o& g" E
  12.     @Override
    0 x$ c+ @4 D5 _7 Y- C
  13.     public void handleState(Monster monster) {. R" d% r+ W+ m* N/ J1 \+ S
  14.         // Выбираем случайный тип атаки: физическая или магическая- y5 U% U& ]* q2 }. @
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; g2 Q2 [0 |7 G! N* w: i
  16. ; m9 p% s: Y5 q% H2 n6 b) Z
  17.         // Логика для агрессивной фазы боя
    & v' |! M% ~/ f& J; L, e
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ( P4 G$ ~% i2 e; v: Y) x! T/ i- g5 w
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    3 F. b& {4 S' ^0 E: E- v
  20.         / X/ l! M9 s2 p9 w% E
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, k# z. ?- X! W! d' R0 V
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;7 b  F% ^4 w$ b4 s: N
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    - S* C: m, L1 y4 `0 d1 T. J
  24.     }
    ( i0 U9 ~. o9 W
  25. }6 b, c; _" Q. X0 p( a
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки5 z) @. d# {& K, n& E

. g, B  f$ z5 S: ^" |5 W1 X: J- H! p
  1. // Пакет org.l2jmobius.gameserver.model.actor  k: h5 G+ k0 b( P. i8 ~( Q
  2. package org.l2jmobius.gameserver.model.actor;. F7 ^+ U" x  J% C
  3. + e3 M& O! i$ C- k: K  C' M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
      N, w5 u0 |& e- [- t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    $ J5 B2 ^# r/ ?" D% ^/ e8 |

  6.   z! h( D" b& O" k4 O9 D& r. c3 [
  7. public class Monster extends Creature {/ n7 q3 K- [* i$ {
  8.     private String name;; a; A/ Z* g- F* X% I7 v
  9.     private double attackPower;: G2 S4 {* [( [1 x2 Q
  10.     private MonsterState state; // Текущее состояние монстра/ V9 P" b: ]( }2 p, `$ M7 r+ A
  11. % r7 I* c- s) D$ d; x# v
  12.     // Конструктор монстра
    " Q- C" n& _5 T9 L* v3 t4 {
  13.     public Monster(String name, double attackPower) {
    # w/ f4 {# w2 q8 g) w' i, n
  14.         this.name = name;, h& E( y2 |: V  r7 F
  15.         this.attackPower = attackPower;
    6 v8 e5 f, l9 _
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    0 Z7 U7 Q3 l; V- q+ e; m4 l
  17.     }
    ( ]- S  n3 [  x8 @
  18. : x1 Q& l+ i& D. h
  19.     // Метод для смены состояния' D  F9 L' ]4 W) q+ r$ z
  20.     public void setState(MonsterState newState) {$ w( o% L* g# w  i* N& Z1 y, K
  21.         this.state = newState;* m. p3 U5 ^' i) ]1 Y! z
  22.     }; [1 Q0 t2 O: T- }
  23. 3 R* I7 G9 G* Z9 X7 F
  24.     // Выполнение действий на основе текущего состояния
    7 P- K3 n4 g, u1 }) d0 Z' P6 T0 A% S$ S: C
  25.     public void executeState() {" X, [" s* C( K3 p; t% L
  26.         state.handleState(this);1 z) [0 h" X. A" b/ H0 c/ |
  27.     }6 \* A+ A0 c  v: m4 g
  28. $ k) R- k6 i$ P: Z
  29.     // Геттеры и сеттеры
    - U+ j7 D# I" R  P0 ~: ^
  30.     public String getName() {
      W) i" x1 X" ?" X# w+ C! K
  31.         return name;- v+ @, m& H! x) Q( {, ]
  32.     }: W. I* G6 F: g5 p+ e
  33. " ?5 e* r  c2 V- ]2 ]6 [
  34.     public double getAttackPower() {
    + Z6 n# o. C, x$ b
  35.         return attackPower;9 G7 }6 ?5 s; Y) m
  36.     }1 k7 J/ Y. o  v- ^7 f
  37. 6 J' U) I) `$ m( @; H5 ]
  38.     public void setAttackPower(double attackPower) {, M( C+ r) W) E7 r2 [4 U" Q
  39.         this.attackPower = attackPower;' |8 A1 Z' a0 Q+ N6 Z+ Z1 [! Y5 H
  40.     }% U% K. R2 u* v2 U: ~: D+ u/ Z6 I
  41. }
    : y: t, e5 u6 d
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
" L. {5 g9 H: j/ P# w& s
9 t4 a: d2 ?1 t
  1. // Пакет org.l2jmobius.gameserver.model.battle6 x: o1 Y( X0 ]. u
  2. package org.l2jmobius.gameserver.model.battle;9 s0 l7 m1 e+ h, ^. h3 R$ I0 Y1 j

  3. 3 u# d: R) ~+ y% z: u9 M9 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;' P& z% R, C# Q) y* B
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * e! @+ h3 G7 X- D

  6. 5 a' g7 ^9 U2 a& M/ `
  7. public class BattleSimulation {
    ; K, h1 A* w: K
  8.     public static void main(String[] args) {
    / n+ v( L& l2 l7 g2 e# b( p2 c1 j
  9.         // Создаем монстра$ k; S! ~3 K. W
  10.         Monster monster = new Monster("Дракон", 100);* X# I+ w* r! k+ x
  11. # |7 t% O( y1 L" D* B3 O# @! R1 n
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    * E" L! S/ l6 ?# l- @
  13.         monster.setState(new AggressiveState());1 S+ h2 m. U3 x0 e# `
  14.         monster.executeState();
    ( b) ?  d& l$ P8 K; u( f
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак7 T* F: Q: x( ~/ r+ L% y- K
  16.     }! u6 Z4 |0 L0 k% B$ ~
  17. }$ v* C- u4 u7 }. n6 V7 X* }
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ f, ?9 C# @+ {" K5 G+ dЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
7 T6 t' O' D0 D* S
. g8 C1 S8 I9 }( x* ~
' k8 C. q6 w% T# H; P3 |
' S; G" E) v6 U8 ]6 T, K) c& ]' K
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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