Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!9 ]! ]: H3 a# H$ [; m

8 a5 W. q/ J. a- T) g5 M
& b6 r' S, f# i* W& X0 F, P9 Z$ J& Z
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
5 L4 W, N# s% Z7 E9 mЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
* `2 Z1 C7 C. x' j1 P6 g# V& jАстралия ?
3 ]0 _$ f2 e2 t, g9 d7 U. Y
& e: m! a3 N, Z1 q7 |! _$ S+ |

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
0 h5 [2 S  `- Z9 N3 t5 r% ZВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
" y: z, r1 r' q$ j! ^1 W/ X; Z9 F6 ^
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
- T4 f% E5 i2 y' A& D2 a. K
AlexCoder опубликовал в 2024-10-16 18:31
7 n; a: O$ K+ M" j) ]. O- iДень добрый!
# U* s- R* u2 Z5 ^В статье описано взаимодействие игрока с N ...
' m0 m; v0 S6 S& k4 L7 N4 H
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . K  d5 ?) |$ S; P, z' ?
  s! F7 w" D' W+ ^5 ^0 X+ L" {
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.* c- w* P6 x- r  s* }. u
; j6 @- z5 @0 ~' }7 N) r8 G' y
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% T5 h9 X8 X4 E
% P3 n; z1 v/ ^: V, {
  1. <font color="Green">// Пакет для состояний монстра</font>
    * v) h2 z% h! ]  S6 X) L
  2. package org.l2jmobius.gameserver.model.actor.state;0 y! O8 P. A" @0 b( d3 Q  g
  3. <font color="Green">
    7 G+ \+ g' a- d
  4. // Интерфейс, представляющий состояния монстра</font># C  T' K: u) N: J0 L
  5. public interface MonsterState {
    ! d, ]& o5 V' X5 O/ i. _" U% }
  6.     void handleState(Monster monster);
    1 p+ ^. L$ @$ E& h
  7. }
    # v) ^% ?4 G4 e# P+ C8 w
Скопировать код

7 d  [: r% Q, L% ]& ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 e7 @8 A# s* S) i7 z' B3 Y6 S

+ Q5 q, _, h/ DКласс для начального состояния монстра:5 m) n$ F2 N$ i( @* Z
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ! U+ ^% n$ G7 B: V; d
  2. package org.l2jmobius.gameserver.model.actor.state;
    , A" F9 j4 i2 j: s) @

  3. " c' d  S6 C' h1 z: I  ?" A
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 i  @. \8 O- b$ ]3 N
  5. ! ^4 o. E- H- L6 t8 @  j
  6. public class InitialState implements MonsterState {
    . I! _: i. b3 z$ Z
  7.     @Override( E9 P2 `9 f; f8 z) V8 Y
  8.     public void handleState(Monster monster) {
    1 }7 C' O- N# |6 l3 I, R
  9.         // Начальная фаза боя1 T- N6 z6 q/ @5 U! z3 X: f
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    8 m) d. b8 {+ n
  11.     }
    # F% W( l( O* J& F* Z
  12. }- J$ b; O* C0 `/ p$ F- E
Скопировать код
( B( ^' I: o: d1 l5 M  p& q& r% m% r
+ K6 U" X% X- X
( a- o. A) P+ j3 g9 e* q: |/ ?( y; @

: w9 N0 l% |4 Q  k
: l# ^' n" L5 }, a$ p
% V9 |2 n( @( r4 |' V, K& U1 E# Z
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). + t+ D8 o- [0 |
0 n2 }- T# g5 g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# R" H& o0 D2 ]+ J& V
9 h) v  c; O. f7 h1 AШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.9 L2 i6 a3 X0 [
3 H/ y4 C, S# ]# D! U5 G
  1. // Пакет для состояний монстра
      n+ `0 h* `# [
  2. package org.l2jmobius.gameserver.model.actor.state;" d& d& E2 M4 V

  3. 3 `/ F8 q/ U8 c" e. p
  4. // Интерфейс, представляющий состояния монстра
    ; @( u5 U/ t' F( i. K' T
  5. public interface MonsterState {
    4 H! v5 c( q! ?5 @2 B/ _
  6.     void handleState(Monster monster);& _* ?, G0 b* ~% f/ u3 z
  7. }
    - S) _; c$ Y* @+ J  I
Скопировать код
# I# o! V1 [# H1 f
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + b" K. g0 g$ o
) o( j8 `4 \  ?8 u+ \) t& k
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
! A& q# ~, d9 r% }7 x2 p5 \9 B" N/ t+ g1 X& b4 ~7 l
Класс для начального состояния монстра:; A% R1 P! u" b9 j2 F; Q4 {% e# n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. [% P1 J3 X- Y. j5 i" V" l
  2. package org.l2jmobius.gameserver.model.actor.state;7 _: Z* e+ t" s+ p. ]* x& A

  3. 6 p( f' G$ {# `4 g- s
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ c, [1 ?% g+ M# i8 Y% ]+ ?% T# \* u
  5. 6 _& d# m! V/ b& @$ t" v
  6. public class InitialState implements MonsterState {
    & L+ s9 g& _# S$ D) @
  7.     @Override3 d4 a5 M+ R1 n5 [/ a$ l3 {; x
  8.     public void handleState(Monster monster) {
    ' Q+ s  I; V5 v0 g) C! M
  9.         // Начальная фаза боя5 q. @3 w/ J+ P
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( ]* c0 i6 ?7 p1 F* {  Y
  11.     }4 V: y, t+ w; d% Z
  12. }
    6 {0 T; D- N; w0 {
Скопировать код
Класс для агрессивного состояния монстра:
9 B6 }  G7 k4 Z( ]
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& y9 Y! w; q, N  A+ v
  2. package org.l2jmobius.gameserver.model.actor.state;: K. t5 I; O* H9 I! d
  3. . m& j: P' _8 ?) g3 c( Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 a0 B1 ^: I/ E, S0 Z
  5. 7 A* n& d, h; T9 L0 {3 w
  6. public class AggressiveState implements MonsterState {
    & t& e# D4 F+ J/ [1 @! _7 r
  7.     @Override, k! s/ q* c7 w
  8.     public void handleState(Monster monster) {
    7 K) Q# k( G2 \; E' D! ?
  9.         // Агрессивная фаза боя
    7 v' ^8 x* E6 x  R" q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 @( c% r- O2 N( V" I/ J
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    + u4 p. M) W. y4 S7 S* O7 K
  12.     }" `' B+ [9 v6 h, v* I* T6 a' h
  13. }
    - d, J( P( G7 M5 V* l: t8 m: D
Скопировать код
Класс для финального состояния монстра:
& k4 K0 F) V3 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state5 L* _7 F! O8 u6 q
  2. package org.l2jmobius.gameserver.model.actor.state;0 F* B) P: O( z+ h, g( ^5 }$ y

  3. ! t& D* @. o# J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! Q! N$ p" C0 c0 B! o9 ~+ T! ]' X9 H

  5. 5 T5 f1 _8 K! ^4 Y6 o
  6. public class FinalState implements MonsterState {# }# ?; h: J. n% L# o
  7.     @Override  _( y' y( O) c* ^2 Y& i5 X  j, B7 I4 `) A
  8.     public void handleState(Monster monster) {% W9 t( e8 F, c; I5 q
  9.         // Финальная фаза боя% `2 A9 Q9 ]" A
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");  ?5 }  ?3 |9 n: \& A
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# g6 ^8 h4 x- ?
  12.     }
    ; `  H1 p% ?3 M) M& ]; T0 z- [
  13. }# @& [, H( L3 _- k! c/ t
Скопировать код
5 {3 \7 t- T4 T/ r' M
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) O  t$ s6 a# \  N* X/ R% ?
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / f4 s7 m: U# [8 v6 k. g9 Q* q8 r
  2. package org.l2jmobius.gameserver.model.actor;( \7 l  i( p. d! `% F
  3. + o6 ]* A; |, d- ]& P. h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 E/ R$ b, q3 x1 N
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 ?6 a2 x7 o. L, |
  6. 1 e5 }& Z& m* n3 i( `
  7. public class Monster extends Creature {
    * b% z( L( q, S1 W% a
  8.     private String name;2 M5 a1 P6 B: R: {
  9.     private double attackPower;: e- i0 p( R& Y& G6 I
  10.     private MonsterState state; // Текущее состояние монстра! F( B/ g2 X6 o% l6 x6 r

  11. 2 \4 c- a; f, z& @+ u% a
  12.     // Конструктор монстра- v4 }$ P3 C  g9 r) L
  13.     public Monster(String name, double attackPower) {
    6 i* o/ b5 {- o/ F* y
  14.         this.name = name;
    ; t2 U5 n1 t# m6 g2 ~' k9 @& x
  15.         this.attackPower = attackPower;
    7 U! `/ \7 F5 G% Y# S% D+ [' i
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    $ K) H$ J8 P& G4 N% j
  17.     }
    0 W: J5 H3 x9 I

  18. 7 l+ _/ n7 A3 V
  19.     // Метод для смены состояния
    4 ~, J9 d; _4 d$ f& b
  20.     public void setState(MonsterState newState) {6 L  c, E5 d) y. S' D0 V
  21.         this.state = newState;1 |, c& Z) l9 C- m$ ?  `/ n  X$ n7 ]
  22.     }8 [0 M  X3 F2 l) O* y7 a

  23. 1 ]  i2 J4 F: ?/ g! R/ ?
  24.     // Выполнение действий на основе текущего состояния
    4 s* J! ]  _+ T# v* u# X# j
  25.     public void executeState() {
      P2 W4 A; O" A$ s
  26.         state.handleState(this);7 t) H  s" a6 j! t% s
  27.     }# _8 W4 n% {- `6 {& T1 \& U" N+ n/ ~+ \

  28. : ^" W5 c1 C8 U! M9 R& |
  29.     // Геттеры и сеттеры8 w' X! b% b$ \) g
  30.     public String getName() {
      {, d7 [4 w0 i7 W4 I" S( V& V
  31.         return name;. [* n+ }# u* B
  32.     }
    ' s+ u" V0 M! q: f) S/ M8 e7 f( l

  33. 2 ~' K6 |6 g, \; i9 Q/ f8 a9 w
  34.     public double getAttackPower() {0 y) G$ ^7 O) R7 R3 ~# d
  35.         return attackPower;
    7 G: a& ~$ k8 r$ e5 s6 F/ m
  36.     }
    . ~, {6 I7 M7 |/ M1 d

  37. 4 ?3 N8 R! J( q8 D' k1 O  \$ S2 W
  38.     public void setAttackPower(double attackPower) {$ n$ h# `( P; S* ^: V9 A
  39.         this.attackPower = attackPower;
    3 e. s& P4 Y- G$ X6 |
  40.     }
    . D' j( z; c8 }0 ~  f
  41. }
    ) z% d/ x+ O+ {4 ?0 A( t. @
Скопировать код
( i8 x  C! R; i+ l3 t% D9 |) O# ~% |
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
/ h. b5 o$ c& [% u5 h, i
% S7 I, U& A0 d/ V9 r% _1 `
  1. // Пакет org.l2jmobius.gameserver.model.battle; |7 \/ J# z6 X+ O# q
  2. package org.l2jmobius.gameserver.model.battle;
    3 O! i7 X+ O, ]8 z4 H0 Q" j

  3. * e1 s3 |3 V. v+ i
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 a1 L; x: Y6 R/ Z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 p* P2 ^' X& h+ p2 b- x% u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;0 `% A  w6 W' h# {: t

  7. * H' ~  r/ n% E' E0 F+ k, V
  8. public class BattleSimulation {
    , f, u! Z9 d2 H2 D% ]4 v9 m
  9.     public static void main(String[] args) {
    : o$ R% X5 s' ^0 U- d$ D& s
  10.         // Создаем монстра с начальной атакой0 z" r8 V! p" k% ~- y
  11.         Monster monster = new Monster("Дракон", 100);
    1 n6 a  I) N' Y, C) x7 f

  12. 1 J6 {+ Z) d/ f$ L$ R% |
  13.         // Начальная фаза) a" m. B& o( G" W9 B* Z
  14.         monster.executeState();, D) R% [, k$ V0 O

  15. 1 Y3 |$ K( @0 o/ D
  16.         // Переход в агрессивную фазу
    # E% f/ I2 P8 c1 \$ b4 c% L
  17.         monster.setState(new AggressiveState());
    0 e: n% B8 a/ a
  18.         monster.executeState();; i% J6 l/ d. N9 x2 v# {$ Z$ ^' p
  19. " m& U% w$ y6 A$ C; i: ]+ Q8 L$ ?
  20.         // Финальная фаза
    " U, v$ X' |! z' p, P( X: i& ^- C
  21.         monster.setState(new FinalState());' `. ^" m0 [; k
  22.         monster.executeState();
    4 O9 D; T) H5 d2 o. G3 ]0 ]' ^
  23.     }
      N* @9 E0 B2 ?8 c' ?$ \
  24. }! l# v; D, z5 ?
Скопировать код

5 N: _& v) R+ R- f/ ^6 q& SКомментарии по структуре пакетов и классов:
# d# g+ g! Q3 S" Z
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.$ r. i4 z3 ^; D: Z+ [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код., H, [9 K1 o4 B* }5 i
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
$ d, ^! l  B0 o' w! X+ E7 @8 T! ]; J* x0 _
( i+ ?" N+ i6 |$ j
; |% w; v- h# P8 P+ ^

( P! k$ F2 s. `$ o* ~. L, y4 V0 ^- L2 g" u
) b3 |$ [6 a2 b+ V( w& G( t: R

0 n, |% O6 `- Y/ [, d1 f; f
# C4 f$ h7 j/ A" K: l
( ?/ ^9 R' M: q* {& U6 X; _9 A
# n* M5 I4 q: G" Q( v% b" o6 P. T- z1 D3 L9 X

) M9 f) p* ^% H! E0 {% G* g; A6 B2 t# F/ {9 h; R

6 H5 P% T- m+ D8 }- N: q" O' m1 z
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04* @1 H4 k% m! C! J, t7 g
Для управления сложными взаимодействиями, такими как  ...
9 {" L" S; }% u" R# d
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) b4 w6 |0 {$ ?- P, l
Отличный подход! Использование шаблона "Состояние" де ...
/ L0 e' X4 h3 H( d! l0 s& E6 Q2 V
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. V8 L5 B& N5 P  i5 X' ~4 [, R4 g" M5 a
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
0 p* @# P+ ~6 f, n! D; {5 k: k3 G
  1. // Пакет org.l2jmobius.gameserver.model.actor6 s; `( P3 H5 \$ d* L: U  P
  2. package org.l2jmobius.gameserver.model.actor;
    : l0 ~' j- g" o9 q9 R
  3. 3 S: e# _, D4 y! w; f: t4 c
  4. // Перечисление для типов атак6 x5 m3 W! S% |5 [" `# F/ i
  5. public enum AttackType {1 Q- a  _0 G& t( i, R
  6.     PHYSICAL, MAGICAL;
    " c: G/ E/ \2 k
  7. }4 ~, _* n! e. I& u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
, a# T% p6 v5 d, u) H$ p4 yОбновленный класс для агрессивного состояния монстра:* {& j7 y* K) ~( o3 x8 x

6 F) B$ `2 Z1 j: R  v- m& a8 E3 ]0 l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 F- v% ?! D, o6 z$ G2 ?
  2. package org.l2jmobius.gameserver.model.actor.state;6 D# m8 L2 \% C& P# D5 X
  3. * x9 \- C3 ~8 F7 M& k. ]" P
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 G) h) ?) h! P" v9 K
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    & t+ K5 e- W( F$ s6 j' X
  6. 7 ^6 N3 v2 N1 v2 s" Q- V( ?& o# ]$ L
  7. import java.util.Random;1 X6 z4 V7 O9 `) R# @1 C# F. N
  8. 1 w- G4 f+ C8 ^# `7 U
  9. public class AggressiveState implements MonsterState {- ], G" p  P0 c6 R9 Q6 u4 C! r
  10.     private Random random = new Random();' W* ^& O9 K* m" n6 V
  11. - \) ^9 ]2 P3 I4 j" B0 q" Y6 t
  12.     @Override8 D" D: ^) N& _. Q2 F# B% z6 y" v
  13.     public void handleState(Monster monster) {
    ( x$ D, N& ~/ j- O9 |' T
  14.         // Выбираем случайный тип атаки: физическая или магическая
    4 e  x( n$ U/ n. _& A9 y
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;. V/ L) P& w9 ]6 o6 e" C9 B
  16. * L  L; i5 ]% \" r: Q
  17.         // Логика для агрессивной фазы боя7 V, c5 P# D7 N) _
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    . V! X1 S2 U$ M9 I
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ! q7 ~/ {7 E0 z( C
  20.         3 J4 }9 Q$ s: ^( v1 [8 C2 }
  21.         // Увеличиваем силу атаки в зависимости от типа атаки7 m/ H) {. ]: J# f
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;3 ]* I$ ^! N& R
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 ^) v0 `1 K1 N) Y  b
  24.     }% n$ X7 D" E3 }9 f& N
  25. }
    9 B- _5 M$ k9 ^
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
6 r  }2 V4 H5 v3 X/ M# ?$ j$ b) F* b; q; n  }
  1. // Пакет org.l2jmobius.gameserver.model.actor( t7 |0 {( R, H! X1 H" m
  2. package org.l2jmobius.gameserver.model.actor;4 k8 X+ L& Q% x& ~

  3. , r+ B7 n/ Q) C: W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    8 C/ s9 M6 y( u9 A0 ^5 J) d
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;2 I+ Z/ q1 d# O6 A

  6. ; X6 S+ M* O. c, [
  7. public class Monster extends Creature {; B7 f+ C, }) k
  8.     private String name;
    & h* T, J* F0 z& b4 L8 @6 }
  9.     private double attackPower;. c  L) n& ^" P5 o
  10.     private MonsterState state; // Текущее состояние монстра
    # a* `6 G1 A; x* O0 m! T

  11. ' Z# t2 `4 Y' |4 Z
  12.     // Конструктор монстра
    & G4 }9 y2 I3 B* `6 A
  13.     public Monster(String name, double attackPower) {
    2 ]9 u' w% }1 g/ Z6 T" L
  14.         this.name = name;$ B% u: s) s8 D) c! `
  15.         this.attackPower = attackPower;
    7 `& R% h1 U  ?& S
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ' W: H9 b% r4 G0 Y  c+ i+ q
  17.     }! b  ]4 c% j+ G8 \) C

  18. 4 c2 H& W+ G% s! j+ u; u
  19.     // Метод для смены состояния7 M! s8 M" j8 \: @3 m  ]
  20.     public void setState(MonsterState newState) {
    + {. W5 ]- a$ v( {& q$ T, `
  21.         this.state = newState;
    " Q0 z3 h& L' n. V0 H$ B6 b
  22.     }
    ) @) |4 y" c; E" z3 z. G
  23. * v- C7 ?* q$ S* \+ Z
  24.     // Выполнение действий на основе текущего состояния5 c+ d4 d8 \. A5 v# W, y# _* V
  25.     public void executeState() {* n' o6 V- [9 c# X( h9 A
  26.         state.handleState(this);! N! @2 u$ E. {6 m! q( A
  27.     }* W0 N) [6 {% \! I8 Y

  28. " z" o" w8 X& c+ e
  29.     // Геттеры и сеттеры  l% ?! W) B1 _. H
  30.     public String getName() {
    9 c! Q" \& {; h( c- N' `
  31.         return name;2 z% h# X7 d0 j# d4 z$ j9 m
  32.     }
    $ [" H, C6 Y  O3 E: O
  33. # y- M" J2 C- Z; t$ J. Z& ], P4 c- o
  34.     public double getAttackPower() {
    3 v2 Y1 r( c1 q7 a; q2 B
  35.         return attackPower;
    ) Z, S( G* l, z, X3 Q
  36.     }
    5 v6 x6 l. O7 J, M, h  g4 X

  37. 6 S: M/ s$ ^1 u7 L5 b5 A9 u  _
  38.     public void setAttackPower(double attackPower) {. i  f5 |) H5 |, U( {
  39.         this.attackPower = attackPower;
    + e$ {# k. n8 F( Q: L: i# y2 }
  40.     }  m( `0 |+ ?! I* r9 R4 p( _
  41. }: I* e/ H: F% q: }) r8 T- N% g( L  K
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.4 t7 n; ^* i: G1 J' f3 ~$ |+ t

$ ]2 }' E2 V! U( n
  1. // Пакет org.l2jmobius.gameserver.model.battle/ M+ s! N! j# Y/ w8 ]. g
  2. package org.l2jmobius.gameserver.model.battle;& g% j! Y: r2 _6 T* }6 j% ^( Z
  3. 8 |/ i6 B& x  J2 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 G! @' P. o4 n0 N4 e) ^0 E
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      Z) p1 ~2 g; A
  6. " I; {2 x" Z& \, H: B
  7. public class BattleSimulation {
    0 h: u2 y: T* y2 q  r$ G
  8.     public static void main(String[] args) {
    - d/ W  ~$ H8 e2 `: v3 J: Q+ t
  9.         // Создаем монстра% @- B- R% k7 J2 d, G9 ?$ k8 N: c
  10.         Monster monster = new Monster("Дракон", 100);/ B# }4 |7 C& N7 C! V6 K0 h

  11. 9 a( ^; e4 W/ e( U
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    , L* L+ D6 a7 I  h0 ^8 |( |1 Q
  13.         monster.setState(new AggressiveState());9 W9 q* ]  [+ p4 [$ O
  14.         monster.executeState();2 G4 O+ s. e; u- P
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    2 g. q, S' h% g1 r3 p) a+ I- L
  16.     }: K# u  q7 R5 O3 f% c
  17. }* T5 L* A( O4 w3 |
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.& K: v" l! y2 z% g, i
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
; g9 G( a, C8 c/ x
- E" G) O" x8 l, O  c
7 n  K5 K5 Z- P! U8 M
8 m3 r& w9 X% a' L* R$ R4 @1 ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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