Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
; u+ l2 _1 R9 }8 y) I2 U* @* l* H
" Q7 b! ?5 |1 ~

  Z$ j7 K1 g+ T; D' iЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.+ K8 g& s9 S7 ~+ D6 I0 B1 e
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
0 V2 g7 `8 ~# j0 `Астралия ?
* M6 Z4 |7 h* j9 |+ K' b& P' t) a

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!7 R4 ]- H1 g( u" ^: W8 u. E
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?( U: J. Q( ]! }7 c/ X( K

. r5 n0 L4 q7 R8 ?+ ?
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
0 j" G3 i% o7 m9 l- w. h& D" H
AlexCoder опубликовал в 2024-10-16 18:31
5 `3 L* l0 n+ s4 X, L1 W! QДень добрый!- F+ r! C& W/ X1 X6 {
В статье описано взаимодействие игрока с N ...
" b; E2 U7 y1 E( ~4 C
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
) O! g. M$ `, u% F; U- o6 l# F( ~; m0 c" |4 g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' S  f. N. @/ W# j+ [% D7 _9 C9 s# ~+ }/ f% p) x# L* q( U  M. E) w% {# f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! `) c$ C' o0 A5 b) o5 E& h; D" Y- Y# q# H3 v
  1. <font color="Green">// Пакет для состояний монстра</font>
    2 h! I5 D  `* I. X5 {* {
  2. package org.l2jmobius.gameserver.model.actor.state;) e5 K* P/ _3 S
  3. <font color="Green">
    * i$ C; X9 M+ y7 P3 g3 j
  4. // Интерфейс, представляющий состояния монстра</font>. c, Q9 v, t0 A) @' Z4 _+ x/ y
  5. public interface MonsterState {  U8 n, |1 {3 c; v# V: L
  6.     void handleState(Monster monster);  [  k) l+ n) h6 i7 j
  7. }: `& X, r4 Q2 L: H' r: }
Скопировать код
6 h" X4 f2 b9 X8 b, `0 v5 B0 w
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ J1 _$ l- g! z3 t6 K6 t2 Z+ t  h0 r
Класс для начального состояния монстра:! E9 a+ s6 G1 |7 I
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    % _* {2 j  ?& F. [3 F- J/ x
  2. package org.l2jmobius.gameserver.model.actor.state;4 B! H" V1 u- ?2 u5 T0 V
  3. : b1 Y0 p$ G: k1 s, W+ u
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + R9 A7 Y3 J2 {# V7 ?

  5. ' k; l0 }; t& B& f  K5 W
  6. public class InitialState implements MonsterState {( C& G% F3 k) j3 n7 w
  7.     @Override
    & `) s5 L, \! s
  8.     public void handleState(Monster monster) {1 D+ \9 ]% g; {3 S2 ^
  9.         // Начальная фаза боя
    % |# e5 j$ F3 J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " M) a2 c% z4 I* s0 D$ S1 V  C1 r+ Z
  11.     }
    9 ?  j! o! S( j2 z& i$ C8 ]
  12. }& }! f% }, W9 e- M; y
Скопировать код

2 k9 f3 f/ r) L% \2 H  {. J, |6 w2 @5 f7 n  _% N

( X+ D# `5 @8 t. K3 M
) l% l5 A5 ~! ?: I! Q$ y& d2 a$ [  M4 G1 I/ R' e

% f( r! ]% X! O9 o$ T+ T( L5 N0 Y
3 C3 r- A' {; y0 @$ A1 Q, C1 N
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 e' }2 O2 \1 h( {

7 ?0 `1 n2 k" N/ ~/ J3 y6 nЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 L: ?' ?& O0 R2 g' `
$ y$ n/ L5 w$ ^6 J" l: P0 CШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
2 C4 ^! {& c* l* e# N6 z2 y$ m+ \2 T7 ?5 t3 q
  1. // Пакет для состояний монстра( x' k/ C) s1 m9 u/ e1 D7 K1 z1 j% n
  2. package org.l2jmobius.gameserver.model.actor.state;/ Y9 a1 y' v' h3 l/ X6 `4 i6 C) T
  3.   W# c* n: o4 s3 J
  4. // Интерфейс, представляющий состояния монстра
    3 ^1 |+ R, @, p8 r
  5. public interface MonsterState {3 i0 `, f/ l* v1 q/ D- W
  6.     void handleState(Monster monster);
    * l/ \4 ^% g  k4 L2 d. n6 T, {
  7. }
    3 x" Q; A0 l/ b5 [& V/ [
Скопировать код
/ \. R* g5 J; D! G9 X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& X6 a5 f. W" v* o( A
9 A; x3 U8 _9 L, v' }0 BЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 P* J9 f  |4 d) s) O! d/ {. {' y/ F8 v3 Y, @# p
Класс для начального состояния монстра:2 o3 Y% l6 L7 \$ K1 I) k0 H
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( R, e7 k2 d* V5 {( Y8 j2 I
  2. package org.l2jmobius.gameserver.model.actor.state;; b2 J8 c$ J; [: w8 r% V
  3. 1 C; Z9 v9 R# ?) e/ ~' P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' k2 I: R# w+ P; j+ p) L0 u  L

  5. ; V8 T9 H. P! w' v& C
  6. public class InitialState implements MonsterState {0 H; \5 }4 L6 ]% [+ ]
  7.     @Override
    ( B4 G1 y9 I# R# W, M! W
  8.     public void handleState(Monster monster) {! e; P9 p) c! ]3 g: R
  9.         // Начальная фаза боя; z3 T: _) [0 j! k* ^3 L( R& J
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");/ e7 M; N- h- A  X5 r7 n
  11.     }
    ) S5 C5 d( L& b3 p
  12. }
    / d! C1 f5 N+ W0 A. ^
Скопировать код
Класс для агрессивного состояния монстра:
/ K9 u: p9 e! K% e5 c2 h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ z+ p+ u" Y. m7 |8 s. v
  2. package org.l2jmobius.gameserver.model.actor.state;
    . n" r  X) w. n" O; I9 D6 n% O

  3. : V2 T6 T* R( s9 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' `/ o/ h: b! ^+ J- h( V- l8 Y

  5. . C! K9 P% Y) q$ k7 V2 B, h
  6. public class AggressiveState implements MonsterState {
    - D- O- T$ S# Q, d
  7.     @Override3 v9 d8 `! H* B& J3 d
  8.     public void handleState(Monster monster) {! {& y2 Q. d. d0 u/ J
  9.         // Агрессивная фаза боя1 ~4 R  j6 W% D' S
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");8 p, x0 U1 K2 s3 {
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
      p  Q: t- f. O# a0 x
  12.     }/ W( y9 p) d6 J2 \9 K! R
  13. }' t3 Q: I2 t5 g
Скопировать код
Класс для финального состояния монстра:! ~1 t6 O6 O6 G  D6 _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, u2 h4 l7 G! k0 n5 A
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 }2 M; ]6 f/ E" e! R

  3. - F) O3 P. A% ~* X4 D" Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;, @5 a9 P" v% O& R( g; B: X. h

  5. ! ?  n$ O4 t2 o
  6. public class FinalState implements MonsterState {
    9 C: K+ w3 k* H% O
  7.     @Override: _- e1 D2 K5 p8 [! O6 c9 W$ E3 P
  8.     public void handleState(Monster monster) {- r% C1 R. ~5 S% G; z
  9.         // Финальная фаза боя7 ]0 Y- N. }, [" `# ^/ }
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    / r2 @. W# I4 D3 G
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ C4 o" P2 d' D' N# s7 q' Q! _
  12.     }
    9 t; Y- e8 m! r+ N; q. y  n0 j5 G
  13. }
    1 g0 B; z3 z$ V
Скопировать код

) e) C  O$ ?& R9 s% tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% C. s6 P" G. v* W# t) s. W: P
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , M2 C6 v# _: ]8 _/ w2 n
  2. package org.l2jmobius.gameserver.model.actor;3 e" l3 i! |' R+ k% }% M" y

  3. % t/ r% y2 w) h! X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 d/ a# k9 _9 @/ U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;' @" m! v% ^* j

  6. 4 z3 y0 m. z* `$ R, y
  7. public class Monster extends Creature {
    * f% @  J) K" L- y3 v
  8.     private String name;& [( Q  M2 `+ c4 n
  9.     private double attackPower;' t5 o$ F) q+ ^4 S  z& u* j
  10.     private MonsterState state; // Текущее состояние монстра$ Z5 E+ l- P' `* D+ l- G

  11. ( C8 U% d; g% T* P
  12.     // Конструктор монстра0 Q9 ^7 z3 g/ Q$ o6 q
  13.     public Monster(String name, double attackPower) {
    ; @, B( M6 N& l& @; E
  14.         this.name = name;
    , M( q( }) [! l" y9 b2 o1 [
  15.         this.attackPower = attackPower;( {9 c% |, h; x# f& x
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние& }4 q" y7 ?' f6 q$ p
  17.     }3 H( l' R3 J9 O" P
  18. ! q$ s. |4 i! N, J
  19.     // Метод для смены состояния- ]5 n& ~$ b$ s$ z4 z5 {' O
  20.     public void setState(MonsterState newState) {
    7 l  t5 V1 V2 \/ D  G4 ^
  21.         this.state = newState;3 }. ^# f- z) Z6 [- O
  22.     }4 N2 `+ ^! f: J

  23. ( D3 C) I+ G: m7 a+ {
  24.     // Выполнение действий на основе текущего состояния7 J8 d  s; t! V! `
  25.     public void executeState() {. @- i2 ?) H; ^! B
  26.         state.handleState(this);( ]5 I, ~# l8 M, a, K
  27.     }
    ' D8 d; u; M3 ^# v6 I- b
  28.   K, \! Q7 A3 F) V& c, U
  29.     // Геттеры и сеттеры
    6 B  z2 {( }/ B/ \+ q$ {$ u+ u! ^
  30.     public String getName() {6 i( [/ G0 L* q3 p) n8 i% C7 n
  31.         return name;8 y4 p% W9 X5 r$ N, y  E/ X4 Y! ]7 M
  32.     }9 e# [' r9 ^  p1 f
  33. + O2 R8 D1 _- D7 h9 p2 H2 W
  34.     public double getAttackPower() {
    / `: y* V7 N4 p5 @0 ^6 v) N
  35.         return attackPower;6 \+ K# C% \4 k
  36.     }
    $ b+ g! b& R' M% l

  37. ; J+ M# ^( O$ Z  V3 t2 i% W8 D
  38.     public void setAttackPower(double attackPower) {! X( k5 T8 J5 z1 H9 L5 H* O
  39.         this.attackPower = attackPower;8 g* m! b- d. X) X( o* A
  40.     }, a4 a: T" o$ v7 B/ R0 c; U
  41. }% d/ B9 H- m, G( J/ i; h
Скопировать код
6 Z, B( m7 G" p; M- x9 n# v( w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.3 U. M; y5 \3 I. V6 ]
. X/ S" N; W! Q- y0 Z7 ^* y
  1. // Пакет org.l2jmobius.gameserver.model.battle
    7 F5 p* P; i) |# W3 t8 d. z
  2. package org.l2jmobius.gameserver.model.battle;
    6 o6 ~5 @, f+ A% ]1 N9 _- n" Q

  3. - D9 }8 O7 Q# s: K$ d* ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;, K: Z  R+ O2 P# J& R0 ~
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% W+ p6 U( ~( A' N7 L6 }
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;( Q! |" h4 T; }! }# q# E/ F

  7. + b: e% H0 o+ D
  8. public class BattleSimulation {8 c7 ]% A; j( ]" n6 v; s# s8 T: {
  9.     public static void main(String[] args) {. U/ m; Y) p( R, g' H' {% k" D
  10.         // Создаем монстра с начальной атакой" i, X' \3 ]$ n; \1 }6 x
  11.         Monster monster = new Monster("Дракон", 100);1 ^2 y( |9 T+ b# b2 v

  12. 2 t! ~9 ~( F: r5 y* [" h$ ?
  13.         // Начальная фаза
    5 @7 l+ C- V. h; M& x& t5 y
  14.         monster.executeState();# ^9 F2 t% S& u6 h. X3 v

  15. * G- }. w( g- k; Y  k
  16.         // Переход в агрессивную фазу. D1 k$ |& _+ I" A6 i
  17.         monster.setState(new AggressiveState());
    6 M8 s3 [1 E5 O
  18.         monster.executeState();
    : g8 r3 N8 j2 b' U

  19. + w. I( u  G$ {
  20.         // Финальная фаза" a2 C$ R. O  e# m7 ?
  21.         monster.setState(new FinalState());5 N$ @! |9 I+ Z1 D0 ^9 _
  22.         monster.executeState();& E; f8 f# S* O5 l. s! j6 r
  23.     }
    4 t9 d7 H: L' P- \( H
  24. }- }8 s9 X, \' z( B* }, q* d
Скопировать код
. _4 }1 r, G$ c8 y) _5 {/ E- w
Комментарии по структуре пакетов и классов:
$ z; {! {. H: b' `, ~% l
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    # {  ?$ |! o1 T+ P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ h7 H7 [; y6 N/ F. ?( hЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
* B! J8 j, N; G2 |2 n/ S1 j5 _/ k, X
% Z8 U- a# R2 a3 @2 \6 T- q9 u' l& `

  E& B. N* D: [6 w: g0 B6 v6 j) X  b- E. \2 _. ]& [

! C5 j( W8 Z+ u* ^* [
# L* L5 v1 @# w; o! p) B* x1 l/ Y; v4 E3 l" n8 z1 m( L

& N! m$ w$ `: n: C
$ v- V( U, T* i% w1 k( A& N, m. x8 f' U

. y% F0 x  ^4 a4 g% p3 }- T0 r& f2 F- s
! \1 J) P9 x+ \

5 ?' L. C' v! N2 U8 U+ w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 ^1 J$ U- P. D+ H' h% L) m9 y* kДля управления сложными взаимодействиями, такими как  ...

; p" j6 g6 O3 B9 ^7 @$ o% y+ E4 DОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:210 [, \, F6 m, C: n- R+ w
Отличный подход! Использование шаблона "Состояние" де ...

$ `4 T/ I& K1 D1 g  t  CХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
$ F' |, ?& F. o7 G# A* l* _# q
( Q) y: K  r& A# J% k; mШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя./ P" k5 ?( G4 o( U( C
! h- p8 b; H7 q/ I
  1. // Пакет org.l2jmobius.gameserver.model.actor' K# p& r, t' z* _$ T6 S4 b% M
  2. package org.l2jmobius.gameserver.model.actor;$ ^2 u$ S3 x0 c: n

  3. ! Y2 C& m! ^9 H; X5 a
  4. // Перечисление для типов атак
    ( P% _" D( S  h; N
  5. public enum AttackType {9 [: e- L' L8 T+ P7 k4 A9 f) X
  6.     PHYSICAL, MAGICAL;
    ' E3 g% B% H: v, m% C/ _/ `
  7. }" E* f* M# G8 V9 M" I7 [0 F
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.8 P. ~* I$ [4 G5 D" n7 Z+ m
Обновленный класс для агрессивного состояния монстра:
5 l  z# O, v2 }0 H# S. Z, \0 t: N; y& ~4 e! @  I4 ?. H0 u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! Q# r. S) T: F$ q+ o+ H
  2. package org.l2jmobius.gameserver.model.actor.state;
    - |* k0 D) @6 D$ \. Q3 l/ O

  3. & k# U+ ?# X) B9 C$ `. z2 N- X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    3 o  P+ k6 |( o+ i3 Y
  5. import org.l2jmobius.gameserver.model.actor.AttackType;6 \8 Y+ B3 s7 x& `* X0 {0 X$ R; \

  6. 9 I# s# E3 O) ?7 D2 g
  7. import java.util.Random;
    7 `! ?$ n' b2 q$ a2 D- a) \2 C

  8. ; `- D& v  c/ ]* u: E& s5 ]& N3 _
  9. public class AggressiveState implements MonsterState {
    3 b. L& W' a7 W9 H8 k5 R
  10.     private Random random = new Random();
    0 y! L4 t9 Y/ ^' {

  11. - S) ~1 p. \) e
  12.     @Override
    * [! d/ `0 g8 B% d( N
  13.     public void handleState(Monster monster) {- u6 L' l8 F4 t7 u# F, H" ~9 R
  14.         // Выбираем случайный тип атаки: физическая или магическая2 ]3 a& c0 W& z" Z8 L( V2 f
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;+ z( A  X4 Q& P9 L4 y5 K6 {3 _

  16. & j; ^' e% K2 j' n  v) h; p% t3 b! I
  17.         // Логика для агрессивной фазы боя
    4 c1 n$ W8 X5 G4 s* F8 f/ v
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 r  P5 L% r) k8 E4 P0 H7 r5 ?
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");, o6 K. T9 X, d, |5 f, P* `" H
  20.         
    - ]8 M- U. n8 `3 M3 y: f
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    # d0 z* h+ z) M1 {! G' [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;$ m0 s. I& S' m' _: K, l
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    , I! Q  H. R; _% b5 q
  24.     }
    $ g; A. Z6 Z0 n  a$ y. u
  25. }
    ) b/ d" b  L! R! i0 t8 z+ `% h
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки; i5 D' V9 [3 i( a

8 V( {* S: Z8 M4 q3 }) W
  1. // Пакет org.l2jmobius.gameserver.model.actor& ~. L8 j0 c& w9 t4 ]
  2. package org.l2jmobius.gameserver.model.actor;. r5 m) j9 ?# \7 r  V+ U' E2 \
  3. 3 @; H7 R, X, Q8 z' ~; t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , z- ?$ ]" H8 T6 b; @2 g4 i
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 n8 H0 D$ j& B( i# U8 g

  6. ( y# G) O) C. d
  7. public class Monster extends Creature {; B2 Y. ?6 h" k7 [
  8.     private String name;+ W6 s1 ]3 J. |8 i( |
  9.     private double attackPower;5 I1 V1 o1 K4 p1 f
  10.     private MonsterState state; // Текущее состояние монстра
    / d% a, I: q8 j. ~

  11. 0 @$ A7 q+ Y: Q, O+ J7 y3 e0 B
  12.     // Конструктор монстра
    9 U- W, R/ ~/ j: c
  13.     public Monster(String name, double attackPower) {0 g) g% q# B' f9 p! _7 f
  14.         this.name = name;. v& K( r1 q$ k, G
  15.         this.attackPower = attackPower;
    * M( c' r4 m% ]5 J+ G
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    1 |5 A4 G  d/ B
  17.     }
    # y% g! X- o1 z

  18. 0 L: k; o7 ~% r. d# S1 Z
  19.     // Метод для смены состояния* b1 Z& O- o% o
  20.     public void setState(MonsterState newState) {9 g# y9 d# _9 Y6 m  j7 c3 m
  21.         this.state = newState;7 P  k2 x+ ~8 i
  22.     }* u+ Z6 [- n5 H$ E  T- |+ T2 y2 }
  23. , o8 d1 F4 i0 M# O
  24.     // Выполнение действий на основе текущего состояния
    0 C& p7 ~' C6 P5 G& z$ Z
  25.     public void executeState() {1 ]3 _- L7 }7 P  k) `
  26.         state.handleState(this);, x2 _% p% I0 l7 R, F
  27.     }
    ( h- W( @- p; a
  28. 0 d' d6 i# V. Z& Y1 F- H- B1 x
  29.     // Геттеры и сеттеры
    3 J2 P6 ^8 \: q
  30.     public String getName() {
    9 a2 \( o8 O# E, a* W; z5 I+ V; T
  31.         return name;
    : x( p; `) a' o4 S5 |
  32.     }7 S$ \1 @. y8 e  J

  33. 0 x5 @2 r; z% H) C( G2 C1 v+ D6 @
  34.     public double getAttackPower() {/ ]. _1 ~# H0 D, P' H. D% j7 O' ]
  35.         return attackPower;
      s/ G1 B8 x5 y: u
  36.     }
    6 x: E& Y8 [. f2 f9 `$ D

  37. 9 C5 h# N. x) i5 I. k
  38.     public void setAttackPower(double attackPower) {1 w) W" F: t/ y/ B% t
  39.         this.attackPower = attackPower;% F4 Q" X% R6 [2 B8 h5 H
  40.     }
    8 R" \% ?+ z8 W! o* _4 v
  41. }
      o% i$ @  L! J4 ^4 A) X) [
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
) u9 ]6 Q! P2 W% j6 O  Q* D. Q& s2 V- Y$ |2 W
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ) `: w( _1 G1 i& M6 u2 O
  2. package org.l2jmobius.gameserver.model.battle;
    & u' Q2 U8 G7 j. B+ k
  3. 4 K6 P* a" N0 l9 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 l$ N6 M1 q! J/ }# k4 e
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;( B/ K7 }7 K6 m3 b* }$ C+ S6 I" x. o

  6. 0 M$ A% `( P# r2 k; E
  7. public class BattleSimulation {
    3 n9 }% L* q  i$ Z1 J0 i" y1 C
  8.     public static void main(String[] args) {  o6 ~/ ~2 ?1 {4 K+ a+ U- o
  9.         // Создаем монстра
    # g0 g1 {& ^1 Q0 w* p0 o
  10.         Monster monster = new Monster("Дракон", 100);
    4 }: E7 S: |; t

  11. 4 Q5 v6 ]" m$ U/ ]' W1 ^' Z3 p
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 Y6 r+ E4 n: Q4 y" p5 M  O! @% a
  13.         monster.setState(new AggressiveState());( x" t! J+ I% K' H! h! U  s0 n9 ?2 F4 T, `
  14.         monster.executeState();2 t, }' T1 S8 ~2 f( p; j
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак3 d# ^( Y4 U0 |* [$ Y1 R
  16.     }) K5 F1 y  H# n3 N% {
  17. }
    # c6 c7 a# H$ W2 b8 _$ M- R' i
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.2 ?, l- k/ T8 r% \1 ?
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!3 x; y2 Y6 h3 |- C2 U
& b/ |$ [, ~' I2 v! A7 ~5 ^
1 j7 Y3 s% S# O) L" {  R

3 g( }! p6 y) h
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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