Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
+ Z+ ]7 B) R- `! g3 d! o( L; }0 `( X' u

$ }1 d7 ^* X9 Z2 I$ E$ vЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
9 ]& o6 G: x5 x. gЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
3 c* g' w5 i. q  c3 bАстралия ?  Y6 \, u6 A; n+ E

: o* z5 s6 Z4 j3 ^  _! r

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!: ~- B& _# |$ _6 U  T
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
( n' e- }( w( x1 j& t& Y1 z. T0 o$ `) e
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
4 m- e1 R% J2 C. b
AlexCoder опубликовал в 2024-10-16 18:31( K9 g6 O: h+ L9 r
День добрый!1 ^$ ^! z* Y0 Q5 q
В статье описано взаимодействие игрока с N ...

  O- [2 N: Z6 ~  H7 |' SДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . D3 y* N% r' h9 l) N
* ~" ^' H: P/ O; R3 ?( a
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра., A7 Q# p. O( v
& e: Q9 c# }( ]- i; k) K/ F9 Q7 ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ V' W+ ~) x/ O' j2 U
2 g  [2 j- H, I+ f6 F
  1. <font color="Green">// Пакет для состояний монстра</font>
    : t% B" c6 }1 o: z
  2. package org.l2jmobius.gameserver.model.actor.state;/ x0 f# u  T/ ~0 X
  3. <font color="Green">
    4 {+ W) U! y+ J
  4. // Интерфейс, представляющий состояния монстра</font>% w; _6 R3 [) t6 k! w+ g1 m( J6 ^: k
  5. public interface MonsterState {
    5 l3 ~5 H" O7 Z1 `) X
  6.     void handleState(Monster monster);
    ! Q/ l5 ~& Q7 q* ^
  7. }
    . ?, l1 `  B5 g8 f) @( V2 F0 w
Скопировать код
: D5 w: ]- [& }0 c& ^$ C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 U3 T' p3 x7 y7 ^

# b  e+ A$ ]) r3 V! wКласс для начального состояния монстра:
! y% R  C; [% T7 Z# u! t
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>; B1 }' v/ H" d
  2. package org.l2jmobius.gameserver.model.actor.state;
    # y5 x# G7 x5 e1 z- I7 g

  3. / c+ x0 R+ s8 Y0 B* Y( z( X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ M- P/ h. A6 d  s' W7 M; x# P

  5. . ?6 a/ s, o, J6 m0 ?; M
  6. public class InitialState implements MonsterState {
    ' `$ F9 A3 j7 M3 v& X# ^
  7.     @Override+ D$ R8 q% p* |) S
  8.     public void handleState(Monster monster) {0 O( h2 V/ c& G1 r: f
  9.         // Начальная фаза боя
    ( E. |. o+ T1 J$ B
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ s7 P% r, C" ]& F) e
  11.     }+ J# u- y/ u3 I0 G/ U! \1 H
  12. }% \4 n7 g* Z, L' d
Скопировать код

/ P6 R% L0 Q8 b( {8 E" [# P
# r% q. e( i# \0 E# S" g" \+ G9 D3 b  K- q
! L) V9 p  @( |. ^6 g2 t2 D. s3 D8 |
/ Z1 S: y4 T1 [
9 K) X6 K/ R$ k5 s7 U: w* d4 q
, I4 x- Q# Q+ Y' W! O* |, v
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 l. x; K6 g2 H7 P) h1 C

6 L/ R+ H4 I$ V0 i6 AЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
6 y. h+ F0 g7 t: k: P  e  |. Q2 `: r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  R  J2 q: ?5 V
: P% W4 R, X8 p. g) k, F0 h
  1. // Пакет для состояний монстра
    2 L, f9 t4 J" ^( {
  2. package org.l2jmobius.gameserver.model.actor.state;5 P, I( Y0 ]+ g" ~# t; t

  3. 3 V% P* {2 w) j* a8 m
  4. // Интерфейс, представляющий состояния монстра" e, t/ E5 k1 T, V7 R
  5. public interface MonsterState {
    0 g! h$ l8 |- Z9 E2 R7 t
  6.     void handleState(Monster monster);  {- S4 f& [% O+ ^+ v, E
  7. }- k' ^9 z: k1 d
Скопировать код

3 n% m* Y% A3 r  w% XШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
/ W; K- I1 a5 e" z& P) Q1 p
$ f' D7 H9 q5 R- i- p7 c$ sЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.$ D9 d- C$ m; W* Q9 l

& Y! P  r/ j. j% {* V: c6 s; `Класс для начального состояния монстра:" f5 ]  A+ j  @& N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 k# p$ `/ e( x: m7 i5 x& B
  2. package org.l2jmobius.gameserver.model.actor.state;: }/ Y) u, Z7 ], A8 p
  3. 2 t9 i4 e" u6 n1 L5 @. Y8 Q+ q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 h  h% z* Q/ H" q  J
  5. 6 q% g' w2 B$ B+ U1 |% b* B! z
  6. public class InitialState implements MonsterState {
    8 ~  Y: ~8 ~5 I4 |5 M5 K
  7.     @Override6 s9 W# N( \/ I, V! `
  8.     public void handleState(Monster monster) {4 Y& L3 b1 c. P& J- s1 @
  9.         // Начальная фаза боя- {" m% C4 g* L; r+ o
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, P9 s; @& k* d$ L' O! p) d  b
  11.     }  i2 W8 e, A9 {& T+ }% C! P
  12. }
    . G& v, g% m+ Q3 n3 `8 }7 m. m# g- b
Скопировать код
Класс для агрессивного состояния монстра:
8 _: }  H, z/ s* ^' R  u0 _
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / r' F4 D" F  U2 @4 g! x  d! g
  2. package org.l2jmobius.gameserver.model.actor.state;% g2 M- Q4 ]) y4 X& x

  3. ) k7 H% ?) X+ M. w# Z4 I1 f, s9 [
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 X  J0 `) i2 [3 w' Z; D# M

  5. 3 ?- ^- I+ q; i
  6. public class AggressiveState implements MonsterState {
    + X( F: l* w5 f% ^+ Q9 p
  7.     @Override: J3 K% l0 U/ ]7 U" s5 o% C7 z; b
  8.     public void handleState(Monster monster) {
    8 V9 d" C( m: J8 F% }
  9.         // Агрессивная фаза боя, h/ C  L3 y7 }: G6 f: H2 I2 g
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    2 }; S% f* l) [  M
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    . g( [* M; ?9 H2 V9 K
  12.     }' t% h) ?: s( ?7 O
  13. }
      R8 Y+ H9 @! Q  Z' T2 o' {
Скопировать код
Класс для финального состояния монстра:: k. R9 v% G5 D# Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 z" C/ X, t/ A4 n& K& e
  2. package org.l2jmobius.gameserver.model.actor.state;- x4 U; c  g5 ^' }8 [
  3. 9 h. q& f4 O. A/ ]; K# a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 V( q- F7 o) g& i2 }( t

  5. : |) }+ p9 k: i  ~) E
  6. public class FinalState implements MonsterState {0 \; k! z. ~2 F8 E
  7.     @Override
    ( g2 }) j. I1 M0 ^- o* g
  8.     public void handleState(Monster monster) {6 k7 G* A3 T4 V% C( [/ c/ j
  9.         // Финальная фаза боя
    $ s, a4 D/ R, [7 Z9 e4 Y; E5 m
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");( y( M" C( T: ^5 g% {% }
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% e8 }# ], a# M% C6 V
  12.     }* J7 E* S# x. h8 s& }% {* s2 Z
  13. }9 e: w: K' A! n7 e3 c7 i/ y9 e
Скопировать код
( X4 n+ M" }" {' `( h- L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 z4 U4 B; p4 C) M. Y' z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    + A8 x0 I# T4 y: `8 X% R
  2. package org.l2jmobius.gameserver.model.actor;6 C) {9 ~4 y9 l) S* F0 t! K

  3. * D3 C, k3 o$ v( k8 U" d* J, p
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" G! G- v! \) g/ B9 B9 a- \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  Q& o. O* N( _1 q1 X* S
  6. 7 }1 x0 i2 ^0 J0 j  ?2 y2 y
  7. public class Monster extends Creature {8 M6 j/ W& a0 g+ U. C( I' N
  8.     private String name;. G, C' E: @: U
  9.     private double attackPower;
    / Z+ F. |  i$ {/ t
  10.     private MonsterState state; // Текущее состояние монстра" h0 r# e$ P1 [5 W! h8 m
  11. * P& u! U1 j; S& ?7 [" x0 v
  12.     // Конструктор монстра
    ; ]! b" A. w2 V+ }+ C2 i
  13.     public Monster(String name, double attackPower) {- O- s; [3 F1 e5 n$ w
  14.         this.name = name;
    9 K$ e) V( Q6 b# j8 M
  15.         this.attackPower = attackPower;
    ) c' M" d1 R5 @2 S3 P' |8 N
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    * K8 P. U. w2 k1 x( ]. d# \
  17.     }- T' o/ b$ V, \# r  o) o; a
  18. + N9 z' l* i0 O% H
  19.     // Метод для смены состояния
    & J) i5 \* n8 j6 {) U& y: z
  20.     public void setState(MonsterState newState) {
    , I5 q: J  I, h
  21.         this.state = newState;1 P# ]) v: H: l' \
  22.     }
    9 g4 j- i5 U/ q* K" P% d* v

  23. ! p# n5 A5 H! P2 U6 c
  24.     // Выполнение действий на основе текущего состояния4 h- q. z& h3 i. a: P  g) X) j
  25.     public void executeState() {* \- @- `1 \# R
  26.         state.handleState(this);
    ; g0 B6 f  `' U" _, Z/ B
  27.     }) @( e7 J5 s0 M

  28. 3 @+ e! \' f5 B$ A; S5 f6 S
  29.     // Геттеры и сеттеры
    - d& P! c. d7 p" Q! c7 }' _, Q& _
  30.     public String getName() {
    * l) }/ x9 d% o3 Z# l/ l
  31.         return name;8 Q( z" F% b9 a4 s* D
  32.     }" P8 U+ R9 D; _3 {
  33. ' U3 V  Y% R! [, J
  34.     public double getAttackPower() {* p/ Z* j4 x( X& H! {% y% S$ k
  35.         return attackPower;( W3 n/ u5 J, A) |& ]: c: x' X) |
  36.     }4 ^) }1 J" U( ?7 @
  37. 6 [2 }" a9 a' C; V
  38.     public void setAttackPower(double attackPower) {" f* a3 X, _4 F; b1 k  f9 p
  39.         this.attackPower = attackPower;5 Q+ U& X! b$ s. |
  40.     }
    * I! W# Z2 a# E
  41. }& D0 J! s% y; X9 J1 D$ p' J
Скопировать код

4 k; r3 e$ M" N# `7 e* cШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
- @4 ~* Q; B1 F2 P0 D  ?1 G. _+ F
  1. // Пакет org.l2jmobius.gameserver.model.battle! X: f# G, b9 j0 S
  2. package org.l2jmobius.gameserver.model.battle;$ x* ~& W3 E  d9 |/ y0 N
  3. ) e, n3 a1 z: m+ l- I' S' M( D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , |7 M- C. o6 F/ w2 N
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    4 q0 K. o7 f# b" o/ L& z
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    5 W5 t* `& {5 |- L

  7. ( g& p% g2 l( f! @2 T, n  g8 {3 a
  8. public class BattleSimulation {
    + K+ T2 u9 t) Z' Y: p  W; c
  9.     public static void main(String[] args) {
    % d; A7 O) g2 z% z/ y
  10.         // Создаем монстра с начальной атакой$ [# J- x; Q% |9 l9 z. a* c
  11.         Monster monster = new Monster("Дракон", 100);" q4 m% `* M& W; U/ m# C* ~
  12. : h% i3 r, u6 n0 ]7 R7 z
  13.         // Начальная фаза, q& e0 r. o, r  S* b) b) }
  14.         monster.executeState();
    1 Y8 H2 j6 H! s6 D: j+ @9 q% o% h
  15. : l& i1 z% ^6 t
  16.         // Переход в агрессивную фазу
    . g5 f/ }: B. q+ ]
  17.         monster.setState(new AggressiveState());' |' N! H. L+ q; M8 O% t
  18.         monster.executeState();* y; L: e. b7 ~
  19.   Z0 i# b# X! n1 `# X1 V
  20.         // Финальная фаза
    7 i( ]& U6 o! U+ M; W9 q
  21.         monster.setState(new FinalState());
    : Y4 h' W- C; z2 Y! P
  22.         monster.executeState();0 N% @8 X3 M# ?7 G2 U! X
  23.     }9 A* S+ \; a  E6 m3 P4 u
  24. }+ g3 S. R7 K# t9 q9 Z/ f( ~
Скопировать код
1 V1 x8 H5 a0 Z; `  o
Комментарии по структуре пакетов и классов:4 T+ b* m: B; y* b6 E# D3 |
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    9 O1 Q  w) }; Z, f, J; U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
( r. k4 a$ w( q9 m( `Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ f' Q- {; E! w8 n
2 _" G/ S& M$ P1 c: R
+ Z1 T2 z% G5 J

9 [3 x, T/ g0 L; f- _8 [" i
& t6 g( C, q3 Z+ R; P7 Y! {2 J1 p* v& A6 ^& u. @

. ^( e. d. }8 w* n4 j1 p& r% \; O8 e+ H

" V/ `1 d6 }/ Z: @4 j
( G0 y+ M  J$ p6 c! V$ @" o( X; ]; B. H4 M
: v2 W) a+ Q& d7 ^* |5 q
$ N( r* ^. C1 f" D6 d, ?$ C) e

7 E2 g) o( q; F9 ]
6 G3 F. _# u" ^2 W* R
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 s) C7 e3 x; V
Для управления сложными взаимодействиями, такими как  ...

/ ~, A6 f- u# a/ }4 v+ JОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21. R6 C- T; x2 B3 y
Отличный подход! Использование шаблона "Состояние" де ...
& `# D( C: t+ R* `& O
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.1 ~0 o' U# g5 U6 l+ J( @% }. l
' S0 J, W/ @2 G1 a2 F
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
, L* u+ _$ F2 q0 P. y- x- W  M0 v5 \& s3 O
  1. // Пакет org.l2jmobius.gameserver.model.actor3 b/ H' i, _9 O0 o' O  w
  2. package org.l2jmobius.gameserver.model.actor;
    " O$ K9 k+ q! l/ v& \

  3. , s* |$ u- a' w/ a$ V
  4. // Перечисление для типов атак; }8 m+ I: @# [
  5. public enum AttackType {3 I( k7 `; X2 h0 m" x: [7 s
  6.     PHYSICAL, MAGICAL;! B# l/ N  u. j
  7. }* p  x6 y7 O4 y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.2 J  @2 l) x5 J6 k% y$ j: E
Обновленный класс для агрессивного состояния монстра:
0 }4 N2 ?/ I( o* n5 [
2 E  ^( n: _0 ?0 a# z# l0 u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 a8 v- }% H# }
  2. package org.l2jmobius.gameserver.model.actor.state;* I3 H0 k! H( s: \  Q

  3. 1 [$ J: L& I( G4 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 x2 u8 V4 j" |* f3 Y! C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    2 g% g$ w9 ?& \+ Q5 A* B8 q; a" I

  6. ) b2 i, \5 m: }3 o& Z  {4 R+ v( k
  7. import java.util.Random;$ n8 [; s( G4 i! j" Z# A3 q

  8. # w7 C% d: L( x$ k% V5 k
  9. public class AggressiveState implements MonsterState {6 P( \/ Z, K# ^0 V' q# b; L( d
  10.     private Random random = new Random();
    ) w; D  B) s: g5 R, _
  11. $ E$ u6 X$ B% T) i
  12.     @Override
      \; Z! i' T1 h# c) R4 a
  13.     public void handleState(Monster monster) {" f6 _1 K9 Z, [! B$ c/ p* L
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; C# T: e2 n8 ~6 @+ z0 G! N
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;. r$ P' f5 m# K( O. B8 w2 ~
  16. + `( L9 Z* m/ ~$ b, [3 m
  17.         // Логика для агрессивной фазы боя
    : B, |6 v; P+ O+ I$ }
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 7 Y9 I/ r5 ~( Q' F& y
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    # i7 p9 @/ f& K# R; A
  20.         
    3 D- k8 [5 M6 a" j4 Q7 t0 d1 T/ q# ^
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( k1 `- N0 s8 E
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    3 ?7 B* p( B3 `& e9 t
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);5 t- A5 U* {+ i/ A2 u% v% s
  24.     }  V) C$ A- D& J; c* h; V
  25. }
    * q& r. w2 D' H# n
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
7 v6 O- s! Q, K+ S7 L
( R1 E6 S( t; R0 C7 o+ ]# m
  1. // Пакет org.l2jmobius.gameserver.model.actor
      d7 N% J3 y# R1 |) @- R
  2. package org.l2jmobius.gameserver.model.actor;( Q9 c4 Y8 C& T' p9 b1 |

  3. + b/ K) U, W5 o. `$ G
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ' r  N- R, x3 p: `
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * n) K2 q$ {  y8 _* {) w

  6. 8 H- w" Y8 f/ C) c  O3 S2 I* A' a
  7. public class Monster extends Creature {$ |" K/ Y7 m" M# g2 Z
  8.     private String name;' `& R; O) `0 K- @+ Z  |( q
  9.     private double attackPower;# p4 S8 N3 S+ Y. F- a
  10.     private MonsterState state; // Текущее состояние монстра4 n! b- l1 \8 f; A" Q! s
  11. 5 d! I$ E3 _# U1 O$ |
  12.     // Конструктор монстра
    & g$ a5 N- G' P; x4 r0 @/ A) A
  13.     public Monster(String name, double attackPower) {
    4 @+ M. w' p: j0 ]; i! I# h4 ~8 G" `
  14.         this.name = name;
    7 y+ o1 Q# v; M) D
  15.         this.attackPower = attackPower;+ v- G$ y$ g; N# {/ c; k2 M  ]1 j
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию8 v( F0 m( R- a
  17.     }
    9 w( _* [0 L$ \% O+ j( B
  18. " f1 G2 y* J# @- \6 Q: d. l
  19.     // Метод для смены состояния: m7 N7 w" E$ M1 P) c
  20.     public void setState(MonsterState newState) {$ n- B( q$ a. L. x' P0 S! R- e
  21.         this.state = newState;4 v7 X) }; u/ f2 @  z; P' @
  22.     }2 w" l. g% |% J6 f9 a- p% z9 ]& G

  23. 3 d* ?" u, @# y4 D
  24.     // Выполнение действий на основе текущего состояния
    " S+ W$ v% ]9 Y" ^7 D9 g/ ^4 w1 w
  25.     public void executeState() {
      A! C* F4 C, S3 a, |
  26.         state.handleState(this);6 k; @; a3 J" M* q6 Q1 [; X  ?
  27.     }2 }0 I: C. f6 j0 E. Q+ ^7 {( Q

  28. 5 t. U* |/ L. w' L- S! x9 s
  29.     // Геттеры и сеттеры1 O5 ?% b+ u; w- p+ L
  30.     public String getName() {" M4 T& I, m, H
  31.         return name;) T( s& l( V' O) H4 V  M! _; A
  32.     }% M5 R1 w# F, l
  33. 8 w" A$ x( P. T' }4 V
  34.     public double getAttackPower() {) |4 t9 f0 w8 [/ g9 d0 V" G6 D
  35.         return attackPower;
    * i: x" o, {# ^: H- \! v
  36.     }
    " {2 s; {" y$ w* p. ^  }- V! a
  37. + [$ R. |% b6 Y1 Z/ T
  38.     public void setAttackPower(double attackPower) {
    + C3 E. v9 E; p5 f
  39.         this.attackPower = attackPower;
    7 Y1 {+ J/ Z$ X$ N- @& t
  40.     }
    " [9 H5 r1 }$ H$ m, G: ~" y: X
  41. }& _' @' u" g3 r5 c+ }9 g& }
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.: m; d# s! R" _: D6 M

$ |; m3 d5 C% c+ w# d8 ^
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # h4 t) ^7 q/ v
  2. package org.l2jmobius.gameserver.model.battle;4 x* u; V7 S- u( E7 A" L

  3. ' N& w' g' y( N* j/ s$ ^0 X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # z2 d( @0 K0 k( A1 e6 w& V" R
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;" e3 x; j6 L$ Z
  6. 4 A& w" R' m8 ^/ W6 Q& z
  7. public class BattleSimulation {
    ) w# c, J) u* U$ I2 S# o
  8.     public static void main(String[] args) {
    4 G" M& M/ `" U1 O; W7 A% J  _: J
  9.         // Создаем монстра9 x& ^; t& {% r
  10.         Monster monster = new Monster("Дракон", 100);+ x8 s# y$ j& C& ?
  11. ( ]1 j% @1 l! ?6 y/ N" e
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    7 ?: ~2 S; _; x3 ]/ W- S1 {
  13.         monster.setState(new AggressiveState());
    . V7 p2 J" W% P6 j' u% l% J
  14.         monster.executeState();
    , H- J' R* ?) I! K, k5 T
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    7 ^9 e0 D" [4 ]
  16.     }$ A/ ?5 C% p' d  U/ y$ ~3 q
  17. }
    - v3 V9 Y! Z7 ^, F
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки., }) U( A4 r4 P
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!+ j+ p5 K" Z7 R# f) c
) N% x  e) m9 n8 ~; K4 ?# b% u
: F$ m, A4 ^1 k9 k% _! r
% i# a- C/ m( \, _
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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