Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!: b4 v# G* @9 a

$ E' d; X% [, S; r( K3 A

! l; b4 }/ H5 C2 sЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
( i# N5 }* y% ^3 VЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
0 J9 e6 f+ X7 l' }; VАстралия ?& r$ z1 a( ~5 b9 k, j# K0 I
8 ^( `% x. F; s8 w% u" l. m" S* Y8 _

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!0 ^4 D9 w7 i4 i+ v$ G! [, G
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 m4 d! V0 L* @: l  X. O
6 \: ?$ R, D) ^7 ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
$ j9 Q, [3 @$ O! J- |
AlexCoder опубликовал в 2024-10-16 18:314 X$ C3 Z  E- y" Y  I7 {4 Y+ f. s
День добрый!
5 n) v6 P) z2 e# U% M" I  R$ P  ?В статье описано взаимодействие игрока с N ...
( L# l  y" }! D9 `4 }
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
7 {9 l# d: f% k2 N8 a3 Y6 M5 @
  I0 ~# U* k# P# J, Y0 k" g! N; [Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' j/ d" d$ b  a/ ]2 f& i2 H
6 e' f2 e* Q. B1 o  v" R! F) l. WШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.( D& k7 g: F* O  G- ^
. O/ g4 P: i) L) E6 [! B' ~# H
  1. <font color="Green">// Пакет для состояний монстра</font>) k  O& a% h: ?2 ^
  2. package org.l2jmobius.gameserver.model.actor.state;& D7 A, x  _  ~
  3. <font color="Green">* X( a" P2 A% [; B# J% F' m( U
  4. // Интерфейс, представляющий состояния монстра</font>6 A+ Y# N( r3 ]
  5. public interface MonsterState {
    9 f9 N! Q" j# }) ^( E" ^: g! U
  6.     void handleState(Monster monster);
    , f$ [) N( E( Z/ ~; O2 C1 o9 y
  7. }& @  R2 U9 l: `, g5 G
Скопировать код

& A4 M& X" u- T, h3 jШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 j) `5 a: R# t7 S6 O  `8 G% _* q
3 v) Y( ?( P* SКласс для начального состояния монстра:
) {& n0 C2 H- [9 \# l0 Q3 \. M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    5 T5 l% O1 o6 i' B
  2. package org.l2jmobius.gameserver.model.actor.state;
    / s' w+ D$ m& S* r* c
  3. : ]8 X# s9 _: R& L* o2 p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 x+ K! H8 I  n6 q

  5. " t( S: K4 ~# h8 ], T. t* l
  6. public class InitialState implements MonsterState {1 M+ _- m3 z) y6 c7 N# k
  7.     @Override2 O1 p9 c! F7 Z" H% h
  8.     public void handleState(Monster monster) {
    # t  G, p. k7 D* b, v# S$ Y& D
  9.         // Начальная фаза боя
    3 y4 k! U% m0 G6 x
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
      ]* p/ ]; Y7 u2 X; U# F5 J6 l' p
  11.     }: b, h  k7 v. H) V4 G9 G9 ]
  12. }
    8 q6 f. C  \7 h+ |1 h9 R/ M
Скопировать код

( B' I  {) V8 p4 v2 s# ~
! F" f2 u7 i2 J* l. Z& |' m6 v& h8 l. r) b5 l; t. U; }/ E- m

9 G. B9 Q0 g/ l! L( y$ N
. T6 k' g+ X7 y& _, U/ {) r% W; E
5 ~- g5 D' m- H6 X5 ?% W0 x
* ^/ N4 k1 s/ r# g3 u# c7 Q
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 b3 }- f+ @7 e6 k; U* P: l/ M
/ g! m0 X! r. d) h& \. W! Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) `( f6 }3 V% ~

. c( T+ `7 z( V( i! h: b/ RШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 }# J/ s1 o; P' N; |+ q" A8 b9 Z% P
  1. // Пакет для состояний монстра
    " R  s+ t5 v5 N# D. V, B7 ^# B
  2. package org.l2jmobius.gameserver.model.actor.state;. n; e* H* n2 V% \8 k- |
  3. ' n/ h1 z, O3 i1 C$ @7 y
  4. // Интерфейс, представляющий состояния монстра/ ~1 p& M# |( \3 U0 V
  5. public interface MonsterState {0 F5 D7 W1 F& f# w" B! i
  6.     void handleState(Monster monster);9 l+ M- T3 j# {$ z5 i7 \$ p2 J
  7. }
    ) ~% d. K( j6 i+ c/ u/ N7 N  {
Скопировать код

  q) D! B" U  GШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 5 n2 I  Q! L" ^1 c

5 \# `4 E" [  g% \Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 `; K! a* }: s* h" _5 H: A# F# g$ o  E) P- j/ `0 \8 _2 [6 ]/ I8 r
Класс для начального состояния монстра:
$ `+ o0 J' i' C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 D/ w" x5 B. `. {1 C6 `9 }
  2. package org.l2jmobius.gameserver.model.actor.state;
    / R5 b5 I5 I3 F1 T4 o% n+ T/ e

  3. 8 p8 i3 {' z4 \) ?  Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( ~3 N' h# z1 @  t7 `

  5. ( D9 E" r8 H) M- b, v
  6. public class InitialState implements MonsterState {
    5 U2 Q+ H3 P3 v& f4 M7 y) @
  7.     @Override
      F+ K2 a' ?, Y6 b' b
  8.     public void handleState(Monster monster) {$ l5 T6 C/ L) i; n
  9.         // Начальная фаза боя
    6 R& _) m$ P0 ]3 b, c# H
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 b' w0 I$ ]% Y* m* W) }& }5 p
  11.     }
    " M: U" K0 A3 C  X4 Q
  12. }
    " J& X9 o, {* n2 Z( O- s: d6 f! c* V
Скопировать код
Класс для агрессивного состояния монстра:
( j5 a0 e4 {' ?) |( V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 C9 _9 y0 H! B& v" Y/ Z
  2. package org.l2jmobius.gameserver.model.actor.state;( K1 I- S# q" f2 t  _0 F# t% l

  3. - E( t' U# N' I
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 Y: v7 a# {# q, f
  5. ( X9 t0 @3 C, O4 t8 ~3 s/ E1 y
  6. public class AggressiveState implements MonsterState {7 t2 |/ b4 U+ s; m6 x; t, }
  7.     @Override
    ; m% Z) G0 R# e3 f  c* V
  8.     public void handleState(Monster monster) {
    / i+ q. c* h7 E; s: V
  9.         // Агрессивная фаза боя
    + Y! ?0 J7 R& j- u" v/ S) F3 P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    4 p" g+ D& J1 v7 Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ' y$ G* \* o% n. f
  12.     }
    ' l1 Z2 d9 @# N3 G4 i" F: N
  13. }5 B% y3 a- k3 V
Скопировать код
Класс для финального состояния монстра:! I4 Y5 `$ e) s7 R& h; x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& w( x5 l# Y- c* ^( d
  2. package org.l2jmobius.gameserver.model.actor.state;( i' D8 E7 ^2 O4 ?

  3. ! A: E  P/ J  F8 S% W- V
  4. import org.l2jmobius.gameserver.model.actor.Monster;" O/ C" h, `. I! }3 Y" u. e9 ?
  5. 0 k( d% g( [- f3 t) c& C! [# c" I
  6. public class FinalState implements MonsterState {0 z) Q  ^, R7 q$ |6 }
  7.     @Override( ^* ~+ G/ Y# @- ^
  8.     public void handleState(Monster monster) {
    . q) P4 |! d) ?
  9.         // Финальная фаза боя
    1 {. b( w; K9 F# I
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");. a1 @% U* r' Z7 B8 f$ b9 K/ L
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    6 H4 L" {  C  [' Y$ k/ c- o
  12.     }' i$ I6 g" v8 f' h; r
  13. }
    ' t% Z9 |6 r' G+ _) p
Скопировать код

8 I4 l" A4 Y% J$ y8 iШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.8 C2 u; l! x& T+ ]7 N4 \
  1. // Пакет org.l2jmobius.gameserver.model.actor
      `  c# k0 J$ H3 l2 m6 S
  2. package org.l2jmobius.gameserver.model.actor;
    4 Z5 u& M, H1 P6 ]
  3. * @( y# B% @6 |
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % c" j$ k) q* Z2 S
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    # i# l, j& i' I5 }. G  [6 d9 ^

  6. ! ~5 I6 s! W' ?1 m* `3 H/ U/ J* x3 Z
  7. public class Monster extends Creature {
    9 `7 f5 g" u' H: i& F! c
  8.     private String name;1 p* j2 h2 C' h( P: u) ?7 _6 Z- n2 u
  9.     private double attackPower;; v: F. p# f' R5 e' [! u
  10.     private MonsterState state; // Текущее состояние монстра
    # |2 X% o$ p) u; U- J! r
  11. 3 ]+ o1 y- U" H0 a$ y- u
  12.     // Конструктор монстра8 S" l- D& B8 |
  13.     public Monster(String name, double attackPower) {
    " [( L2 {  Q1 j/ d" x
  14.         this.name = name;
    + S- k" j+ F" u# \9 m3 i& Z0 a
  15.         this.attackPower = attackPower;
    & t: T% X3 ]) ~6 n; B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 R# v( f; E* p' s8 H& G
  17.     }& _! \: w! S2 u0 n! c4 P( F9 e$ Q
  18. * @5 @9 \8 _& S) |) ]$ V5 o6 l
  19.     // Метод для смены состояния
    : P. Z4 a3 W4 h; R3 B3 G$ z
  20.     public void setState(MonsterState newState) {
    % Z8 b9 n! x9 D2 s9 ^
  21.         this.state = newState;
    9 {7 C% Z% e2 k! |, f  n/ F
  22.     }) X4 k0 ?. ^4 U, u1 a% |( L
  23.   u( g8 }8 F3 c4 C, ~/ ^* J% k# K+ A
  24.     // Выполнение действий на основе текущего состояния
    1 K* l4 N; O1 B0 R4 o
  25.     public void executeState() {3 D) e. G" K8 d$ |5 |( ?# _
  26.         state.handleState(this);
    , z% Q* [+ P5 K' X
  27.     }% ]2 R6 B/ K' A8 o4 I9 l' L! c
  28. 7 K3 Z* y4 S- O# C! v
  29.     // Геттеры и сеттеры3 B8 B% E5 P) c' b  i0 i2 n" \  I  _
  30.     public String getName() {- y1 j* K1 p2 ^9 O! g0 A. H
  31.         return name;3 J/ `6 i6 p1 F8 C3 D; B
  32.     }
    ' R/ t5 A# ^* |- ]

  33. . K/ I- d) o* s; h) ~5 V
  34.     public double getAttackPower() {
      Y/ L0 w- B1 E8 Y" \7 Z1 g
  35.         return attackPower;2 }. Z) |- |$ H  H& f0 g+ ]. m
  36.     }
    ) o4 Y; P8 E. R; ]5 I/ ?; l+ }: T

  37. ) p9 s; }) r: x' J- Y
  38.     public void setAttackPower(double attackPower) {
    6 g& t0 J' Z7 C# C$ ^7 _
  39.         this.attackPower = attackPower;7 u5 w! ~# E2 g  U7 K! x! r
  40.     }
    6 S% A5 H( N% h8 ]/ a& N
  41. }# p4 {. Z1 ~7 J+ ]0 V' ]
Скопировать код

( Z) l+ U8 m1 F6 {/ U( hШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
0 [1 |' ~* i6 v+ |2 d/ x0 j7 ?0 W7 h' _9 F$ e% V: q. K) M- B
  1. // Пакет org.l2jmobius.gameserver.model.battle/ r: _, t& @/ ?) I/ e
  2. package org.l2jmobius.gameserver.model.battle;$ v/ q: }* r8 ]  U/ a
  3. 0 S' w6 W2 e+ a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . F# i7 ^/ F4 k) Z: H/ m9 O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 A4 K8 v# n1 b# \; J( L* l8 u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ; w7 G+ [" {+ y0 Q' A. Y

  7. 4 C) P! ~0 J& j# p- G
  8. public class BattleSimulation {
    % e; y- U( i: a
  9.     public static void main(String[] args) {# y2 t" D+ F: a  n$ h
  10.         // Создаем монстра с начальной атакой3 V. a6 s# U+ ]  }
  11.         Monster monster = new Monster("Дракон", 100);5 |! ?3 l  x, c" I" q
  12. 8 `' p6 P/ h8 D& F2 C& k
  13.         // Начальная фаза
    , p/ _! _5 M7 N1 N! n
  14.         monster.executeState();& \, M0 p/ p' Y" y& k
  15. + Y$ K5 J- t( X
  16.         // Переход в агрессивную фазу7 L4 J4 `$ f: _9 P4 {
  17.         monster.setState(new AggressiveState());
    6 r% z  \0 u, ~. r1 }9 f
  18.         monster.executeState();
    - z3 Y4 E) ]3 E

  19. ) @0 Q* k' ]" U- q0 R
  20.         // Финальная фаза7 _  g! Y' y* `- G3 k. w) X
  21.         monster.setState(new FinalState());
    1 K1 N# z- @# E& m) g/ ^
  22.         monster.executeState();
    5 Y) T! ~6 a; I  d; R$ S
  23.     }
    $ Y/ U2 O0 ~, `9 [1 L7 H
  24. }
    9 d# R) G3 s" a; k
Скопировать код

( N! z, g6 ^2 U+ U6 H3 YКомментарии по структуре пакетов и классов:
- H& h, E8 B& y( E- i. G
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 U/ X8 h& A# @- N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; f2 g1 r% O( ]1 xЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
. h& P- Z2 u/ Y; {% S# |" m: `0 u. C6 D" i
) M; v4 {2 Q  f# e6 [& Z. r  r( J8 z
( y( b5 l+ Z- i6 N3 a/ d6 L
% g8 ?: c$ |9 ~6 n0 [

) j2 E9 F/ R0 R  F- W, q% q0 ^# h: {- F$ \+ @" Z1 n; }
5 P* H1 v6 c! `1 f# H

. H2 T" [; l' Q+ U7 m' t
/ [. P% ]* f1 }# p+ _6 _" }: r4 v" L  |9 f/ f9 \4 C4 f$ d
1 {9 I% ~6 t- x
! K5 [1 W. ~) A& k
2 L/ j) n) Y) m% F
1 t1 G. ?% T" g3 z- y- d
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
/ u1 V$ t7 H* q1 ~0 eДля управления сложными взаимодействиями, такими как  ...
5 v2 K! ?! d5 T, A" h
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21* S1 Q/ Y+ X8 k: s- d) ^
Отличный подход! Использование шаблона "Состояние" де ...

; }! }  L9 O8 b9 q" g5 U: BХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 e) h2 ]5 ?& p5 O- r
# l  t# Z8 l: Q+ v: [! zШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.0 g( c1 e, u/ y: T
, J& \- Z3 O  r' D) p
  1. // Пакет org.l2jmobius.gameserver.model.actor! y$ y3 D* K0 b$ K7 g! ^/ ?
  2. package org.l2jmobius.gameserver.model.actor;; ]3 r* j; Q4 Z4 u0 c& `- Y

  3. 2 _- }; S2 x4 |0 |. [7 E
  4. // Перечисление для типов атак
    + p* x; M7 R3 e) q
  5. public enum AttackType {6 _$ T$ q  R6 l4 r! a' W; K
  6.     PHYSICAL, MAGICAL;
    . n8 g9 t/ a" f- }
  7. }
    / u" d9 h- g) u9 R
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
, k6 ]3 z1 O( a7 kОбновленный класс для агрессивного состояния монстра:
8 U8 {" W7 u: h$ ^) E
2 z5 r# T6 m7 S( i0 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . |: Q, D  |( E8 e
  2. package org.l2jmobius.gameserver.model.actor.state;" v" U0 I/ Q7 C0 C5 F
  3. 8 J: B* p3 r( y1 ?8 {( w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % ]# ]# }( S) A7 l
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    - ~5 H( D" Y5 P" `! @, g* c$ f- o2 ~
  6.   Z  [+ n4 M3 ^( D
  7. import java.util.Random;
    3 U) Y) n' ]9 {. t' o0 |
  8. / A6 [4 O$ [5 L# [( w' m1 I
  9. public class AggressiveState implements MonsterState {/ c* s+ H2 S9 F7 U' C
  10.     private Random random = new Random();
    # J. K0 T; A( l4 i4 L( e
  11. ; ]% X! p) g) _2 _" i
  12.     @Override  O. e9 Q& m0 l: U% B% ^
  13.     public void handleState(Monster monster) {7 K1 y, e8 B) ?5 W9 e# F
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 `$ f5 \" l$ ~
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;7 I4 P% u( t4 _1 p9 }* C( M
  16. $ e; S) X: Z+ S, J0 ~6 Y. T9 B
  17.         // Логика для агрессивной фазы боя2 H1 m! U. h: e2 q0 X% ]' ?; Q
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ( r& I9 i' j/ w1 C2 l% r
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    : H7 K* u! W" ]$ c/ \9 ~. F' O
  20.         
    6 S% A( p" M: S# T/ o( g: t
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! y4 W* Y5 c5 ~0 ^% L% n7 w
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    " _1 V  N9 {9 p/ S- s
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    1 `  f$ _: i' {( a5 q7 Z5 \3 ]
  24.     }
      L8 i! R2 j! L. @: l8 P& B" M  O
  25. }
    : D, H- f+ O" ?% q2 c& l& |
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
% J7 K) w/ n+ |1 ]& B+ c7 P8 n* |7 X, s: m! N& S. X5 e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 k5 S' U) f' Z$ o: h
  2. package org.l2jmobius.gameserver.model.actor;
    + L+ b; \5 ?% h4 Q- ]  ^
  3. - e8 a; W5 F: Y' V- x2 u8 x) [9 j4 m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 P% C5 y0 o2 f6 G% M, h- t
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ; G. @0 ]7 m" d8 B9 Z3 u
  6. 8 G( t2 x* R6 w; @+ R
  7. public class Monster extends Creature {' v0 S6 r" B9 O9 x3 B4 x
  8.     private String name;
    9 j$ x$ ^- p/ D
  9.     private double attackPower;
    2 I5 V5 }* ]  q. I2 n' @
  10.     private MonsterState state; // Текущее состояние монстра  G* _7 @! k" b* W5 k( {5 q4 t2 A
  11. / I3 l8 @. C+ R. K
  12.     // Конструктор монстра9 V+ k. o( S5 }  S+ k. ]+ K
  13.     public Monster(String name, double attackPower) {
    * G/ F! K+ q8 V0 P3 a) m" l
  14.         this.name = name;+ ~( [5 V; L4 ^. N+ F7 |
  15.         this.attackPower = attackPower;  d( i, z1 i/ F) B+ [% X6 K, M
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию6 s3 `' ~2 x6 C  k/ |3 Z% g  H
  17.     }
    $ g2 I; w3 q: {& ?2 G3 s7 t" F$ x" \

  18. . l, T0 M2 A- c+ R5 x6 U/ L8 a
  19.     // Метод для смены состояния. p' K; d1 F3 |7 K2 `
  20.     public void setState(MonsterState newState) {
    " n8 \/ e2 B1 T+ s0 g
  21.         this.state = newState;# N7 [: F" ]- }, {9 N+ J8 Z$ i
  22.     }
    2 K1 m2 @" D! o9 D

  23. $ x) E$ o& n+ ?. [+ `/ W& {
  24.     // Выполнение действий на основе текущего состояния
    * o( I" I, Y: A
  25.     public void executeState() {/ y$ o! @2 t- Q4 n& \9 d
  26.         state.handleState(this);; e" z; Y- t8 ^3 h
  27.     }9 n, I5 [. Y) |- M
  28. / [4 w$ i# l1 R- Z9 N( y+ K% _
  29.     // Геттеры и сеттеры
    , r, T  v& S+ Y
  30.     public String getName() {
    6 K6 u8 w) e) G5 H1 y9 q& ~
  31.         return name;& k- |) i7 B! r, i/ s8 h
  32.     }' P6 R$ a; `4 x0 J
  33. : W6 v$ S8 L9 j& N; T; v
  34.     public double getAttackPower() {
    / D  O5 w5 |5 z# v  t# f
  35.         return attackPower;1 V! _& L( ^% A1 H
  36.     }
    & D& w4 r/ n/ K
  37. ; X! y! b* a+ a' f% y" S
  38.     public void setAttackPower(double attackPower) {
    " m& K- F" m/ v/ ^
  39.         this.attackPower = attackPower;
    ; K! U0 b1 d" q1 Q; A; ^
  40.     }4 j8 V. m! i' V! D
  41. }  @2 U9 l$ d) x8 Q% |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе." i' @4 ]. z& F4 }* p
5 l5 I; Z4 Z# e$ A
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , M7 T7 H& e/ Z- ]4 N* i
  2. package org.l2jmobius.gameserver.model.battle;
    : p9 [# [$ B- R4 ?! V% s* |1 y' b

  3. 2 w4 Y4 i) ]7 Z. Z3 ?' }
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 m0 Q0 n3 _+ O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* c' q) j" x" |- |2 U4 X
  6. / d! Q+ J1 s1 c& C
  7. public class BattleSimulation {
    ( q  L# b: Z+ D' H
  8.     public static void main(String[] args) {
    0 ^/ s9 M% A& }3 M
  9.         // Создаем монстра" d! S; J' A% x/ t/ d7 W$ _
  10.         Monster monster = new Monster("Дракон", 100);. E7 q& B+ W( q, D2 E

  11. ; \! `5 B+ [5 S( I& s- R& z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак+ O+ c3 r) n4 ^# {0 ^
  13.         monster.setState(new AggressiveState());0 ^0 U% W1 N# L" S$ u* M% z+ v
  14.         monster.executeState();0 r! N& N- @% b% Z9 N- @8 g
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак' i$ s* y$ y7 P# u+ `; A
  16.     }* q& g# c  A) y) s( Q" U
  17. }
    , R& w; k$ z5 f! n/ W4 t
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.# W! t3 a! j  ]/ w- t# m
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
  R2 f! x  s1 b0 S* d
& P2 t7 D' u6 h& @, D: S( r: d0 w4 Y7 g4 I

4 @! B# F$ s9 }1 }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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