Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!$ f3 `9 J2 p0 K% E, Q: q

8 y2 {! {) @* v5 A5 ~0 Y9 r

5 j$ X) R* a" L9 g6 iЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
! J" ?3 W  v+ `* B+ x- L! MЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
% p4 @/ W9 w1 A7 g# `Астралия ?
  j& c: E1 A! d1 A- ]" |, M1 v( o8 y& i. A" M6 \% u

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
+ E2 j% `4 f* |" iВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, o+ }' U, e7 ~: F' P/ C3 j+ ^
7 P9 s7 n1 Q/ L- i  I: G  x
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 + J2 a+ K& z0 P1 Z% }' u" q
AlexCoder опубликовал в 2024-10-16 18:31! n5 \, u, N3 W0 \1 F6 a
День добрый!
# H( B6 S/ @) X7 ^3 V, ?В статье описано взаимодействие игрока с N ...

( g$ C, Q) _8 x# v* U* ~Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 @7 E6 O! C+ E+ N+ v
- Q4 w2 O* Y2 X# J7 T, DЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; n, t" c0 p5 O  B; O" ], p6 h8 Q/ G; \. g1 j. k! Z
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ m( i; N0 d1 s* Y$ J) i3 I- ]3 T, t$ V
2 p/ c+ {( e0 z; u, t
  1. <font color="Green">// Пакет для состояний монстра</font>
    : Q5 n1 i; f8 y: P% F; Y/ x
  2. package org.l2jmobius.gameserver.model.actor.state;; B/ ^& m" C( I1 v& D
  3. <font color="Green">
    % \. _9 L7 \; F
  4. // Интерфейс, представляющий состояния монстра</font>
    8 Z" |$ _$ b( B/ A9 z
  5. public interface MonsterState {6 Z2 ~) _2 Q9 I  a. {& m; r  h# Z# a
  6.     void handleState(Monster monster);! R8 O0 h7 m& ~
  7. }* h) @. N7 z6 C4 H5 k
Скопировать код
3 t7 Z! Y1 z& o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.( Z& Q1 L- z5 ?7 }8 @3 s8 F

( d; ?1 t, T3 S8 MКласс для начального состояния монстра:* R& Q3 C& j% b9 A1 b' E
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ' g" x; m6 T; y6 v1 m
  2. package org.l2jmobius.gameserver.model.actor.state;: J* K4 J/ j6 s0 P5 `/ m! v
  3. + x: o" G  y9 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + y- c' {6 q. `1 s. y! O
  5. 9 f0 j8 r( F) R' c
  6. public class InitialState implements MonsterState {
    - @# R* J  c$ {) Y( f1 J
  7.     @Override# m1 z. J7 h, t
  8.     public void handleState(Monster monster) {8 D" L- U& k: v2 |
  9.         // Начальная фаза боя
    / _& Y! d9 l2 Z8 h6 I6 Z5 y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    / G& ~' i: a4 [4 O
  11.     }
    # @: Z9 I6 ~% [% k( Q' i
  12. }
    4 |3 z$ B& r# B4 X1 n
Скопировать код
( h& X# M) N% y! o

5 ~7 }  @+ N( g8 e
0 ?9 A3 B; f9 ^  h8 ?, ~% w* K- N* z1 i
4 ?( l; X+ i0 g; x- M" o

$ m" E8 T3 a' X+ h  n' b  X
* Z' b/ T1 A( z! Y0 ]& T
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - K, k: ^  u$ r# T
( Q# |) Q" V0 t  d3 A) O6 v
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  z7 c1 G& H" m  z- \( o  p3 [9 G7 @. Y2 j2 B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ a( V. _& q  X' s/ L. V
# [; D  w3 M+ U7 m4 d
  1. // Пакет для состояний монстра
    8 i/ Z3 U3 R4 @0 J- r2 n/ g# ^
  2. package org.l2jmobius.gameserver.model.actor.state;3 o& e9 |& V9 f0 J5 n# \- A1 c

  3. $ s' j" w7 q) ^+ w7 E$ H) a  d6 x
  4. // Интерфейс, представляющий состояния монстра
    % u3 |) ]$ ?( d
  5. public interface MonsterState {
    $ r- {2 M  w8 u# G( S& j
  6.     void handleState(Monster monster);! Y- V! [/ Q. e/ O% D: G
  7. }
    ; J/ ]7 [" U7 T& B) M
Скопировать код

; n; ?4 Z/ G$ t( y% [% e/ BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" N1 I2 |  w) y- O$ ]' X( T% u/ n, j& b$ S$ P6 n, z
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, x: w1 E: [/ V7 h, [3 p0 s+ P' c7 Z! P: z- h% g% }5 m& J) R
Класс для начального состояния монстра:
9 A# m% c# G) J1 A  R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 B9 S2 G; A' ]% P% X6 @6 E
  2. package org.l2jmobius.gameserver.model.actor.state;
      ~6 p: h/ [! _3 v, v4 l
  3. 7 Q6 G4 a) F" u2 l2 _
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 j' n! P5 ^! `- n9 K: j( d

  5. 8 a8 b$ f8 f' G! ?; P
  6. public class InitialState implements MonsterState {' O5 c9 R3 a5 p/ q' m$ N8 {
  7.     @Override! u3 E' I* J* N  }" b  f
  8.     public void handleState(Monster monster) {' B; y  D5 m% f# M" O* H
  9.         // Начальная фаза боя
    . j1 R6 ]* t: ?/ q) z% f5 U
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " B0 l2 F1 T' K$ ]9 _; U
  11.     }
    4 o  d; q  W* n; ~
  12. }
    . J9 h3 d# W3 Q( \$ q
Скопировать код
Класс для агрессивного состояния монстра:
& `5 N. M2 A" `. o( _  f& W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 x8 d+ [& g: d9 `7 o: k. ?1 B7 K
  2. package org.l2jmobius.gameserver.model.actor.state;$ Z6 X8 n+ I# J

  3. * R  K# r" T0 g' T$ i# I6 k  D
  4. import org.l2jmobius.gameserver.model.actor.Monster;) D. C) \$ \# y" U

  5. , ?8 C1 u6 f( ^1 p! x/ d
  6. public class AggressiveState implements MonsterState {, ~  x+ j/ ^$ ?  I" ]
  7.     @Override* z+ ~" Z  ]8 K5 M! `# {5 e
  8.     public void handleState(Monster monster) {
    7 i5 |; J' T( i$ M* L. \
  9.         // Агрессивная фаза боя$ v5 l( B7 E) B
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' w5 o; X5 ^2 D. J0 t
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    1 h! A% l. |6 S$ P
  12.     }/ o9 |/ i1 }' x0 H
  13. }
    ' H9 A  i* A, n
Скопировать код
Класс для финального состояния монстра:* t& V% j' \9 W" L* w+ m/ m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; j* E& {- s) P, x- w( w3 Q
  2. package org.l2jmobius.gameserver.model.actor.state;3 T) H0 F8 I) Y+ r' B3 g5 q' y
  3. 8 |0 D2 ]! K: v/ f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 C6 o0 t5 o# {8 G5 @1 f
  5. - P" L4 u( n' Y! x5 w
  6. public class FinalState implements MonsterState {
    2 Q3 E* m' U5 D2 j0 R. J
  7.     @Override
    + |8 I. h# A. o7 s0 i" y
  8.     public void handleState(Monster monster) {
    , f" ^9 D0 @% V: ^! ]# b2 _
  9.         // Финальная фаза боя9 m1 \9 w- p/ a1 O" D# q) v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    7 r* f1 j8 u$ N+ U
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    . M8 k( ]3 H+ j$ c
  12.     }( N8 b. a# P3 H; O4 T
  13. }4 \1 a9 t9 f1 k. X: i3 F
Скопировать код
, w3 M7 B, o$ C7 d3 }- w
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% Z& k, q1 w7 V2 {
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 F) H' s8 b" @: ~  k
  2. package org.l2jmobius.gameserver.model.actor;; |7 R: V  o+ i. Z
  3. 7 x! S( o! C8 P; Q: A: m& ]
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;1 n; W$ |$ d  D9 v) S4 t( T
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 C( d# h% |! u- `& Z) G

  6.   n8 [& p. t/ Q! y" o$ o- R
  7. public class Monster extends Creature {- \# g( S1 U8 R( z' y
  8.     private String name;
    ! c( Z0 o: x/ r0 v
  9.     private double attackPower;4 I( J# @$ l* N% ?  |  S5 |% i+ d
  10.     private MonsterState state; // Текущее состояние монстра2 _5 {. h& N- P- k
  11. 4 o( e# G: r" k. ~0 l0 o* x+ Q* a' E
  12.     // Конструктор монстра
    * R9 @8 K& e/ `
  13.     public Monster(String name, double attackPower) {
    . u# L$ g1 t; Z
  14.         this.name = name;
    2 \4 @  o. W! g% e; g4 `% {
  15.         this.attackPower = attackPower;* v- y% c* T; T- M" B1 B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    3 ^5 T1 j) W4 V& L
  17.     }) T  l; p$ L1 e* `
  18. $ Y* n. w0 l2 ^* Q
  19.     // Метод для смены состояния
    % T/ I' H+ E  R" y
  20.     public void setState(MonsterState newState) {
      e; Y' K! i& Z% g7 ~1 p
  21.         this.state = newState;$ Q, {7 h( i5 O6 }/ [- K
  22.     }! \5 y$ Y1 ]) Z" Y- v8 h
  23. 7 ~) |2 O  k7 n* d' O$ }7 I
  24.     // Выполнение действий на основе текущего состояния( n. @; e( A, v4 D  z
  25.     public void executeState() {
    / r6 q9 t8 S+ w" w: F% H
  26.         state.handleState(this);
    2 j$ M3 n& r: d7 O. u* p
  27.     }. a! T' f4 W0 S5 n( h) w/ D
  28. 5 A5 l4 \* q8 m  X
  29.     // Геттеры и сеттеры; I5 x4 @2 G+ a) {3 {, Z" q
  30.     public String getName() {
    / J. a2 @2 J& |6 ?1 \
  31.         return name;5 s& E  _- g8 i' X. m  p
  32.     }
    2 y1 c2 _/ E; }2 k
  33. " e4 R5 C6 C- V% g3 }
  34.     public double getAttackPower() {
    ) y! Q) z; H. L+ b7 a7 r' H
  35.         return attackPower;
    . x' g/ N& b/ [" ~8 a+ o. l
  36.     }
    + q# \* @9 m5 r! W2 ~1 a! X3 X9 R
  37. 8 ]4 C: e* C* }
  38.     public void setAttackPower(double attackPower) {
    9 h2 e: `6 B2 |3 ^! \
  39.         this.attackPower = attackPower;
    9 E) N; M. I" \  T& Q
  40.     }7 y6 [; C( I/ J! U' I
  41. }, A& n# m7 X1 `
Скопировать код
7 h9 z/ Y) `- u
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
) e! O; ?+ w4 d7 a8 v) j- p( ?! W* q, B/ O% F) S5 Q5 k
  1. // Пакет org.l2jmobius.gameserver.model.battle6 i" q" m: s3 `% o
  2. package org.l2jmobius.gameserver.model.battle;( L1 g7 Z/ ?- F6 W7 {& Z

  3. % Q. k! K0 A# J) u  B
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ C& n  E  X! F0 \9 D* Y- N
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ) g: f- H& l, u. ^/ t1 P# l4 L
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;7 B& g  E% a+ r+ Q
  7. . h! T* h( e1 v. O9 z
  8. public class BattleSimulation {
    / ]& W, c. I. m* b0 @5 R+ j0 L
  9.     public static void main(String[] args) {: r- C4 n+ q$ ^; B" Y1 a
  10.         // Создаем монстра с начальной атакой2 \; T+ u: S& C& ]6 w
  11.         Monster monster = new Monster("Дракон", 100);
    7 a& S: K% |$ k. l

  12.   t. Q1 y# C: D2 o
  13.         // Начальная фаза
    5 N, M: P4 L  P" v* v. e' P2 x
  14.         monster.executeState();( g' g" i5 d$ e
  15. ( g5 O/ l' s% K2 c- F
  16.         // Переход в агрессивную фазу- S7 I& H, E3 }) M/ l3 @
  17.         monster.setState(new AggressiveState());( C& w* p$ c! K; t& w/ S9 d
  18.         monster.executeState();
    % ^  t; V/ `" y+ n3 Z5 J4 V% Z3 L( r
  19. 1 L& E5 w  y+ _' z/ Y# O
  20.         // Финальная фаза
    # a$ w9 {, I/ o/ q. ~- Z  V! Y
  21.         monster.setState(new FinalState());
    5 M2 a, W5 U6 l" P# ]  ]1 S0 ~
  22.         monster.executeState();
    + F- ~/ }8 W; k( R3 H: d# H$ q
  23.     }/ Q" f& @9 X3 g  O( v+ j' ^
  24. }
    " f4 O" j8 w+ s3 U5 c5 a  a! `- Y
Скопировать код
+ k7 g0 L* N" U2 y, ]6 c. V% l
Комментарии по структуре пакетов и классов:: W" ~/ k0 ]; F6 P, G' u4 i9 T
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.% B8 @; e1 b3 J6 R) h, h+ V2 F
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
3 \) b5 r' q9 F/ \2 bЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
5 G, X) f% y+ e; h6 R0 y: Z3 F, d$ t) `% A: t( C# m

, U# _$ W: S% H1 m; M, A% |; u& I' A2 ?

& o# {! H  L+ r& m; U! ]
: G9 R) o7 f7 b+ N6 j" |3 n& j# B  ]4 f. b$ F. G

0 G" K; W) r/ k
) }/ T# S  c" G8 G6 V4 {4 s- T6 o
/ v/ \) M- W% \5 U8 p9 v1 Z: u: ?- l
7 I5 A1 t$ \( ]: P9 R1 I  Y& C1 C* V' J1 b. A

6 A! z% l0 G- e5 ~, J
( T, f: p; ?0 i! X0 }9 T% W
: M- e) F1 U6 x) ]: n0 C
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:049 G1 a0 J' [& H6 |% |& o
Для управления сложными взаимодействиями, такими как  ...
0 l" S- U+ C2 G
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21, T4 k, ]2 ?. ^; W1 ?
Отличный подход! Использование шаблона "Состояние" де ...

% _" L, y& k! @# F( [Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
7 e# p2 h3 R7 }' U0 C7 W) h
: h6 [7 d4 k, ]; B( t4 V, k. uШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.6 z9 p0 J# z6 m9 l
- g4 V/ S9 ?  @' P. c
  1. // Пакет org.l2jmobius.gameserver.model.actor0 P; S- `& H8 D9 X# a# j7 f' c
  2. package org.l2jmobius.gameserver.model.actor;: I; M5 r$ K9 ?/ |
  3. 4 U! [6 c0 M. `7 [  r) z
  4. // Перечисление для типов атак2 m$ e3 S0 E. z3 {) g: y
  5. public enum AttackType {* l0 J/ e1 g3 b$ l, @! q5 s# S+ c
  6.     PHYSICAL, MAGICAL;( Q% Q2 I; n$ l0 j: b6 D
  7. }
    , r4 {+ T' K, s: t
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.. S- U% Q; J5 x
Обновленный класс для агрессивного состояния монстра:! ?9 J3 ]4 j  F2 o. F) r$ ?

9 E" \& p; l5 }( K4 O" _2 {: c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; T1 o3 n0 z, y6 ?
  2. package org.l2jmobius.gameserver.model.actor.state;! O3 L  z/ w& O* e

  3. 1 Y5 W) V1 O7 _5 E
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & x" l. O! p3 Y: ~" _  L5 M# q
  5. import org.l2jmobius.gameserver.model.actor.AttackType;# O& G  y0 _* Y0 w5 @; e/ H
  6. , A6 F3 q, `& p$ B0 V- A9 T0 ?
  7. import java.util.Random;% }# G3 F3 O2 m5 S: H

  8. 1 i- u3 ^2 x3 S( I
  9. public class AggressiveState implements MonsterState {
    % E" W0 L) }* ?/ u! E3 l
  10.     private Random random = new Random();5 O6 i% D( h; l
  11. . k# E" V" X7 r9 H% x. B5 B
  12.     @Override
    , V3 [6 V$ G3 ^" k, ]1 I
  13.     public void handleState(Monster monster) {
    % R& j; Q: _$ c' `
  14.         // Выбираем случайный тип атаки: физическая или магическая+ z8 l% f/ W1 h$ @  a& U
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ' |& v7 I3 U& c) H9 j

  16. : \# B6 C; m" [' O8 u  f
  17.         // Логика для агрессивной фазы боя) u% d6 }, P9 T$ H4 V5 {
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ! B' L3 v7 U4 g5 I& P
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");3 ~6 G  w  Z% Q9 ?
  20.         
    . f+ X# M! f- v
  21.         // Увеличиваем силу атаки в зависимости от типа атаки1 m1 ^% l* G, f3 S5 `% y+ h
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;# z: J  o. V( D9 ]; a
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    $ [5 w7 y, c3 ^  |9 ^+ I
  24.     }! N  [" j1 `$ R# h2 h! |6 H4 P7 S4 `
  25. }6 D1 g$ B7 E; \
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
! @9 B# Y, u, C  k
% m' N# F; ^% T( |! S
  1. // Пакет org.l2jmobius.gameserver.model.actor# v% \5 w% P: f, Y' n
  2. package org.l2jmobius.gameserver.model.actor;# |+ {6 r' x7 g+ s& [3 m0 m0 m
  3.   m" K1 N2 o# @# ]: `# m
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& ]8 X$ ]3 c( j  J# v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % K+ ?$ v$ t2 V% h- q
  6. 6 {3 f' h" C  K7 |1 }- r
  7. public class Monster extends Creature {
      A) |6 s( `6 v& r7 l
  8.     private String name;9 v3 A8 Y0 l9 P" p( j" x" {* J) I
  9.     private double attackPower;
    . x3 V* l6 T' r: {% h9 f) j% R
  10.     private MonsterState state; // Текущее состояние монстра
    6 e' \, P0 [8 p6 r- c. a
  11. 5 M$ ^1 J2 ]# l& p6 w4 j1 Q0 e
  12.     // Конструктор монстра
    4 _# b' }% @: X7 p
  13.     public Monster(String name, double attackPower) {
    ! v: n1 B5 d  b+ B
  14.         this.name = name;
    - J" L2 X: C: d& _
  15.         this.attackPower = attackPower;
    6 t5 q8 f; b. J& I0 g6 G; `* @
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    + i1 y  ~' ~" v! o: P+ G7 B
  17.     }
    # H* J; r% w- X" s! @7 _
  18. 7 V0 p  Y6 @2 k# R' w: M
  19.     // Метод для смены состояния' \" k0 s3 M( W
  20.     public void setState(MonsterState newState) {5 {5 Q  G( U7 |) d( r
  21.         this.state = newState;
    $ d' X9 e) i* A3 |
  22.     }4 J5 r( l6 y* U; r3 P; r

  23. : E0 L3 f) l3 ~$ ]& n5 N
  24.     // Выполнение действий на основе текущего состояния
    * K& P- U, z) |
  25.     public void executeState() {$ a. ^, J7 O& d  t! N# R
  26.         state.handleState(this);2 A6 d0 F  ]7 b5 q7 c; M
  27.     }
    ' T) {2 ^6 E( T) l4 t" v
  28. ( r8 {0 y- G$ X8 A
  29.     // Геттеры и сеттеры) Y0 h' @) @5 Z8 ?- Q6 U5 m
  30.     public String getName() {
    + T$ `$ i8 h( |3 w# Z0 Q8 I1 V
  31.         return name;9 _1 {+ f; D" Q; T' B
  32.     }
    1 f* q4 E! U0 w- C! O; G# ]! _1 J# R

  33. 5 L% I# G% i1 A: r1 F
  34.     public double getAttackPower() {5 Z8 ?6 n2 b2 v7 ^! o
  35.         return attackPower;
    & f* A, a1 w/ t: e( V6 S$ A
  36.     }
    * N/ }5 D, K6 S- a& C! ~; z- o
  37. 5 e- N6 G5 j% s
  38.     public void setAttackPower(double attackPower) {
    2 o, V0 I9 S# X7 M$ r" G1 {
  39.         this.attackPower = attackPower;- V$ O/ F% z" I; l3 U
  40.     }# E& g4 j: D& X2 b7 Z
  41. }$ k, g+ t8 W6 L2 y8 E7 N& e
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 g  v- U) x* ?. P9 T2 L4 {( q3 T1 F9 U, l
  1. // Пакет org.l2jmobius.gameserver.model.battle! }: I( {9 e/ Z# T$ b- k
  2. package org.l2jmobius.gameserver.model.battle;
    # {7 }1 N5 e, B* {  I3 H+ E
  3. $ l9 W; z. G' Z9 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 L' `- O2 G0 x$ @7 |# d" j
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 N% T$ N( T. H/ g/ p
  6. ' Z- i7 {) s( {# C: |
  7. public class BattleSimulation {) e& v6 [! L# g# e9 U  z
  8.     public static void main(String[] args) {
    3 j& v3 v" U1 w* r0 G0 ~
  9.         // Создаем монстра8 h! G# n0 J) k* t1 K4 V2 f& ]
  10.         Monster monster = new Monster("Дракон", 100);
    5 w; |" W% v* ?- ~' W

  11. ' x' ]- p, r" T3 @/ w& O
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ; S$ G$ Y  ]7 `: _
  13.         monster.setState(new AggressiveState());
    ; |" B, m$ o" P' j, S
  14.         monster.executeState();: b) V. w) L( r/ J- D! i
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    : M# B5 X2 c8 e. f2 G
  16.     }
    - r" [+ i" R1 D$ z$ _$ ^8 t/ |
  17. }
    7 K; J8 M  l+ e1 g* \: V* F/ a
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.7 V: l0 B; [2 g' A3 @& p9 [
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!, U0 B* |# k( J- v8 n
4 F% b& ]- T; U/ J
5 I* a' C8 _& Q
0 b0 k  I1 c- ~: y' ?" v
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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