Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
/ ^7 W5 o  @2 O5 |
3 S, Y2 u+ \5 |

+ ?5 F. O; }3 `7 P/ FЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
# \( @* T  g7 A2 NЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
, Y" E, j2 `; L% d* A8 zАстралия ?/ N: }1 ^9 @9 h  b

5 T$ ~# y% @5 [) w* u

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
% \* L0 |# T! ]  AВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- w: B: a' d; n& L. v- c! T. C) h7 w4 \5 L$ l& T1 r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 5 k* \/ W& {! k% o
AlexCoder опубликовал в 2024-10-16 18:31/ h# N: o6 D" n; p
День добрый!1 [# m8 b! O7 l  P9 c  R3 d$ t5 ~  z
В статье описано взаимодействие игрока с N ...
3 y; u7 q3 ^& U" s- {) Q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - M, v9 }& R. S! T

0 R! ~' U% b+ H' @) V$ ]" xЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
% ?( v8 N$ V* M8 ]& j) H
: k8 a$ @% T. s/ H' K6 O% lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 g6 l% x) C" o# \4 i( L& y
# n2 h, Y- _! H7 n+ D4 g$ S
  1. <font color="Green">// Пакет для состояний монстра</font>
    ) x5 Z: z1 L' |/ S& }
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 z8 e4 X( L& T& l! Q. b
  3. <font color="Green">1 E7 I# H5 [+ c) m3 U
  4. // Интерфейс, представляющий состояния монстра</font>0 y& s; G4 x& J8 |5 x
  5. public interface MonsterState {/ r1 _, j$ j$ f' a
  6.     void handleState(Monster monster);( i, H9 R2 S* Z  K* g7 O
  7. }
    2 [) w& }: w5 R6 J0 J; W% z
Скопировать код
) M- {" |8 _; ]/ H5 V9 s
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
: c0 |1 @6 Y8 }. k: P& e% q
% O. j( O5 Y; A, n* D+ I8 hКласс для начального состояния монстра:
! ~2 M9 B7 Y  K) A7 P! J3 K  D
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    3 V, P/ t# s) F! U2 w9 z( b, G
  2. package org.l2jmobius.gameserver.model.actor.state;- `& V) }" u: d- G* i

  3. " Z3 L9 b9 o: T( j
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 U+ U! c& U, T

  5. # c6 ~  `, y" [
  6. public class InitialState implements MonsterState {
    " w  y1 W% e8 E
  7.     @Override: x% B$ b- |6 x' \2 S
  8.     public void handleState(Monster monster) {
    / ?4 T  {0 D4 A. u+ X4 V2 j3 S1 ?* o
  9.         // Начальная фаза боя
    1 e% U, j* G+ I9 H- |
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, e5 Y: v4 D# B2 \, j
  11.     }
    6 O: J1 z) H+ t5 z* S* h8 ~
  12. }
    ) o0 x" O  ?) J) i
Скопировать код
# h. T& |' B$ @% \% k6 N6 o  Z4 v* T
% P; T" A" O/ M% g# |- g

6 M7 {$ H4 y# ?. _0 l7 d
2 ~5 q4 y5 ~& f* ^+ x( m
$ M8 p; t0 |7 s4 H
- [& x- V) _! \" Q. x/ ?
" J; L" q( `8 B/ @
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ o) ?" |' [; B  i) B" B. d
' ]# D$ s5 y/ `, b. B4 BЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ M$ n- k, v  A% E3 O& |( X+ c
2 o' D5 W# s. X" c/ {; t' U8 l$ D
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" i4 \) m, n/ s3 K. x( d# x, D
  1. // Пакет для состояний монстра6 K0 {' s+ b  \' ^+ _* v
  2. package org.l2jmobius.gameserver.model.actor.state;5 ^1 X7 u8 @( C, I/ J/ J

  3. % x& Q( K( D0 I$ U! F
  4. // Интерфейс, представляющий состояния монстра. N) `! b3 P3 s2 m1 w, {$ D* P
  5. public interface MonsterState {. `" @  {" L: q; s# j
  6.     void handleState(Monster monster);) C4 x$ M( {$ Q( b0 M, i  `
  7. }7 _' Z* ~- V9 y
Скопировать код

! |- h- a4 f3 W) p; q) C7 [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 ^& L5 h$ R) @# Q+ C

: n: x/ l# D# Q% bЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' n" F) a5 n; @/ H; i, f% y

3 y2 T6 \9 s" i7 I0 J- n8 \Класс для начального состояния монстра:
7 L: Z$ I% a7 b6 V' C1 w1 y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 Z, s$ b$ a7 v! w3 C/ V4 ^9 b
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 k, ^8 g3 ^- |/ E1 z' n* U
  3. % N, h; F6 [3 f  y8 `+ ]  @. A
  4. import org.l2jmobius.gameserver.model.actor.Monster;* J& k5 c* o9 O  O

  5. 7 J$ C/ Q7 b4 x4 {0 L$ b- r: X
  6. public class InitialState implements MonsterState {
    3 a6 Z6 u( \7 i# _
  7.     @Override( p! O' W' G/ |( j2 L
  8.     public void handleState(Monster monster) {
      V: v+ ?' {5 m  i& v1 h! w  d3 k
  9.         // Начальная фаза боя+ _& W2 m: ~$ m( `+ b' k
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");- X, h+ r  w! D1 _7 f$ S- }
  11.     }5 P1 ]6 g6 R" }/ g3 C* h
  12. }
    6 |6 V( C& M5 y8 J. x& T) |. t
Скопировать код
Класс для агрессивного состояния монстра:9 w1 T0 P7 C! H3 `! z) ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* l* @; B* g+ s4 W# Y
  2. package org.l2jmobius.gameserver.model.actor.state;0 H! q" a/ ~" D0 H7 C* v
  3. $ J& p! f- m" F# l. p' _
  4. import org.l2jmobius.gameserver.model.actor.Monster;% p/ X" P0 q9 b# n& W: p+ _* Z* J

  5. & \7 L. I4 {( w0 J0 Y1 b& C
  6. public class AggressiveState implements MonsterState {
    6 s, `6 R$ j: M
  7.     @Override; Z3 Q! G1 [7 R) N2 c  R7 S
  8.     public void handleState(Monster monster) {
    8 G4 S+ {, ^+ O
  9.         // Агрессивная фаза боя  L5 F* |. t* K: c
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    9 e: E7 ~1 J$ c, {( }
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки4 y& n0 P3 G3 _( ]$ @
  12.     }
    1 q5 s( @- ]0 z" ]1 `) D
  13. }& S2 [. w7 R6 }. n: t. P
Скопировать код
Класс для финального состояния монстра:
8 I3 E  Z) P) O" n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state: l. l0 N* ~7 U9 J
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' j; a: j; `7 B1 V5 c6 E4 [

  3. 4 p+ L# `% a3 r7 [0 r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 e$ Q$ J2 ]& t* t9 o( k/ t) N
  5. 1 [' [* b: [& s0 w0 t: X
  6. public class FinalState implements MonsterState {2 ?( D3 U0 Y/ ~# w( ~/ m
  7.     @Override+ z' K- B  A% Z$ e
  8.     public void handleState(Monster monster) {
    ) l0 O$ ^0 q' K: q1 R+ V9 Y% f
  9.         // Финальная фаза боя
    : F( y& P0 h( `- ^
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    * b$ m3 X. M6 m$ o3 O
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : E6 R% x# Z+ G' D- \
  12.     }
    ( S1 z* ]$ o; h8 y$ _7 {5 @
  13. }+ _2 e( i. O0 H3 o5 B; |& f
Скопировать код

2 w' |$ u% H: }, i1 ~Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.6 |* u2 `$ H8 P" [2 I0 N
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , o9 I7 ~0 [, @9 S1 ?" Z
  2. package org.l2jmobius.gameserver.model.actor;
    " [  U- @: Q  ?) z2 o: G3 |

  3. ! x- G; c  p- w+ H8 o
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 {6 v1 `8 h1 n# \0 s3 z0 o& s4 \: [
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + D5 p/ L# ~% n0 v, g- T
  6. ' p. d& k4 v, H+ |) S
  7. public class Monster extends Creature {
    , o$ a( ^% u: E
  8.     private String name;. H8 H# j4 o" u- N, z
  9.     private double attackPower;
    0 l; Y6 B1 U- m4 j2 w( k/ z( I
  10.     private MonsterState state; // Текущее состояние монстра
    2 y+ x, L3 g, l7 v/ M

  11. 7 e9 x2 C$ n+ K2 G+ p
  12.     // Конструктор монстра# b- i$ z  N9 V! _/ M* N
  13.     public Monster(String name, double attackPower) {
    ( _9 t, T% g7 E" f
  14.         this.name = name;  l5 Z" z9 {/ [: L; h: t# Z! a) d- q$ B
  15.         this.attackPower = attackPower;
      `& a; |) Y9 n" N8 u2 P
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние6 z" ~% D  [" l; _
  17.     }
    1 r- v4 t1 C+ ]6 l: `% W' h
  18. * T. }6 M. S6 L0 ~* k! d4 k) ^3 x
  19.     // Метод для смены состояния6 i: Y1 x) a8 C
  20.     public void setState(MonsterState newState) {5 p. p0 b2 k$ R% N
  21.         this.state = newState;, u, m% O/ q$ N: \1 {5 T, B3 `( i
  22.     }
    ( d5 q& k. L" d( s$ M
  23. ) A# P" X. ~. Q; l
  24.     // Выполнение действий на основе текущего состояния3 {% p* _, o4 U/ V$ }7 p
  25.     public void executeState() {
    1 h) f& z2 S4 Z7 ^! A! L
  26.         state.handleState(this);
    , Q9 v+ g+ z% A5 C: c# y9 J
  27.     }' K' e& v6 v2 D2 i5 _

  28. , s" C$ U5 o2 C+ t6 V6 [8 Q( ]
  29.     // Геттеры и сеттеры/ Y3 Q: P  }, j
  30.     public String getName() {
    - L; y! Y- M" g* T, d0 z
  31.         return name;' J0 Y9 @& {" O! S2 {# }
  32.     }
    : R' F( `' o$ a" N
  33. ) r# Q  H, m3 k% f5 g) V- Y$ {4 _
  34.     public double getAttackPower() {
    ( M* X, H0 \3 n" L
  35.         return attackPower;6 u) w" W$ h5 d
  36.     }( p' T0 w% @2 ^# x( s6 s
  37. . z/ T5 u8 V; I
  38.     public void setAttackPower(double attackPower) {& X* u3 P- X) w/ o  L; U
  39.         this.attackPower = attackPower;
    ' I6 p  E! t3 p* y+ y! k
  40.     }% [9 o; q* b) ~& d. v% M
  41. }
    3 t, W% y; _8 @0 y$ h
Скопировать код
% g9 q8 Z) P! \+ S* Z- b7 [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." G; r( F) q" j
0 b6 N0 S; l+ F: |0 \- @# @
  1. // Пакет org.l2jmobius.gameserver.model.battle5 z. O: N; D$ j3 ~% C
  2. package org.l2jmobius.gameserver.model.battle;
    3 w4 L' F- H: a7 i: X+ m9 N% d0 X' W
  3. ! M7 F$ R, {3 ?1 c1 X( f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # q% C# ~  {2 ]
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 G7 M7 y9 J: \5 e5 N4 @- E) H
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;7 Y9 ^/ K! T6 t2 M) o/ w
  7. 4 q" m, C4 R, g2 ]+ m
  8. public class BattleSimulation {
    1 A: x- F, M+ n6 J% {' L, x7 O
  9.     public static void main(String[] args) {2 R+ a: P- S9 f  @$ v  D' B0 W
  10.         // Создаем монстра с начальной атакой
    / G  z' h$ m' ]* C9 G) `
  11.         Monster monster = new Monster("Дракон", 100);6 q9 z+ r: N$ m8 n" l2 E$ x

  12. ( @3 q  _+ p5 Q! t" X$ E$ c& T% a8 i
  13.         // Начальная фаза
    $ w7 o3 L  D* H, d) q4 \
  14.         monster.executeState();9 X% b& q7 k8 d! N' l3 {
  15.   N: `" o( J* R
  16.         // Переход в агрессивную фазу. b# B( [+ X$ \3 T
  17.         monster.setState(new AggressiveState());' h# S5 X. _; e- R" P+ H9 _
  18.         monster.executeState();6 l2 C# ^7 q* v  K$ J* a

  19. 8 c$ X7 j2 }2 \' m, r7 k
  20.         // Финальная фаза
    , q4 G* H" w* A( B% v
  21.         monster.setState(new FinalState());/ M9 _+ @. t$ B  p; f" s' x
  22.         monster.executeState();1 B& G6 q- c: z
  23.     }
    : }) v5 x( _9 G
  24. }
    6 x( m* j: Q! E2 @
Скопировать код

( V5 t) f2 m! kКомментарии по структуре пакетов и классов:$ F# S4 v$ R7 E5 J
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.* \4 n) b2 {' U9 ^( z8 n4 O5 D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.  X$ r4 d) B4 ~) ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" r: h! o& [+ n
. a% a+ ?% s- J; J! `( C4 ^! [' y5 Z' o) O7 `0 X6 s
. T4 R3 t! i( r* r
6 J1 [. D; y: z
4 f; g% n. ^" \; [. b
; ~# [! X- `, o% c. X" \/ I/ p

5 l9 {9 _6 X9 d9 _- [2 ~8 h8 u; X/ `. P
9 K& Q, v4 x  `- A7 @0 F
6 ]; p' N8 m* f  h

3 L4 X. h9 r- x' K7 [# t2 N) W. t5 T0 {& h% e% Z/ A2 C) W" y9 r

& }( Y: F5 `# I/ f) m/ N1 W/ T* Y& c4 n2 o
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
: k) R1 u+ a( DДля управления сложными взаимодействиями, такими как  ...
4 u( i1 V. X" `8 U9 o: ^7 T, _4 ^
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21, u. Y. _4 t$ D" `- q
Отличный подход! Использование шаблона "Состояние" де ...

" t2 u+ {: Y8 ~9 PХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.' a( R' h9 A6 x/ X6 i6 f
" Z9 V( v! d! ?
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.$ q% J  \( ?( D
1 Y4 v7 D* F8 M  _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , l' r. T- `1 F  @- Y
  2. package org.l2jmobius.gameserver.model.actor;
    6 z0 Y" |! t$ \$ I1 n2 `0 ?
  3. 9 k+ O) ^9 s8 S. v4 j2 d
  4. // Перечисление для типов атак
    6 U' I& ?2 w7 H+ j1 ~
  5. public enum AttackType {: G) M! i% t- }4 C
  6.     PHYSICAL, MAGICAL;) D) n! j# V6 b0 D% i; P
  7. }
    7 O; K: F+ m+ _. S
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.$ B1 j" T  S7 \0 ]$ ]3 D/ A) C
Обновленный класс для агрессивного состояния монстра:
7 R5 u' |8 `0 J+ b
8 F4 S; K. t: ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " {7 O2 V, \; o$ j
  2. package org.l2jmobius.gameserver.model.actor.state;1 Y6 i4 K0 u  C1 j! X$ Y1 V

  3. ) ~' A. G$ `* |1 J- z2 @' {3 u5 N! \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + X/ S2 U. b8 S' p; _
  5. import org.l2jmobius.gameserver.model.actor.AttackType;( }9 R4 d5 F* W/ i8 B3 c. l" y9 N
  6. 5 {9 a/ k, h+ w$ h0 F
  7. import java.util.Random;  a) |: e6 f& h) I. `
  8. ) C# I9 m, a. N3 E6 {$ I% W
  9. public class AggressiveState implements MonsterState {
    ) {% S+ t4 {# g- n
  10.     private Random random = new Random();
    2 j6 i& {& J! L: S! L: ?6 S, e

  11. % F3 k( [% q& H! J2 B
  12.     @Override9 i7 t# S+ j( M# }" v% h) ~
  13.     public void handleState(Monster monster) {$ A7 K% i- }1 P& J2 d
  14.         // Выбираем случайный тип атаки: физическая или магическая+ g1 j! o9 n# \+ l! j8 y6 n* w
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;# ~9 m% B/ @5 G1 s! Z/ {  S* [
  16.   C3 w1 Z) `0 J! n$ q3 M
  17.         // Логика для агрессивной фазы боя- I* r- F# O- e# s. W
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 R4 \# J( _+ n" Y- L8 K
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");. Q2 K# o' W) C: \# W9 P
  20.         
    2 n9 z  s& B5 Q* O) |. }6 ^
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! x6 A- A' _" ~9 g5 t
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    8 M4 `' b  h* ?2 |) x; w. T
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    : h8 \, P3 x3 G% ]8 X5 D
  24.     }
    9 w! E) i: A9 Q8 b
  25. }8 C, G# o5 I6 }  e& D; P" G- r
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
9 _  o8 p6 w  b% F
7 ]8 t6 H! Y6 d! }
  1. // Пакет org.l2jmobius.gameserver.model.actor, {3 O+ ]4 G5 ~3 `
  2. package org.l2jmobius.gameserver.model.actor;
    : f+ P; a' ?/ S9 u: Z& b6 c

  3. , l( g( {& z7 o
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % y, |4 T0 i" F7 O& Y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; @1 v* U- d8 y6 m8 V, {0 a/ Y( F
  6. 2 D- `2 h+ |: t( |# \
  7. public class Monster extends Creature {
    0 `: h8 H/ q" _+ I- U6 o
  8.     private String name;4 t+ p4 P  Q9 w( a* v4 i( g
  9.     private double attackPower;& c; t+ I# f& W
  10.     private MonsterState state; // Текущее состояние монстра
    * M! G2 N- e* s8 o3 O; E
  11. & ]/ [$ P/ m: i7 n9 n. e% A
  12.     // Конструктор монстра1 n9 q6 O. A: x! N- Q; ~
  13.     public Monster(String name, double attackPower) {, H4 p! {9 T0 t0 w" V+ a
  14.         this.name = name;
    5 s6 J- s7 A: A+ u7 t
  15.         this.attackPower = attackPower;8 D8 n/ I* x# _5 z
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию$ p& }, C; N' `# r6 X
  17.     }
    5 e0 D& y. h6 v- @; C

  18. 2 \5 X, H6 K8 r+ z9 I) q; G
  19.     // Метод для смены состояния
    / S% L2 o. m, l& c: o9 b( ?% A* [
  20.     public void setState(MonsterState newState) {
    3 R; g  `: X1 a" x0 R4 q
  21.         this.state = newState;
    $ h8 F  N" g- ~$ G; j* k# v9 b- d
  22.     }/ m7 K0 h. y  A

  23. $ r; p, G9 u# U" S4 x7 R2 D; R
  24.     // Выполнение действий на основе текущего состояния
    5 k7 K. |$ k, {0 {1 D
  25.     public void executeState() {
    9 a# ^2 P; B. K
  26.         state.handleState(this);: z8 T3 W) W* ]- j( M1 M9 q5 b$ S
  27.     }
    & D3 ?( o. g* F8 z  D- k1 I* S' l
  28. 8 T* [' v/ {5 c9 x* Z& `
  29.     // Геттеры и сеттеры
    0 q3 @; ]* [9 ]) O
  30.     public String getName() {
    $ ?  I( L" y/ Q& _8 c0 W- ]
  31.         return name;
    * P: c  {3 ?$ p9 }6 M( H$ f( ~
  32.     }
    ) @6 ?1 [3 t" W6 q( G

  33. . ~% {! l1 Z4 q/ _* k8 ^
  34.     public double getAttackPower() {
    # c' X" E. z+ q: ]+ _/ P
  35.         return attackPower;/ _& B+ v/ u; u8 l* @5 b
  36.     }+ N1 D* p8 T' y% X8 `
  37. , H8 f& m7 G" ]
  38.     public void setAttackPower(double attackPower) {& `; i* Q/ k, g, X3 k' ]
  39.         this.attackPower = attackPower;
    ' b9 O: d  p% Z( u' }& u
  40.     }$ M- ~  n- y% J4 u
  41. }# Y( F  d; r$ f* P3 E4 [" a: [
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
' P9 w. ?: a0 |4 \: N1 A" M- u$ |6 `) _" b% c+ |
  1. // Пакет org.l2jmobius.gameserver.model.battle5 Z" s0 m7 c# O5 o1 z# m0 |
  2. package org.l2jmobius.gameserver.model.battle;9 m: {$ u4 e# F
  3. 0 k% u5 E) y8 f  ]4 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : z3 v* n+ b' S2 P
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 \6 H' z+ e3 ]; _
  6. $ P8 z& r* k9 J2 h* Z2 b
  7. public class BattleSimulation {
    & W: @7 t0 \" M$ w" l; {
  8.     public static void main(String[] args) {
    ' J9 b  D7 W' k/ ]% E
  9.         // Создаем монстра
    $ {% f, O) \6 u9 `/ z- L
  10.         Monster monster = new Monster("Дракон", 100);
    % T! K7 y1 j8 I3 `* Q

  11. , ~  u; d, R' _5 B
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак$ G$ i& u, ^3 q! W& B3 A7 k
  13.         monster.setState(new AggressiveState());0 P/ b+ G1 H( P  T* B# h+ v9 ^. E
  14.         monster.executeState();
    7 J( ]$ R# H/ L) r) D- I
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 c; c( C$ d6 J
  16.     }
    0 G# ^1 c- B1 h
  17. }8 D* J" O6 @( |' m9 P5 d9 ?
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.% I! g, h2 |$ F3 e
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!$ d' n* _4 d$ F- I( h) b; I0 M

# ]! E) M. Q( J
# t; [% [3 ]; O/ C# L( l  p2 Y7 t7 _+ n2 B% K
- k8 a7 D) b6 o' _
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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