Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
) g) m0 L) r: J5 b: [$ T- a- q* f0 _
. T* q( I! N! N6 \0 q, R
& w# x! x. e. u. g
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.0 r4 _; G3 A' @0 X3 E" S
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!/ E! u1 W" v: P1 W. W+ X
Астралия ?+ \# i/ x9 o0 ~4 j

3 I9 e1 E/ B. N' n

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!* E+ U$ h- i# j. v7 ]# n9 _! ~4 O
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
. h0 n$ r" S+ Y. p( _$ C. M5 u( e
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 + g2 m% k8 @1 Y/ y# e0 H; i" ^
AlexCoder опубликовал в 2024-10-16 18:315 d3 H/ ?* i) k  Q4 w% m8 }
День добрый!& q, ]! n, U( d/ C
В статье описано взаимодействие игрока с N ...
1 @4 j! Y0 z1 R1 k: [' {
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
0 O: q: e% _6 ?5 b
7 M) t8 ]' R# W6 s# KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
9 d& I+ j1 o! }( h
6 S; x. K$ I# fШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.1 y6 Q# ^& ~' ^+ z7 C/ I- k) w
* R2 ]: O5 \9 W4 U
  1. <font color="Green">// Пакет для состояний монстра</font>
    8 R, M( P" Z  n5 x; t2 q
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( o1 c6 o: ?7 Y! C
  3. <font color="Green">
    7 D5 C. i- O" e: V, ~, g7 Y
  4. // Интерфейс, представляющий состояния монстра</font>% x$ G7 }0 X  t/ W
  5. public interface MonsterState {4 K0 U/ g! [7 J" E3 o! m5 P
  6.     void handleState(Monster monster);) a2 I! v, F( j# V
  7. }
    / v" V) a1 t$ k3 a) ^
Скопировать код
& D: F3 v9 |4 P; o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 G2 Z, I5 w$ G4 a8 t
" C3 u- C9 H" `$ e2 p
Класс для начального состояния монстра:0 v) |/ m# k0 R1 X6 Z  l7 ]8 a
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>$ a5 j: F4 |" m- O, E6 K
  2. package org.l2jmobius.gameserver.model.actor.state;7 ], J9 u5 u, Z! w8 V( G4 M1 \- p) U# M

  3. 4 V( D$ _8 k6 A% Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;* e  H' r# l0 l4 ~
  5. ! b0 L0 v7 E- `  m, W
  6. public class InitialState implements MonsterState {5 ^0 z1 x' g3 v% B$ o- y* F; s
  7.     @Override
    % j- Z- n6 u1 `' _7 i+ p+ v
  8.     public void handleState(Monster monster) {: o$ u5 I5 A0 L8 I$ N3 ~" S
  9.         // Начальная фаза боя7 @. O+ w" g9 S9 V$ z5 t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # c. g, A, N$ V! a3 T0 k3 I: s0 a1 \
  11.     }
    8 X1 f. Q, |& I( O1 W& ~
  12. }
    / ?2 M+ T6 O9 }" A0 F! W. I
Скопировать код

4 j" y/ P2 W# \0 c3 b
6 \8 n. W$ }3 l* p
. B8 e' d( h5 E. ]; c' _3 D; a" `& n' l

# T0 W4 q$ h" b, G1 J; @9 X2 P) T* y, n) q- p+ r: x

% E7 P4 z2 j3 p
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" r( F$ r$ f7 \4 q8 L
5 w1 N" q) p8 y3 N/ p" mЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; G# v" d3 {- @. M/ G- u' B
( R4 `9 w2 u% ^4 ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 z0 b; C1 ]- E$ J  ^" P1 ^
0 o2 R: ~7 i4 z5 N% g5 ]3 J# U
  1. // Пакет для состояний монстра
    - y" X( E+ o( p" T
  2. package org.l2jmobius.gameserver.model.actor.state;* O* v! e" T# ^5 h' z. q
  3. 2 n8 X5 L! b8 k  G! H- M6 _0 s' F
  4. // Интерфейс, представляющий состояния монстра/ h! W0 ?( A9 x6 F
  5. public interface MonsterState {
    * v9 J0 P. W+ ?7 T& h+ E! s
  6.     void handleState(Monster monster);
    ) K- `' ~+ i- M  t# _0 `) P
  7. }
    ) ?- u& t9 t' ]4 i7 [
Скопировать код
% z. Z6 m) ^9 ?( {9 \/ W
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# [& b" A7 F. i- P* p2 U! S7 a
" P# ~0 K3 a& t4 d9 aЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ L; c* o  E% {$ K
- B( _) L, \. o- A% M( M: Z) J7 HКласс для начального состояния монстра:
1 F' h) d* z' [0 o+ S* C7 ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % }3 H, I0 a* f8 W, y. A
  2. package org.l2jmobius.gameserver.model.actor.state;" ~" _; U$ v: R/ R0 c6 r
  3. ; k+ B& G8 t! n0 h. ?/ N
  4. import org.l2jmobius.gameserver.model.actor.Monster;  \) f8 j/ B% W6 Z- q0 A; a
  5. * C6 L3 i  {8 d. v
  6. public class InitialState implements MonsterState {% A, i) s7 u! ~- m
  7.     @Override
    0 W3 G& }5 p1 E1 h; T2 Z
  8.     public void handleState(Monster monster) {5 \7 X5 O3 V& _/ b9 @/ I8 x# T
  9.         // Начальная фаза боя# w' R1 I/ J9 A, J% A
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! N4 F- G; a- K, x0 W4 _8 C
  11.     }  r4 T6 e6 n  o8 L2 ~
  12. }
    ( t1 V! B7 L: ?6 i  a7 v0 ^$ U
Скопировать код
Класс для агрессивного состояния монстра:
, l( F* z% F2 O# h! C
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* S% c' _) R* \' i9 G6 O1 U- h
  2. package org.l2jmobius.gameserver.model.actor.state;6 y3 t3 q: H6 r/ F" q
  3. & \1 _. X+ ~- Q. R' O; d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 Z, U( q) [5 \# U# r
  5. + C; M# w5 `( ?" D& z6 f3 B- p9 P
  6. public class AggressiveState implements MonsterState {% ?7 ?" i/ d5 P; _. ^1 [
  7.     @Override7 u9 J3 G" Y+ q7 v3 O' \
  8.     public void handleState(Monster monster) {
    / k; R: i/ m' k
  9.         // Агрессивная фаза боя* a8 Z) s; g0 b7 F  ]
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");" |: P' ]" b( \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки( i) ]6 Y' v+ L/ v  q
  12.     }
    " B, m( u  f  d# p+ E% ]
  13. }
    + Y! G' O0 Q7 N7 v" X
Скопировать код
Класс для финального состояния монстра:
5 J6 m( F) C4 h% y" O, ~
  1. // Пакет org.l2jmobius.gameserver.model.actor.state. O# J  U7 ^* `1 w# {
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( |7 O' C  v3 q1 |: I

  3. ; D2 J. g5 m* k  V  ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;) M7 l6 D! }) @6 D. I3 w2 z' D, W

  5. $ i$ C7 r. S% }
  6. public class FinalState implements MonsterState {3 n5 r; P, W/ l) n8 Y) {
  7.     @Override
    8 |. z: R! K0 H* k8 J
  8.     public void handleState(Monster monster) {
    ) g0 N. r5 }: ?: h( V
  9.         // Финальная фаза боя
    $ C7 y+ O( t/ T/ X, U0 m
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");5 Z: f# ^/ w1 R: J7 c
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ( R7 I) Q% Y# n; F* i8 M
  12.     }
    4 z9 u1 F0 d6 p" u" s& x- d
  13. }
    ( [! V  L& n6 N$ j* T5 H  ~- k4 e
Скопировать код
; w7 i8 @" I- G2 U( z- B
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.# P4 A3 b4 v3 h. H% ^) Y  t
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( o0 z' _8 f$ c6 p& g
  2. package org.l2jmobius.gameserver.model.actor;/ N7 y2 `( T) z' p- u" n% f

  3. , `# v) v0 i/ u# E
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ) z1 s# j. X0 b# W  G# Z' h
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;. d% |: V6 s! R' H/ s3 P
  6. 1 D  l0 `2 Q0 Q5 c% O* l
  7. public class Monster extends Creature {8 M) c  a( o; T2 S) B- X, ~. {
  8.     private String name;$ J5 A- o( b8 R( T" Y) V  x
  9.     private double attackPower;' ^$ `: C/ s+ `% R2 n8 F
  10.     private MonsterState state; // Текущее состояние монстра9 m' N, Y+ M5 n1 ~
  11. 2 _4 o. B7 q) M2 H
  12.     // Конструктор монстра
    ) K" w  C$ ]' S0 L
  13.     public Monster(String name, double attackPower) {0 d* Z' u* ~% k
  14.         this.name = name;, K! h5 B! j; M6 N% [; ], z9 ?
  15.         this.attackPower = attackPower;
    ! p3 d% F/ d. H4 v: s
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние8 C2 z9 y' G9 _. }1 [/ ^: s
  17.     }# ?2 P  k* q1 R. h* ~9 L( l

  18. * I9 I, T. G# b5 s
  19.     // Метод для смены состояния, Y% Q) i! W4 u$ g/ u' h
  20.     public void setState(MonsterState newState) {2 E5 P2 S3 C7 v4 j5 Y# a4 Z
  21.         this.state = newState;
    / b4 {% w" ^4 @' Z
  22.     }+ C+ |" ?8 v1 X* Y# N- K- C
  23. " N) h/ y  y6 C- h  _, @0 H: `
  24.     // Выполнение действий на основе текущего состояния
    " v6 k9 Q7 C- s+ p
  25.     public void executeState() {
    8 s, k# ]3 L3 C! i/ ]
  26.         state.handleState(this);
    5 `8 R2 T- u/ o- h; P0 [* i
  27.     }# @9 ?/ N  Q+ _
  28. 3 o% e. |. N# @' W4 @
  29.     // Геттеры и сеттеры
      q5 x% {8 k, u) k/ \* i) W
  30.     public String getName() {- l5 G/ w5 k0 ?; r% f( y% y
  31.         return name;2 y5 ~# V7 d& s
  32.     }; T5 w7 F5 P& J3 M5 z  ]

  33. ) ?( L  }) |- w( @
  34.     public double getAttackPower() {, ?9 u" T1 {' T" `" y6 _
  35.         return attackPower;0 G# [( v3 I* r/ a5 j& c8 i
  36.     }2 }; c$ t, B) J/ N) f# |. W

  37. 4 z+ {( B+ s! G4 D. X2 T
  38.     public void setAttackPower(double attackPower) {
    , a: s* H+ C* m- c
  39.         this.attackPower = attackPower;3 {, s& s/ Q3 [2 y. l
  40.     }
    # z7 |- _8 W8 |" k# A. b( o5 l7 ~
  41. }
    ' M+ e% C, F6 s. q' U- E# T
Скопировать код

  I, Y; a& O2 F# [2 M5 MШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 g3 F  _2 W8 a2 S
7 W) a3 J! `$ ~
  1. // Пакет org.l2jmobius.gameserver.model.battle" f; z2 r1 m6 d  _! u
  2. package org.l2jmobius.gameserver.model.battle;& @) f1 l2 _# `/ x3 d& n# u
  3.   g, t* u+ s2 j: A+ K
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 ?; e0 O4 }( }5 O6 E5 C. y1 x) h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    2 p; _) s& t5 l+ k3 E
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ) L; |* w1 ?: z, M" z

  7. , _% j$ b9 E( C2 R5 w+ s
  8. public class BattleSimulation {
    ; f- I, S  E# |; b  Q) P
  9.     public static void main(String[] args) {
    " O8 C9 m( n$ }
  10.         // Создаем монстра с начальной атакой$ M; F' c) l8 ^, E8 N' G. s- Z' N
  11.         Monster monster = new Monster("Дракон", 100);
      ^' s, n% ~9 q8 l( Q) V+ ^7 Q

  12. , z( B/ F# W( @# [6 b, `
  13.         // Начальная фаза/ d3 F( ~( |! q6 ?, E
  14.         monster.executeState();: e+ j  P* K% [! `. Q) w3 U

  15. / n" u1 b" ?: u7 }1 b7 M4 Q7 p- E
  16.         // Переход в агрессивную фазу
    5 L" W- q. V; d
  17.         monster.setState(new AggressiveState());" S  j" r4 i+ o! x
  18.         monster.executeState();
    8 I, [4 v4 m+ o' ~

  19. + F4 }" V; ~7 ?, x4 C5 C0 j$ z  O
  20.         // Финальная фаза
    ; u9 e. p" P( L2 u1 z5 H, Z  Y
  21.         monster.setState(new FinalState());5 l. F/ ?( a1 I" a: G" q. G
  22.         monster.executeState();
    * ~8 }6 |1 ~; Z( @
  23.     }
    ( v" U$ g  x: V( u4 W2 j' k
  24. }
    * Q4 z# s5 p  l8 I
Скопировать код
% I' x9 @& [# G  p- h# z0 d
Комментарии по структуре пакетов и классов:
7 {, S, P2 {$ n  I% Y* u
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.5 [: L) l, l1 }0 k5 z5 q
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ M6 U" B$ ?, c6 T  F% MЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!% ~" f. e/ W. G! i
! Y( B  R- q0 Z

: \% p# x# Y: G2 f
  Q" L1 J4 ~9 o0 t2 `& D! T3 W
- Z3 e7 ~8 k1 B: E( Q* {, r! H! x' K+ U' _. Z7 x7 G
/ {8 Y, }! Z& z

* Z. t' ]  Y7 P! j5 b# y. H! M! n8 j$ M# Z, W+ }3 P

% L: z8 l( Q( f% r7 F5 O
, r" u* }% D) X( I$ \9 U
* ]: M( u/ M  g
2 l3 G6 Q# J7 _" R2 a5 c9 g( j$ v" \- J9 T
3 g9 d" d) l1 p, v3 }
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04! e) O. v8 Z3 F. A
Для управления сложными взаимодействиями, такими как  ...

* V- z9 a4 W- t" fОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
$ ~) n9 M7 h6 p& LОтличный подход! Использование шаблона "Состояние" де ...

8 `6 K* `( h. ]Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
; g  D6 V0 [# J6 z( J8 {5 J! r
7 t8 `% y, Y) QШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
7 b5 r6 w+ _! r
2 U& [1 P) N& p0 l$ X3 s
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - [9 h6 K2 ~9 P, ^5 K
  2. package org.l2jmobius.gameserver.model.actor;3 G  _- I4 o- o% d

  3. ' b, p( J; }/ b( ~7 a
  4. // Перечисление для типов атак; n" Y. R/ `' c& @# w
  5. public enum AttackType {. M+ [+ U2 r; y' u5 Q% `
  6.     PHYSICAL, MAGICAL;: ^" \! W. e4 ~
  7. }% p% H1 I9 O) ^! Q/ E$ q+ M" l8 N: p
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.' g% A" D+ e3 m1 ]+ u' \" z2 y
Обновленный класс для агрессивного состояния монстра:
% ~. V4 s4 D: Y2 m1 x
& `+ F$ M! F+ \; @4 ~  T' f  z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 @9 n, g) z, y" f; a/ k. Q
  2. package org.l2jmobius.gameserver.model.actor.state;  |  g# O6 m  x7 r

  3. ) S$ v* h- j, X7 S+ L& m2 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % g* J. s7 Q2 _1 W
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    ) R) j: ]1 {% w

  6. ! b$ i) y2 }% @& \  R/ ~: h
  7. import java.util.Random;; I8 r8 }  N: J7 g% }- ?6 h- {6 t

  8. 4 |( W5 f2 y% o4 G& I- \0 {8 [, l
  9. public class AggressiveState implements MonsterState {
    ! ~% I& _1 m6 j2 \2 h9 W/ P! x
  10.     private Random random = new Random();* l: X; l( K9 ]# x

  11. 4 B  O2 ~! n$ [: n7 n; v! ^& [
  12.     @Override, c' C$ m  ?7 ?2 ?( S2 p9 o6 j8 M8 n
  13.     public void handleState(Monster monster) {
    & q& M/ ?! A9 x: j, G; h  O9 a
  14.         // Выбираем случайный тип атаки: физическая или магическая+ I% v5 n# \7 m  B" z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;' k4 t. d9 J9 n7 U& Q2 X& G

  16. 6 d1 T1 S" l) x7 z( T
  17.         // Логика для агрессивной фазы боя$ v: m) `! Y( }3 |
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 3 e9 A8 ^4 m' \6 u( T
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");  Q& Y( @5 c" m0 A4 V
  20.         8 X( I5 j) \  o9 \
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! j% r1 R6 I- j7 u1 V6 k
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    . _$ e7 c  O7 i$ G3 W; |! U
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);( u: i; ]. P& C, }# j
  24.     }% T4 b$ E. `; X$ ^
  25. }
    + Q, t' ?+ t) Y! f' O
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки  L/ x8 f7 d' r& h
4 H! D0 O8 w" _
  1. // Пакет org.l2jmobius.gameserver.model.actor
    & I7 c" H/ J4 K+ g4 }; S/ i
  2. package org.l2jmobius.gameserver.model.actor;; ?) [  f; H3 R- Z5 |" p: K1 }
  3. 3 r& G! b" @) \9 S
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;  T( E! b: t- c
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    + x& T6 j. z. {7 Q/ c) [/ o

  6. * G6 H3 V2 O2 ?; m" m* Y
  7. public class Monster extends Creature {0 c* _2 L5 K+ t1 ^  N, v' r
  8.     private String name;  f1 @* ^$ p, g/ K' _8 N
  9.     private double attackPower;- ?" T- x# G4 L- y
  10.     private MonsterState state; // Текущее состояние монстра% G0 K; p1 F8 w! I" S
  11. 5 l. G" |" z# x+ w  F0 C4 m
  12.     // Конструктор монстра% w7 F  K3 J0 }6 y3 K3 ?$ G, k; N
  13.     public Monster(String name, double attackPower) {
    ! s; C$ [, Y' q5 G/ Z1 R, |( ^
  14.         this.name = name;
    2 j  r* O* M3 }/ k" B9 c% n3 W, j
  15.         this.attackPower = attackPower;9 L& ~: U6 X" @- |, W
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 H' [: i4 I6 t4 X. h+ R' }$ J
  17.     }
    ( Q) u! U! T# h9 B4 s8 H

  18. ; c% _( Z$ G. H  Q
  19.     // Метод для смены состояния
    , ^6 N1 x! _& R8 ~
  20.     public void setState(MonsterState newState) {$ `% d0 U# `  h1 j( b& T% K$ p
  21.         this.state = newState;
    1 S0 P7 Z: S2 u
  22.     }
    $ x+ P: V4 i, e: i

  23. " U% l8 K; g2 L9 n' E2 b  ?
  24.     // Выполнение действий на основе текущего состояния
    * k7 p% B! h! T# F8 O3 y+ a$ m
  25.     public void executeState() {  y- {% X, @" O; c8 ]) t1 ~
  26.         state.handleState(this);
    2 L' X8 v. |1 g- E1 `
  27.     }
    * _. a1 n8 ^3 ]$ m1 q9 X  A

  28. , m# A5 F( m1 W( p9 F- A. Z( B
  29.     // Геттеры и сеттеры
    " T+ V2 a( Z" f( c. K- ~8 g: B5 d9 E
  30.     public String getName() {- b# V  K' C. [3 }) z. i4 d9 R
  31.         return name;
    ' ]* i/ t& ?8 b) D
  32.     }3 m" R% l: [/ Y3 G; z8 }9 G
  33. : ~& |9 F0 i+ q( C9 ~2 R$ M: t
  34.     public double getAttackPower() {
    # J# b7 o" ?/ U- \9 G! `8 N
  35.         return attackPower;
    " Z/ n) P- k' @6 p
  36.     }
    4 P  S5 V; m; L& [' u+ i

  37. 2 j* H& F0 D- z! g% M* l) R, K
  38.     public void setAttackPower(double attackPower) {
    ! E) i4 O- t: M6 U
  39.         this.attackPower = attackPower;
    ! @% X1 {: G, W
  40.     }6 n% T0 m$ z; ?$ n( B* b
  41. }
    3 m- b5 W8 G$ F) Q  c! H
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе., v  J* q- T& o! H0 q
" r' N/ c7 Q6 j* ?8 X# ]! W. O4 t( I
  1. // Пакет org.l2jmobius.gameserver.model.battle8 K& e" h6 O# V' H9 R. b  g0 Y
  2. package org.l2jmobius.gameserver.model.battle;
    $ _6 x$ Q7 r7 S$ x, e
  3.   [! K+ v, O! ~$ H
  4. import org.l2jmobius.gameserver.model.actor.Monster;* r7 f& c+ M( i# ^% n% R6 g' R7 G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; f+ e9 T4 L3 Y( E

  6. 8 q* k, L5 H; O' f4 z* F' h1 J
  7. public class BattleSimulation {
    2 @' h9 k9 L# U% y
  8.     public static void main(String[] args) {
    & S6 k) c* a2 O$ w" C/ M
  9.         // Создаем монстра
    7 N+ P& D1 p5 j% O
  10.         Monster monster = new Monster("Дракон", 100);( S: P# Y, m5 f2 i
  11. / W, `# z& W$ Q+ v. q8 f( S
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак9 X. d& E8 ]5 A, u: y3 j0 h6 i
  13.         monster.setState(new AggressiveState());
    3 s. m5 C& s& A9 L+ o6 g/ j; N- E
  14.         monster.executeState();$ R+ Q7 y) ]+ T6 q- G% |- b
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак) ?) b2 F$ e$ b7 r+ S$ ]
  16.     }& c* ]. q* W4 O+ y" Q8 n3 S! Q
  17. }. \$ ^) f* k! V) q, I
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
1 V/ ]* N7 q" I% Q; _& sЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
- c; h- ?5 @' m* _. n8 u- u) I4 B. X$ g
- Z3 |$ ~, \1 O+ ?0 U
* ^) x; J: d2 \- M( u
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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