Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
1 K0 ~( P- Y+ |$ p
1 E/ ?7 m/ H0 `2 `, s

, h) J% `/ B! s1 L- _) E1 x# PЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
8 Y. Q3 G, d6 ^0 KЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
% O+ d) q( ]: B5 Y8 LАстралия 🌟6 t0 Y; k9 q5 F, l, C: G* l' W. f

& V' g% X; T+ G( o) C6 E4 H

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
0 ^( ^0 a, n. W0 NВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?: L# t3 N3 n. L# n% }8 \- q& }4 V) Q7 E

, E9 F& k# R$ R. {$ D
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 H4 q1 u2 U/ r" M+ W1 P
AlexCoder опубликовал в 2024-10-16 18:316 W6 }, d0 c- M+ h3 z' c
День добрый!# a, G5 v/ M5 G2 C
В статье описано взаимодействие игрока с N ...
, o7 w& B' h% X" O" ^
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
) ^8 x% x( ?3 d' p# _
8 A5 j, V% T  x  X/ I: hЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ D" h+ c% a  s& O2 }
$ g; E! D9 Q5 h" ]1 g$ }
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 s/ [9 G, V4 M
! d7 c  z2 f5 ?$ w# n/ c( q
  1. <font color="Green">// Пакет для состояний монстра</font>9 Y8 J  E' O4 f. j
  2. package org.l2jmobius.gameserver.model.actor.state;
    % k# p3 ~1 ?2 r0 ~6 z) U) ^$ d
  3. <font color="Green">
    : L- X+ Z  ]: E5 z
  4. // Интерфейс, представляющий состояния монстра</font>- D. `- l) B- V9 e
  5. public interface MonsterState {; ^/ a5 x! ~# n  Y$ Y5 D. s$ O
  6.     void handleState(Monster monster);
    4 ^$ t! D, `* X, L& ^; y
  7. }
    # n6 o! ~$ J9 `5 m0 q, X
Скопировать код
! `! j, `4 H4 y1 ]
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 Q" ]: i- l: F8 F+ g
7 U; E9 F, _  L7 p6 X+ ^
Класс для начального состояния монстра:1 Z7 Q7 P2 K- M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>- i; C: e( a/ ?' I! ?- j
  2. package org.l2jmobius.gameserver.model.actor.state;  w5 K( j/ t0 H# s  j. s2 [4 [
  3. 1 u% U$ \+ [! W7 ~2 @. {; ?- A1 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , c+ d1 g! l8 E/ A

  5. 5 t6 Q3 o+ G$ s( d
  6. public class InitialState implements MonsterState {
    4 w+ G1 H8 Q1 u6 i: R1 y$ s9 h, B% i% b
  7.     @Override% H' L7 C. v/ Y' {  c
  8.     public void handleState(Monster monster) {( H5 m( |+ Z. E$ t
  9.         // Начальная фаза боя
    , h% u: V8 |3 c, S2 w  b
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    / V$ h# Y: H9 A! v( o" Y1 ^$ u
  11.     }- j) {5 @+ `( N
  12. }
    0 m1 F% k; {8 C& c- z
Скопировать код
" \2 C1 G2 e4 A4 v) b2 u9 t( D! G

. p+ k0 f/ s1 w: \; X
  P0 k" |" c) z0 A0 E3 h9 l6 d
. T! S0 n0 Z; h! H' K( T

; u& Y9 E9 y5 u, ^& A$ D8 t8 C
; B( j6 ]# H. M6 S3 I
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 a# v- i* P" i7 i2 i9 K8 a) X- s. E
" B- g* y; W* ^Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
: n$ P: h0 i. O8 ~
2 s0 ]% R9 s- A9 D" v3 e, JШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% T) ?9 Q1 X, s3 X
+ Y" }# V/ H- w: I
  1. // Пакет для состояний монстра8 V  @/ e! `& \2 V6 o9 E
  2. package org.l2jmobius.gameserver.model.actor.state;' @, A3 T+ E# P' M0 h+ O! S' g9 L
  3. + H: T; C. N3 n# p5 ?
  4. // Интерфейс, представляющий состояния монстра
    3 z; l; T6 \2 o, d2 r
  5. public interface MonsterState {' F% J/ K# p; q# a2 j1 z- I
  6.     void handleState(Monster monster);
    5 f+ T9 ]2 _3 Y
  7. }* K; ~9 r0 J+ I
Скопировать код
0 V, C$ q3 R: J, ]% Y7 R/ c5 U
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' d4 B- L* O. @0 E

; w0 V% T% x0 a+ y; D" J/ M7 e& cЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! m1 F/ K/ q; e% q2 \- @& L
. h. G+ ^; c$ Z  x' V) S
Класс для начального состояния монстра:
/ d+ |- P6 v' R& X% l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 D2 N; y$ X* c
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 I% r9 N& u6 t5 Z5 p

  3. $ e+ U% O% I- L$ o3 R2 r5 ~; E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 G' _& p7 m9 r0 o8 N' j; y

  5. 8 @3 A+ U3 B5 _! c, z. |
  6. public class InitialState implements MonsterState {
    2 J+ f, L6 @6 }' ~
  7.     @Override
    : m# ^  J6 A' c/ W  ^" _+ Z- D9 o
  8.     public void handleState(Monster monster) {: m4 a* T! Z: Q
  9.         // Начальная фаза боя
    7 Q! I7 D5 L7 x) ~) {+ v
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 e" Y$ N( l( z% v
  11.     }- t# W7 {" R9 j+ `+ B! x
  12. }
    ! p9 H! D; u! ?) [( F) f
Скопировать код
Класс для агрессивного состояния монстра:
! ~# C/ V+ B1 V) e2 V, Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % |* f. w* l& q5 W& \# a4 t) e& }
  2. package org.l2jmobius.gameserver.model.actor.state;! E3 _$ ?) W" J7 W8 r

  3. % w+ x% j% y  M. A4 d0 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 @  L2 C- C5 \& B; {; O( z
  5. ! W. u& ?* X& v6 X% K  \# M
  6. public class AggressiveState implements MonsterState {: p7 D/ a& j  D" g3 }  w
  7.     @Override
    ( o3 u! h: q4 H) q
  8.     public void handleState(Monster monster) {* _: P  U7 q; O! l
  9.         // Агрессивная фаза боя
    $ A- P: u  `' Q1 ^
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");, j& A2 P, q! I: x; y& I
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* I6 N% y# K& g
  12.     }: g( A9 Q: G- c$ ], O
  13. }
    2 a' R9 E' u5 t( X- j& ]! x
Скопировать код
Класс для финального состояния монстра:
- K' W) |6 a$ {+ B# a
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ N% t, [7 P- o6 E* Y3 P
  2. package org.l2jmobius.gameserver.model.actor.state;5 c" Z+ U$ W/ D% |

  3. ( J  J! G3 @" @) J6 d- ], H  I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 M1 r8 \, _1 `7 k* _
  5. , E" _1 e9 e7 o" q" m  J% X9 }
  6. public class FinalState implements MonsterState {
    8 R1 C9 B5 D) U* D( r" _$ G' ?
  7.     @Override
    " D- k  }8 `" L* t, g3 w$ {
  8.     public void handleState(Monster monster) {+ d# O. {3 T( Y2 Y, C! V5 x
  9.         // Финальная фаза боя& Q. z4 R& a' a6 S# M$ S
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");" F8 o! D1 h0 Y# z2 D9 L# {
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    , d" Q1 f: a6 c" x- \  e6 H2 O
  12.     }
    ; A6 }( W8 A% D6 g
  13. }
    ; ]  u7 L  z/ O, n
Скопировать код
$ C; a  ~9 s$ ^4 t0 g3 r3 u
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.' q. K, e  {# l: a- t
  1. // Пакет org.l2jmobius.gameserver.model.actor) A5 F6 K6 o% m* H1 N2 D6 ^: U
  2. package org.l2jmobius.gameserver.model.actor;
    " k$ p; x, n/ W
  3. 3 D2 P" w: P' t& y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;% T( X; q1 x" {( L$ L, Z4 U0 |
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( y  H% }7 b- Q# r

  6. 3 r) K- ]( s/ }2 B* u# p, `0 n
  7. public class Monster extends Creature {* ~9 |5 A7 `  V: S* S
  8.     private String name;' U1 L* J% ]: T8 Y$ t
  9.     private double attackPower;
    5 a1 _7 d+ W7 A7 a: N9 i
  10.     private MonsterState state; // Текущее состояние монстра  c; D5 c+ m% m" o) i( ]

  11. 6 ?0 \3 D! S7 Q# @1 q6 ^' |% Y
  12.     // Конструктор монстра: K: a; Y/ j/ B. y& G' C
  13.     public Monster(String name, double attackPower) {
    ' K( W8 D+ b8 m" _
  14.         this.name = name;
    : f7 c& U4 H# U; l8 P
  15.         this.attackPower = attackPower;
    8 W& Y* U, P2 v4 o" Q0 c1 I
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    + z/ |* N" U, d* ]! A- i
  17.     }
    ; B1 z7 m0 z2 B5 p6 e, q6 |! @
  18. . c4 J; ]) ^1 E- ~- F: _4 p& l
  19.     // Метод для смены состояния' R. `5 }" x2 Z
  20.     public void setState(MonsterState newState) {
    0 G! p: f0 S5 `# _0 L. v5 Y
  21.         this.state = newState;: K: t9 l" H  u; B: O+ k
  22.     }
    $ k) f7 u" Y. H. w, R" T7 O& c& H
  23. 7 {1 c6 A# ^2 m
  24.     // Выполнение действий на основе текущего состояния# O, H* s3 F) v. r4 R( H; [; {! Y( @2 g
  25.     public void executeState() {
    4 a; {! ?. a6 s' C& Q
  26.         state.handleState(this);9 g( @8 @  C7 b5 D2 g8 I
  27.     }- \& S: Y9 Z" `* u( O- B8 O
  28. ! Q% E" \; m& H% N/ `( B
  29.     // Геттеры и сеттеры+ C3 T7 p7 H+ _$ \: C" z! \% S0 r% Z
  30.     public String getName() {: V5 Z, C# ~$ X" \
  31.         return name;2 c3 o: a9 y9 G& Z
  32.     }
    ) W% y3 V$ u0 c9 M$ N4 f! [; R

  33. 2 v- e5 T2 j; n( g  l1 c
  34.     public double getAttackPower() {7 Q5 T& i7 @5 {. j2 f6 O$ C7 h
  35.         return attackPower;
    , [( l9 f( d+ A0 ~
  36.     }( E. E( M7 x- a. }
  37. 4 d' W( @- w' n" i
  38.     public void setAttackPower(double attackPower) {9 v$ u4 S" G) y
  39.         this.attackPower = attackPower;* ~4 d0 D9 i4 R2 C
  40.     }
    6 C: o. t! Z7 M% f  u# s, G1 t
  41. }
    ( b+ ^( l# T6 E( P+ {
Скопировать код

; x( m6 Q9 x2 W; W  PШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
" X% x4 S% r. \: I) `: F/ g* I- ~) d" ^6 i
  1. // Пакет org.l2jmobius.gameserver.model.battle5 {7 t) K$ l  l5 g- I0 Y, B
  2. package org.l2jmobius.gameserver.model.battle;9 I1 v' |1 ~+ c: x2 V8 A( P

  3. ! ^/ V1 l' k6 p6 H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & g; i8 V4 {: U) B
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! Z2 g; H2 I. t  Y5 O. h; H
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;3 S  z$ s# {2 j! o+ {3 |- n2 {  s

  7. 3 ?+ P9 D' C! P+ M, N4 P
  8. public class BattleSimulation {
    ; z7 h! {$ W' R: B
  9.     public static void main(String[] args) {
    / Z7 i; V5 ~! M7 H( [" F
  10.         // Создаем монстра с начальной атакой
    3 v" r$ s* J7 g3 y2 T9 y6 V
  11.         Monster monster = new Monster("Дракон", 100);
    : s' u: u( o. ]' r

  12. 2 S' B+ p- W; Z) ~. {8 x8 Y
  13.         // Начальная фаза
    4 M+ X0 l, Q" _3 V
  14.         monster.executeState();/ [* t/ ]- S" y: X) e7 v

  15. # d3 v; g# \- `% m) _; \6 o6 U
  16.         // Переход в агрессивную фазу0 n( g% Z$ y8 b; ?- U7 q7 |- P6 A
  17.         monster.setState(new AggressiveState());  S" G& b( @8 [- R" o* x0 f9 q8 ^8 P
  18.         monster.executeState();
    ) B7 f1 j; ~+ A3 e4 B( N

  19. / R0 k1 ]% N9 S
  20.         // Финальная фаза( Z0 i9 y' h5 X6 s  f
  21.         monster.setState(new FinalState());2 X, v2 n" t( M# ?  j1 E+ x
  22.         monster.executeState();. p$ g0 {. u2 u9 _. g$ F+ q& g
  23.     }. O9 G5 U: p4 g- W
  24. }( H, M% s3 Y0 u
Скопировать код
( j6 {+ h* T( G
Комментарии по структуре пакетов и классов:
, g8 f* I# {+ D6 d6 Q4 v
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    0 S; |+ u) |$ \% k0 |0 v
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.) p: C2 Z& L& @
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 P- I8 _: w+ x$ ^% [9 n
% H7 S" }9 m' S# A, X

5 g9 ]1 X2 o" p# I
3 R* `+ K6 x- x7 o1 p' _& V, [) G6 f, x2 Q
1 a! {/ g2 O) F, L) g

6 T' k, H  y6 A7 s( A
3 d" Y4 z$ s/ \- m/ z8 I2 W! i/ a* C, _1 j$ ~

/ g% o& F6 _1 v2 g
  ?9 |5 _6 y+ E2 N9 |
9 F5 @! t/ O/ j! I$ M+ B( T4 _) |7 V5 V) Q& l5 }4 r( ]
/ V3 l7 q6 C/ v  m

: {4 H0 W, x6 J' |1 T
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
1 s4 h* y, K# x5 s8 D# MДля управления сложными взаимодействиями, такими как  ...
3 }, u: \) P! O5 m
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
. S) j3 [3 j" m' H# y/ L6 P% n) {& yОтличный подход! Использование шаблона "Состояние" де ...

$ D4 l/ F! L3 [4 \9 r, `  Y. T) SХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
) r; l: g! l! |% k$ P! e+ }( Q* r
. S" ^2 {' @( n% ]! t: N: ^# {Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
$ _' o$ E8 u  M$ Z& c% {: f
1 Z% G: j. v- I, c5 H: ^3 q
  1. // Пакет org.l2jmobius.gameserver.model.actor
    & {; t" K/ o8 N% C
  2. package org.l2jmobius.gameserver.model.actor;3 y) c" b  V5 D* d8 c* Q: o
  3. / y0 I' N) |7 x! ?/ O1 x
  4. // Перечисление для типов атак% X! a: ~4 B; k2 @6 S. Z
  5. public enum AttackType {2 k/ u! A& B/ z
  6.     PHYSICAL, MAGICAL;+ D" i' m1 g) w2 @* q# h4 J
  7. }
    ( W& g  E% r  M" ^
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
: @5 v5 A0 Z+ j5 ^4 T& OОбновленный класс для агрессивного состояния монстра:
% N* d& n8 L6 ?8 y( b- d' i1 A7 A2 X9 R) @$ O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' }3 m9 L. v; `& S, M, ?
  2. package org.l2jmobius.gameserver.model.actor.state;
      B( s8 u4 z+ _0 Q

  3. # n+ d+ C! K; T
  4. import org.l2jmobius.gameserver.model.actor.Monster;% [. g* l  k, e; e$ f% S
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    . n/ y1 {$ _! H! H% p- @

  6. ) ^) A! j* n$ h2 i- z+ m
  7. import java.util.Random;% D8 g( v5 S3 t- Y
  8. 3 Q, `/ n# V6 \% U3 l3 c3 e4 D  }
  9. public class AggressiveState implements MonsterState {; f+ P5 m# U& u2 a- b1 U, E
  10.     private Random random = new Random();
    6 o! H3 B. ]6 o3 C* [4 w+ g
  11. . A. G; a4 z" M1 ]/ m+ O3 i. N
  12.     @Override
    8 L7 \# y1 I% c. w
  13.     public void handleState(Monster monster) {" `7 K  F& U) g
  14.         // Выбираем случайный тип атаки: физическая или магическая" S; b1 {6 U5 F4 X7 Y9 @/ p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ) d* b  B3 {% N
  16. . Z1 s2 A7 e0 Q8 x: y
  17.         // Логика для агрессивной фазы боя" e+ v5 m/ V2 i' g  N* f' i3 v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    / X- w# K+ Z0 r$ P
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    * H/ z* k! [' c
  20.         
    * r+ Q' E# R+ j2 B% d
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ; F9 J) D( x* c9 Z# X# C
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;+ x- w- p/ T% @# f+ Y# `2 y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);, J/ w; z+ R& m& p  E
  24.     }
    2 l- |7 T4 h! o$ j' E
  25. }) d- W6 b* j; U. K% A9 b3 C
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки& K2 j6 d  W9 }$ U  ?4 y( {

( {6 d% w4 c! N- w+ p  a/ b7 e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    * @9 D" C9 F8 L6 A) E0 o
  2. package org.l2jmobius.gameserver.model.actor;
    - v) E8 J' v% Z
  3. 9 z7 d& G' g/ A+ V! E* U- j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( b  f9 D3 c% s& H3 z+ y0 e5 e, H
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;% m! {1 u( E2 Z; l( h
  6. 3 u  ?' l. \8 b; G1 c5 D
  7. public class Monster extends Creature {! P% a* Q5 h7 d% u* F
  8.     private String name;
    ) n, H. [& \3 ^& F5 d9 Z
  9.     private double attackPower;
      |5 l7 A7 T, D8 w3 O, q7 d
  10.     private MonsterState state; // Текущее состояние монстра0 r  E; G6 s- k& s4 R) D

  11. ; h: h8 H% t( x- k# x4 {7 b
  12.     // Конструктор монстра% v3 a& u9 J5 S7 D8 j# P0 }6 t1 K
  13.     public Monster(String name, double attackPower) {
    , l# i7 a1 }  w7 ]7 L+ F
  14.         this.name = name;
    % |1 H# s, Y. p8 A
  15.         this.attackPower = attackPower;$ o+ k) ^$ I- t: v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию9 W' C( g& d% x; _9 O; h/ K& N
  17.     }6 x. U4 g% f; w, x
  18. 6 @; g" Y) B$ E% E. a* q8 [
  19.     // Метод для смены состояния
      Y6 E4 G! J; [+ P) J; y; t: e9 n
  20.     public void setState(MonsterState newState) {/ ?1 f, G( L1 K* M. P8 ^* c
  21.         this.state = newState;7 W5 N0 i: F5 r3 C, Y4 \
  22.     }) l- R* ]) o: f9 w0 Y
  23. ; r' V0 \$ F- Y$ e; f" o
  24.     // Выполнение действий на основе текущего состояния
    * v+ U5 H1 ?4 `$ {) J2 Q. S( [
  25.     public void executeState() {/ V5 @5 E: I( X5 V0 j; [# F$ U4 j
  26.         state.handleState(this);
    0 U6 k- O3 |' J! G* p) O1 ~
  27.     }" q, `8 Q/ N- v6 G& d
  28. ' o+ `# X. I* O
  29.     // Геттеры и сеттеры8 G1 \, n  m0 o; S, Z
  30.     public String getName() {
    / U* |6 j5 K7 G- J- c
  31.         return name;( q+ U& j4 h, ^7 Q7 a
  32.     }
    ! g* j% F% M6 T5 r# g% L/ N
  33. " x4 j* ?1 B9 m
  34.     public double getAttackPower() {
    7 e( O9 g( c5 v& S6 Y/ n$ u
  35.         return attackPower;
    9 ]! o" L2 c4 d+ g2 X6 H
  36.     }. }1 c. m1 S1 ~4 `6 _- M
  37. ; z: ?' D# y9 c* b4 S% i0 O
  38.     public void setAttackPower(double attackPower) {
    ' r+ s& z& h) I
  39.         this.attackPower = attackPower;0 u0 l. Z, @1 c% |  y
  40.     }2 N5 g. t) D" f5 v$ q# e% B  M% m! N
  41. }5 F+ Z! O9 `7 {3 o$ R4 A- g4 S
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
) w8 b9 B' o8 t+ k: P) P4 v3 T! M
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; M5 S8 \' o( ~" h4 D1 O) ^/ n
  2. package org.l2jmobius.gameserver.model.battle;1 c% b" l/ V. m$ S, p9 T

  3. * v) _6 c* |& w! W9 ]5 Y. d" G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , |. c" N% P: W4 D# n0 ?. [  ?
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;. ?3 Q' i- f1 u# A5 i
  6. 8 D- P( y, y5 y. m+ q
  7. public class BattleSimulation {) L' u* i" a( `+ R
  8.     public static void main(String[] args) {
    $ c% x0 v/ ~% Q8 _" {' o; E
  9.         // Создаем монстра2 \7 D9 m7 y/ w9 c" m. m) X  {
  10.         Monster monster = new Monster("Дракон", 100);
    9 i7 G3 Y6 S5 t0 I' ]

  11. ! I+ n' e4 z% @1 M4 Z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    6 z8 h" Z1 X  F+ ^' y
  13.         monster.setState(new AggressiveState());: A/ F- }0 u, }! I. n6 y* l9 o
  14.         monster.executeState();3 _9 K6 W4 h7 w5 r- z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 s) V! d2 {" a: x
  16.     }
    ' ?! `$ o4 u4 Y1 {$ J9 R
  17. }
    + @- F/ \) m8 ^
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
9 X% Z' V* I( a3 M+ b8 N6 [Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!8 `$ \3 o& q) I! P

  K1 o# t, k; V4 T# D8 f! z* d# S+ w% s7 z

7 ^  W( [0 g* H$ u
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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