Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
+ Y, B+ g  r  H8 J8 K
3 d+ J9 O! W; W- `1 ~7 _

2 E- L* P0 y9 V; SЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
8 d: x6 L& [8 h& \. C! v& zЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!7 S" J' L4 E" O( @8 v) K4 L9 k
Астралия ?
# c! `; j# m6 n+ B: @  n! G9 P9 j# f
( e/ T! E2 |9 B" \) A

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!8 X+ u0 k3 W* X  A, d# o
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 W: c, ^6 y2 r& ~& E5 Z* a! A. \; Y9 }5 |0 G
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 / e) m: U% h% B: t' A- l
AlexCoder опубликовал в 2024-10-16 18:31
% f$ D; o3 Z& Z9 T6 }( \" b9 W# qДень добрый!1 _# S1 `% a& _3 ~) a. \1 P
В статье описано взаимодействие игрока с N ...
) k3 t' E/ r( u* A
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 H, Z! g+ J, @' G
1 ~0 E2 L) w; z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) G4 f5 K6 \+ N* J% I3 u

" ~" d3 L" G% m& o2 E9 D" uШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! {- R6 R9 o4 n
) _4 }8 x+ l# }( p- l
  1. <font color="Green">// Пакет для состояний монстра</font>1 b& ]3 A9 y( S8 `( k
  2. package org.l2jmobius.gameserver.model.actor.state;
    % t. H2 a; L# z( ~( b- Y. P9 L& O
  3. <font color="Green">
    7 |3 b, ]; Y5 P; [' ~* i+ g. ~
  4. // Интерфейс, представляющий состояния монстра</font>; y5 `; ^# z" M0 w
  5. public interface MonsterState {
    % c1 x. b& Y; P! g3 s
  6.     void handleState(Monster monster);
    7 x4 S2 I/ c0 j. K- P0 Q8 O) @! B" t
  7. }0 r, s7 F: t' J+ d6 F
Скопировать код

3 K- d1 d8 k) j1 OШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) l* [2 ]! `" z; c8 c4 `' Q- ~+ J, a! n& W
Класс для начального состояния монстра:# ^, |* g, L+ K: p" L
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* c& `' K  {) O
  2. package org.l2jmobius.gameserver.model.actor.state;" N! x& F6 a1 l1 N5 O
  3. 7 b+ ^& K3 m$ G; d5 Q! P2 l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( g; x+ D  r8 k2 A7 Q- V8 D. [

  5. " @' y% I8 L9 Y2 M6 K+ z( Y
  6. public class InitialState implements MonsterState {
    / T% g0 W! N- T6 C7 e, B
  7.     @Override
    6 ^2 U7 f  w! B( a! B1 Q
  8.     public void handleState(Monster monster) {
    2 @  Q, E+ `! H5 i6 V) i, y
  9.         // Начальная фаза боя
    # F4 x& q& [& _* B  j
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ) W; o4 M, ~1 Q9 W" ~- U. R/ m6 N
  11.     }; W+ L; x3 x8 f
  12. }
    1 V& H0 x# a+ ]) G* q
Скопировать код

+ g6 U8 \- H/ g) y" l
7 Y. B" l$ U/ u- o" g
8 _, ]5 C3 a6 K6 _: _% n$ ^1 o0 |1 I

( ]7 b& {; L- G$ y2 [
- }0 ~2 i  I5 ]9 d5 B, O# Q8 T5 N' ]0 r, t! u8 T
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   @- x+ I- l' B* J% c/ C

" {9 Q) w2 k7 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ B6 \5 d' H! W
* w" V2 a1 {6 S$ k8 F3 ?. S# t2 RШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., b7 w3 S& ]; d$ h

  G% ~: |+ a5 t) `
  1. // Пакет для состояний монстра
    , ?, Q8 b% n9 X' Y0 R
  2. package org.l2jmobius.gameserver.model.actor.state;0 |8 v" z/ j' A9 g3 Z0 R3 F

  3. ' f' |2 g( Y6 ^, T( o+ b
  4. // Интерфейс, представляющий состояния монстра0 g/ C' c) B9 G/ s. V
  5. public interface MonsterState {
    - I' Q  q$ c3 G5 K
  6.     void handleState(Monster monster);/ {/ T: u0 n/ m7 i; r
  7. }
    & Y% u9 |2 ~8 y6 L2 v! G
Скопировать код

+ e( r$ l( z5 `7 ?Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
  z8 S4 |$ b- M: l. i
( d" c% G$ z; n" n# u8 c- V* QЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
; \) D/ m* V& Y1 u/ H- R' `3 z; z
0 O' F7 Q6 O- b- G+ }% D: u, M* M8 lКласс для начального состояния монстра:
3 }) u2 D6 G' J( E) B2 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, ?9 p. k9 g* `( f6 u1 w
  2. package org.l2jmobius.gameserver.model.actor.state;" r" U6 e5 s% C4 B

  3. / h% f. \7 N- S" U
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ E* Q9 `6 @; Z  ~, a6 z
  5. # M2 `; L3 |) K$ o* X& [
  6. public class InitialState implements MonsterState {
    3 R: l" e6 k( |* b, u1 p
  7.     @Override
    5 j5 P: T/ X2 `1 A4 t
  8.     public void handleState(Monster monster) {
    9 p; g8 ]% Z( X( Q! p2 f
  9.         // Начальная фаза боя4 Y" F: @  l0 B) {% [! u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " }  T$ F9 C* [- C
  11.     }/ T% Y! K1 ?, k4 }! ^
  12. }/ ]2 O  A9 S1 o0 f" S
Скопировать код
Класс для агрессивного состояния монстра:
( i! x. F) V( X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 u  @" I/ z- z
  2. package org.l2jmobius.gameserver.model.actor.state;# _5 m( V8 q8 e+ R
  3. ) u9 y: o. b" t" O
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 U6 I: b  y& B/ {

  5. : [* |: ^" \8 u
  6. public class AggressiveState implements MonsterState {
    % `4 C$ {0 G% }' A( m9 J
  7.     @Override  G* ]6 K. q5 G% ^; ]1 I9 x3 C
  8.     public void handleState(Monster monster) {
      F# i+ D! o4 q
  9.         // Агрессивная фаза боя# J. m6 b0 s$ p. q, U& j8 u" a
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    4 z3 D* z; H0 ^2 J
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" s# K9 o2 U7 H) @: ~1 `$ B% ~6 v
  12.     }: h2 ~: U6 }  V7 ^3 @2 _5 W
  13. }
    ! i1 H  k4 }9 l/ w2 `
Скопировать код
Класс для финального состояния монстра:
) O3 h$ r3 [# Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # u5 n; t* Z7 J; j! `
  2. package org.l2jmobius.gameserver.model.actor.state;/ b# F6 K& k9 V! G) b+ T# x
  3. 5 m" s% @) A  C& h5 G' }: j
  4. import org.l2jmobius.gameserver.model.actor.Monster;" \+ T& A( ?9 H% ^" f* w

  5.   @* W" B$ }, Z$ L/ y
  6. public class FinalState implements MonsterState {: I& |7 U, L' E3 K0 `8 @# `
  7.     @Override$ f2 H  d2 j9 |* b* K
  8.     public void handleState(Monster monster) {& n9 J# R( \' r+ b4 x: r/ o
  9.         // Финальная фаза боя" O( x* _# A* d% r+ m
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");0 m- Q' `3 a9 y1 j
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    3 l& C/ u. P/ l: I1 g1 W8 W, v
  12.     }0 e$ X9 z) p0 z; a
  13. }" F7 V* S; @; z6 [5 L- q
Скопировать код
) x1 F- }  z$ x: x) x
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; P# u" c$ U" N+ g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : m3 d+ {2 ?( B, p+ k, A7 e
  2. package org.l2jmobius.gameserver.model.actor;8 W( J+ Z' k. n& r

  3. / m  }7 @6 \4 n1 }+ r/ m+ z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( U# Q8 j. D5 K: x2 `# e$ y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    7 g1 @9 G4 w6 f$ h9 ~
  6. * }3 q( y4 \7 G6 t6 w- ]' Y8 _
  7. public class Monster extends Creature {
    $ q8 ?7 C3 f. \$ r1 D% a
  8.     private String name;
    . `& @4 z, s! V8 i
  9.     private double attackPower;
    ! M$ Z! q1 J3 B& v( `; d- @
  10.     private MonsterState state; // Текущее состояние монстра" q4 C# L! S. Y7 K

  11. ; @0 S; ~; D& R9 ]+ Z
  12.     // Конструктор монстра
    ) G$ f) t+ t' V7 S' }/ _/ m
  13.     public Monster(String name, double attackPower) {0 r2 T% {7 I/ N0 `, I9 i
  14.         this.name = name;
    ) ~' p( `* D. }) Y0 [
  15.         this.attackPower = attackPower;( x" I) z: p  @$ Z
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    7 E; G/ a6 @9 L; D" P/ w
  17.     }8 o' ~) M1 Q  }& ?  @- b* w
  18. # O7 O& n# \% {4 U1 t
  19.     // Метод для смены состояния0 n4 V) O$ C9 Z0 d' V
  20.     public void setState(MonsterState newState) {$ l, f0 |8 _5 F- a$ J) q) _* Z
  21.         this.state = newState;
    ! @7 n. i" s8 t+ C4 S
  22.     }/ l9 H6 i3 |  g5 _7 w

  23. - O4 Y( w% |/ c7 {  q9 N
  24.     // Выполнение действий на основе текущего состояния1 i# w# ^* Z, s4 S, y
  25.     public void executeState() {
    & M; ^1 f5 A( ~' d
  26.         state.handleState(this);& `: d' W7 E1 A  i
  27.     }2 }  p' d  @& ?9 e( q. U
  28. + o3 G+ o) f( y! N; Z0 Z& O
  29.     // Геттеры и сеттеры2 C) D) M. `# P5 h. n
  30.     public String getName() {
    " `' j% l" t0 w. Z7 r
  31.         return name;
    2 t4 C! \. h- y2 q% \# T' n9 n0 j
  32.     }; [, F/ _" M+ f

  33. / t( a* ~) i! U; @; D
  34.     public double getAttackPower() {& H% z# L  M7 Q0 c) x
  35.         return attackPower;
    - R- ]( Z5 |6 L0 D
  36.     }
    5 K0 {; O4 ]/ F" y, Q7 o

  37. " @" \. x8 Y, j: H( g/ q, L
  38.     public void setAttackPower(double attackPower) {
    % ]3 I! a6 m6 n' G1 e
  39.         this.attackPower = attackPower;
    5 L7 \4 r5 `3 s! d- q# f% r
  40.     }* C9 E5 |- q  k, D, b: V2 V
  41. }
    % K' A, W+ g. l* E$ G& G
Скопировать код
" e; s: Q0 o$ n# e: [
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
, i, i4 C( K# N9 R) f4 h6 w
/ I+ p8 q: s  q  T" z" O
  1. // Пакет org.l2jmobius.gameserver.model.battle& R# q: p) O! r: `
  2. package org.l2jmobius.gameserver.model.battle;1 |/ D% |  w% L; m4 O, D3 [

  3. % H& V* c2 j" {: {# ^% R
  4. import org.l2jmobius.gameserver.model.actor.Monster;- M  @. ~# g! _: r* b, c3 u  t5 v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;* ]2 d% {' i* c; X0 S
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;0 Q; ^1 Q3 g5 r  ?* F

  7. & k! d7 Z- |( c" Y7 w" n; f; }
  8. public class BattleSimulation {9 ]: E) X& X, A
  9.     public static void main(String[] args) {
    1 t/ G9 b$ e2 R* d$ j
  10.         // Создаем монстра с начальной атакой* x" u2 d0 Z9 K/ Y, F" ^& d3 b
  11.         Monster monster = new Monster("Дракон", 100);5 X% I/ y/ i* j3 E0 d2 N9 n* i) N0 w" x
  12. , r6 w! N5 W) L/ Q
  13.         // Начальная фаза
      N  X2 j4 g9 [
  14.         monster.executeState();; Z8 l2 v8 U  Y2 n& j4 ?& E

  15. ' H3 f* V2 u. ]6 X6 c/ S% J
  16.         // Переход в агрессивную фазу* Z& `2 Y! _9 _+ r! ?" }
  17.         monster.setState(new AggressiveState());
    ! _9 q+ t3 Q$ ~) ?( v4 X8 P+ p
  18.         monster.executeState();
    ' T* H5 \0 X3 u1 w
  19. ) e& _; e0 [2 I
  20.         // Финальная фаза
    1 K7 `- r' H$ C! K0 V% h
  21.         monster.setState(new FinalState());
    , ~# i2 b  ?: m9 S8 d
  22.         monster.executeState();8 v3 @) O( }' B& O( i
  23.     }1 K9 [  o3 Z, a& ?) ?& P+ I
  24. }% ?, x$ @( c' \/ ^- ?6 l, h
Скопировать код

8 J! v* F. x. v/ D, H' wКомментарии по структуре пакетов и классов:
# `& n" s2 ~4 L
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.' X) r8 z9 d; U0 ^
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( T: l2 [  W" `. v: S
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ n, N, d7 L" J- Q; h( e+ ?. d
: I) Z4 g; n% O3 w5 F
8 K. e1 j& i/ }( K3 R+ M' r% Y0 G3 `; u' s6 R
/ n9 n* P/ r1 @7 n( ^1 s2 c% A. _

4 J. U  P, M7 u: V, @* y
1 ]  C% h/ n) A0 h5 h
$ I+ W! e3 ?9 N- z/ y
. q7 E( C0 x5 P; c
. I9 n# y6 _; A+ z6 {5 G! Q. Z5 ^3 Y) l; j  ?! A/ J! W$ [

' L9 [6 i* o' u( Q& Z8 W# e4 Z2 g5 b3 u9 [0 K5 z
" Q) v" G5 n* v4 H

% M. E3 B* \* R' ~, H5 X* E, w$ w1 j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04- C- l9 l, ^3 C5 v* X
Для управления сложными взаимодействиями, такими как  ...
& y, G  u% Y/ b
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) G, P* d" f3 ]! P$ B% w. |6 L
Отличный подход! Использование шаблона "Состояние" де ...

6 X  E/ p3 v- S) Q2 KХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.  Q! Y. D; Y$ i9 w6 o
) v& G0 L' \) H  n( H9 g2 J
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
: j3 s' X2 N6 X* y4 L, R
; X* B" P5 b! `0 G
  1. // Пакет org.l2jmobius.gameserver.model.actor( |: s: L0 [; ]' Z6 y
  2. package org.l2jmobius.gameserver.model.actor;1 E! A+ x# v7 n  y0 @

  3. ( ]4 \% D. z3 G/ b
  4. // Перечисление для типов атак
    0 r0 s8 I. e4 H7 F% H( T7 h
  5. public enum AttackType {: l! R( P5 |+ a  y) L8 g" n
  6.     PHYSICAL, MAGICAL;2 w/ e2 f8 ~2 {4 {
  7. }
    # G' n/ ?, E4 O6 O' D- P# P
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.& O, E% ]  }0 U* ]+ E8 d
Обновленный класс для агрессивного состояния монстра:1 {- e9 @$ ]& s" m

0 T. i# r8 S, y$ K' I) u7 j9 Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 V" |3 N9 M5 Z, ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    , u6 R$ N/ {- p# U0 l

  3. + Q1 D& O$ D; X. [; ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 w9 I7 P5 Z. J% h' @- o( @3 M
  5. import org.l2jmobius.gameserver.model.actor.AttackType;% z' r- W* P' J+ f/ S

  6. ( C5 e7 Q/ W+ |
  7. import java.util.Random;. Q9 h1 m$ d: N* }) ~

  8. ( X$ C0 ?- {- l8 w3 [, @/ E
  9. public class AggressiveState implements MonsterState {
    8 v/ Y  V2 @: C- s% a8 L
  10.     private Random random = new Random();) x6 j% x+ F6 E8 o1 k6 |
  11. & e* l$ u7 J4 ?6 w: f' H
  12.     @Override
    & V+ g* W4 G* q! ^1 X$ D& M
  13.     public void handleState(Monster monster) {4 z# {0 Z2 H' B9 T  }9 z) l8 L
  14.         // Выбираем случайный тип атаки: физическая или магическая- e" X' s3 ^. k# r; c+ J
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
      R5 t0 S6 [1 f- h9 V% G

  16. ; I2 N) M$ S, K, p1 q3 w
  17.         // Логика для агрессивной фазы боя) m/ A# b* Z7 _
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    2 `1 I. E/ H, A/ n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    . s; k1 f7 t7 n; \0 s7 F' Q
  20.         
    4 v, q+ z* r( Q" g! h
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , `) H+ G4 ~4 G/ }" A! c, T* T
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    , D* p6 v+ u7 p- g( M; j& y6 ~9 P
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    ' ]* k. U5 S2 H' z" h
  24.     }6 G8 O% N9 N& V; n% w/ K$ ~
  25. }8 C3 N8 a' J6 G; k- G
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
% \) e: p9 i" @
4 B0 J0 y/ s9 A, S( ]
  1. // Пакет org.l2jmobius.gameserver.model.actor. ^0 K# R/ v2 R
  2. package org.l2jmobius.gameserver.model.actor;2 F  t% N5 F: J  Q& ~* O

  3. ( c$ ]. E2 l, P+ m& T
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , [# q# \  m& X/ x$ y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
      S+ [4 J+ N/ j
  6. - n6 [0 ^3 R8 j
  7. public class Monster extends Creature {
    % |- j0 {2 ?0 T) E3 D8 \- B
  8.     private String name;
    . ^6 h! E6 |$ I" }+ l3 O
  9.     private double attackPower;& T, w" O% V+ B# x6 H
  10.     private MonsterState state; // Текущее состояние монстра
    1 f5 G$ e+ D9 k5 ?( T  G4 j9 R& Q

  11. 6 m3 g, v& M- u
  12.     // Конструктор монстра$ j) e( r: @5 j' ?  V, z6 {( E
  13.     public Monster(String name, double attackPower) {: P  h8 |) B3 S/ I* ]% @/ O
  14.         this.name = name;
    . V8 j" C5 Y2 D/ F$ I! I
  15.         this.attackPower = attackPower;
    . o4 U4 _* T. C# A* p6 h
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    1 ]% m- x; p$ H# a0 }, v: H1 o
  17.     }' F$ K8 C0 Q5 \5 t7 b
  18. . f* d% M) Q1 A8 ~
  19.     // Метод для смены состояния
    + ^* \% t* n$ S; ~7 y9 G' F
  20.     public void setState(MonsterState newState) {
    + G7 l3 R7 |& O/ B- O3 `) U  Q
  21.         this.state = newState;$ R/ ]7 Q- O) z% y" d% @
  22.     }* \' |# m" x) ]- @! Q

  23. 1 h  S0 S2 Q: E2 t6 l! a
  24.     // Выполнение действий на основе текущего состояния( o% T: ^% {" e' m5 U$ I  \
  25.     public void executeState() {
    ! `: _% K' E6 V! [4 p, O
  26.         state.handleState(this);
    * W& X3 Y* k5 h4 ^( r
  27.     }
    & N2 j' |% [' N9 {/ e( A3 ?: u) y

  28. & i+ h6 i; Y5 s0 I  T
  29.     // Геттеры и сеттеры. m6 t3 {$ U. u6 I3 D
  30.     public String getName() {/ v5 A+ V+ M1 z& I9 S
  31.         return name;2 Y1 L' I; R/ e0 N3 T6 t
  32.     }' [5 J! ]. x3 L
  33. , W; I, W- M/ p3 C
  34.     public double getAttackPower() {6 I* d' O9 y( o
  35.         return attackPower;
    5 u% W2 `* Q1 W
  36.     }
    , ~6 m$ P( E2 b% f
  37. ' ^5 A9 p( K: m1 L( P# b* S
  38.     public void setAttackPower(double attackPower) {
    ; K. e4 Q$ r* b4 P/ z, }
  39.         this.attackPower = attackPower;& {" C7 C4 i5 N7 e
  40.     }
    ( _0 g/ t3 |3 b- @5 k* n% P
  41. }9 E/ v1 ]4 Y& X2 b# F7 J
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.8 h' I, U# d: M8 k! s& z( c
) S4 y- T3 c. \1 ~. S, h8 |  ]9 y9 U, E
  1. // Пакет org.l2jmobius.gameserver.model.battle& ]1 H+ O+ p" h5 ?
  2. package org.l2jmobius.gameserver.model.battle;
    0 ^0 a+ ]0 k: Z6 X2 A4 V4 p0 o8 g

  3. % B6 W) \; F& c( Q3 B. S+ }  F
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : X$ t0 Y: Y$ X7 n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;3 q- l7 ]6 h, D3 }, D( t) R. e0 K& B
  6. : }# K$ Z! D" x! v
  7. public class BattleSimulation {
    ( `9 n+ x7 m6 i, O- \
  8.     public static void main(String[] args) {5 W5 z8 Z. N" d6 m' [; h7 u. j
  9.         // Создаем монстра$ q! a3 ~& @6 V7 J- B, K% k
  10.         Monster monster = new Monster("Дракон", 100);: I; d& }' s0 _+ S

  11. + `8 }/ G  k# B$ _
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак' j+ A# |3 i* l7 S* C8 i6 Q
  13.         monster.setState(new AggressiveState());
    : n7 }2 V" F! \% D  p
  14.         monster.executeState();
    / {& a+ |3 P+ [6 s
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак& {2 K; A& r+ B  }7 a$ u# r- @: i
  16.     }  s) {. h2 I% E4 G
  17. }
    3 X3 O1 W# e$ S$ F' _
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
  K2 t/ y0 M, s$ @: o9 `Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
/ g! U. V1 t; p. y. L" Z
9 U2 e" `. i+ J) X; Y6 [1 m& g* O
5 ?1 Y: M6 R4 h  L/ v) l& a# ]8 M
) {9 P; b3 b+ |/ }+ [% P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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