Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!$ Q! ~: T0 x3 y8 d% Z* B% d6 a

/ Z4 N" n7 L, V6 O: L. ]: b* K- B/ {
+ L& P$ B( W; y& |% {) k2 q0 K
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
/ v: i9 J) A5 }+ \- tЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!7 x& p- ]/ w6 R
Астралия ?
% K# g1 C. Q! P) q; U1 T: n
% @0 n% [, V6 [- ^3 u( x2 D  i

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!1 n% K/ p3 n% B! X
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?8 E! S2 x* |8 @& W5 l& `: Z8 [
$ K  u- ?! A" f1 w3 j. |
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 & u. U1 v, V  n, Y0 @- `4 z/ B
AlexCoder опубликовал в 2024-10-16 18:31. ?0 p7 y" h5 p8 k- q, s$ m/ y
День добрый!. J. j% a7 m( K1 Y" ]9 m# w) g- p
В статье описано взаимодействие игрока с N ...
4 o' s+ C  r( E; L) H0 A; j% r1 y4 l
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). + o& H" c& N2 |# ~  ]

5 j+ O3 a3 P( s2 V% K6 OЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 b0 X/ k1 L+ L" x2 I! d) y, N0 c% I& \. L, H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 W; u- H) X4 y) C" A
. T4 J1 f' n! {) Z3 ^% ?- G
  1. <font color="Green">// Пакет для состояний монстра</font>
    $ w  _2 X- ~4 B+ ?7 x: r' j
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 A5 d. e5 X9 W8 O: g2 c
  3. <font color="Green">
    6 W7 a" X( E( v/ O1 b) }
  4. // Интерфейс, представляющий состояния монстра</font>4 f2 A) [1 b$ q/ B4 f& D: u) `# G- Y
  5. public interface MonsterState {! m$ u" g# b8 d) @' ]; L
  6.     void handleState(Monster monster);
    ' B6 X7 L: W4 X' _8 v5 i! f
  7. }) [- t6 K. W4 Z. [+ q! O8 f
Скопировать код

/ U% R7 O% @+ V# }" {$ c, D" V- IШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
4 ^; o5 l1 q2 `- t/ t; |# Z; Q( X
Класс для начального состояния монстра:. X) E  q0 B& s% @- }$ H
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ! u( N7 ^. I7 b: v1 z0 {3 T  v$ I8 O
  2. package org.l2jmobius.gameserver.model.actor.state;
    . H% q" m* m" e8 y+ @/ W* W0 o/ s

  3. % ~2 H, V0 A% H" t' Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 {0 [5 l; d6 T0 H- ~
  5.   z. `, f1 N% E7 ~$ q7 T* f
  6. public class InitialState implements MonsterState {8 J# G) }. R1 C9 ^
  7.     @Override
    2 k) d5 s' D8 L( ?0 f9 z& J
  8.     public void handleState(Monster monster) {$ v' N) B7 H! Y$ r7 `
  9.         // Начальная фаза боя
    + l  ?3 I" Y# H( |# h4 _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");6 K' m8 u" v) Y- W2 O
  11.     }* {; x  s! p# Q- ]; J+ `
  12. }2 {6 F4 c! {- J
Скопировать код

. z0 t  h. D' V9 f% t# w
4 p. X( u5 {& v! l6 v
1 Z9 j) W4 @6 E5 D4 j# r/ ^: _7 q2 `

: y" m! k9 i- a$ c) K4 U1 y+ b
- w" @. ?$ K5 }) ~: T" p1 T$ a$ _
: R& y# C8 {/ X7 |" _
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 J+ ~# w7 I# J3 m4 z2 ?+ x" r
% P& X7 v, n  z1 JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: [" I8 W+ f. m, y, \( M2 C. R

  h; L  J$ D2 ~  C* d3 C; ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.# f& x6 R! @' t  r% V; q1 r& k0 J

9 |1 x9 Q: ^$ x5 q2 E: S
  1. // Пакет для состояний монстра
    # W+ i2 O% Q# `: C) h7 j
  2. package org.l2jmobius.gameserver.model.actor.state;
    % P- X% B. v; T' [+ O# _

  3. 2 S( x1 k% d/ P2 H; N
  4. // Интерфейс, представляющий состояния монстра
    6 S& L2 ?4 g) l# W9 d7 z
  5. public interface MonsterState {
    3 d- h, o6 s( {/ W. j( M! m* |6 ]
  6.     void handleState(Monster monster);- I! F& x* u- S( c6 ]9 `7 F
  7. }
    ; a0 i8 j# \% t5 N, P
Скопировать код

; n  y  ?5 r  b( k% cШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.   ~3 U7 ?  j; m0 w- h& k. c

0 [: E. C/ X! `7 e  gЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! W) Y5 R# P& C5 b/ |2 }
# [6 i4 q8 k+ R2 G( H
Класс для начального состояния монстра:
( Y; k/ M+ I; {' i6 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* x% W% r+ j$ S* U
  2. package org.l2jmobius.gameserver.model.actor.state;
    & v8 U7 ?. V0 x+ \

  3. 1 N' _  `7 E- V
  4. import org.l2jmobius.gameserver.model.actor.Monster;* ]# B$ {7 ^# q8 f! D  P1 E/ C

  5.   D7 w- R/ k, P& t
  6. public class InitialState implements MonsterState {! l! y: _1 @% h5 Q3 a2 I) P
  7.     @Override
    . \3 n( W6 M& B
  8.     public void handleState(Monster monster) {
    $ X  z0 [0 \6 s' _# n
  9.         // Начальная фаза боя1 s1 C) s) x+ d! B: S% D+ C  _
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( H" D3 b2 b" e
  11.     }% n1 L! I# q; Y" e, P
  12. }6 f- A0 S4 D3 H
Скопировать код
Класс для агрессивного состояния монстра:4 ?- h4 [! R# a: R6 G8 h- v" z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 A, W/ Z! f2 S- I
  2. package org.l2jmobius.gameserver.model.actor.state;( Q( F4 z/ ^8 ~; v8 ?4 @1 _
  3. ) S, e% ~9 f$ P/ V( I5 h5 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;. E0 O3 T: J! p! z* Y! h: F; p
  5. " C& j# C) d8 Z3 m* F
  6. public class AggressiveState implements MonsterState {( S4 }1 a+ t7 o1 B- F
  7.     @Override- S& A1 M4 S/ t& R: U: M2 m
  8.     public void handleState(Monster monster) {! M- E) A* H) h$ e
  9.         // Агрессивная фаза боя1 N5 O* S. Z  ?: D
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    # n$ Y( k( X" X) S% \; q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* ^" M/ u+ B# p. T# M6 u
  12.     }
    + E% W5 z. S+ k* a; G
  13. }6 l7 Z( P! _+ ~& s' t
Скопировать код
Класс для финального состояния монстра:
) ~3 b- m; q7 J7 G$ M7 T6 e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 P& L. _8 ]5 Y
  2. package org.l2jmobius.gameserver.model.actor.state;3 a4 S/ f" j% d7 b# r" m% c
  3. 0 a2 v: x- M- Q  I
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ n8 w& u; E7 V- [8 @/ c5 c
  5. ( \: p$ b) [& B/ \
  6. public class FinalState implements MonsterState {
    & g* c2 B0 _* E. \5 t1 G; z! J
  7.     @Override- X' |( h- }5 X' m* f' n! ]. ?
  8.     public void handleState(Monster monster) {
    2 B3 k" S( b+ z) ]6 Z" E
  9.         // Финальная фаза боя
    . B" Q! ~( q; d+ M6 V& Q
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");" c5 r* W$ p5 ^9 L. P4 b1 j
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ a( b' G4 h. Q
  12.     }& F( N% W, _3 s0 M6 Y# j3 I* w) G
  13. }
    2 g, Z! P- U) P0 ?
Скопировать код

! q6 ?5 s! B0 b3 p  Y  K5 J  b" A9 y$ LШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 z( B. H' w9 I' p
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , K2 w- ^6 ~& c1 Y4 o8 D, {0 ~
  2. package org.l2jmobius.gameserver.model.actor;$ b; ~8 N5 e; a) W$ r8 o
  3. 1 n+ |% s# N3 x9 w
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 D, c; Y0 ]* X. X
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    4 E% U5 {- L1 Z. ?$ f+ x4 E- i
  6. % o, ]* F% p% D8 k! b" @
  7. public class Monster extends Creature {
    ) f3 ?( N) ]5 m4 R, U1 o
  8.     private String name;
    + M2 f! n% s- @; M
  9.     private double attackPower;
    1 t- W6 d5 ^+ `6 b+ n! V
  10.     private MonsterState state; // Текущее состояние монстра7 M* X9 R: i6 t: {; [: Z2 b  o

  11. , s8 _2 J/ h$ X
  12.     // Конструктор монстра
    / R! A+ V" Y5 E5 {& v
  13.     public Monster(String name, double attackPower) {
    " t/ M' A: A6 y
  14.         this.name = name;7 e4 C- S: v1 i8 c& E1 ~
  15.         this.attackPower = attackPower;
    3 c! `' p# C; U3 U6 [1 s
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ( x0 C6 N0 T$ o: e# _6 |1 [
  17.     }
    ) B" \. p% h4 u/ _9 @! o3 s  Y
  18. * S$ x- B! n% i0 {# ~
  19.     // Метод для смены состояния# }5 K$ l3 w! e
  20.     public void setState(MonsterState newState) {! ~% l$ P% @7 O& \
  21.         this.state = newState;" n  T4 \! q" Z, n- `8 i! C3 x
  22.     }! U! b8 K1 M' f3 ^

  23. / P1 j3 }. ~% k5 K
  24.     // Выполнение действий на основе текущего состояния, B+ H% O! _# [, }
  25.     public void executeState() {
    6 D* l& o* x, ?. y9 ?4 S' `" E
  26.         state.handleState(this);& {4 P" N( X5 F( |  I/ _' G
  27.     }
    ) F! t# H# `: ~7 ~

  28. 9 L  P: O$ O+ s) b
  29.     // Геттеры и сеттеры) B5 M$ Y" T1 m: Q9 u2 K
  30.     public String getName() {
    8 z0 [" P2 |! u9 B) x
  31.         return name;
    , ~3 A3 [# ?. ]+ x
  32.     }; \" @/ D8 r2 }. z# d. s& X
  33. ) A3 W1 T7 I! V
  34.     public double getAttackPower() {; y/ ]- l  U' W5 Q& q0 A7 b
  35.         return attackPower;; R) J" A8 J' u& J5 e
  36.     }
    , J# T: O! r- u, w* x8 D# c  k6 K

  37. / i0 B: L7 ~2 G" M% K) Y; u+ e/ Q
  38.     public void setAttackPower(double attackPower) {0 c0 u. |1 K5 ~  g0 d+ t
  39.         this.attackPower = attackPower;
    3 A, W" ]' ?- r# r
  40.     }
    , M) G% W5 p- G# O# C5 n
  41. }
    + d: {- N: e! ]3 w+ J# B
Скопировать код

6 p3 W+ d: n/ ]2 e3 ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
# Y* e2 f. i" ?8 j' M  G* i
* O% B9 l0 o( Q, o: X% I
  1. // Пакет org.l2jmobius.gameserver.model.battle
    7 T- a$ n# L0 m9 r% S# m
  2. package org.l2jmobius.gameserver.model.battle;
    ; `4 E! O7 J6 f6 i; R
  3. * p( \- R0 o& `3 J  q) a
  4. import org.l2jmobius.gameserver.model.actor.Monster;* ^; Q2 G# M! V9 O' }
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    9 S4 I+ G0 ^. c2 ]# [
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    3 ~$ K) R. s) |1 s% _
  7. 9 v; ?' U& J. H6 h
  8. public class BattleSimulation {1 C+ I& k$ O$ \3 [
  9.     public static void main(String[] args) {$ w% }- q; D& l, L+ \1 a3 f- s
  10.         // Создаем монстра с начальной атакой0 Q4 n" {" a4 w, Z1 u
  11.         Monster monster = new Monster("Дракон", 100);% R$ y; Y+ d4 Q. K

  12. 4 l" P/ H# Y2 v: h/ t$ U2 J
  13.         // Начальная фаза, q! H% K0 E4 x) b8 i
  14.         monster.executeState();
    8 i5 @2 L' ?- i% ]0 f

  15. " m+ ?4 }, Y" s1 N
  16.         // Переход в агрессивную фазу  M$ Z0 G1 g& i& c& z1 ~6 S
  17.         monster.setState(new AggressiveState());
    + {' ?7 a4 v6 Y* k- n
  18.         monster.executeState();# y: E$ X( J+ Z' O' z( m' L

  19.   ^) @3 S+ \7 j7 u) u
  20.         // Финальная фаза- R6 R: R% i1 c* W
  21.         monster.setState(new FinalState());
    3 h  u1 o6 D$ O, S
  22.         monster.executeState();
    2 L8 l- @. [6 q4 b9 R' S
  23.     }
    9 c6 o9 L3 C9 B9 E8 v
  24. }
    / G! H" G8 r/ O/ x
Скопировать код
4 L: V% R% ?$ g; o' P  [
Комментарии по структуре пакетов и классов:; X: b; n" N/ s) p$ Q" D
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.) Z) z. P6 q( ]1 u% \7 K
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код./ Q; H4 ]2 v2 v9 ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. j, f; r' Y& Z: c( [
& D9 G2 R" N/ i9 n; `- S5 C
! L3 p: f! H( m& t% E

& V; M0 @& T/ q  |3 `# ^5 _8 u/ f- r/ i: |

; P5 q. F; O) Z9 M
1 t9 v0 c8 Y( S( z, k# T8 {1 ]8 I& K0 W$ Q  ?/ C& r1 N7 v
. B5 h( D$ {- y

2 ^5 R; C1 S6 X& W" E; k
7 a  V( a# b1 J4 ?) |( D& j/ p  p3 Q" y$ b* u/ C

3 N$ ^/ E+ p2 j6 i1 w- G2 m  q2 u5 f7 Q7 H1 Y. q& }

! u- `( V4 c3 F
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04* Y; T& v3 _/ {
Для управления сложными взаимодействиями, такими как  ...
+ C7 b) N2 W& K% r% T5 ?6 B' O! x7 e
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
! m4 @, @1 ~+ r+ u1 a. s$ @Отличный подход! Использование шаблона "Состояние" де ...
$ K- g% R( O& B! q& T. ?; H5 h
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.2 R7 g% c6 \+ A$ B, s

1 M6 N; F% @7 v9 ?Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя., K# S  I' ]3 W) {1 A/ \. R) i. v9 F

6 o8 W6 I7 I  R3 l5 j( f
  1. // Пакет org.l2jmobius.gameserver.model.actor& E% ?1 J' @; s- N/ Y
  2. package org.l2jmobius.gameserver.model.actor;
    . w0 T+ j. O( T4 J. c) A+ p
  3.   k1 I1 C: z2 e: @
  4. // Перечисление для типов атак% T$ r! Y* O) n3 i
  5. public enum AttackType {
    ! Z& U8 n2 \; n! @8 ^/ S
  6.     PHYSICAL, MAGICAL;
    - D0 o4 `: Q0 X$ O
  7. }- o/ W( c2 v  s( c
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.9 W8 @: l& [" a$ I8 [* U
Обновленный класс для агрессивного состояния монстра:% B$ l) D8 a/ ~9 k7 ?

9 Q, q/ L5 F  q/ n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 T( y+ A4 g& h0 @& V# K; |
  2. package org.l2jmobius.gameserver.model.actor.state;, v+ Q4 O1 N" Q: ?6 Y: [& t

  3. # Y# P" ~0 p; W; D: Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 i( C0 l. @1 n, R) s; W
  5. import org.l2jmobius.gameserver.model.actor.AttackType;0 l' [# l3 W2 S4 C8 h- e
  6. . E+ g7 z5 s/ c. s9 z5 \
  7. import java.util.Random;
    + w6 Z( e# }  x! _

  8. 7 {0 T* ?( D' m" U8 M  [, S' K
  9. public class AggressiveState implements MonsterState {
    ; e8 D' o9 T5 O
  10.     private Random random = new Random();
    & c& L3 W) ?# \# V

  11. 4 |  N9 ?  Q6 S( V
  12.     @Override
    5 G( Z( h: z8 v! k5 T* {
  13.     public void handleState(Monster monster) {
    % p: i& o5 {) C0 t3 c# `" H
  14.         // Выбираем случайный тип атаки: физическая или магическая
    - D+ [7 _# p8 [8 v! Y# d
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;3 a% i9 t- h( Q. o$ f
  16. % W$ p' W! |; O5 o4 {3 Q; X$ }
  17.         // Логика для агрессивной фазы боя  T: x! q/ y/ y  C
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " # K5 e, o$ s; S( n3 q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");  d1 F. _1 z/ ^, f
  20.         
    1 F1 K; f, E) v/ I/ g
  21.         // Увеличиваем силу атаки в зависимости от типа атаки, v% n6 i" o* \$ e  Q
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ! U5 M# v4 z- O' V
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);7 P" `: Y) _* v/ n- C' Y8 ~% r& P
  24.     }
    1 P) g1 ?. T; q$ N
  25. }
    # _' d  ?. W9 e: o, L% ]4 Z& O+ t; S6 u
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки; w' n0 g) \4 C! A. @

1 z% g, s8 q, w6 a3 f
  1. // Пакет org.l2jmobius.gameserver.model.actor: G, H& D- U# K& P: n
  2. package org.l2jmobius.gameserver.model.actor;
    ( R, c9 j9 p* W- h2 T# ~
  3. 0 w7 v7 V" t/ P6 u! p/ X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! l# b9 L& x9 m$ k+ h- k
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) W$ b# u* P: }- b9 @
  6. 4 m1 @8 \! b* k$ S
  7. public class Monster extends Creature {
    ! b2 [9 U+ ]! D/ Y9 s% {8 V2 t, J6 r
  8.     private String name;
    & m" @0 W/ y0 N; o, S* G
  9.     private double attackPower;' {; A' R1 j0 m1 G) o
  10.     private MonsterState state; // Текущее состояние монстра
    ( x* c& j: `) z5 y7 J: q6 }

  11. 6 k! C, R( ?% t2 s8 B
  12.     // Конструктор монстра
    " c4 k5 g# e* I( T
  13.     public Monster(String name, double attackPower) {/ @% V% \) W! M$ X& Q3 N* n
  14.         this.name = name;3 I9 Y6 _6 o% d2 m- m1 W' V2 G
  15.         this.attackPower = attackPower;: r' N' r" [) ]; {% \
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    % e7 M) F/ I& M
  17.     }/ ^$ \) V' v5 p5 }" u+ j6 T
  18. ; X3 m, I; _9 j. B. \4 c
  19.     // Метод для смены состояния3 w% r( C, o. L, N  P& C8 w
  20.     public void setState(MonsterState newState) {' Q9 w0 E. }2 b0 @6 B  d% ^0 p/ ?6 g4 F
  21.         this.state = newState;
    1 X3 r4 o7 ]# t( k& b$ K2 h
  22.     }
    " R# ~3 x0 E8 s3 z0 C
  23. ) C& c$ d+ d4 O) c
  24.     // Выполнение действий на основе текущего состояния4 w8 M& v+ A/ A9 X, O8 B
  25.     public void executeState() {9 H# G( R- P4 z/ H; W7 l
  26.         state.handleState(this);
    $ \6 t& V  e* J' z) j' E
  27.     }3 {9 x  N1 O! s8 D* d
  28. + `! P: |% b# [- {0 T
  29.     // Геттеры и сеттеры
    ( \7 T, s: P' D) i
  30.     public String getName() {2 x1 e' b5 M% U. h: U1 j1 N
  31.         return name;7 I9 X- C. f& ^3 d, I
  32.     }
      A, k# x2 S" G8 y* @' z7 A
  33. . w# w# }6 r2 J+ j& W. J
  34.     public double getAttackPower() {, U8 a7 k8 F# M7 J8 a9 h) B+ g
  35.         return attackPower;
    - _2 O, }5 B0 t( @; h& B9 Q" s5 S
  36.     }
    9 h9 E5 c' J- I  w
  37. 6 Z# P' o' P) ~* F
  38.     public void setAttackPower(double attackPower) {
    - Q2 c9 k7 g$ j. _" e; }0 s6 c
  39.         this.attackPower = attackPower;
    - Q( {9 p5 v/ o) Z
  40.     }
    4 w# f) e4 M) y) R: F  E7 j( f/ y
  41. }
    8 [7 ^5 A: |' x! G6 A  Q; L+ }
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
5 r+ p0 r& U5 c" J4 ^4 l! s4 `
. Q1 P% S+ ^9 T) C7 f
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - |7 ~/ H! ?( {: e/ m( J, ^
  2. package org.l2jmobius.gameserver.model.battle;% N# B1 C* }* j2 b! ^" V" J
  3. & Y+ Z0 r; v2 ~; g8 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;& P5 z! B+ c2 V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 v; `6 n3 N+ Y$ M1 }

  6. + _# ^& I4 L. Z5 T: _" v
  7. public class BattleSimulation {
    # l* s- P9 V2 n1 q3 a6 B" S
  8.     public static void main(String[] args) {
    % A) S6 h- U' k- z$ q* o5 d& O3 p, @) c
  9.         // Создаем монстра
    # Z3 p$ ]: y" S5 A3 B5 W% u+ w
  10.         Monster monster = new Monster("Дракон", 100);* V5 D, h) }" E7 h) b% c; `

  11. - M( Y& R+ o2 q
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    & d& ], p6 B2 \( Q+ x$ b
  13.         monster.setState(new AggressiveState());' U7 q8 R/ {" I3 H7 ~
  14.         monster.executeState();7 N- L9 t+ {0 H% [
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    . l+ E0 x' Y( ~+ e: @% w" ^$ H
  16.     }
    ; T6 B0 Y. W' x" N8 n
  17. }7 Y. n# c; J. r: f7 U; v
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.3 c  s1 C  \& `* j% Y
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
6 W# o+ f3 x- p2 E4 o/ g* E+ t
: \7 Y, W( P$ N& d9 G
- y+ |: w9 }0 g7 t. w+ _3 {6 s7 a' e6 V; O7 S. R3 B" W7 z9 T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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