Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!9 Y% u/ Z" c. g4 q3 E( g$ s8 u" R

& D$ n; w# S8 D/ Z( \
% x( x/ A' x; n
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.2 [4 m% V6 l) p$ Y( H
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
) x3 Y) g9 n( e. q- l$ Q' V( uАстралия ?4 [/ a! b+ e; v

" Q5 |# O1 y; \. `4 q

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
' _4 n( t4 M! x$ aВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
4 `+ |0 K3 X& ^  S0 C' T6 x6 T  B7 e' k
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
9 }5 I2 n. V4 W0 `$ T
AlexCoder опубликовал в 2024-10-16 18:31
2 v, p; R$ X. A/ X! b: m; n/ ]День добрый!
& o: q* L- n' E7 A! `В статье описано взаимодействие игрока с N ...

7 F9 N$ _4 y$ j6 p. q6 cДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
! h3 s# W" f. P4 h) J$ t! L0 V  f$ J+ Y, j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.  P. f) S. \" g+ I" P$ q
! U5 x  Z& l2 Z" ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; H: i% q% J0 O
( |- l0 P2 Y1 R; V" j. Y
  1. <font color="Green">// Пакет для состояний монстра</font>0 q7 ]0 ^) Y; A! K& D9 |# n( S+ n; x) h
  2. package org.l2jmobius.gameserver.model.actor.state;+ G2 _1 B2 G0 M7 _  E6 U; g
  3. <font color="Green">; o, f  \: G3 [# ~% N0 l4 L; E
  4. // Интерфейс, представляющий состояния монстра</font>5 L% e+ \" v1 T- j* ~
  5. public interface MonsterState {9 t; L: j7 |! t& H9 |: n; x
  6.     void handleState(Monster monster);
    , ^2 y7 ~, h( ~+ Z
  7. }
    8 R2 G. i& k: K2 i, d1 i3 `0 r% W
Скопировать код
3 ~8 e) k5 b& {/ F9 ]
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* ?( U2 n) z4 L0 S0 _

7 |6 E7 y0 M0 q3 {Класс для начального состояния монстра:
- u2 B# Y1 ?: N" N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>( q, ~2 W3 q5 C+ ^: s% d9 X
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 Z% B* O4 m" G. \. u

  3. 4 s8 c3 f0 I' V8 n1 L( {$ c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - T! x0 F+ W7 |. h
  5. ' f8 c) F, M, J
  6. public class InitialState implements MonsterState {
    ) F; v& \. l' W" S. j+ J
  7.     @Override$ X( }* r5 c9 A( K+ |# Z
  8.     public void handleState(Monster monster) {; f5 I- v5 I) l. i& \" h/ }
  9.         // Начальная фаза боя
    / D7 p: L# g1 f6 ?! q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  A1 b5 L0 z4 M1 a$ H$ ]
  11.     }; d7 \( p- `; |% Y- u8 P
  12. }
    " l/ a2 v/ p8 Z* w" s, e
Скопировать код

- U9 P2 \9 t0 `
* d# ?" C# D% q6 D+ G7 _- _5 i- L6 U0 V8 y& R9 j8 [
9 m( @/ X. B5 y
/ ?4 m# W" j$ j5 q' ], i
* i) F* j9 e) O6 i  R1 s  W
! y3 d& L( s3 w5 e0 _
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 K8 b* K$ ~# D0 A  b% b

8 P% L6 s- a* K7 u' b2 PЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% r8 v, q4 {7 e9 p% n' |" u
" [* e4 x$ |* C8 q0 W; N
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
" b& y0 n/ e1 H# p
8 d6 k7 |' {+ \6 \, p% i9 W) T
  1. // Пакет для состояний монстра
    ) H. z% W7 V  Q) N4 F* ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 Q2 M( Z0 W, w6 t& A+ s" I
  3. & @3 H- r6 l! A
  4. // Интерфейс, представляющий состояния монстра
      O7 F$ R6 o9 D
  5. public interface MonsterState {. R  L# s( S* S/ o$ z( B# o
  6.     void handleState(Monster monster);  c4 `+ t8 J5 F0 k
  7. }
    + y9 R5 h. F% U
Скопировать код
4 U6 A, B2 ~; r6 B/ }! V
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ A, J0 {1 ]# B" X8 t0 Q! Z* l% j* b8 Q4 ~+ w8 o
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 Q; c) W) t+ f6 z! K  N4 f" T; G

9 ]' `! y) r* ~+ w0 Y% yКласс для начального состояния монстра:
( d, N( \7 o0 w: n' c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ a/ m9 k! \! B& D! X
  2. package org.l2jmobius.gameserver.model.actor.state;' n& b& [; h4 g  w
  3. 6 u. {: S" `. J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + u" g# z2 P' ^& p" s6 |7 I) v" b% ~
  5. 2 Q1 h* @$ n2 h5 X
  6. public class InitialState implements MonsterState {: T' i. N( A+ P  s7 s) x8 M* ~
  7.     @Override* D3 J8 Q8 X5 o3 n  y9 P" U0 e5 Q5 }
  8.     public void handleState(Monster monster) {5 e! G) W: M) J8 k
  9.         // Начальная фаза боя3 Q( R3 J$ j! W2 A) a% t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 Q$ N! y# `8 z; R6 ~
  11.     }
    + t8 O# v' o4 ^
  12. }% @- t( c/ ?% A9 m
Скопировать код
Класс для агрессивного состояния монстра:
0 J  @* b, Q/ l0 w( l1 P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 h- G) A3 }9 l
  2. package org.l2jmobius.gameserver.model.actor.state;8 r( c% Q! [5 |  t5 M* N  o  E

  3.   M4 ^5 F. i/ k; F$ Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # b% j8 J/ A7 B! C* N  J* \3 ?: B
  5. ; S9 e# B$ ^' C0 Y8 K/ P
  6. public class AggressiveState implements MonsterState {; s2 K' ~2 W' e
  7.     @Override
    ) N" |, ?* n& B6 S
  8.     public void handleState(Monster monster) {
    ) }, x8 \- Y( o# c' ]
  9.         // Агрессивная фаза боя
    ) n4 W+ @- `+ U
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    6 Z! c5 P' [% Y6 P( c3 Q
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ' K& B! |: }0 X2 i" [4 s+ q
  12.     }' r3 q# w0 ~1 }  Z
  13. }
    " `4 ^; s  x4 v$ o/ Q; V5 Y3 I' [: a
Скопировать код
Класс для финального состояния монстра:
$ w" g* T/ g3 E1 ]+ j
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) [& S% N! S) J1 B8 E: v8 H: y
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 s& [6 w' P4 a4 {
  3. ; w2 f8 F0 d" i1 r5 p; o
  4. import org.l2jmobius.gameserver.model.actor.Monster;. B3 l! T. X) ~# [! p
  5. - a0 F$ N$ W5 W7 z4 u8 n
  6. public class FinalState implements MonsterState {3 F( K- S9 J4 B1 W& Q
  7.     @Override
    & t+ ^( |4 z$ Y* v' M
  8.     public void handleState(Monster monster) {3 d2 i5 Z9 N! R* J1 f& k0 G
  9.         // Финальная фаза боя# F% j0 E4 ~& T! S2 E7 i9 ?
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ( Q" @& z# `: B8 D
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' \# j9 A) C& _
  12.     }
    $ J/ F, ?% G$ G6 m  A6 u2 z
  13. }
    + X$ S0 {7 w; [" B
Скопировать код
3 A5 H' q" [; Q/ H: {+ [" Y- h) \
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# u; x# g7 G5 y! D- T
  1. // Пакет org.l2jmobius.gameserver.model.actor7 f  Y  Y! G$ ~8 c7 X# ^
  2. package org.l2jmobius.gameserver.model.actor;, ]5 Z; h+ j; R! ^6 [, b6 @: @0 _

  3. & F. R. G/ e$ E) _' G, o( Z0 q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( p4 O' L$ V( W  ^
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 t) E2 e7 z! O, l& T

  6. ) H# J! l' D) u
  7. public class Monster extends Creature {6 A, d. Y: p# ]+ [) u/ y0 Y
  8.     private String name;
    # [# j+ H  c% l  B) y- `
  9.     private double attackPower;# S, r1 G. m! k) S
  10.     private MonsterState state; // Текущее состояние монстра
    ' U$ r$ n' m% {
  11. * h* Y% U2 }# y) [: `7 h
  12.     // Конструктор монстра8 Q# h/ b  k4 @4 F5 P# t
  13.     public Monster(String name, double attackPower) {
    , O7 L8 w1 C, @
  14.         this.name = name;
    $ {9 G$ d# k! n0 B" ^' ~- t
  15.         this.attackPower = attackPower;
    ) U2 R' x8 [! j& Q" ]$ T
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    1 ~& ?7 f7 J1 Q
  17.     }, R5 f  _, h5 y: m7 S$ n
  18. 1 f) }: W4 Q. @
  19.     // Метод для смены состояния
    * }2 K, N3 M; Y
  20.     public void setState(MonsterState newState) {
    . ^' ^3 L; ?" D, v+ E& T
  21.         this.state = newState;
    4 k0 c4 T, o# R8 I) k9 ]7 V' Q  j
  22.     }3 t3 n( o3 R' {" |* H
  23. : k% A0 @% y* l2 S4 W: c. ?* B
  24.     // Выполнение действий на основе текущего состояния# ]1 P1 R4 j8 m  j4 f
  25.     public void executeState() {
    5 _5 A4 C0 }! G1 F
  26.         state.handleState(this);
    ( s; P# P. h( r# D
  27.     }5 E, K3 W- {$ w* z1 ]

  28. . A" Z$ `+ k! o
  29.     // Геттеры и сеттеры/ Y& k4 \) g: C
  30.     public String getName() {
    : ^6 c+ d5 {% C9 r) D
  31.         return name;
    8 `0 g8 _' v8 v1 Z; X: G, |
  32.     }
    * Z5 W/ J) z/ T1 P  Y: A

  33. 2 j- [0 `5 ^$ H8 K7 P: H+ {
  34.     public double getAttackPower() {
    : a0 \  z3 q# H
  35.         return attackPower;; r2 l9 }$ }& _% {. e6 Z$ g5 N( W8 F
  36.     }
    8 _2 t, P6 J& F! o6 P

  37. % N8 ^  e, T6 u+ S' e
  38.     public void setAttackPower(double attackPower) {
      P% ]: }# h. |" |  k
  39.         this.attackPower = attackPower;
    ( v  r) P! V" g
  40.     }+ v& w# M+ p/ D, s- X) W: ^
  41. }7 A5 b% Z/ C  K7 c
Скопировать код

: N/ E( a! I: {Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.. {3 U6 e6 V1 E3 S4 L  [* s* D

3 w+ k' b7 _( V1 d) ]
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & @2 B! a, T& w! p; y
  2. package org.l2jmobius.gameserver.model.battle;5 e7 C6 Y! D" ?$ z  W, W* C( s
  3. 2 y) C6 u" i* s: D
  4. import org.l2jmobius.gameserver.model.actor.Monster;* B2 e8 [1 T% V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;# i- [  k9 h$ q) m3 k0 j7 b
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;: X6 a; x/ J: M3 |

  7. # v6 v* G; Y# d" G; ~1 `! v, N
  8. public class BattleSimulation {
    % J9 k0 |1 T2 h; l/ }
  9.     public static void main(String[] args) {
    ; d( S3 t% i! c( b& V* g+ Z) O/ N
  10.         // Создаем монстра с начальной атакой
    9 V2 k  h0 W( J5 U
  11.         Monster monster = new Monster("Дракон", 100);
    ' |# q6 x6 v2 Y; k, Z9 N& u

  12. - Z6 h$ _$ X3 F+ Y- \+ j+ Z2 _
  13.         // Начальная фаза: B5 j9 u, J) ^2 ]( S2 {
  14.         monster.executeState();! E6 z5 Q; u) R& K2 \' a
  15. $ ~: u& {8 D8 ?3 \: s
  16.         // Переход в агрессивную фазу
    ' b$ o6 }0 m1 W0 T! d4 d1 r. Y
  17.         monster.setState(new AggressiveState());5 M% r3 e9 N( m9 n
  18.         monster.executeState();3 ?% \- f/ i/ o: @

  19. % u0 D2 w0 N3 R$ h& z7 o
  20.         // Финальная фаза' `9 x. G+ h5 V$ j+ j
  21.         monster.setState(new FinalState());7 E( f# K  o# Z( {& F1 Y" }2 C" X- J: w
  22.         monster.executeState();1 D% R9 p3 A+ e9 v6 I% [6 ^! T- r$ _2 v
  23.     }4 L. v2 j$ F: v4 c' F8 ]
  24. }2 B! `5 R2 ?& f" ~; Y$ i8 B
Скопировать код

* z$ e1 N$ r$ C. {Комментарии по структуре пакетов и классов:8 N, x% j# v3 i/ ?1 n% ~' f0 P
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    + W3 J& w" ~0 b' o0 A3 X& [
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 Z" ~* Z2 u7 v) D) o  R  tЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
; ]$ Q5 ^3 }  b& u5 C  [- P# g
! l6 y* M7 e6 j/ Z% d$ `, n, L: N1 R4 _8 N% t, g' O

6 z8 U# S7 w  N7 k7 U3 F% L- ]! _( }2 T/ V6 Q. j

* v+ P* d: n2 \- W( j. i' C# |' g! }* r
" ]) A1 h/ ^8 r' ~( s# |

$ u1 ^- K+ h7 M: }- u5 c1 y# Z: c; |" v4 D( h

$ y- k5 N5 }; W/ d5 x" o  ?1 W5 o8 z- n) E

* Q4 P6 ]' X% \- E* N! k: B' A: g+ Z2 r: k+ @
6 U% O$ d) h5 u2 x8 c# [$ ~
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
6 T  S3 B3 `' S  x; sДля управления сложными взаимодействиями, такими как  ...
; K0 x: S2 L/ c( a. j
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
6 S" l$ Z+ L" s  [6 ?7 }9 t) \Отличный подход! Использование шаблона "Состояние" де ...

& o7 V$ M: Q& l- d+ |Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
9 B. N# |! z6 |; Q3 T, l$ }9 A$ `* c2 |
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
+ A! T, b1 Y' l9 t0 M( q
- P7 D3 `  ^1 w) n
  1. // Пакет org.l2jmobius.gameserver.model.actor: V) j9 h& o2 B) {5 J. G' x
  2. package org.l2jmobius.gameserver.model.actor;9 d3 o9 H) L0 w$ R2 N1 I$ r9 j, ?8 T
  3. 4 A' M7 d5 s# T+ c$ B9 h& I
  4. // Перечисление для типов атак
    9 X  v, I6 K  l' F2 \
  5. public enum AttackType {
    $ |$ G3 h( L( h( W5 e* w+ M9 E
  6.     PHYSICAL, MAGICAL;) d6 S3 X* y+ Z. u) S( {6 L
  7. }7 |& \! ^4 Y4 R9 B( Z8 ^
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.( J9 c) l+ }5 n0 r0 E6 u( ^/ }
Обновленный класс для агрессивного состояния монстра:
6 g: K* @3 a3 s! `7 i6 Y6 i' ~: s6 q3 F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( L  C9 T  e; r/ K5 X8 E, i
  2. package org.l2jmobius.gameserver.model.actor.state;9 T5 p! E1 B: N7 f- [0 j; G- V/ L; {1 e
  3. ; Z6 Q. k- r) E. t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 K, X$ w) }) w; P! {% k' v
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' I" Y+ A  A# q5 L; T5 A
  6. ! t1 \9 l0 A$ x" q1 u% E
  7. import java.util.Random;
    ) H/ g0 q3 b' H, ^2 P6 i6 `

  8. 1 p; a7 i+ b1 z$ f
  9. public class AggressiveState implements MonsterState {7 \) h5 x. n; J2 r
  10.     private Random random = new Random();' ?( d' \3 ]$ O5 M% V8 ]
  11. 7 O( _% |4 @" U4 U1 R) b1 z
  12.     @Override
    # l' D% C) @3 n8 F3 R9 a$ P
  13.     public void handleState(Monster monster) {$ P, z9 U; d, {
  14.         // Выбираем случайный тип атаки: физическая или магическая
    % }6 w2 t: y% G6 F
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    + J$ i& \  e3 V/ m0 c  p3 r
  16. 9 U4 Q; b& l' V$ X% v+ d! h" }
  17.         // Логика для агрессивной фазы боя- A2 f" C/ s$ c7 f% K& a  ?
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ) e6 |* D; d/ g' P
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( g9 T. w6 }; I4 }  l8 m+ F
  20.         . o$ s6 O* K* z6 l" o1 B1 l
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    4 N. G$ b2 K; j' z( X
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;+ H! s) A$ V7 o6 d' G. E' {
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / j* @; m& F7 y
  24.     }
    ! V* m* l# V+ Z' s
  25. }2 G' @+ m( e0 ]% A8 B
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки4 o! L3 u9 k. ?

; w. g! O' h* l: C" v+ i& A" {  E. e/ c
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 g3 e) {& ^! \9 z& y/ n+ r
  2. package org.l2jmobius.gameserver.model.actor;
    1 i0 {& z8 g" X
  3. : m) a4 p1 p  B( L) S
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 [7 i! N; d  t" Z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 Q. _' A0 q: f, j2 V4 I/ T

  6. ) j' j" ?* F! M7 \1 y7 v! Y
  7. public class Monster extends Creature {2 m6 R) A" M  U/ ~/ f- W' a
  8.     private String name;
    - _7 |' H& W' J4 z% n1 z( J
  9.     private double attackPower;' v# f* e0 J6 X: L: v  R' S
  10.     private MonsterState state; // Текущее состояние монстра' C" N( A: t2 C( v2 i: ]" N% I0 t% m2 E

  11. 9 |! l* u6 v7 @. |; {& ^
  12.     // Конструктор монстра' l9 r& m, z! y7 h5 x) l# P
  13.     public Monster(String name, double attackPower) {9 _5 D( i( ^# I: ^, k: o# l
  14.         this.name = name;2 i* t  t- Z: Y
  15.         this.attackPower = attackPower;9 @0 ]$ w3 S) @) I; W( }
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ( ]; Q6 w' w. ]) |
  17.     }- z+ ]- q  t$ Q: R' L3 s
  18. 0 R  M6 [0 O4 x% S& H8 M
  19.     // Метод для смены состояния
    # a) P/ E" b# V+ }& d- _
  20.     public void setState(MonsterState newState) {
    # {, i$ L/ t1 w8 E4 n
  21.         this.state = newState;
    8 M+ N( V; W9 \! s1 v
  22.     }
    & J3 B4 w1 h7 G6 P1 k2 P  I

  23. + [+ E" d2 Z9 n' [! n5 ]+ i% f
  24.     // Выполнение действий на основе текущего состояния5 L/ n! l7 L$ c- ^
  25.     public void executeState() {
    * e6 r' b/ f3 V# p+ g7 G( }; c
  26.         state.handleState(this);
    - |: M3 r5 a( p6 E. S
  27.     }
    ! i; w7 j& ]3 A3 \8 \2 o: a, g

  28. 8 ?5 P. o5 X/ {  `8 y( a: k
  29.     // Геттеры и сеттеры
    # s9 i$ s8 x) A8 W  ~9 ^& n1 w4 a- J
  30.     public String getName() {7 ^4 a" w2 k: H  L7 {  E' `4 \
  31.         return name;, h5 a9 m1 m* N3 w2 j/ v
  32.     }. S- n2 Q. @4 o/ a  B
  33. 3 u% D' |- U( L' {" X$ {
  34.     public double getAttackPower() {% r+ m1 T; o- }
  35.         return attackPower;
    7 t2 B" e/ Z% p. w% I) V* D0 D! z
  36.     }, Q/ I0 `/ \' b- `

  37. + m% W% |+ u* d
  38.     public void setAttackPower(double attackPower) {
    ! f; |7 t( n" J7 R; i
  39.         this.attackPower = attackPower;' }3 p2 w5 l3 @2 P" B8 S- k' Q
  40.     }9 \' ~, V" f$ u1 c( O# a8 D7 d
  41. }
    + Z" C/ k2 @3 G* [
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.2 X: A5 n$ J+ O: P5 z) G" i
7 @, _3 d3 S! W! B/ h
  1. // Пакет org.l2jmobius.gameserver.model.battle1 F; P- W1 Q/ U% W
  2. package org.l2jmobius.gameserver.model.battle;- \0 q5 Q9 e( B0 a4 z" O
  3. 6 A* D% {* e3 R" Q- H
  4. import org.l2jmobius.gameserver.model.actor.Monster;: u3 a% \2 T( z2 W6 j
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 r; L: m7 K$ t2 j- D: ?

  6. . |. s: _3 N1 [3 k" K
  7. public class BattleSimulation {
    . o+ t9 P) r/ E1 u. f0 I. X! v
  8.     public static void main(String[] args) {7 n5 Q8 T4 n; Q8 J
  9.         // Создаем монстра7 ]& n' r1 T+ n  s
  10.         Monster monster = new Monster("Дракон", 100);
    9 I1 Y) B: c% p5 @, H: X$ V

  11. ' q4 k8 e" ]3 t- v1 ?8 G5 S
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак: b! Y, L' |, {. F
  13.         monster.setState(new AggressiveState());
    ( A1 E' a5 w4 o6 ~. Z$ }+ }
  14.         monster.executeState();, E  j4 A4 l0 D' _
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак  u3 j8 B* ^- K) X: h
  16.     }
    " x; L1 w: e  k# A0 r
  17. }5 \3 C' U* V& h: V
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
: N# ~( w$ [5 q! @/ EЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!: G4 ^9 i, h! O" e( o

# G: R; |! W+ Q- e# Y- g
: _. W6 N# p# p, F0 s  L" I; `! C# e; O" n
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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