Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!, F* h4 J" g# {1 `) g# m

5 p  G4 p7 `1 b& F

' i0 {% L% D0 O5 L$ i8 VЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 Z4 W: m( M' s& U1 j2 p4 c
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
  c  q- v( _8 b: n  X* `Астралия ?8 s' V0 x# \0 t& C6 z
) U& s& {- |% W' j$ H8 F

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!- c+ J) ~# g% t! t0 [
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?  ]4 A1 _/ G" @; B( i1 L+ \9 s

" k$ F( }7 |0 I; u2 D6 t6 K
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ( B/ M1 g+ {4 H
AlexCoder опубликовал в 2024-10-16 18:31+ Z" b- u) G0 [1 ^0 ^- G
День добрый!8 T7 ~  E  o$ B0 M
В статье описано взаимодействие игрока с N ...
& f; c, r. G* X- t, X) m+ ^" F
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
! O' Q1 l6 W7 A% Y; V8 v+ s! i1 \9 l; ~! M8 Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
: q. @! x6 f* j  x
/ ?  z; X' a. DШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
) G0 }; R1 G* A& C
- `* i/ ?: v; t2 F1 b- y
  1. <font color="Green">// Пакет для состояний монстра</font>
    " g, f# a+ J" t
  2. package org.l2jmobius.gameserver.model.actor.state;5 P) B; E0 C$ ?- k) ]  o
  3. <font color="Green">- K6 W* h: H9 C% o
  4. // Интерфейс, представляющий состояния монстра</font>. E9 X& W3 Z; @7 r
  5. public interface MonsterState {" N0 a! a+ ~* z4 g
  6.     void handleState(Monster monster);2 P6 i; z+ D' o- U8 p" t1 i
  7. }
    : P1 `- i% Q) G
Скопировать код

$ z4 p) b' n2 o3 k) U: MШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 m4 r) R6 f3 @: u; U

/ K9 f( H. A' S. L$ wКласс для начального состояния монстра:4 @: r5 b: H4 E  {. m5 ^2 M
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>7 ^) `  p: N% O7 Z, L" q* T. }
  2. package org.l2jmobius.gameserver.model.actor.state;, ~/ @6 Y! j# U3 H( B2 ?
  3. ' {2 j" ?* i% T# d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 ^* V2 ]& v- J  Q

  5. : i3 u9 R9 ?  d' n) h' \
  6. public class InitialState implements MonsterState {# I6 m# G# ~% W0 b$ x: K* d6 @
  7.     @Override* I& h4 q: b  J/ j9 \
  8.     public void handleState(Monster monster) {
    ! \: A0 c7 M" d  `
  9.         // Начальная фаза боя
    5 C; M1 H' q7 U: w
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : M" F: e# k( P0 f4 R
  11.     }
    2 f, }5 L9 g- }* x' L
  12. }
      k$ j7 @8 j' P' c8 |3 U2 o
Скопировать код

! c  @9 @4 `6 y3 J  U6 z
7 w% u# O7 x$ b6 t  |5 p& f2 M$ \; B

; Q* w2 B0 ?! i5 y  ]. z9 e4 b6 a
  |' Y5 k% w/ d$ ]' E; b
3 O7 |$ ?4 E5 x* @. _/ z' `
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
5 l/ `3 d# T! n$ ^
. k6 k5 x) B, T8 v$ Q6 IЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." o9 h) ~( W# `2 E2 T: M+ k

4 C. k# L( Y1 W" Z' y3 o1 J2 PШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* M) q+ r  s: s) C& p" X2 V# |' H/ l7 j/ e. g, _
  1. // Пакет для состояний монстра
    7 B; d" D2 F+ ^2 U
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 X2 R" D3 D2 g! W3 z
  3. ( n0 k5 K1 o  a& E  G8 Z1 t
  4. // Интерфейс, представляющий состояния монстра
    4 K. _. C2 \% P; v8 A
  5. public interface MonsterState {
    . m* j- w2 ]' A% }1 X! p
  6.     void handleState(Monster monster);
    ! c  d" @* t/ ?9 Q
  7. }; F" X( R6 R. z4 p
Скопировать код

/ V; L1 |6 Q# o7 K# gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % }" t5 l- }3 H5 w, o2 i
" C! D7 o: }% h
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' G3 O" k7 k& a
$ m% a6 s. {6 u% M* l' A9 A# X- }Класс для начального состояния монстра:
& J% U! a7 U  d( P  W5 M  s6 o# G1 O* u1 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # Y4 G/ f' B3 P8 q) m# M: |
  2. package org.l2jmobius.gameserver.model.actor.state;
    % k; z1 |" _: `$ M$ V& q
  3. 6 i9 B2 _2 x  m! ~) Q0 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 `, k0 c' \% P6 {$ z) s
  5. . x2 \2 W. j2 x0 j$ Q0 l
  6. public class InitialState implements MonsterState {! |8 k& a& m( J- `! i
  7.     @Override
    % {/ t4 z, z+ r5 l. z) M- G
  8.     public void handleState(Monster monster) {) R0 i8 |. I5 I% Y7 |0 ~( A$ p
  9.         // Начальная фаза боя
    - ]" }5 }; m% g0 V) M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    / {' |7 `+ {' [/ u+ |
  11.     }& P" ]+ w7 \6 S
  12. }
    : X5 e& [2 J. \4 V0 [3 W2 w5 B
Скопировать код
Класс для агрессивного состояния монстра:9 R; T6 J7 [  q9 V7 L  ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # M/ x! |6 C. Z+ W- B3 }
  2. package org.l2jmobius.gameserver.model.actor.state;' n* _9 W5 d- N( B
  3. " v+ L$ c& E* A: B  ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 e& T2 o- @5 S! m
  5. 7 q& G4 B" w% V, V% D
  6. public class AggressiveState implements MonsterState {. K/ |  z9 Y% u+ F1 A3 O( ~
  7.     @Override$ e9 `$ W" g1 k- c5 ~
  8.     public void handleState(Monster monster) {
    : }, _. S6 d# Z( `2 }0 R! V
  9.         // Агрессивная фаза боя
    7 m; I0 ^4 D' L
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    / o% j" J9 F  k
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    / P  D% M9 P( M4 h
  12.     }
    % U6 p1 N; C9 S  b
  13. }
    " \- b8 g( K. M( P+ N" X
Скопировать код
Класс для финального состояния монстра:0 l9 t7 ^. y8 q  m  G# x3 h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ! B5 K1 Y, M0 h( y
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 U/ T& N1 U4 U2 [7 R- _9 P

  3. , O# V/ l0 |8 s3 e' O. E6 ~+ Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % A1 e% Y$ \" J! R$ }1 n, b5 ?& ^

  5. 1 B* Y; k/ J6 J1 X1 a6 z! B: j
  6. public class FinalState implements MonsterState {. g: e8 t5 E4 ^2 b
  7.     @Override
    % R0 }5 j: N; E/ \) |
  8.     public void handleState(Monster monster) {
    4 Y& [- [: ~! \# f
  9.         // Финальная фаза боя, [( r1 ]/ b4 f$ p5 T4 [* Y/ k: S
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");4 {6 s4 {( V+ ~' k
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки* t$ H& d. C1 [2 o$ I5 A; k; R9 E
  12.     }
      C; m: _) w2 j
  13. }3 y  R( u. G  C) W8 b& f7 H7 O0 P! L
Скопировать код

$ Q. T. t7 Y! M: E+ gШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
5 }  B( Q/ h1 e4 \
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 s+ x0 ]* |/ a5 j! I7 U
  2. package org.l2jmobius.gameserver.model.actor;/ b% [' n0 l1 E: Z2 R

  3. " [  s& _3 R1 y4 |2 N
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    4 D1 R! ]) c$ C3 Z& o  M
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;! U. u: [/ g; g  C1 N. l

  6. 6 E6 C. C. G) ?3 w( B$ C2 _
  7. public class Monster extends Creature {0 {6 t& T! c! L2 K- e1 `
  8.     private String name;
    ; e; U4 X( F+ Z
  9.     private double attackPower;: \2 x3 `( h  M9 y6 n3 y) ~
  10.     private MonsterState state; // Текущее состояние монстра7 @" {) x  O6 D5 A1 k! a% x* n
  11. 6 t0 L$ X6 p6 f5 l7 b
  12.     // Конструктор монстра
    6 w8 W) V% P: Q6 c5 x$ q
  13.     public Monster(String name, double attackPower) {
    $ ]# L, T. f3 f8 W+ s3 w3 f
  14.         this.name = name;7 R+ S/ j0 c" P3 R' f  f6 {
  15.         this.attackPower = attackPower;
    # m: m) {$ _6 z7 e1 ^( }) s
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние) }  P8 w# @: U7 x* c! t- z" i. j
  17.     }
    - m/ y$ \/ }7 a+ r" m+ e  P) c

  18. $ }# r1 E0 m3 u( `2 Z% {; {" ?
  19.     // Метод для смены состояния+ f; v# W- ?, K( [; o! f
  20.     public void setState(MonsterState newState) {
    4 L( j* F( z" Q: S' u  t: x' U
  21.         this.state = newState;4 _! h# ^+ I5 a5 L, e
  22.     }
    / ~9 Z8 u- X7 T4 l

  23. 1 _" {1 I, ?' I) @7 ?+ H
  24.     // Выполнение действий на основе текущего состояния$ a. {* p9 t( v- O$ Q
  25.     public void executeState() {9 k; F* J& t# V' f. o
  26.         state.handleState(this);$ }  l5 v$ l5 j8 Y
  27.     }
    , q- R4 D; h( i, Y

  28. 9 ?+ m' w8 q0 C" Q
  29.     // Геттеры и сеттеры1 m* ], v) {+ g  t# N2 V7 v
  30.     public String getName() {
    + W/ E; \# S* A# G
  31.         return name;
    " g3 Z8 v3 I( `  r
  32.     }: ^- A: {/ n; R

  33. ) @6 L- Q8 a  P0 }# n2 k1 v4 r3 b
  34.     public double getAttackPower() {
    # Q8 a1 J% w9 [6 D- ?/ m* D3 J
  35.         return attackPower;. z. c6 l# Y2 o# Z( ]
  36.     }
    , I) ~. o  M2 G' H% a& N% h. w* n; k
  37. $ i" v1 F% U8 o9 {
  38.     public void setAttackPower(double attackPower) {$ o: Y1 [' O4 b0 k) d
  39.         this.attackPower = attackPower;
    * e4 X8 I/ e* v8 h. N* p, F
  40.     }
    ( M/ y5 k6 y! I0 p
  41. }% X) [" t7 W( a1 e
Скопировать код
+ p9 Y$ P! I  w/ S% E1 n0 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.: q, [/ O% O6 {; ?, U, o4 ^

9 M' F* P6 t( t9 f( m
  1. // Пакет org.l2jmobius.gameserver.model.battle
    5 C- f6 ~- H0 L4 U
  2. package org.l2jmobius.gameserver.model.battle;5 V& _1 e6 Y! l) T# b0 S1 q

  3.   g/ Q; G, l# M9 A0 Z  u  V2 h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 l' J, n; _/ S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  P1 z& J* t7 n3 B* j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    5 W6 Y, h& s; P( }& D, B: @! i
  7. * B& g! F- d. _: P4 @
  8. public class BattleSimulation {* u3 S! f8 i9 x7 S! ^3 d
  9.     public static void main(String[] args) {
    ; _) w# b3 w/ _3 ]+ d: B
  10.         // Создаем монстра с начальной атакой& B! ?0 G5 X" O
  11.         Monster monster = new Monster("Дракон", 100);6 [* w/ b( f8 x
  12. $ a0 F$ H2 {2 e. i+ g) M0 q
  13.         // Начальная фаза2 U5 Q( l' |+ h. I( q
  14.         monster.executeState();& w; H( @# J3 t$ H* _) Y4 y

  15.   x( J; V- `& ?# F. R2 y  ?1 F! {
  16.         // Переход в агрессивную фазу
    + ^" v2 t, J+ t, h. I  T' J& g
  17.         monster.setState(new AggressiveState());( u" S7 w$ X% b# B' ?8 a
  18.         monster.executeState();
    ( L" Z3 U( f) N! c3 b

  19. ! F- Q5 v( h9 [& S& q- t- l' `
  20.         // Финальная фаза$ @8 M, q- _; ?, I1 ?: l
  21.         monster.setState(new FinalState());
    * w: s4 k5 S+ A2 v8 C* m$ X7 ~
  22.         monster.executeState();
    + s& ^' s. E; C5 h7 L0 Z
  23.     }
    ( {9 R, [* q1 V* A7 E# t+ A
  24. }; T) B5 l) R. u- L8 K; U) B; R' @& Q' |
Скопировать код

4 f7 c- A# h% u7 y# y* \Комментарии по структуре пакетов и классов:/ ^2 u* ?% b; i4 l2 s
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    9 M  _0 M8 _7 {+ J
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." j7 H- I2 A) h- e
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 N1 `+ [' e) K, ~0 W

# [% n1 M9 f1 I! {& c2 ^" Q4 o" H5 \# i% {0 G0 v

: F# ~3 S( A, _* u. }
. d. J- y8 H0 q+ B+ ^8 M( F) `5 h( T+ v0 P% |! _
: Z. N: o; H" M9 x$ a( k/ v# n

/ H6 [. e+ h" \/ L; a1 \& ?1 g* G& ?. ^

5 U9 D, f0 C, E5 w3 h9 ~# x0 q* p$ Y* T0 \

; R6 u- X) C9 U- B% ]9 E4 o7 [( r6 c" Y' N; y; x* _% M
6 ?) I4 l/ e3 N" A! S- G  e
+ a, M- e6 Y: E  w
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04+ y6 t, V" E8 ~% d% I4 s, x
Для управления сложными взаимодействиями, такими как  ...
2 b3 C% k- U- s
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
# Z4 A0 u0 M5 g9 B  z2 ]Отличный подход! Использование шаблона "Состояние" де ...
: F4 y: q$ L1 c5 i' s1 ]; `; ]' P
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.2 @+ R+ I( q  \5 i% [$ @7 H

- n! A: |" t9 H: Q. i0 _Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.( @3 m: Y: \& O0 I
" c5 Y2 p' |0 i! Q- E
  1. // Пакет org.l2jmobius.gameserver.model.actor
      m; W/ I9 k( d7 e! S( Z- K
  2. package org.l2jmobius.gameserver.model.actor;: Z5 D& K" C% n2 {1 i: S7 k

  3. : ^) S$ P+ p$ N$ K+ R! R
  4. // Перечисление для типов атак8 R+ }+ x4 b0 u& e5 `1 H1 E
  5. public enum AttackType {
    $ m: X% m" y: Y
  6.     PHYSICAL, MAGICAL;( C7 A# S: f0 B" S( @; ?0 x  k! v
  7. }
    - j, i: O3 B0 I- s) S8 d
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.# s, ?% j) w( K
Обновленный класс для агрессивного состояния монстра:- @) _/ |9 H7 ?* `
9 i; W( J5 R2 P0 r5 X$ `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ \. K2 I' X, B3 C4 H+ d
  2. package org.l2jmobius.gameserver.model.actor.state;
    & g/ D: S: w4 e: F2 p8 ^

  3. & I" h8 d- |8 h/ W0 N  V
  4. import org.l2jmobius.gameserver.model.actor.Monster;& |  t+ @4 ^* _
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
      H! {6 m4 P( J" Y
  6. ' N9 N5 O" t8 [: I' s& S8 M1 P
  7. import java.util.Random;& E8 b" F; F" M# s, H$ D
  8. , P4 a, ?/ C- F% K
  9. public class AggressiveState implements MonsterState {
    ! m3 H8 M9 ~0 i) m
  10.     private Random random = new Random();  ~; d' s$ ~9 f/ d+ d% K. O5 `
  11. 0 f' K' Q# \  P$ N7 L+ u) F
  12.     @Override
    ; g& z  B& A8 J: U. V9 V( \( Q
  13.     public void handleState(Monster monster) {
    & |) N7 W$ P: B
  14.         // Выбираем случайный тип атаки: физическая или магическая# {* s" e; t9 d) Z# j
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    : o8 M7 a  R; y6 t1 r% s. h9 W

  16. " |4 A- ~: J# Q! d& ~  J& q
  17.         // Логика для агрессивной фазы боя5 G! R+ H# e. B% j% |
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "   Q0 h) ?& F; h/ b
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! _# S+ N! D8 d4 N# y7 N( y
  20.         # c- f% I% V, Q: e/ o8 g: b& D( r
  21.         // Увеличиваем силу атаки в зависимости от типа атаки$ L5 |5 k( w% [5 W
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;4 f. C, O, Q5 A% Q9 x6 S3 r1 [
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    2 b3 p$ B3 R7 C$ [& m4 B" l% S0 D" [
  24.     }& h: c' a6 v) M' i# |
  25. }: H0 u2 u% C! P% Y4 [
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки2 V5 Y. ]. w& y4 F  H

2 S# {1 Y: k  ^1 T5 L$ F: ?, ^
  1. // Пакет org.l2jmobius.gameserver.model.actor
    / x. d: w# X2 k! ^& d
  2. package org.l2jmobius.gameserver.model.actor;9 V' A, S2 ?& N
  3. 3 X& P8 d" }1 r2 U; j$ m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;7 W# D" i) S# o8 p% J  F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( w1 ]+ {8 v7 I1 S) M) M  e

  6. 6 G7 P6 L  Y3 q0 b$ t
  7. public class Monster extends Creature {
    0 O* R+ ~0 y# h! N3 D. D4 i% I. j
  8.     private String name;, B, A" s9 C* M3 ]
  9.     private double attackPower;2 S9 s! ]: |  R4 |) Y3 n
  10.     private MonsterState state; // Текущее состояние монстра
    , P4 o- n/ p, B

  11. + N# Y* V) o& y7 G. S! |
  12.     // Конструктор монстра
    4 Q) B0 l# K% N" a9 F) U
  13.     public Monster(String name, double attackPower) {5 x4 b' l0 }( j- N
  14.         this.name = name;) }* a- _% g) f3 h% x. _
  15.         this.attackPower = attackPower;
    8 Z, b2 \5 ?4 b) n' C  F
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию! i# B" `# d+ v4 z0 h( O) {  r
  17.     }
    : {, X0 M( ^  ~- m/ Z+ v
  18. , C+ x4 o% Y2 @* }
  19.     // Метод для смены состояния6 B; f1 _5 p5 g* H( F
  20.     public void setState(MonsterState newState) {
    6 o  p2 H$ G& Y$ w3 K
  21.         this.state = newState;
    1 ^& ~# Q( l' W3 r
  22.     }! l" C5 A7 p# _' A- {& w
  23. 9 s7 t7 U* G- x8 O6 I
  24.     // Выполнение действий на основе текущего состояния$ C, v4 M& j! q
  25.     public void executeState() {
    / @$ q% E; f* w
  26.         state.handleState(this);
    - |$ S+ {2 [# \$ v: K7 }( d8 Z
  27.     }+ R5 V( o4 v7 k! L
  28. / |2 x- k  n& X7 l% c0 P
  29.     // Геттеры и сеттеры
    6 U& f. b; g( |9 U2 B) m6 z9 A
  30.     public String getName() {
    5 }8 s+ {% x8 J
  31.         return name;9 r& {6 t' t6 F) B
  32.     }  B' @0 p7 I" g7 _% A# L
  33. ' G! U6 U  ~7 \
  34.     public double getAttackPower() {8 r1 a9 T5 T( ^$ A
  35.         return attackPower;
    ; D$ k  A, H/ Y1 v$ H
  36.     }
    ! O5 k7 f' X( A% l5 q
  37. # i) W6 U3 _! ?. _7 j
  38.     public void setAttackPower(double attackPower) {
    ; |8 @( x; n* `* y' J' S" w) e
  39.         this.attackPower = attackPower;
    # L1 D4 p( L0 ]7 W0 S  {
  40.     }
    & j$ S' F' J. O" {3 y
  41. }* c+ ^6 W" [' M1 M/ ~
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 O- v) }. X/ I; }5 {. y
3 M4 d* u7 \0 L9 k# U. X, D9 D' X
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - c5 F1 |  }, K2 }. _/ I: T
  2. package org.l2jmobius.gameserver.model.battle;
    ' c/ K4 F, W6 l6 c, G" Y5 A7 t* E
  3. + a$ L9 b1 D  r4 k: M/ j
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 N, f# C* S2 U( \# U
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& a3 E+ K# v& J, D2 ?
  6. 8 ]" X+ M+ m* u: e* j1 Z
  7. public class BattleSimulation {2 H! X! g, l% k# \, h: a% W
  8.     public static void main(String[] args) {
    3 H8 Q- Q3 F" `* |) x. d
  9.         // Создаем монстра
    ; F3 b7 J" q8 ]$ C! }# |0 x5 [
  10.         Monster monster = new Monster("Дракон", 100);9 c, t& \  i7 d1 V7 M) V9 }
  11. 2 K; d3 h3 _) T7 R% t
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак) ]0 O1 E/ m: p& M1 c! b8 Y
  13.         monster.setState(new AggressiveState());
    " Q2 r# g2 i+ W, d2 y4 D, i" C
  14.         monster.executeState();
    . @9 @+ A8 [. J
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак% p% C& [( Y, d4 y. z& F
  16.     }% o8 ^( {9 }: X# j! `- y4 X
  17. }
    4 v; ~- A3 ~1 u& k" b7 ?( v2 X
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
, `# e/ s' B4 s2 {* p" aЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!. v1 \  q3 k7 t, c0 C. `( ]- ~
. e5 |  e0 ^. G2 g% |$ _
* N! \' a1 d$ T& `: k: E
: j% M* N+ `% X3 Z' C
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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