Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
& t* R& p1 Z8 A5 W2 A# z( P9 q
8 |3 O3 i) B5 }' J3 y+ T3 y  q. e
' I6 g/ a# q9 @' Q- _
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ C. b: C8 C  u2 ^Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
7 C9 M1 Y6 Y1 \/ W5 KАстралия ?
6 O1 R: r% X) t: W/ y( ?* P" B
& N# S& b" z1 r& i  P' V

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
& {: l5 B9 B0 Q  B8 C7 C9 h. |& uВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?! P8 n/ X& ]- B0 h: l- g0 U# L1 a
/ y- @7 _' f( S
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 9 U6 Y+ t4 a7 ^' X" F) F+ [
AlexCoder опубликовал в 2024-10-16 18:31
7 S6 [3 x1 |/ O* i9 IДень добрый!
; l8 x$ H* a& D6 vВ статье описано взаимодействие игрока с N ...

( @! J9 J! h) x: o7 R8 Q* ^7 @Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 G# u5 m( \1 m/ O

* M* H$ E. S$ CЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; w" p$ k# [5 a& ]6 L& u* V
, z6 c% I6 E% g5 ?- O$ w) f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: t9 }5 K  R$ B; K$ @0 ^8 n3 Q3 G3 R) E9 h( @* z7 C% I7 c* Z0 ^
  1. <font color="Green">// Пакет для состояний монстра</font>
    , d5 N) l1 B9 A5 F. Z
  2. package org.l2jmobius.gameserver.model.actor.state;* t% b% ^4 }' Q% E5 B
  3. <font color="Green">9 b1 w! p: X3 h. E" H& b$ I
  4. // Интерфейс, представляющий состояния монстра</font>, O/ ^4 U! G# \  A: x
  5. public interface MonsterState {3 R: s' W0 `: Z: e* b1 V1 Z
  6.     void handleState(Monster monster);
      ^! K) o! H* z
  7. }6 F7 v, @4 r9 b+ Q( V3 [
Скопировать код

- ?  e& H4 F' y4 TШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% G" G) |& \/ D3 M# H, E0 @

, ~+ Q+ C/ Q: C" a2 O7 mКласс для начального состояния монстра:+ ?% P: M+ E7 v, ?* W/ V
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>9 x' p9 @7 i# U- V
  2. package org.l2jmobius.gameserver.model.actor.state;2 K; e' q! L( u, C) F4 n% D; d
  3. " e; P+ u! C0 z% b% Z$ K
  4. import org.l2jmobius.gameserver.model.actor.Monster;% W( q$ X+ ~5 N2 }

  5. . P) y& j6 E/ `! e* p: t( H' r0 v
  6. public class InitialState implements MonsterState {; M* g; M3 P) \1 H
  7.     @Override/ d  @6 E9 S! L7 G) f4 V' j2 D; v
  8.     public void handleState(Monster monster) {3 Z0 W, u% o8 \* ?
  9.         // Начальная фаза боя
    0 d; {7 P( f5 l# ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % {: {5 T: Z2 {* H+ g5 h
  11.     }
    + O  K+ u) V2 E  C# i6 N0 o  n
  12. }& g) ]7 x. L- L8 f' r; i* H
Скопировать код

' k/ F! M! ^% v0 g4 z; g
; k; L& W5 t) `0 v& X) F- R$ k  \) w- E, n
0 V  W# Y, D) l) I3 p5 i6 F
2 s; _5 S: {0 P# E. H

" `7 q+ g! B' a- W& V4 p0 b: i6 W  I$ `+ H# ~4 q, f6 n
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . T/ f0 T/ j, f/ o
  m( ?) B7 J! s: x, q" ^- c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 r9 [4 W+ t( M! x' C5 C
4 M7 q/ U0 p9 `9 J3 AШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' J1 U' h) q/ u' U' L  l
: p3 {4 _% F# n6 E
  1. // Пакет для состояний монстра# ^1 c& f$ ~$ @/ c9 I+ X2 H
  2. package org.l2jmobius.gameserver.model.actor.state;0 t- R3 M  p8 c  z3 e
  3. 2 Q) I1 A: l6 I. T9 e
  4. // Интерфейс, представляющий состояния монстра
    - W, X* b. {6 A- T1 ^
  5. public interface MonsterState {
    $ y' X- D5 ]3 x( ~
  6.     void handleState(Monster monster);- }4 m' f% m0 j
  7. }
    ) B  v' |/ d  D3 I3 j. t
Скопировать код
. J- z% I8 e8 x: W# X# b3 K
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 1 }, R# A0 S! q+ o
5 x, `, \7 A4 h2 {/ ]. m# N7 y
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 D1 Q+ S! {7 a
0 j. t( t  n& d4 M, kКласс для начального состояния монстра:5 X4 Q" e; O; m& t4 b8 N) J( E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, V3 V8 }6 L1 q, T! N! J
  2. package org.l2jmobius.gameserver.model.actor.state;
    - ]! E% M( u) x5 S) J5 J
  3. % G- L9 Y/ K5 o( j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; i8 Q, N4 _/ t  B7 ]( k4 P1 t4 q
  5.   ^. N1 S& U# ~6 S3 a( d8 \9 X
  6. public class InitialState implements MonsterState {
    7 D/ B) ]' v3 \
  7.     @Override$ O1 N% O! {$ ]" X
  8.     public void handleState(Monster monster) {
    % j! Q* {. R; W# U/ z( U, \
  9.         // Начальная фаза боя- R. s# l0 J( X; ^
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");; |. O3 Q* _+ H) C" T; p
  11.     }* y3 I$ `9 u, {% r+ ?2 v8 q8 b, L% B
  12. }0 E1 D, k+ o- l( \% ?( \: V5 N% H
Скопировать код
Класс для агрессивного состояния монстра:4 L+ m- ?$ m0 E, `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / Q& ~% ?' o. q; K( x* F7 A
  2. package org.l2jmobius.gameserver.model.actor.state;
    : b, r$ m9 p4 R
  3. " H6 s7 j8 I3 J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 [/ \1 U3 t) U2 C
  5. 0 k% }+ G$ A6 |- j8 s
  6. public class AggressiveState implements MonsterState {
    ; C6 y4 g6 I2 ]3 f  N9 H, ~* _
  7.     @Override2 h( u2 @% ~. ?. x1 Y# ^, a2 _
  8.     public void handleState(Monster monster) {7 ]5 b: C$ Z3 A
  9.         // Агрессивная фаза боя
    5 D6 u1 \5 m! J8 y& F8 M' S2 {
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");' D; T; `/ b; l7 W# t; l8 r/ u
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    " _$ q) Z; }* l7 x
  12.     }0 B7 h! V  F$ H" s3 q
  13. }
    / E5 [' H) V7 I2 Z3 `4 X1 v
Скопировать код
Класс для финального состояния монстра:, u& v8 s4 k, p6 E- C; ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . @0 c3 }# @. Z4 i
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ H2 h& A; W9 e. `; y
  3. 5 o' v* q7 b/ o
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 g: g: q0 b/ X  b' W
  5. 3 l8 d8 O" I$ ?& I
  6. public class FinalState implements MonsterState {
    & B# e& C: p# M2 D" D
  7.     @Override
    # Y2 ^+ N# h7 X+ ~# S( Q" q( e
  8.     public void handleState(Monster monster) {0 J0 S4 o$ `. O9 ^0 A" L
  9.         // Финальная фаза боя
    4 N4 \. W$ u) o3 Y  j( g* K. |" B
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    1 k- z+ J( C4 a
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    3 {! u" y# F: \
  12.     }
    3 b3 j; @1 k+ k, @% S; m/ n" U
  13. }
    # e& w3 ^8 b+ k4 z* P# b" D
Скопировать код

' m$ W  V: ]2 n' N( e+ q/ ~Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.0 Q; E7 m7 X$ p) L) I
  1. // Пакет org.l2jmobius.gameserver.model.actor
    9 f4 M7 U! D0 ?0 K) G
  2. package org.l2jmobius.gameserver.model.actor;
    9 K9 ^. K4 w* {  q% h/ b
  3. 3 N- z' ?2 u" b% w
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;( X. d% A2 ^# E1 N9 j$ f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 d% P6 P% g6 _& d7 O) d
  6. 4 o/ E$ `' l: s7 u
  7. public class Monster extends Creature {
    & ]. e! e. |; f
  8.     private String name;
    / y( Q/ q+ x" g7 E- `' O5 e" A
  9.     private double attackPower;0 m" J: }" A( `& O2 q. j5 A. h
  10.     private MonsterState state; // Текущее состояние монстра  Y) y, k* `: Q4 V, M2 c

  11. ( R% ^. u9 e& j( G6 }
  12.     // Конструктор монстра
    . o8 ]% K( }7 ]# j+ c+ [
  13.     public Monster(String name, double attackPower) {9 y  i* U9 _' s' Y: |6 y' c
  14.         this.name = name;+ X4 P2 ^8 w+ ~* z+ M' D
  15.         this.attackPower = attackPower;- T- i- P" v6 z5 ?) w- W- @: ?
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние/ G4 t+ D. ?2 U2 Y. a" N. U
  17.     }
    # B' L/ }  S: {2 J, D6 X4 P5 X

  18. 8 ^1 _; p' Y- `6 c* A5 i1 |
  19.     // Метод для смены состояния
    / Z% `, F! G  O" J. i- g
  20.     public void setState(MonsterState newState) {3 b" S6 A: N; o# l- E% }' `5 A: C4 S
  21.         this.state = newState;. K0 s4 x- l# g& c) ^
  22.     }' t$ H; g) w; W3 E' ~$ I/ d2 d
  23. 6 a, g0 G& e' i. Y8 m0 S& _5 y
  24.     // Выполнение действий на основе текущего состояния
    , ]- `6 L( `, v# \
  25.     public void executeState() {; _3 B; H2 k1 a; \* Q0 r( \- B; c
  26.         state.handleState(this);
    " I5 r4 q0 z( q6 R6 {, ~
  27.     }
    / v) x; [, @( p% K0 X4 E; ?" C) O
  28.   W9 \; `' K$ G' w
  29.     // Геттеры и сеттеры
    , N: y1 I% s* N& m: o" P3 a
  30.     public String getName() {
    6 }; F8 S- S8 A( b
  31.         return name;
    + D, `. P8 l  X! _3 o9 ?7 l$ j
  32.     }* ]" G2 Y& i/ Y( y7 D9 A; Q

  33. . p8 n  ]' p% G( h4 X
  34.     public double getAttackPower() {
    , z5 ]( f. W1 t" E! C5 C) `
  35.         return attackPower;3 p1 q0 ?9 Q0 Q+ ?
  36.     }
    2 C- T6 o- O9 U, n- X  }

  37. " @6 {1 E$ B% h& T3 _# [  O
  38.     public void setAttackPower(double attackPower) {
    ( {! r0 c6 a  f
  39.         this.attackPower = attackPower;
    ' f$ W0 F- t3 Y& S
  40.     }3 ~, r. n/ E! u9 G& O2 b4 {( b( M
  41. }
    ( z- y6 }: j) K  ]6 ^
Скопировать код

7 @; V6 k7 J! Q* d  V  M0 yШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
  q" J  ]3 i$ H( P2 m- f
- Y8 p  G0 ?  J  a& H# B; b& ?; e
  1. // Пакет org.l2jmobius.gameserver.model.battle: v) G4 }& \; M- c- @  H
  2. package org.l2jmobius.gameserver.model.battle;5 `: ]# f9 T6 L4 U$ X$ k3 e6 |

  3. 9 t, @, K4 G9 Y  d4 a5 f
  4. import org.l2jmobius.gameserver.model.actor.Monster;* v- x' U) I1 W2 [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    - C4 n2 g* t+ u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;/ S  Y/ |9 c! [

  7. # x8 k& v# U# q) h8 R" K
  8. public class BattleSimulation {
    1 p$ K$ d! L: O# v
  9.     public static void main(String[] args) {
      }6 |" V- z+ I- R
  10.         // Создаем монстра с начальной атакой5 p* s0 o! U0 Z
  11.         Monster monster = new Monster("Дракон", 100);
    ' ]* C/ j4 x& @0 v+ i

  12. ) |& `% o: @6 C& Z9 E0 g
  13.         // Начальная фаза
    % S7 }9 j& E; @1 n. X; A
  14.         monster.executeState();+ E  O4 ?$ I7 W; V9 V) B
  15. . c/ _4 t1 \9 E3 h0 r# ~% V7 Y
  16.         // Переход в агрессивную фазу2 `4 G' }) W" r* w
  17.         monster.setState(new AggressiveState());
      S& M) _0 W: s! e$ o+ d
  18.         monster.executeState();
      d- e* B. J6 G

  19. ' z. |5 Q* k2 U8 _
  20.         // Финальная фаза, l4 N9 l1 h7 ?, o; a$ F3 s) P
  21.         monster.setState(new FinalState());+ `% d8 d# E7 w: W1 h! X
  22.         monster.executeState();
    2 T8 ^3 ?6 ?" ?5 v2 f
  23.     }; T# R: {8 \7 y1 U
  24. }' X4 ^+ x4 m0 i' r! q! X
Скопировать код

7 I% f5 V* q( ~+ A6 x. NКомментарии по структуре пакетов и классов:2 T: P( v: S* v1 v
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    1 K: g4 H: w) ^- Y
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& W* x3 y$ c, z  mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!2 \. j, y/ ?/ \, a* V9 H6 F

) Y( r6 a) C6 `! K/ n9 \, n$ p# o9 d# u
: Q6 g" X( W' |# \; w

2 j$ K, a3 N9 p3 |% `* a1 `" l- q: e) K+ q
4 f# o, h8 L' n) b3 \! k9 B0 v

( D/ T. J( a+ |7 M" @& j; ?% L! F7 R% N
" K8 ^, c' K# S
5 P! ?4 ^% c! D# ?3 v; S8 u2 i+ x

* g$ K8 E$ ~6 Q2 A2 U* h0 k+ e& A: a1 s# T; y, K" S& s
% e5 V: V4 G) P8 Z' K  Z1 S" |; I
( W+ Y9 v; t1 M
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
0 H8 T* {  W1 s! mДля управления сложными взаимодействиями, такими как  ...
" ?; W6 Z& k; L& }4 I
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:217 p& r: n/ D- b) \
Отличный подход! Использование шаблона "Состояние" де ...
1 [, q# g5 ?( a, s
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.5 s7 i$ q) b5 m! H
% l1 E' ]4 \0 d3 Y8 P- ^
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.' t9 R4 _% \/ H3 y
3 P  D& A! ~9 c4 J& @; K* g" m
  1. // Пакет org.l2jmobius.gameserver.model.actor* R( l' \2 r7 q) {5 \$ O8 a
  2. package org.l2jmobius.gameserver.model.actor;
    8 C% c- g$ Q0 x
  3. 8 u3 ^& p- e  f2 g& V4 y: G
  4. // Перечисление для типов атак
    / {  z) A1 t# z: n9 A- o
  5. public enum AttackType {: a2 u* @) X1 K, [4 r
  6.     PHYSICAL, MAGICAL;
    / L7 ~2 L* A) K0 A7 }) c% ^
  7. }
      l/ s/ F0 d& r9 |9 l' ^0 r
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
8 v6 T9 ]2 |- T  qОбновленный класс для агрессивного состояния монстра:
, l7 X8 U! w; @* k* a- \! ?' Q( E- F; ]4 J  }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * Z1 ]9 ]: Y* E; b; ?6 I4 n# |2 T
  2. package org.l2jmobius.gameserver.model.actor.state;# B: P# O1 F2 x4 M1 V, U( c6 R' @

  3. 1 K$ f6 }1 e: q+ i/ a" g. l% E; _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 D, H( ~3 ^8 N) i3 V
  5. import org.l2jmobius.gameserver.model.actor.AttackType;* B1 j/ y7 b  ^: ]6 q1 `  @1 z) D

  6. 7 i' R: c6 n/ k5 c3 s; f
  7. import java.util.Random;
    2 v4 a+ L* L' D! a: r. R; D3 n
  8. ' T* ]' L( E0 ^& r  f9 R
  9. public class AggressiveState implements MonsterState {
    7 W/ a: e- ^9 R0 l
  10.     private Random random = new Random();
    9 p! \6 o; {/ O' q2 q

  11. / y/ s3 ?* c- P  I" Y4 i
  12.     @Override
    3 |- V0 e9 I8 f1 `- J" ]- k
  13.     public void handleState(Monster monster) {
    - d9 U, y1 ^, h8 m) ?
  14.         // Выбираем случайный тип атаки: физическая или магическая
    5 C* m. `' z1 p6 l; g3 C
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;, m: h7 ]2 U3 L, @! M; i

  16. 8 C' H1 ^% H# Q- s' X5 L! F
  17.         // Логика для агрессивной фазы боя
    2 _0 |4 H$ n5 [( }2 ?9 Y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " , }" y4 z9 n: J
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");) u' s* s" c2 _7 H
  20.         
    7 ~7 Y9 `5 |2 c1 }6 j; ?3 f
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    6 ?) N! p* h5 D% [$ _7 r
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;# B) M8 p! G& t% H; X0 t  S. z
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    % E; K/ G* D3 D9 A
  24.     }8 l- u6 `! e7 A* A7 d
  25. }- I/ g* v' y7 J
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
# X7 c( h/ g7 h5 F) s
% P$ _# ^# ?' I! i+ q' ~
  1. // Пакет org.l2jmobius.gameserver.model.actor1 Q9 v2 K0 t, y9 u; {+ A
  2. package org.l2jmobius.gameserver.model.actor;: ]3 ]% P  @- t. l/ C

  3. & K& I5 b& L8 @- \. P; Q
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 W6 ?+ E1 n$ t3 e; b9 T
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    9 X, Z1 l$ U4 N

  6. - ]  f5 Z+ h4 b/ k
  7. public class Monster extends Creature {+ o! \3 Z5 j2 |8 k6 P
  8.     private String name;4 f5 W, n6 [% i8 ?: N
  9.     private double attackPower;
    4 v0 l' z9 C% G3 f0 w$ [
  10.     private MonsterState state; // Текущее состояние монстра
    . f* m" l9 J0 v. r$ }( K
  11. 4 h% Z; {" g" [+ w) Q& K
  12.     // Конструктор монстра
    ; n4 r  U- \9 o& L) Y1 w
  13.     public Monster(String name, double attackPower) {) K# N7 m4 N  q; ~- Q0 L0 ]- n( ?
  14.         this.name = name;7 P7 V/ Q9 C- E% }: O/ F. D
  15.         this.attackPower = attackPower;
    # p9 n! \/ k' r0 P1 E
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ) a5 e8 {( B1 i! q" `3 G9 N$ ^
  17.     }
    - S0 B# B. |6 k- m- Z9 H
  18. $ _4 u, q+ R$ q' [6 r1 V1 l
  19.     // Метод для смены состояния
    ; d- d5 X% f- w8 o* B: |
  20.     public void setState(MonsterState newState) {# j8 n1 m% `" G, R
  21.         this.state = newState;
    2 [( H. ?5 T5 {9 B! A2 ~" F4 ^. N
  22.     }6 E7 ~* ^$ F' c- u. M8 `
  23. ( R. J% |* L! o
  24.     // Выполнение действий на основе текущего состояния* k2 k; B+ f' t5 v/ ]- m" k+ ?- O
  25.     public void executeState() {, |# O* L. e6 Q4 i. N% V
  26.         state.handleState(this);# F4 c7 a! m0 u- H
  27.     }
    5 @5 L# C9 [# f) R

  28. , G. T0 T1 j/ M
  29.     // Геттеры и сеттеры
    - U% I* y- P7 n
  30.     public String getName() {
    2 h8 b5 @, ^5 _8 l6 o& r  P  S. t
  31.         return name;
    + I! I3 u+ ?5 F  q0 C+ P  l
  32.     }, T' v0 T" `5 m0 q, H
  33. / q  R& r: l9 ^! n; [, D. r
  34.     public double getAttackPower() {
    $ B1 ]- S$ f; [; f! S/ c
  35.         return attackPower;  n; V2 R' @' |7 n' e7 K
  36.     }7 T. {2 t/ x# m

  37. ( _3 |8 {5 H4 S& A' J3 `
  38.     public void setAttackPower(double attackPower) {% Q6 e) |* b, |5 a+ u& `
  39.         this.attackPower = attackPower;
      h& G9 n" x8 i6 ^6 m+ f! t
  40.     }( r* D4 }- c) }" p9 g
  41. }! X3 _) f, k/ c9 k2 V2 w( V
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.- H5 R! T/ [% j$ W  J4 b

# ^- e( K% \4 Z
  1. // Пакет org.l2jmobius.gameserver.model.battle9 d6 f: t# \! V: H0 X
  2. package org.l2jmobius.gameserver.model.battle;
      s5 A1 K3 ?9 E
  3. & H3 H7 O; w# k1 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ z# ?6 y! l( r
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ N1 M0 U0 ^% ^8 J1 G& P

  6. $ q0 d9 k! B$ ~) Z' o& b6 z
  7. public class BattleSimulation {
    : c3 Z" a! Z. w+ ~( {
  8.     public static void main(String[] args) {
    , _0 q, E5 @* `& c% t. X
  9.         // Создаем монстра
    1 R$ `) E* C( s: {9 ^
  10.         Monster monster = new Monster("Дракон", 100);7 S) t+ B& e8 L' n) w1 z# w
  11. & |9 k" c' J  g7 ~8 L
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    + ]! L, K' }* W" n$ ]( k
  13.         monster.setState(new AggressiveState());
    8 e) `  [. W' Y) Z( U6 q9 h
  14.         monster.executeState();
    3 ^- b: C8 q% v5 Y) s2 N  r3 F
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 S# X; p2 ~$ b# d
  16.     }
    ; M; [5 [% S) V: i  b5 ]6 K
  17. }  d5 M2 j' J- ~# R
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.* E, B4 z5 n$ D5 U' l, x, I
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
) p/ k* X& f6 H; B" X: s6 b5 D8 a. T% h2 S# ?
% H6 l4 Y& L3 G

) }4 @5 e0 p. c4 g: k* P- ?
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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