Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 l, {, ^( a3 h" B* X# ]

' R$ w7 q2 P6 `: Q" f$ ^

& J+ Q8 @6 N1 P' K/ b5 sЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 C5 S& z+ B/ U" d0 E  W% d, ]3 ?
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
8 \+ V( H: R* B* y& Y) N# v" @Астралия ?
" G+ F& V* |1 `4 S) T4 I0 U3 }5 L7 t, }  D, Y: ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
2 i' O4 K/ h) s; D+ C/ CВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?! v3 O4 A* M" q: ]- W

- A% s" x, N  M1 r
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
. E0 e" ^3 L. t6 i# ~3 ^8 q! L
AlexCoder опубликовал в 2024-10-16 18:31
/ L! i4 D+ z9 L$ w6 X6 `- W# Y& `День добрый!
$ |0 A) G) e. i% ~, `2 f6 B* tВ статье описано взаимодействие игрока с N ...
  S  r& p; W* c  a1 l
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 k) C) U6 u4 D% x
) E6 J0 n* F5 \: aЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра./ g; l2 y' t" C+ H8 d
  y7 N+ F/ @8 C- T; _
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. k1 I) o" `3 g0 B4 z/ R
. ~% [' d8 U7 c9 k; N3 j4 }
  1. <font color="Green">// Пакет для состояний монстра</font>
    9 d% @$ z% v! T6 t$ M' v
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 n3 y5 o5 r; z. m4 Y* O7 f
  3. <font color="Green">
    ; [! K: g5 g  F) a
  4. // Интерфейс, представляющий состояния монстра</font>
    % z3 }+ W1 l. B9 \' M( n8 `
  5. public interface MonsterState {; n6 r4 Z! S! K" ~
  6.     void handleState(Monster monster);
    ! c8 _0 `+ }" j3 t
  7. }
    - P/ c' R  o- Z: d% |9 s; J5 N
Скопировать код

. h% l) V; Q8 Y( I5 h% R# zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
6 z) g+ |/ \9 b& m0 f% X
9 X( I3 o% G6 a% JКласс для начального состояния монстра:
$ L' h" r- H3 B1 ^! {4 b) _
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>+ Y1 z) J/ `/ @6 ^: x8 M4 N6 S- b: W
  2. package org.l2jmobius.gameserver.model.actor.state;* T8 V' U3 r; `7 g. J# C

  3. 0 Q# U+ j9 g! I4 `: g
  4. import org.l2jmobius.gameserver.model.actor.Monster;& _- i3 w2 s& E7 I3 ^" B+ ?

  5. ' z( v0 f8 j+ O5 Z8 c
  6. public class InitialState implements MonsterState {
    3 l) L! C, g+ o' [. s9 B' C3 `
  7.     @Override
    * t* b' s7 @) }0 x  X# T4 m
  8.     public void handleState(Monster monster) {/ b6 h% l0 w9 x9 I# J% ~+ R
  9.         // Начальная фаза боя0 N; T  ?1 `& x
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  ?+ J7 u! [( D6 \+ f& x
  11.     }
    : Z4 f" j  F+ n+ A5 D
  12. }
    % Y) z- T" p# M1 q& n/ a8 |
Скопировать код
4 T; ^1 e4 t! |- k5 C
4 N1 e7 M% o; k+ c' G% x
2 [* }4 }0 W/ Y: u/ A4 Q: y

* E& T% v6 c" B+ `- o* K( l! @9 H3 E5 J9 |. L
: h- O/ T7 p+ @2 R0 N

  x. Y  i: N0 y: q1 j
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 i' Z/ L) c$ A2 u# G
* H; c9 M  Q2 d+ S. g" k* U
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- [1 s3 Y& i; Q, F, K: g$ B- d1 Y. G. [6 f  [
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ }2 l- l  U" x) `, L3 J6 U) G

. J3 f/ ^, H2 V$ ~
  1. // Пакет для состояний монстра
    7 }- _' y; {4 x! S8 O: k
  2. package org.l2jmobius.gameserver.model.actor.state;
      R3 m* p3 |/ X1 t0 e, g5 C, z

  3. ! J( ^0 W  j6 v4 x; S1 \2 m. H
  4. // Интерфейс, представляющий состояния монстра2 x# O' J- H2 D/ ]
  5. public interface MonsterState {5 s4 U1 M4 j! w0 L( \7 ?
  6.     void handleState(Monster monster);
    6 E) k  B$ O( |. b
  7. }
    1 v: ^6 s! ^  Y& y
Скопировать код
% @4 b* x; P' C0 Z& B3 p$ O* Q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 0 ~( m1 F, x: W9 ^+ M7 {: K
- s% T8 u+ h# u, G- F
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; e# H5 S& H) O" C3 o4 F* f

% P' S% @9 z+ ]Класс для начального состояния монстра:6 h% I9 m+ m' B" L+ l& x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 ^/ i4 j7 P3 G( j: @- c
  2. package org.l2jmobius.gameserver.model.actor.state;: c' z. F5 D# S* I2 P

  3. 7 l( }4 R& \2 K; b3 Y& D% m
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 b/ s2 z" e2 [' |& u' u# W
  5. " l6 g9 o9 r8 e
  6. public class InitialState implements MonsterState {! s( B/ d- m0 G7 t7 w  K
  7.     @Override  p) x0 \+ X% n3 ]$ r0 w$ v
  8.     public void handleState(Monster monster) {
    - M8 T1 T( d, d3 E' h
  9.         // Начальная фаза боя
    4 p& h+ [2 L" y  h% A! D; Z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    $ [  T3 t  Z: x/ A& \
  11.     }* g0 l3 E5 w! V4 L& g" n: w8 i' ]
  12. }& s4 ~3 u7 Z. U9 _
Скопировать код
Класс для агрессивного состояния монстра:
0 Q' a8 ^8 M( o, x  m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 y" N! ]+ l5 e& C
  2. package org.l2jmobius.gameserver.model.actor.state;7 l& p! W% z/ |! ^  ?) P0 E' p9 Z9 V
  3. ; X' J! M) k* Z. L0 R7 \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * D/ c) F5 F: e

  5. 0 L' A( U# a- H* g
  6. public class AggressiveState implements MonsterState {
    . F; D1 L8 P$ k/ S* o1 D
  7.     @Override
    : [+ F) d  m- s- |- H
  8.     public void handleState(Monster monster) {  f# R1 G& k8 v9 R
  9.         // Агрессивная фаза боя3 ^! Y# A1 n. ~4 b7 N( i) P6 e
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , w: B) [7 ^7 N+ Q: v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ( Y, a3 S" G$ G" P! @+ e( v
  12.     }
    $ y6 C8 X9 s6 H0 |
  13. }" [1 u! W( f# Z9 f/ m
Скопировать код
Класс для финального состояния монстра:; H% J- O0 X  s; @/ ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 ]2 h( j- y  w9 N! n% N7 Q+ {: ^. a
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' a. d+ S4 L8 v: i

  3.   @) A# }. d+ P9 Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 Q  ^. O, @1 }1 O6 A: D% u

  5. 7 B  R( x5 X' ^) R8 L  E: n
  6. public class FinalState implements MonsterState {
      w7 q$ Y$ \' o: F, J
  7.     @Override: M. z/ T/ ]6 G! H1 z6 r; }- m$ w2 f' |
  8.     public void handleState(Monster monster) {1 l; `% P* ?# M  F/ u/ A+ V3 s
  9.         // Финальная фаза боя0 y0 h0 g+ P- ~8 A; V+ J8 o+ q
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");+ _  x  J" q2 ?
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( y; q, h1 h& j1 k" @5 g
  12.     }# k* L4 W9 h- v) i& P
  13. }
    ) O' R7 v  {; i4 F' S# h
Скопировать код
/ n7 K. Y6 e& F9 o+ a
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 S* N' z0 A4 V! E) b( l) f
  1. // Пакет org.l2jmobius.gameserver.model.actor9 n6 r+ V2 _1 u9 B5 h
  2. package org.l2jmobius.gameserver.model.actor;- q( x7 N2 `; ^0 d
  3. " b9 c# b* o3 K- A2 ?5 w* ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 W6 g+ {# B8 l0 Q1 k
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) Y$ i9 g& A) k5 `

  6. 5 m7 Z3 F/ C9 w; m; p* q, }6 i
  7. public class Monster extends Creature {
    / V4 Q0 W4 G  X$ D/ M* k, W
  8.     private String name;
    / u5 t" a+ v6 T9 q) a" ^, C
  9.     private double attackPower;
    & y  y& F' T* U5 k$ R+ Q
  10.     private MonsterState state; // Текущее состояние монстра9 Q) W+ n" y+ A+ c. F: L
  11. 9 D& L) v$ X3 Y# ~
  12.     // Конструктор монстра5 Z' a$ \, V, C! J' q% E7 D5 x
  13.     public Monster(String name, double attackPower) {
    $ I1 R3 C! k2 _6 l$ B3 U9 ]
  14.         this.name = name;  }( Q" ~5 @6 H; x# s
  15.         this.attackPower = attackPower;
      y/ s( ?" Y7 Y1 ^2 ~+ i( P
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние; X, F; C" X3 H! a" ~' Q
  17.     }
    8 w3 W$ |/ p& A9 k5 T/ w; {: i) G3 [

  18. 5 V  Y- f. ^7 I6 a: V5 u
  19.     // Метод для смены состояния! y' Z- j) ~9 |+ y
  20.     public void setState(MonsterState newState) {1 t% c* b9 s; u0 ~
  21.         this.state = newState;4 B# b6 T, x. b- J
  22.     }
    + `0 L  i" O8 M2 t
  23. * I) k9 t6 e- Y! C( d2 O7 y- f; N
  24.     // Выполнение действий на основе текущего состояния
    ( P" v+ {, o/ ~# E% U6 V
  25.     public void executeState() {" u, D* n2 i; S1 B) C
  26.         state.handleState(this);4 l' @0 q2 a" J9 w# U5 ~, c: g- _& J
  27.     }/ @6 }' K2 F0 N8 c+ X
  28. 2 D+ [7 S7 }9 A; U0 L% d( D
  29.     // Геттеры и сеттеры; r/ g+ g  [6 d/ @; K8 i1 A
  30.     public String getName() {
    - `( c$ U( S3 n: I, g
  31.         return name;
    6 ~! V" s3 f6 z8 {0 M; x
  32.     }* f0 q* X8 L/ ]# A
  33. # Q+ I7 P4 z8 G  j) d- a
  34.     public double getAttackPower() {8 r) h) p( f7 m- R. `5 K. @0 g
  35.         return attackPower;
    2 C4 S( Y: u5 ]: }! i8 V1 v* x. f& T
  36.     }! z2 R2 G: ^4 ^
  37. ; u. f, K6 p# P! ?8 I5 `- U& L
  38.     public void setAttackPower(double attackPower) {
    9 X. ]3 _9 C. Y
  39.         this.attackPower = attackPower;
    ) B6 }0 h* F; N8 R2 K  m2 @
  40.     }
    ' f; r3 X0 l9 O" X- K6 z7 n
  41. }# p- F1 V  Y2 D/ H/ n
Скопировать код
8 @' C5 U5 ^4 W  A
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! f+ k1 L# k8 m7 i2 e, _& B3 p4 c% j1 o: z2 E0 u8 I  l
  1. // Пакет org.l2jmobius.gameserver.model.battle, i+ B' r9 X, X7 E4 u
  2. package org.l2jmobius.gameserver.model.battle;
    * ^1 L  h/ O0 w* M

  3. + T* P  A% [: G; w2 j
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 u& w: U+ E' B) X$ ^) u- X
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 ~" A+ n6 R' s( O0 A: k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;; n2 t( k9 ?5 B( P4 A  O

  7. 8 N( I: W3 u' w, m
  8. public class BattleSimulation {
    0 t% _# ?, I% H+ J
  9.     public static void main(String[] args) {5 {" S  e) @* w! d
  10.         // Создаем монстра с начальной атакой
    3 R6 Z, r- S# [$ ~
  11.         Monster monster = new Monster("Дракон", 100);* j4 F, q& w% ^

  12. # B8 U$ W( E1 d+ Z2 g
  13.         // Начальная фаза
    ; @6 Q2 e3 F0 V6 a! [
  14.         monster.executeState();: m" ^/ v' U( F: J
  15. + h' k3 q) S! G
  16.         // Переход в агрессивную фазу
    ' D! d3 ?% {, ^
  17.         monster.setState(new AggressiveState());/ a3 d- J1 q; `7 l$ L
  18.         monster.executeState();4 {3 T& L2 Q% j6 C8 Q

  19. 0 o5 v: `  W* E! W5 U% Q
  20.         // Финальная фаза4 x$ i" s7 Q% @" U2 Y+ z9 q1 K
  21.         monster.setState(new FinalState());  I' R4 a, Y7 g  v7 b1 F. v5 d, }8 H
  22.         monster.executeState();
      Q: I8 g- N2 F2 H
  23.     }
    5 E& K  v8 j  g+ y
  24. }
    8 B# A- K" ^, G0 w8 ~
Скопировать код
3 ?0 h, A& y! q% l
Комментарии по структуре пакетов и классов:1 w: F0 s9 R: b
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ( N6 f2 @0 G4 q% l
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 F: L' i9 C! j$ nЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 f9 c3 r4 l) b' A# Z
+ Q$ h* Z9 w6 S

. Y; L, I! i5 H& O
2 {7 [6 \" E& _
3 g5 L4 O% j) U! d8 G* Z4 J
% ~; |3 R% X9 g+ E' l# h( P
* P( m) u( W! n/ O1 C# s3 h+ e& X( E9 C+ O) Y, u6 s+ ?
# u: Z: z/ o* [
6 W$ C% s% y' C. U; k
* ~4 g. I' ^) `" d: w* v( M

, S9 I4 @/ b; L( Y/ l# Q2 }( E: B0 G: E

5 u1 E1 ?/ s) V4 ?  L7 ~) u
! Q% W! d' f5 k
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04* a' a" ^# l# O" |
Для управления сложными взаимодействиями, такими как  ...
" t9 @. W( s! Q
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:215 G) y4 A6 [' }9 b
Отличный подход! Использование шаблона "Состояние" де ...
" o5 s, e1 P' x5 H$ Z( m
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
  {2 e$ H: g1 i" N6 z
# F7 o8 N# v5 QШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
6 [  o2 ?" T) \  U! l. I" A
: q& X2 m9 e2 E3 I) w$ j9 T
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 v; Q1 L. r5 R; E, c( M- f2 c8 j3 ^
  2. package org.l2jmobius.gameserver.model.actor;- v0 R$ Q! Y0 U3 u

  3. & f; g6 E" F: \# S# U( M
  4. // Перечисление для типов атак1 q1 ]' |# d5 i9 h4 O3 o. N
  5. public enum AttackType {5 g0 b2 t% a+ O" k1 M0 }
  6.     PHYSICAL, MAGICAL;
    3 a& w5 Z! l8 c0 \& N
  7. }1 B" T# m$ |" {: Z* _2 u0 \
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.& f. k) `% s) X: Y
Обновленный класс для агрессивного состояния монстра:
! m6 \' k+ {7 x
6 A3 ]' A8 W$ X. |- Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 r' x$ Q; f: [/ M$ x+ ^
  2. package org.l2jmobius.gameserver.model.actor.state;+ B$ \9 N' w! ^4 r0 v. s" ~
  3. ! d0 x9 h* R4 m! _- r, e
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : B$ G' A- U4 w/ ~7 K1 H
  5. import org.l2jmobius.gameserver.model.actor.AttackType;, x# m. H6 v" y

  6. 9 y3 X* p# O1 m% {/ ^
  7. import java.util.Random;& z" h2 w8 I6 A$ o9 V( S  u' I
  8. ! ]+ p  W! ^5 n* o! P
  9. public class AggressiveState implements MonsterState {5 x) {+ W1 X4 n) g; V
  10.     private Random random = new Random();
      n! d0 j7 x4 I% R# q2 z0 Q* k
  11. 4 b0 d+ i9 p8 t3 A
  12.     @Override
    6 S9 i0 s9 a" U/ u: R% ~
  13.     public void handleState(Monster monster) {7 Z& q! s( ^& t
  14.         // Выбираем случайный тип атаки: физическая или магическая2 T; U6 r0 m) c: S$ {
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;; Z" O0 |( C+ d2 R( b! z
  16. 9 }. X( g; _+ R7 {
  17.         // Логика для агрессивной фазы боя
    & |! Q5 s$ s9 L4 n
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    - N' Z+ U6 K& B  @
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- p  C" ^! W) F/ r8 |  W+ o
  20.         ' j" b, v8 t5 F
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    4 K: ]! t' ]  v% ^9 k
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;2 I( N  ?. ^1 [9 A6 Q# _% H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 P# {" r# l. r
  24.     }
    + s' n, K! i' ?& _% V
  25. }
      J6 l( @) i# R% Z+ J7 N, Z! w
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
2 v8 Y$ T' e( f# I9 H0 l6 i) T3 r
" S7 y# R/ U1 m/ c+ ^+ y/ ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 D: j% ^; \, x0 h& j
  2. package org.l2jmobius.gameserver.model.actor;6 p, A; }2 D. {$ X2 Z
  3. * l7 \/ {+ f2 z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ K2 l; H3 Q% V4 [: @
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    " q& W% Q6 ~6 o: `) m3 H, q# x; u
  6. 7 n" E9 y! Z& s/ g2 T' u" M
  7. public class Monster extends Creature {& X9 v5 i- j3 k' p! j/ K/ w
  8.     private String name;
    . Y8 V' @; V, j
  9.     private double attackPower;4 x2 p$ o$ l: T" {/ k0 L; s6 Y
  10.     private MonsterState state; // Текущее состояние монстра
    3 C. W: X% ^, C8 |
  11. 8 G  G2 `/ k  a1 ~* u
  12.     // Конструктор монстра  G" y4 Q% n. c/ d, \; ]
  13.     public Monster(String name, double attackPower) {* @0 S9 u' E" X; K8 n' B" U# Y9 _+ I
  14.         this.name = name;+ N) Z8 E/ X# x: [7 \
  15.         this.attackPower = attackPower;- D1 A1 g3 Q6 T$ O+ q4 P
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию2 y9 j' W  z0 P  C
  17.     }0 u) x* j( d9 h( a: G% S; G
  18. 9 w5 Z3 H% ]% ^) }: u
  19.     // Метод для смены состояния
    ; f- T( p: Z0 e! T* I
  20.     public void setState(MonsterState newState) {
    " u3 l" t' R7 }; ]2 P
  21.         this.state = newState;( O( O$ f4 G* l+ Z  Q- I7 O8 q
  22.     }  a0 V$ `% H* N7 w

  23. + {; O5 ^9 X( e& H* ~* v, D
  24.     // Выполнение действий на основе текущего состояния
    0 i( @+ Z$ f8 h" E, n+ r- ?
  25.     public void executeState() {
    ) M. i- p7 v3 t
  26.         state.handleState(this);
    . c6 d" e# H: m, D
  27.     }( s6 m+ _4 _) c
  28. - A& q, W2 y* H2 h; u: Z7 J
  29.     // Геттеры и сеттеры- [/ O' Y" \) d5 _, H
  30.     public String getName() {
    2 I* E( R' x9 g
  31.         return name;
    ' g6 z7 w* t( `# T
  32.     }
    + t8 q0 L1 q+ T4 A* P0 D
  33. + R5 `" e. T4 y6 @
  34.     public double getAttackPower() {5 Z5 c4 o5 g, n5 N" L9 l! ^$ b9 C4 K
  35.         return attackPower;
    7 i6 b# P) o1 k* @8 T7 J. t
  36.     }- Z$ {# T. K' M$ s8 b

  37. $ p0 W; R+ w/ l( a6 {3 `* D' V. A
  38.     public void setAttackPower(double attackPower) {
    3 s0 t8 G" ]3 q7 r
  39.         this.attackPower = attackPower;
    7 u( `3 k  N# Q6 j
  40.     }
    6 I6 |3 J* W) Q$ V/ f
  41. }
    8 a8 W; ~' x! l9 {1 }2 Y
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 l5 O3 _9 {* P

4 H$ u: l' M, y
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 X) m+ D5 {$ s
  2. package org.l2jmobius.gameserver.model.battle;( t; e& y6 W6 ?6 `( M8 r
  3. 9 A7 F% m/ S3 S9 F7 ]% k/ Z% f* g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % A# t' x8 ?! x. x, Q9 ^9 I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 K7 x9 C$ I* ?: Y8 S
  6. 0 s  j. z/ n8 P! ?( f) Q! \
  7. public class BattleSimulation {! m, p. R/ S3 P5 Y1 r
  8.     public static void main(String[] args) {
    3 R/ o- w; _; ^
  9.         // Создаем монстра4 c: Z* Y- |( k- p* m0 G% L9 [
  10.         Monster monster = new Monster("Дракон", 100);0 J: d; }) c; Q8 o

  11.   J, r$ s, p6 L
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак* U* Y! r& k, U8 J/ a! c5 C
  13.         monster.setState(new AggressiveState());
    5 u0 h* v) \4 }
  14.         monster.executeState();
    8 }; V9 j+ C3 e" A- m& C/ B( ^# K
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
      S: e5 i% a& k9 D) G
  16.     }
    / I, p' x/ j1 u1 ]
  17. }
    $ E9 X" d9 v3 A9 h; ]0 j
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки., `* ^/ H' ]! Z% Q# f& V
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!& d+ ~, I' ]2 a! d7 R

9 B+ d8 w1 `. |3 O, C8 X1 V- q; `! m- h4 l

# N1 O* i8 Q, }$ i3 M* `+ T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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