Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
- k3 f5 b5 Y8 {1 T3 d  o2 K+ h9 `& [# e* N5 W, C1 Y

6 s% ?$ F! m4 o0 RЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
2 U" a1 _! V% l0 Y6 cЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
5 b1 [% ?( y; O, e& {+ b1 nАстралия ?
& H8 ]7 Q( l+ E2 x; \1 W+ s; q) p6 \) @# O# G" p

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!/ j. F/ t% c: G3 W
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?& A+ S3 J5 E5 y- j) F
+ Q+ X; T7 X' v  B  A
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
7 V7 l! W  k5 {6 L
AlexCoder опубликовал в 2024-10-16 18:31" e4 {% p3 C- t; j
День добрый!( r3 [5 X0 C5 v2 H) S- k6 R
В статье описано взаимодействие игрока с N ...
% h- r8 W% t5 Y; V
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
% `  T& H+ x$ i$ F. i6 T
" a7 |! I& f  o  @  WЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. q; |# y: M% g( {+ B1 g7 a2 p6 L; `4 i+ u  {# N4 \
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 s  w8 N6 P7 c$ R* G& y
2 Z8 t$ u: V% k1 B4 n6 J
  1. <font color="Green">// Пакет для состояний монстра</font>3 h; G7 X3 u0 r3 I! `
  2. package org.l2jmobius.gameserver.model.actor.state;5 S* X% L; U: p- C; r
  3. <font color="Green">* v3 Q% |0 M1 F, h: W, W: B
  4. // Интерфейс, представляющий состояния монстра</font>4 g! o9 ^  F& f: ?% x+ i: T" V: R
  5. public interface MonsterState {0 f7 x  o6 h( d" O
  6.     void handleState(Monster monster);" C8 f7 l# s' O  Y
  7. }
    / |4 |! h: i0 |
Скопировать код
7 f) ^3 Z- W4 N9 h+ y0 Y' {2 `; u
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ u9 ~) e3 ^! n; Y

) i, K" }0 _( p+ I2 m) rКласс для начального состояния монстра:
! N+ d, L% }& y  T7 a. I
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- [% k1 L0 ^) a5 L  {
  2. package org.l2jmobius.gameserver.model.actor.state;+ M  g/ F2 \; k
  3. ' a# _! J0 z# m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      Z2 l6 w1 ?$ @- _# ]0 U: u& W

  5. ) A  G/ E  `# ]
  6. public class InitialState implements MonsterState {" K) i/ E% v$ Q2 |! F
  7.     @Override
    3 h* q& v) h5 _9 `! J5 R* H8 y% m
  8.     public void handleState(Monster monster) {6 Q$ F& _# O/ h9 f) m4 K
  9.         // Начальная фаза боя6 ~8 V+ ?& W. V$ }- K; l7 _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " e3 _+ t+ d2 l! n
  11.     }- m6 H% Q, M8 K7 {
  12. }  U4 l* ?" c. g0 Y; a6 x0 T
Скопировать код

' |: y9 X1 ]$ f- p
, T5 D1 w$ `4 \- |& X
# b+ P5 M& d; P& B( \. M* {0 e

  L* z# V4 a7 i9 |6 l. ^4 s% p7 s& N" O8 V

) J+ Z0 O4 ^7 ~( Y. t! T
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & F) s! v" _6 h7 X  v/ v: e. G0 C
/ i+ b, X: |" {6 k5 O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.. G* M" b' \+ O2 g0 n4 B2 k
3 ]7 v5 }* m. }6 Y5 y. d  U
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ d! f3 }6 p4 P$ U/ f' l& ~' c

7 l; c. l8 C- P# t$ d
  1. // Пакет для состояний монстра# D% W4 M2 g+ {
  2. package org.l2jmobius.gameserver.model.actor.state;$ {% P4 j+ c8 i1 x6 d+ M- `

  3. , M% t& [+ o% k0 B
  4. // Интерфейс, представляющий состояния монстра
    - U, `5 Y6 x% \& t* l1 t7 `6 R
  5. public interface MonsterState {
    , y8 E, S$ j; r& ^
  6.     void handleState(Monster monster);5 _( h; h- K# K3 F( @5 J* r
  7. }, E3 i9 f3 B; r3 ^7 l! v
Скопировать код

" A! g. k8 l! JШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
- p. K$ v6 h1 P6 G% d4 {! _  c& K; q6 S1 _0 A8 M) K0 i* p: a
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ ~' _* @, _9 {# k2 }  N
7 W+ |, o" G" e; A7 G1 _; TКласс для начального состояния монстра:$ Q* ^7 l# v$ E( c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 y( s/ d! G8 _3 H& O8 {8 a* I9 \9 R
  2. package org.l2jmobius.gameserver.model.actor.state;8 h4 p' o9 @( Y* D
  3. * W6 Z. S! i: ]' z
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 d+ \( i, I' b) v, \3 J7 m
  5. * z, o+ M/ f: Y6 F0 [1 b& t
  6. public class InitialState implements MonsterState {
    " i2 c9 m) \: a0 E8 p5 s
  7.     @Override4 T2 O5 A) ?% m' a- ?! ~
  8.     public void handleState(Monster monster) {% L: T4 O% ?1 U8 `8 t
  9.         // Начальная фаза боя
    7 W6 z( e1 z7 E+ f/ r% x" U& \
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");& @: S/ d. B) g- B
  11.     }6 U+ f4 i! ~( {& T) M
  12. }% _* u6 I% t1 q; |; n4 ]; ~
Скопировать код
Класс для агрессивного состояния монстра:
/ M# c& i9 @0 x) `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state# t( y3 [3 Q- M$ G
  2. package org.l2jmobius.gameserver.model.actor.state;3 W8 Y5 a/ i: r" E. Q% G: c, L

  3. " Z3 e3 M" @' o
  4. import org.l2jmobius.gameserver.model.actor.Monster;) J1 c: O1 c  b$ I" T6 P

  5. # Z/ A0 R  Z  V$ g3 s4 J3 T# M
  6. public class AggressiveState implements MonsterState {
    ) P( Z1 R9 x) r6 J2 ?, q
  7.     @Override
    % e- V( r' Q- U
  8.     public void handleState(Monster monster) {) t1 X: }4 v# k2 X7 X* O6 F5 |3 |
  9.         // Агрессивная фаза боя
    / N( r% M! J5 g  \. q$ \% x
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    4 N7 ]6 T% H3 s9 Z
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * ]4 k+ t( J2 h4 r! v2 Z+ p7 y
  12.     }2 G5 [5 N0 I4 `- B
  13. }. U% A7 I# @# h" U/ I# z' N0 w, C' T
Скопировать код
Класс для финального состояния монстра:8 c/ o7 y2 G4 {, X* u. a
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' Y6 q; J0 a) g* |, v0 |
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 Y! B$ Z* U* x) G! ]( N9 m
  3. ! e, i4 p- ?! e5 `6 B* T3 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 x2 _4 g2 a, j+ N. }% H

  5. ! T/ i: J9 a9 A# f" H, V3 q: H
  6. public class FinalState implements MonsterState {! \& L. s$ k8 J6 k  k0 l
  7.     @Override* [  J6 A0 @0 U: l$ _# |
  8.     public void handleState(Monster monster) {2 v- k! p" {( [4 m& G
  9.         // Финальная фаза боя
    ) D1 D% v8 m% \% g; [1 {
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    5 K+ o" z6 j- a
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 Y7 d* R9 f6 ^* L
  12.     }7 F8 B' g1 m- o; w  L+ J$ |
  13. }0 J: H/ `8 H, Q) |, r0 h! r
Скопировать код
$ r" |2 _  I! X7 R6 m) Z" ^
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; g) m  Z: X7 f8 E# c! N
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( x, `7 X  Y' ?( U0 E8 ]
  2. package org.l2jmobius.gameserver.model.actor;( ~- V1 M3 m, y; t% u

  3. 7 o% Q: ~5 w. [* Q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 {) d) X6 c/ |+ G% f7 Z- D
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;* F" q) C, C5 T/ X6 \4 G

  6. 5 ~# j# |$ T' J
  7. public class Monster extends Creature {
    7 r$ w! N9 [( M
  8.     private String name;; ?; t: v0 @. ^+ p( {; A" }  x- m
  9.     private double attackPower;9 o, S. O# c* o8 s8 a: L6 t+ ?
  10.     private MonsterState state; // Текущее состояние монстра* a  h4 T* w; l; L+ w4 C( j3 i

  11. 4 ]7 W5 t1 ~- K+ X) U! z! G
  12.     // Конструктор монстра
    ) e6 A' F( b( c# u4 o1 Y
  13.     public Monster(String name, double attackPower) {: z( p. O9 i, Q
  14.         this.name = name;# v6 h1 `% Z. }' x; L( j
  15.         this.attackPower = attackPower;
    3 H: D7 t( }) F3 O
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние! B* @5 K! w' ?9 t
  17.     }
    ' q+ B+ z; L5 v# u

  18. ; u8 K; p! ]6 b9 @
  19.     // Метод для смены состояния) I3 v/ K# u7 @: C' H- D1 V; q
  20.     public void setState(MonsterState newState) {/ @8 g8 S. u& X4 o9 i) q) K5 {
  21.         this.state = newState;2 p- [3 m: q  v+ K, F
  22.     }
    8 ~  b* I- v3 G0 f
  23. 1 X8 A/ I, M+ j. m3 P8 k
  24.     // Выполнение действий на основе текущего состояния
    6 f+ W2 d) m: T) ~% Y
  25.     public void executeState() {+ l0 `: A; q8 K1 x, c
  26.         state.handleState(this);
    - w8 y5 G- L6 I: f
  27.     }8 v& A- N( H( _% a$ U+ y7 I" P
  28. $ C, k* l$ L0 G: @2 g7 F% h: |
  29.     // Геттеры и сеттеры; i: u5 [! x& @
  30.     public String getName() {
    # S7 q- W5 X( K
  31.         return name;
    0 U- w3 X' M- {. u
  32.     }
      D$ x) x5 S/ c$ J! y) b/ {

  33. 6 J/ d2 {3 m! [. i% ~* Q) ]
  34.     public double getAttackPower() {4 ]5 Q% f! B% o
  35.         return attackPower;. E+ C) M0 c2 }/ v& Z
  36.     }# E, d& l; Y' R" c- R" n1 y

  37. ; h" V9 c' N; k) A# L
  38.     public void setAttackPower(double attackPower) {
    & v+ j" P9 g) z3 I5 b7 i
  39.         this.attackPower = attackPower;
    7 z) E" ?$ x0 s7 v
  40.     }- k$ A4 T. ^; ~& B5 b: O" t
  41. }* T& D$ H# r7 J; ?' H/ \
Скопировать код
7 f8 _$ }8 t  ]5 R- w- O
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 z" g" P5 W: T% k+ J, D' e1 _8 I; v0 Y1 F* ]4 ~
  1. // Пакет org.l2jmobius.gameserver.model.battle$ n" H4 x2 |' ~/ F$ f$ j
  2. package org.l2jmobius.gameserver.model.battle;
    ; R: t! }9 J7 q- e6 c
  3. 1 [+ C' d" \9 s( f
  4. import org.l2jmobius.gameserver.model.actor.Monster;% C6 [' y8 E& k* L( |8 V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * n( S3 e: W: e& d6 g$ q
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    * w" t* y: m, v# Y
  7. # o$ O3 s7 n. M- @4 p
  8. public class BattleSimulation {
    . z: X$ A9 A/ }) e9 w
  9.     public static void main(String[] args) {' {# ]0 [  r: R; D
  10.         // Создаем монстра с начальной атакой
    : o9 x6 p0 V; K' {. h8 S) J3 W
  11.         Monster monster = new Monster("Дракон", 100);9 \& P# x# ~! R
  12. % R2 h2 K$ U4 I+ c$ |
  13.         // Начальная фаза$ p) B4 N6 C2 f" X/ T' R/ v! v
  14.         monster.executeState();& l2 B9 j! V7 }- E
  15. & r8 ^1 r5 C) E5 D8 @$ j; g& ]* S9 ?
  16.         // Переход в агрессивную фазу
    1 W. T+ H! f; P$ ]$ \
  17.         monster.setState(new AggressiveState());
    $ g2 G, r# }* o5 A6 B$ h, U8 ?
  18.         monster.executeState();1 ^! o; n, h: D$ u
  19. - l! }3 M- U' [: w* I
  20.         // Финальная фаза6 h# d) w' ]' u! ]6 |
  21.         monster.setState(new FinalState());9 _7 b2 D! ~' ]8 I" K- W
  22.         monster.executeState();
    , R  }% \7 J0 h& g/ i1 t
  23.     }
    + ~3 a# i) o! s* w% u  x
  24. }
    2 M5 A4 k$ @; p7 Z  M$ g! U
Скопировать код
% m9 x1 o1 c$ t1 t$ u
Комментарии по структуре пакетов и классов:( C, a9 ?. ^1 U" x8 g% f3 k
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    0 g, i- Z; D7 A
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) d- B7 X8 Y! H& u4 R) Y8 Y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 s- x$ s- }/ |3 c* e/ U, y& G- ^; S
& m3 o! t( o& }8 z, l# }+ x7 z
4 J: P. f% _" f, R7 k

8 \+ Q* o% \- n# y
& d1 G# ]. \" ?+ R3 d6 l. v  d
* A  u6 k7 C% {4 z" g$ t& F  a& _% d3 H! j/ Q4 Z) v1 R* ?
3 R% ]" L* j2 e4 }% B: \, ]
# g4 y  ^8 R& Q+ M9 q- ~+ `
. v7 @& Y1 Q- W# }3 q
# H0 Y# ~* V) y# q6 J

6 T' ?) ]* e5 z  }! D9 h6 E! Y
6 K1 d! `3 U# X, q/ `8 u" ]5 l5 @$ S6 v
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
  A; {+ R2 }- Z- J  n8 F" ~Для управления сложными взаимодействиями, такими как  ...

$ ~1 H8 l, l$ |3 b6 |5 b: aОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21$ }9 E7 L+ ~2 g& ^, t1 ]
Отличный подход! Использование шаблона "Состояние" де ...
% o. X5 J' C8 b& _# L
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.& h" n; s$ `9 S1 Q3 H
, {) x6 q' N6 `' L8 }- z
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; e. T* f* T0 {, c
: d' m- l! I- y3 g+ W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 z7 `+ k5 r% K1 D  G7 Y
  2. package org.l2jmobius.gameserver.model.actor;( G% l+ L) G9 n" z, v

  3. - D" B2 G/ q+ a, d7 B1 @% B0 R
  4. // Перечисление для типов атак$ V4 m& d* t) Z9 G
  5. public enum AttackType {
      i2 u" `# V, ~  r9 s7 ]
  6.     PHYSICAL, MAGICAL;
    1 w& b3 m8 d# G. A# z
  7. }" p. e# e8 ~7 m) B* S
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.2 ]9 s/ d! O" m
Обновленный класс для агрессивного состояния монстра:% U- q0 ~( k+ {! Y

+ x$ u* Y1 F% z( U7 K# B  ]" p
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 X4 F  ?' Q7 m, f# y; ?  y
  2. package org.l2jmobius.gameserver.model.actor.state;
    . U4 n2 G( }) `+ r% X8 @, d# D
  3. 1 Y- s* D% o% m. i! Q1 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' T5 W! {. Y1 _! Q; e, S% u
  5. import org.l2jmobius.gameserver.model.actor.AttackType;, `2 ~# I! @* k0 c9 I) X) D1 b

  6. ) o) V9 J5 K3 D% p$ t8 @1 d
  7. import java.util.Random;
    + I$ |1 q; I8 p% A7 x" z( h1 O

  8. " d2 I5 f7 @( P6 ]1 X1 M. c7 d
  9. public class AggressiveState implements MonsterState {! a8 n+ Y' [9 c/ [5 b' b6 C3 T
  10.     private Random random = new Random();
    7 A. ~& U; j9 A4 }; `
  11. ; Y1 m4 m$ R% n# \& w1 c& W' l
  12.     @Override
    9 @: t6 L' a* I- A4 j, a
  13.     public void handleState(Monster monster) {
    & U! V, a. Z* o  v8 X/ k0 z
  14.         // Выбираем случайный тип атаки: физическая или магическая
    3 J- L" \9 y: z  E( p/ F
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;5 m' T& m( e' l5 Z1 Q

  16. ; }3 r# m9 I& l; g( d' A! A
  17.         // Логика для агрессивной фазы боя$ @( V7 Q. u; l7 y2 `
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " * T4 Y" D$ f- {+ Y
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");2 S, {1 R( @. f4 t  u5 D
  20.         
    " F! \' J! L. E: l! ?% ^( u2 B* F
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    7 G. Q/ z, B) s+ x2 o: D) \
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    5 n' j6 ]# t' N2 }! G
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    " d" @& a* z3 B: `
  24.     }% F, N% \/ w5 I% A7 a, j2 k5 w0 k
  25. }
    * I6 Q/ O2 q2 C# a8 Z5 x/ x; ~
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки  y# M; H  p' r! ^. }# r

2 m" I, s2 C( R4 j# [( ?$ F( Q
  1. // Пакет org.l2jmobius.gameserver.model.actor  M( n: t4 v9 G# \+ _
  2. package org.l2jmobius.gameserver.model.actor;/ J- `& g$ j5 ~; l8 a
  3. 0 Q8 N  Z. ]. x  Y% h. R
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 Y) o9 U8 V/ ]/ s: H/ ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) U5 j: K9 k( S& s

  6. / p7 [" s& i5 M5 n6 [
  7. public class Monster extends Creature {
    $ \, J, @: J3 c' ?+ l0 }; y
  8.     private String name;
    1 F% J, b% B8 Y1 v/ g7 x8 f( y
  9.     private double attackPower;4 E8 A& j+ q  O
  10.     private MonsterState state; // Текущее состояние монстра- R# B. u" O& `

  11. # b' q6 O" w$ r3 Z# [
  12.     // Конструктор монстра" \0 e3 Z& T3 a& Z, Y
  13.     public Monster(String name, double attackPower) {
    ; y8 z" z7 N  R* A' o8 j+ V
  14.         this.name = name;
    / c4 j' A. `2 C, Q+ {
  15.         this.attackPower = attackPower;3 c4 j6 |9 g! w6 n
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    1 e2 T  B$ \4 K) |0 j8 h3 X
  17.     }% [  ]+ P' X3 e  e: i- ^
  18. # j/ u. N, H" B% f8 f4 q7 X
  19.     // Метод для смены состояния/ }2 n* m7 q3 S9 r+ a5 r9 E2 _
  20.     public void setState(MonsterState newState) {5 ^+ b5 p  j+ o$ B2 ^* }7 c
  21.         this.state = newState;# r+ E  g1 n# a, k; b3 }( q
  22.     }
    ; o1 j  |! k' Q
  23. ( j6 o  `6 `4 b0 D+ N1 e
  24.     // Выполнение действий на основе текущего состояния# I" U) x" k8 ?' \  L
  25.     public void executeState() {/ k$ z# v3 X0 t( k) c2 p0 r
  26.         state.handleState(this);
    8 L" i$ b3 D! X. o$ k
  27.     }5 r) H9 B+ Q- L: H- ^- J" r( \. o

  28. ! r# A3 g! h4 V6 c. x# R/ ~
  29.     // Геттеры и сеттеры' F; D6 L( q" R: L
  30.     public String getName() {4 y2 _! R( m* k
  31.         return name;7 C1 x: ?: `- x; e6 ^$ u: ]- ^
  32.     }! ?6 B. _9 J) i+ a% n
  33. ; ~5 Y$ E. V+ A! S8 X0 s( S
  34.     public double getAttackPower() {
    7 O7 Q7 Y0 w- U, N" U7 k3 N
  35.         return attackPower;" n1 u8 r" |: |7 y8 a/ Y( ^7 ?8 X
  36.     }$ ]& O$ f1 Q. c# o. Y2 h' S
  37. 1 W, [7 c# b" h3 p$ e2 s
  38.     public void setAttackPower(double attackPower) {
    ! L0 a$ R1 F5 X& _( f+ ~! y+ P
  39.         this.attackPower = attackPower;. L# R5 C& s3 w! {5 Y
  40.     }
    0 v2 {9 Q' h' C% Q
  41. }
    ) J# S, o" t% b
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
0 d6 A# G' c3 W% J3 v/ C" B
  K0 w8 Z; p) V% R# m5 s+ m
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - S  d. |& H  U' p/ g
  2. package org.l2jmobius.gameserver.model.battle;
    - h/ f% x6 K, \4 z

  3. / z9 g* B3 w  g5 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 }, p/ A9 s6 e
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * ]8 o. ?# Y9 C) ]* E

  6. 6 K1 i  O/ }5 r7 Z" u
  7. public class BattleSimulation {" V: L8 G* i+ {5 X, Q1 p" o
  8.     public static void main(String[] args) {
    / R1 [' b# Y. ^) k4 h6 q# \4 Y9 d. _  O
  9.         // Создаем монстра
    + |) N1 P5 Y' a
  10.         Monster monster = new Monster("Дракон", 100);
    1 X+ i4 O# e& r' y) q9 `4 J

  11. 3 C( k) G+ j& Z% j9 |1 F: _+ ]2 m& P5 Q
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    + n; Y2 \+ f0 U
  13.         monster.setState(new AggressiveState());" g, l2 x  y9 j; Q. v' V
  14.         monster.executeState();  R+ n. R9 S+ a  Y& Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    1 Z4 K' A# Y& v, W9 Y8 X
  16.     }* ^; S* K) W( O9 U* h" {$ P' c
  17. }8 z; d, o3 A. t9 n9 b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.9 ?3 T; T9 Q- x# A! Z! e
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
6 o! w9 `* ?/ `) D  S2 b
  y; f" p, W9 _' |% Z5 m, a$ k  ~, ?4 T; ^$ z' q

# W1 ?7 k, E7 \5 J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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