Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
) R0 y# v9 A+ S, g) V7 T8 r
+ f" `% I& ]; s* ~4 f5 _

2 ]: J, E3 E0 h, n# N; s4 yЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
, E+ |5 x$ R3 @' A8 J6 JЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
; F# F+ b) g; l; i% C7 v; H5 f( q1 xАстралия ?' v( J: W3 p+ f& p) ^# C# D6 U; W

. l; x' U! x( l5 T

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
7 [, c* ^" R& l5 P; [# RВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?, K% W/ k1 m2 m: H3 h7 M. I, ?4 l
/ [1 B# y3 X6 D/ @3 T
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 8 j. F3 m! k. m7 n& x5 Y! {8 Q6 Y
AlexCoder опубликовал в 2024-10-16 18:31, ~9 D! a% n  P( J( r9 n
День добрый!& i  O: f6 T4 k9 f; @9 w
В статье описано взаимодействие игрока с N ...
$ V3 o1 L+ N6 m. Z( |
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ! e5 b* G( a' Q7 P
/ A5 i. z, H; n" z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
& ~+ p! m- q: X4 f  p- q6 l
1 [; P$ ?0 o- Y# dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 L8 k$ e* p: |0 l6 Y2 ]% v1 o
7 s. [. ^, D5 L4 C( f
  1. <font color="Green">// Пакет для состояний монстра</font>6 g' ^% C% S& b8 _( |9 N1 V
  2. package org.l2jmobius.gameserver.model.actor.state;2 |+ k; e2 C' `* i6 r3 [) E
  3. <font color="Green">
    4 S, m: v0 e' c0 A" G
  4. // Интерфейс, представляющий состояния монстра</font>
    7 h& X+ D) O. i0 w8 _2 k# }  k) h
  5. public interface MonsterState {, z6 ?% Y/ O0 w2 J) v  E
  6.     void handleState(Monster monster);9 w2 C* S4 a! k4 z( A
  7. }2 ^/ p5 R& E" x0 B  ?& ?
Скопировать код

" ]) X- ]2 p/ H# xШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.. V, K; V& Z; a3 C3 F/ ?
2 l% r& y9 e4 I3 @
Класс для начального состояния монстра:( T$ r& \- s4 ?) M6 a1 p
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ( o6 M# A( `" z% Z# Y
  2. package org.l2jmobius.gameserver.model.actor.state;  k+ ~$ L$ p; V# R/ Q

  3. * |' Z6 U9 C, @% z* X% a" c3 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;& i! x6 m/ }5 P0 Q
  5. 7 {8 g7 }2 L9 e
  6. public class InitialState implements MonsterState {, b3 r  Y8 j% [9 ~' D
  7.     @Override
    . y2 O8 _' w, I* ?! w' I) v
  8.     public void handleState(Monster monster) {- {6 S) a# T6 }) j; `
  9.         // Начальная фаза боя' ^% W) X1 |4 s: O3 i* Q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    + }$ J% ?5 `/ }/ J# i" x
  11.     }
    - h0 E0 v; p" G4 {
  12. }7 z! F$ g4 f* c$ {
Скопировать код
$ q; H* X  W: t, Y! w
! }- Z1 I& U" T6 o

2 l. f& M* F! p
. Q. F* ]3 G- A; p+ E' M, J
' w, `" N9 J  @& |# F& g) e* E& G; o7 J4 p4 s
3 v1 B6 w3 S4 c' ~5 i/ o
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' j! r4 r4 j# m1 o- p$ _/ z
* J7 T: D7 @3 M+ }
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# R- f+ w: q9 ?  E& `
3 U/ {. h" @4 l- DШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' f5 a9 P7 G+ J! S
) p2 I* W; M/ n) \+ W' F0 z
  1. // Пакет для состояний монстра
    9 G- z- i# h6 ?$ H* U0 i0 W7 ?; c
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 n( i$ {' |  I8 b
  3. 4 B6 z0 U" l4 M+ s# @& D8 k9 A/ f2 J
  4. // Интерфейс, представляющий состояния монстра( d7 J9 N* \$ ~) j7 h0 N) p
  5. public interface MonsterState {& Q: ^' h& @7 T2 I' J. f2 f
  6.     void handleState(Monster monster);
    , ?8 Q$ C7 J9 X# @
  7. }
    2 t8 G$ U  \0 p5 ^, M
Скопировать код
; q4 Y7 @. i2 u9 S: d! A$ A, J4 O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; u( {- p9 o, K4 h( E0 J4 }# G

+ }3 p8 l" ~( i6 H4 D$ i+ RЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# D) r5 J+ k) {9 _* C6 S8 Q) m2 T8 T
Класс для начального состояния монстра:3 ]7 Q* i: K" c# n, @5 X6 D: ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 I# o3 `) g( {2 Q0 ~" [
  2. package org.l2jmobius.gameserver.model.actor.state;% X9 L% {& D: \; `
  3. 1 Q! V8 L: Q1 f3 Z! Y* L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) h3 Z! I& |! ^1 x' a5 S
  5. ' p5 O; F; _, f" A) ^
  6. public class InitialState implements MonsterState {
    $ `, |3 h; P2 `1 S1 Z
  7.     @Override+ V# f$ k4 ~! f% p4 v. E: p* q. z5 B
  8.     public void handleState(Monster monster) {
    $ M8 U1 ~* T. H
  9.         // Начальная фаза боя9 D( g7 l3 ?! g- H" Y; M8 }
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  k! A  t( L& E' g. J
  11.     }
    1 W7 O; k) ?& \
  12. }2 C/ D! u1 N, v  _5 [/ A3 C
Скопировать код
Класс для агрессивного состояния монстра:* T( `4 U" ^' B( w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 S. C. z5 a/ Z7 T
  2. package org.l2jmobius.gameserver.model.actor.state;4 g5 @* x6 h2 N' [# D# `

  3. 0 Z4 c8 ~) D9 ?& \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 ]6 t+ X' {1 \4 ~3 z5 @# a# L4 `

  5. 7 }  U* q: m* F! q: d1 j
  6. public class AggressiveState implements MonsterState {
    4 F; m- o$ y" S
  7.     @Override
    0 Z+ b( u: z2 o/ _6 ?# ?/ X7 W
  8.     public void handleState(Monster monster) {1 |/ A- i! b% \  {, k
  9.         // Агрессивная фаза боя
    $ S3 g! h1 ?1 x* y
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( h7 i' H7 K! F5 l9 F
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки  Y# H1 d, h. U
  12.     }0 l2 x0 J8 s5 _
  13. }
    ) d/ F$ c7 B$ k: }% G6 j
Скопировать код
Класс для финального состояния монстра:
8 m5 l' b' [" d; `1 V( X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / E# j1 X, A$ d
  2. package org.l2jmobius.gameserver.model.actor.state;# ~7 A1 J" R4 V" H) Y9 Q+ [8 c
  3. 3 b" ~, j8 E# S! p
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 U; V0 H* d1 D% K3 `
  5. $ L% e8 e2 {6 I& {
  6. public class FinalState implements MonsterState {
    . \" J3 y1 X0 _6 H) V
  7.     @Override
    . t, q: n! ]  s' @& x
  8.     public void handleState(Monster monster) {3 f7 ?" }* x+ F% o
  9.         // Финальная фаза боя' w& x" W1 }! Y: b
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ; n6 W  z9 {: _, q* l. ^7 a
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки3 D1 g2 Y* F# s; o5 R
  12.     }1 `6 [* @- {$ {, m2 L) D: O" t
  13. }
    & A, \8 j$ F1 y, [* n
Скопировать код
5 L  W! N! C1 y( v( p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
9 z. _) r# h4 o/ a4 x6 C
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; I/ W8 H1 K/ y6 V& Y  W
  2. package org.l2jmobius.gameserver.model.actor;$ I* [! w( m0 J' j: Z

  3. : X; ]2 @" S$ M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 B/ p! i7 b+ G0 I( T. L: G- @& `5 x0 g+ y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % B5 A; ~" F+ z) n0 i0 k$ x5 ?6 x

  6. $ `: n* N: u& C2 ?4 @
  7. public class Monster extends Creature {
    / b4 A# \8 y5 I% ?
  8.     private String name;
    6 l0 b  \' x4 x, T+ N  `
  9.     private double attackPower;
    ; c8 I3 l$ u7 D  D
  10.     private MonsterState state; // Текущее состояние монстра* @9 h; _. [1 ^

  11. + l, y+ V; k0 }. d+ C! ?
  12.     // Конструктор монстра
    1 J, v5 t8 ~6 A* V4 M8 j: Z- ~& }% [
  13.     public Monster(String name, double attackPower) {5 }& n9 n( U2 _; C6 M  i
  14.         this.name = name;
    3 D5 x) X' x: J; Q; v+ g& @
  15.         this.attackPower = attackPower;2 E" a9 ~: ], d0 N! M1 h
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    9 d- d" g- x  {. Y: k
  17.     }; [9 \. E' _. i
  18. 1 k; f, H9 [. u4 C+ z$ C9 j
  19.     // Метод для смены состояния% H2 ]7 S+ }+ O6 b: V, e
  20.     public void setState(MonsterState newState) {/ s) K, J* J/ a! R
  21.         this.state = newState;" A% G. ^% y0 g( C6 R3 s+ j# `( o
  22.     }
    ! W8 J  y  Z$ Z' X- z/ L- J& c
  23. & W& W! s6 X  Z! |0 H- k
  24.     // Выполнение действий на основе текущего состояния
    1 h! g& X% B& l& Y' ~4 R; }
  25.     public void executeState() {3 U& Y1 a: E  M' T/ V
  26.         state.handleState(this);4 {. V+ o& l7 X5 K- c' G4 Y7 x
  27.     }
    ' A# D) K' u$ x" T8 j$ I: ?

  28. : |  a2 A/ q% Z; o( b7 ~
  29.     // Геттеры и сеттеры' F" W1 q* L1 A/ l
  30.     public String getName() {
    ( ~, o9 p# e" P+ `
  31.         return name;8 A& S$ j' b5 ?
  32.     }4 E: U. j- G  s

  33. 9 ?3 B. u+ u) q) T/ G# g, \
  34.     public double getAttackPower() {/ I" z9 O& h9 ^/ ~  |5 `
  35.         return attackPower;/ }1 d. V9 z* D. _7 J6 j9 g; d9 {
  36.     }
    % u8 ?3 V$ z0 x  I

  37. 3 d% p4 o$ V- |* C( z6 ^
  38.     public void setAttackPower(double attackPower) {
    5 s/ n  j; \& H1 J! M
  39.         this.attackPower = attackPower;
    0 E/ J( L$ z# ?; ]5 U% [
  40.     }
    1 e3 j& b" V, v$ s( U, d
  41. }
    ! j3 N$ o. R7 I
Скопировать код

- h. j" S: v9 K- T8 r. U2 dШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. J; |6 l( Y$ \9 ?5 Z8 M  m

+ Y& G  [- f4 v* m* c& J
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , g# @& ?+ s8 D( g* }( C
  2. package org.l2jmobius.gameserver.model.battle;
    . }, ~8 V) q& j
  3. 2 x! }1 z; S3 b' q+ o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & ?2 V* E! M4 r3 s$ ~+ f
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% F, j/ f' f1 Q- g9 u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % A  a! F6 _- y1 \1 T/ \; ~
  7. 2 f3 S, Z( I, n* ?" p5 [8 U* o
  8. public class BattleSimulation {) J+ D+ S/ Y8 ^. R$ v
  9.     public static void main(String[] args) {2 T  y  n& a9 W7 n! d4 E& M
  10.         // Создаем монстра с начальной атакой% p4 i% z, i( Z& ?
  11.         Monster monster = new Monster("Дракон", 100);
    * R, O% L+ `: J1 F. C- V

  12. 7 g3 e( }0 @+ D0 \
  13.         // Начальная фаза; v* d5 \9 L% N- g' B9 F* D8 q
  14.         monster.executeState();( _) z" \. r& M7 ^

  15. . k' \7 C5 J, S+ D" g
  16.         // Переход в агрессивную фазу: ?' s1 B* s4 h* [
  17.         monster.setState(new AggressiveState());( q: j7 ~0 q% b% g8 C. _( B
  18.         monster.executeState();" w3 i4 u& Y" i: r6 i0 ^

  19. $ a+ L- {* ?' ^; K- R# H5 S9 N% Y' {! C
  20.         // Финальная фаза# _) N/ E/ N8 `3 }9 h- u! \7 d( p
  21.         monster.setState(new FinalState());% s" \. h, Z" `7 w
  22.         monster.executeState();
    $ y' n0 t: H6 L2 ^
  23.     }9 A6 [2 O- y- x$ E7 W5 L
  24. }& _6 X1 m( R; ]0 E% [3 b
Скопировать код
8 O- s7 K& U8 Q1 J- R
Комментарии по структуре пакетов и классов:! D3 S! g. f0 v# h2 B$ E6 S  U
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ }& y5 F! G9 i- Y3 p8 X
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( q; M8 K! s" h5 f
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" }: [, Z6 ]- u# W# c3 Y% w. N8 h3 A* U% Z& ?1 b/ h; z) t; G! P6 o
3 ^/ I( d2 b- o% Q
7 z! W& {4 ~+ `0 k
' V& C4 z; l$ G% P% b4 G

# c/ ~; R. `. j2 ?9 }
" P7 I7 o: D! T' Y$ Z
% B, a( u1 ~- }1 V
9 r2 T$ y" {, S9 A5 i
3 }/ F+ K& f! P& S) ~. y6 z+ l  L3 c* X8 b5 R9 V1 A
: a" U4 q1 l- t# L  B
: S) q. a0 D+ z, J1 G
# B* [8 F% w+ y  W

3 U. H6 L: ?+ M# ^- c# v+ W! e. q7 d
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
5 D8 U% K' M$ y) sДля управления сложными взаимодействиями, такими как  ...
# d) w" S, C1 l9 B) x" u
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
' ^) }% p* R% K( @8 T; R9 xОтличный подход! Использование шаблона "Состояние" де ...

  Z8 W1 K+ N( C3 IХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
9 g! q4 b* L- I% u: p: ?7 u
0 d; D' ^: Q+ w, rШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.% W2 R, o9 u6 _& I. K5 Y

3 U# L( |* M# x7 y5 g5 N) e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - T' G7 a4 }, x7 k7 ^
  2. package org.l2jmobius.gameserver.model.actor;
    ' V8 t' a3 [& B& e# e8 v

  3. ( E( r/ {* e* [$ N7 m7 N; Y# i
  4. // Перечисление для типов атак: F1 U' x. r4 B! \
  5. public enum AttackType {& B" D% D2 N6 N& W$ G1 F
  6.     PHYSICAL, MAGICAL;
    ! V, r  k( `* L& P' @9 P3 C
  7. }6 F7 V  ]& A# t! Y/ Y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак./ ^5 N% }/ ]+ S  E
Обновленный класс для агрессивного состояния монстра:: S- W* u' J' j9 G( X1 ^
* H' I, Q, S* j$ g9 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 F- V5 u5 a" A: U1 p
  2. package org.l2jmobius.gameserver.model.actor.state;3 @3 I% P  I: ~+ D6 |7 v7 M
  3. * p% p0 v9 x. f9 f, v5 `- T
  4. import org.l2jmobius.gameserver.model.actor.Monster;; b0 G0 q* Y7 |: k# E
  5. import org.l2jmobius.gameserver.model.actor.AttackType;( `( }, \! ?% j( l: t( [" w
  6. $ Z- x* h6 [! Y) A1 \/ K: b0 q3 i8 {
  7. import java.util.Random;
    ) e8 I' x+ \  H3 f

  8. 9 {' O( k+ p' \0 N* S! Y5 e
  9. public class AggressiveState implements MonsterState {9 g0 i( }1 a5 ~& Z) e( ~8 [
  10.     private Random random = new Random();
    5 C# a6 N, m3 B+ `! p4 T
  11. 4 u4 g. I! G. o  f! G4 i
  12.     @Override2 H' S# E! \' V5 _
  13.     public void handleState(Monster monster) {8 _3 Z6 f8 m: N& V0 H& W; H
  14.         // Выбираем случайный тип атаки: физическая или магическая
    / `8 Q' K; [7 ?7 j3 e) p+ F, a
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ( y( ~3 p9 v+ d+ s; x2 `" _7 a1 F
  16. & e& V% W4 ^; W9 J4 i
  17.         // Логика для агрессивной фазы боя7 v' I2 x) i2 A1 \
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    & E- V, @5 @, P% E" v( N
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");* x- y% D$ p  t8 t* a
  20.         
    % ~- p8 C: m0 x: I2 N7 G; `
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( @* j- `% D1 m
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;! o: M- f+ T' z4 Q  U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);1 B" s( w) U8 w* q
  24.     }
    : h7 ^- v2 l' f- O2 p
  25. }
    4 t( }  _# m2 V+ L" l" t# x4 W
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. f  j. Y2 w" K3 y1 p  G. V( p9 `9 n- C! M0 S  [
  1. // Пакет org.l2jmobius.gameserver.model.actor% d# k. l+ ~9 U) m3 J0 t5 ~( m
  2. package org.l2jmobius.gameserver.model.actor;
    , H* S. {7 ^5 Y: C! t9 c0 a& _2 D

  3. ; M( B- F6 ~) a. J0 q( n! d
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 @- h9 D- W# s
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;( }! H: i# W/ u7 p7 J) s

  6. & e. B3 O! |; b$ m
  7. public class Monster extends Creature {
    + B! I! j; W" d0 X6 k, a8 P
  8.     private String name;
    * s, w4 F8 c$ J7 ?9 q5 h6 L+ F
  9.     private double attackPower;) V2 ?- {  |7 {9 w' T3 @+ d8 P
  10.     private MonsterState state; // Текущее состояние монстра. H0 @) J: y+ Q; _4 \
  11. ! S! p, v& g5 C, v1 i
  12.     // Конструктор монстра
    / b- x8 a8 Q: T4 d5 h. l( t
  13.     public Monster(String name, double attackPower) {
    % T# `: G8 r2 o+ }
  14.         this.name = name;9 p+ B: N" Z# A/ C; d! n
  15.         this.attackPower = attackPower;
    # @% c; D9 h  v' N, ~, W% n! @
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    , T0 L' f7 j. Q5 q
  17.     }% o: l' p( n0 V, o( r6 o+ T1 w, @! o

  18. 5 R$ l3 _6 C7 r. Z1 Z8 e$ |% a; I
  19.     // Метод для смены состояния1 w. |1 X6 M' [+ u+ p
  20.     public void setState(MonsterState newState) {
      q2 k& @6 ]1 i# q6 |: J
  21.         this.state = newState;
    2 M1 @. B, d8 C( w/ g# C, k9 H
  22.     }# r  U, \3 V" S8 v% u
  23. ! y0 @6 Y, S# H$ Y. [, K
  24.     // Выполнение действий на основе текущего состояния3 x. s: U# y+ i1 T
  25.     public void executeState() {" v! b3 o' O9 g
  26.         state.handleState(this);
    + T8 B' b% g0 c. Q: Q2 B
  27.     }5 u1 e+ O+ s6 H7 w2 y2 n4 w2 G
  28. ) W" g5 @, E- j( R$ m/ g  H1 S
  29.     // Геттеры и сеттеры, @: e# U2 ?( |, ?* ^" p7 u
  30.     public String getName() {
    9 ~7 i' g1 W3 _
  31.         return name;. K; |2 }+ \# D  z- i9 {- K6 e, I
  32.     }
    ' N7 U: M, h% i9 ?. @

  33. / {4 j6 s& {* {2 R- H% x# m
  34.     public double getAttackPower() {; i3 F5 m8 p& D4 g( x
  35.         return attackPower;$ g+ u, n5 J1 ?' Y# ]8 ?
  36.     }
    ; y& M- b' @+ z& u/ b3 }
  37. 9 f1 F) V' O8 a1 Q& W, q' q; }
  38.     public void setAttackPower(double attackPower) {! W6 }% U7 e) I! m
  39.         this.attackPower = attackPower;8 t4 q1 t. P  P2 @$ F- X7 w4 [, Z% g
  40.     }! R* c0 V& K2 N, s$ H" u/ ?4 @& G
  41. }
    , W( T4 x( [9 F1 t
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
# `& r0 Z9 @0 H5 k4 X7 C8 K/ T( F( D: C& W  ]. `1 k4 Y
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 @" ?- V% L( n! g, }$ o& K
  2. package org.l2jmobius.gameserver.model.battle;
    ) Q7 z0 m( P" D: q# N) ^" ?
  3. 9 O2 q7 a1 f7 o. I7 a$ Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 r6 p$ h) h! {' p( L& }6 V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;3 s& q4 A  o5 h5 `/ f' c

  6. 3 c& _$ T, b3 G' s$ y+ ~0 a
  7. public class BattleSimulation {* ]1 [# ]3 e1 B8 |
  8.     public static void main(String[] args) {
    ; D, z1 k# L- S
  9.         // Создаем монстра8 E9 ~. t9 G; M! d( m/ v
  10.         Monster monster = new Monster("Дракон", 100);% B  R! h2 R9 ]; @' a: Y' ], v
  11. 6 H3 T  I7 Y4 O, |
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    5 R9 @- S8 }8 @, r
  13.         monster.setState(new AggressiveState());
    / j( p/ D0 o. x, E
  14.         monster.executeState();3 b. Z0 K+ G8 m1 |
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак& X1 \8 d; w4 k6 }& W4 ]
  16.     }' _$ i, K: Z% V" |' F: Y
  17. }  q# u8 O: p. T/ E: I
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.1 v# v$ a: P( M$ ^& k
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!! l/ Y8 }6 A6 I' e2 R6 k

; E6 ~, c" G3 ]2 w
6 m! e+ O+ i* o* c. E
3 d5 K+ i: l. z
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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