Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!, q" |+ ^" v7 ]. _3 a
, N  E) W2 f- f" s1 T) K/ Q
: l1 O( i) `+ a: S% d& J
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.! s( U/ I' L" A+ s4 d* j9 H
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
2 q: s4 ^2 _" T" ^' c0 R5 P$ yАстралия ?( ]6 ~" f5 Q. b" M9 i: V2 U
& L- ?9 {9 x3 Y4 }- w

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!) k  v) h& `4 `9 e
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?2 e9 C& ?) y# m
! D4 J8 `) h5 n/ t+ L; F$ D4 m
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
, _4 S9 U. d5 ~3 P3 K) U2 m
AlexCoder опубликовал в 2024-10-16 18:31. v2 n, o' Q& [% r. p1 }+ |
День добрый!
5 J9 }+ B2 B2 h1 N( Z4 ?6 ?В статье описано взаимодействие игрока с N ...
+ Y: S1 q! h/ l, X' M( r* Q
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) S: k! ^; m; l8 ~
- u; {! [9 J! Q5 e) n- v7 Y/ o+ Y6 @
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
+ d) h  V, w3 z+ b2 W
9 b( U( M' }, K: P) u1 \Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* @% y5 r* R1 m( J5 o% X  ]3 u# P% Q7 T+ e& U
  1. <font color="Green">// Пакет для состояний монстра</font># Z& V; [' y2 w8 I' s  G/ U4 c
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 r$ N1 w0 f7 w: x  P
  3. <font color="Green">& N4 X. d1 C, [% c, [$ v
  4. // Интерфейс, представляющий состояния монстра</font>
    . m2 Q; _' A/ N+ ?) Y, p
  5. public interface MonsterState {( m9 U9 V, d9 U. b4 c: z$ T4 k
  6.     void handleState(Monster monster);
    1 ?) f0 n1 `. R2 q
  7. }1 M4 N3 v. p, W3 s% R
Скопировать код
. b: S. G. i% Q1 X, o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' L3 T& @7 C2 R" G8 t( F
; p5 i' ]1 }4 a
Класс для начального состояния монстра:* I3 N6 X0 D0 o1 ^* i
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>) m, F2 w% f2 r
  2. package org.l2jmobius.gameserver.model.actor.state;4 z/ _4 `& d/ r5 ^
  3. ( _' o: B, V( |$ @& k' t# z1 p7 H- S
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ X+ e' J8 c+ u; @) [
  5. 7 |" u% _+ [6 J9 W# |& X
  6. public class InitialState implements MonsterState {
    ; g+ w( j, p# D. w* w7 v; C
  7.     @Override
    8 B; I7 d. g# t" I" p. I* N+ O: G
  8.     public void handleState(Monster monster) {
    6 C4 H1 s9 r7 s; f' ^
  9.         // Начальная фаза боя% \, I  `1 u) g* y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    9 X' O5 E* f5 p+ ?! z: P
  11.     }6 E) p0 a4 L5 r9 r. X  i" w1 m; l
  12. }6 L( ]% ^/ Z+ b" T( y; Y9 s
Скопировать код
( M7 M: W7 P7 w* i

( s" P  H# H4 i2 N8 I1 V( h9 @9 |. m$ d6 b; q! w) x# o+ R

# o' ]4 H' O% z( R* d2 P7 l) V% ]# i: @) f' s
3 d! q0 c; s" T( U
3 C% ~' W: G( h9 N
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. g. R( L: V) \3 G) X& x6 H2 r. m5 `# r$ k0 H' Z+ g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
. I$ v9 S- \/ V) Q" B. P# G( d7 ]. a( M% H+ l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- h) {3 N6 G1 L- }7 W1 _& b
& L4 V/ u# K; a9 ~6 H2 v
  1. // Пакет для состояний монстра9 U. N& j4 |4 y7 l+ D
  2. package org.l2jmobius.gameserver.model.actor.state;- |! g* e/ R3 y2 V' P- Q% |' @

  3. " {/ D0 O: x+ E' Z1 ]' {
  4. // Интерфейс, представляющий состояния монстра
    3 O1 A2 K) a9 u4 F5 T2 {0 G/ T
  5. public interface MonsterState {
    5 B6 R1 }6 I$ e* b1 s, f
  6.     void handleState(Monster monster);/ M3 t* f9 ^7 t: _7 n0 E5 M6 R4 |
  7. }' O& u- _& q: w: @1 t8 @
Скопировать код

* a3 S1 T+ T! JШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
, n8 Q# y. Q" {% M+ e% S9 W. a% k: w' u# W
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) h8 ~6 o3 [% b- ?6 u$ ]3 b! r
- w) I: ?0 A% _- i; G; B3 @' T) HКласс для начального состояния монстра:- f8 ~3 f7 g  d! A. T& ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; M' ?4 s/ w9 F, [) }
  2. package org.l2jmobius.gameserver.model.actor.state;6 ~1 g7 l" |) x# C

  3. . z; r, `( e8 h8 a0 t/ ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( B" _6 Q$ }- W/ K
  5. 1 G9 H0 d# r+ k6 n$ f9 S. {
  6. public class InitialState implements MonsterState {
    + C- v# ^8 d6 z' d6 p
  7.     @Override8 ?" j. B; ]. Q
  8.     public void handleState(Monster monster) {
    7 K- m3 ?; q5 g6 R
  9.         // Начальная фаза боя
    + ^4 [4 T7 [/ v9 p1 ?0 O0 w: g7 R
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : ?% ^* `- i% \. U% \* S5 A, O0 `
  11.     }
    8 e% }+ X# @6 y' ~
  12. }
    8 q' `& X2 Z) I( c- D4 ?
Скопировать код
Класс для агрессивного состояния монстра:
  q1 y& m; V( X+ G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 r: g6 {- I% J/ c9 a: U
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) X2 `% O/ w. j+ y

  3. * A7 }. d# Z5 o% J7 q% V
  4. import org.l2jmobius.gameserver.model.actor.Monster;+ X) P9 x" }3 O4 l  |3 B- d4 p# W; _
  5. 6 A5 N6 h4 R7 ?3 U; T( S
  6. public class AggressiveState implements MonsterState {) L* K0 h# D# o. H. ]
  7.     @Override+ w; I" H( H" H) U
  8.     public void handleState(Monster monster) {
    - b/ D; G! [2 Q8 S0 N$ H. D  I
  9.         // Агрессивная фаза боя# _" i+ F2 l+ ~& u
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ' w" Q# Z+ g, j) r" y
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки* w4 k3 T  @. r
  12.     }  a  J& Q# `5 c" w: V
  13. }
    * i1 Y( k. F* T, R; \
Скопировать код
Класс для финального состояния монстра:
# U5 D( n) X. V3 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 X& R2 l# [$ Z# U, e. h
  2. package org.l2jmobius.gameserver.model.actor.state;# b3 o  h- I$ s( X  {" ~+ E
  3. & z1 y4 z: s2 Q/ a: t, F
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 e; S- S4 p5 S+ ?0 Q( c

  5. # r; c% m& @$ a  K
  6. public class FinalState implements MonsterState {
    2 p% }2 w8 d0 K. R* n! V
  7.     @Override+ i* H' h  r3 K2 |; d9 w" P
  8.     public void handleState(Monster monster) {4 M, B( \' W# n! d$ @$ s1 }4 |' _7 W
  9.         // Финальная фаза боя
    9 g/ |" c+ H: R. n, N
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    , e; A5 `( ~# y
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки& I5 k( `# r+ {" H2 @' o2 O
  12.     }
    % |6 \% D+ g' a2 [
  13. }
    : F5 G% e9 a" O  z
Скопировать код

1 n: B$ I( e5 [- h6 BШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.7 l, G$ D* u: j6 Q' J0 G
  1. // Пакет org.l2jmobius.gameserver.model.actor7 C4 d4 A/ e( N- y% {- ?2 V, I4 ?
  2. package org.l2jmobius.gameserver.model.actor;
    / b1 @# A  e1 D$ ~  e5 i  N
  3. : W, I' V, {# |6 R0 t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 s& `  T8 ]# P$ a4 B9 Y: R9 ?
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;8 j. [$ V- ]& l4 D0 \2 F' {

  6. $ ?3 S; g7 u5 j; _. @  f( B; y
  7. public class Monster extends Creature {  e, _+ ]% W  }( d. }, h- S+ F3 c' x
  8.     private String name;1 I/ l( f6 x/ F& m, M+ a. c
  9.     private double attackPower;
    : `% X( n5 G7 T$ F' U/ t
  10.     private MonsterState state; // Текущее состояние монстра
    + U8 {  Q- }* x! ^% U

  11. & i* F( D; t$ L+ M
  12.     // Конструктор монстра
    0 q. Z0 ~1 C: o+ }
  13.     public Monster(String name, double attackPower) {
    ' T% w7 l$ G1 N' A
  14.         this.name = name;
    ! f, b% n7 `- S( ]/ n7 {7 v" E& G
  15.         this.attackPower = attackPower;
    9 ?& _8 Z* D, a. c) E7 U8 H
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    - I9 O  s5 {! `
  17.     }3 O" j. ^/ t$ a, C' }+ Q' p
  18. # s1 e' r- O, N: `
  19.     // Метод для смены состояния
    6 G" D$ E% J. Y! z7 S4 k9 u
  20.     public void setState(MonsterState newState) {
    - a' l& \7 ~- ^' N  N
  21.         this.state = newState;) X5 l6 O2 U/ ~; I9 f
  22.     }4 C' i( ]! u+ y& K* Y- K

  23. " b# z+ {4 g" C2 v: \
  24.     // Выполнение действий на основе текущего состояния: {4 _( m# B9 N; n# h8 B# T
  25.     public void executeState() {! u% w1 y/ X7 @9 q
  26.         state.handleState(this);
    % b0 J! S, V( L: G( y- _
  27.     }
    : ]4 C1 k: B7 `1 C

  28. 8 N9 O* }5 @$ r6 j) T3 p; p
  29.     // Геттеры и сеттеры+ J4 H, D6 j1 a% G0 [, [
  30.     public String getName() {
    * X- ?* H4 R" o
  31.         return name;
    5 t  E% f  h3 h5 w/ H, K
  32.     }8 e6 G9 i5 x2 [9 i

  33. # r! v( \  F2 N" \
  34.     public double getAttackPower() {, Z% {; m5 y* ^9 t. n2 h6 a) r
  35.         return attackPower;
    . Q1 |% y; G6 Q( @: n
  36.     }
    ' |. c. F  D5 ?! c  ~/ @: u
  37. 5 I" T" C/ z$ Q- e, X( ~  o- L, @# D! q
  38.     public void setAttackPower(double attackPower) {
    . Y! ^4 t2 N& C% |& l2 e
  39.         this.attackPower = attackPower;% j2 O6 L8 l# D1 H0 }
  40.     }. ?/ s0 J: ]: x* b, a5 Z- l" l
  41. }
    , z% y. p) p# X# d1 x; Z+ f
Скопировать код
; z( t$ q# D% P( Z1 C3 o9 _9 ~) Y3 {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
/ x) J" t* ]4 N/ c! m6 T
6 A' O1 {. @$ F' F6 @
  1. // Пакет org.l2jmobius.gameserver.model.battle
    5 k0 q+ g6 R( v
  2. package org.l2jmobius.gameserver.model.battle;
      P' C; l- I, O& O4 ~% S
  3. 6 L) Q7 y) ?5 t- ^8 [' D9 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;; F1 o7 B; }/ {" m; g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 x" X  y: F5 |3 |/ e: B" Z
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    8 c4 E2 r- S$ J& D  m

  7. ' T) ]: k/ ?  k: I/ F# i( }
  8. public class BattleSimulation {
    , F2 W% w9 a) c* p( j# {
  9.     public static void main(String[] args) {
    & Q7 N; P4 v# f6 ~7 B" U
  10.         // Создаем монстра с начальной атакой( q& B. h; }& r$ }. j
  11.         Monster monster = new Monster("Дракон", 100);9 D" f3 A- |* Y8 o  d& |
  12. 0 x: W) A2 j; ~/ w. v$ H$ R
  13.         // Начальная фаза
    * [$ B- M* [% ^$ p% T
  14.         monster.executeState();
    4 Z- \/ t6 {1 {& F" ?" Z! G
  15. 6 ^" ?- A" W1 N7 d; o
  16.         // Переход в агрессивную фазу6 ^0 t7 l3 V& M& ^" j" R
  17.         monster.setState(new AggressiveState());  P0 o! U7 U  ]7 b
  18.         monster.executeState();" N& z) Y6 e' ^% H7 C9 x
  19. % H- G& R$ q# l6 j5 P  u/ `
  20.         // Финальная фаза$ J+ k5 L7 A, L8 h- e
  21.         monster.setState(new FinalState());3 g# ~, i" u/ m. L/ c6 W
  22.         monster.executeState();
    ( T; A. C; \! ^2 z
  23.     }
    4 n! q+ @, {7 ^  i4 ]
  24. }( A* u. r* `: O4 e; e) b" w1 q
Скопировать код
! y7 _9 t5 \; o& ?$ `
Комментарии по структуре пакетов и классов:$ o; r* c( r" |0 n& `
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    : L. c. ]! z5 U5 R: r2 T7 S1 |
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% e( E% B$ E/ g( a8 F, K# C" K3 @  sЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!- d# k/ U; j. ~/ u
  t3 _) m9 ]6 B3 q

+ b+ s% g5 S6 d+ h5 l8 A3 h; w
2 s$ r3 R  `# M
2 O( m# ~( S9 v; C3 K  J/ f2 D
2 g* x) C0 y7 W5 z2 M4 m. `- K3 F* k8 }. n$ [2 B, B. L

: o" v* p" t' o0 P' u: M4 }' X' ^7 [0 \, D4 E

" _  ]  V' B/ ~8 @/ F5 I/ t5 Z2 \$ W: _0 n# c: L

5 S/ _4 n8 |1 e$ r* z5 Y* J  N. l, h9 ~. Z' A$ ~- @9 M
8 |% v/ u$ @) }, s
# W1 ~9 i1 @  n& H: O" l5 ?
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04/ F0 p: K! ?: a% z( `, w& R8 ?
Для управления сложными взаимодействиями, такими как  ...
3 c' f9 G. x* [. `. [) ~: d9 B; Z
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
( j; C5 ^) W  G6 M9 D. SОтличный подход! Использование шаблона "Состояние" де ...
( T. U. s/ E0 S& W. q1 |, y' t
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
! c6 H. m. O2 w
- g7 C, V' @6 q3 ^: X- y0 sШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
) X2 v" N/ [. ~3 j' c; O; i# n/ F: k% v# Q+ z: \
  1. // Пакет org.l2jmobius.gameserver.model.actor# v3 U# s# j4 T% H3 t+ D
  2. package org.l2jmobius.gameserver.model.actor;
    7 y, v7 ?0 l. Y1 s. d- d. M
  3. 5 W# l8 d9 q2 F3 I! N; @0 }- O
  4. // Перечисление для типов атак
    3 j3 N  E& U4 ^5 _
  5. public enum AttackType {
    1 ~  O3 |$ S8 D; y5 W* X
  6.     PHYSICAL, MAGICAL;* g. r" U/ ^5 K- y) e6 |2 O
  7. }
    + m  u2 S% ^. P" ~0 k: U3 s
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.) y& C$ @& ]7 D1 Y+ E- T1 W. F% z
Обновленный класс для агрессивного состояния монстра:! g+ \' m9 X7 K  K: i
. B1 j4 @  \/ c( q1 ^/ S: h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 f+ \" U8 h2 i7 g  P
  2. package org.l2jmobius.gameserver.model.actor.state;+ ]$ m( }2 D" B
  3. 8 d9 |& H2 t. b6 h2 \) ~" f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % M9 I" g/ x; x7 p( N4 o
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    9 l6 D$ p" k  w% I
  6. " ^- i! `. ~4 e6 m/ R2 F
  7. import java.util.Random;
    2 C. a' G& n( W9 i' q* L% O
  8. + E1 Q/ j' F' n- D4 j, X
  9. public class AggressiveState implements MonsterState {! N  w" K) g) ?' d' E
  10.     private Random random = new Random();
    9 W9 m) ~! n7 Z; z

  11. 3 z6 @5 n- G, I8 D" ~
  12.     @Override# Q3 c$ Z8 l- j! p; d- F
  13.     public void handleState(Monster monster) {
    , B$ r3 g6 N+ T& ]% ^  m* f
  14.         // Выбираем случайный тип атаки: физическая или магическая
    . d& a3 _/ h+ ~# N9 L
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 f6 m! L$ ^$ T( x& W. l, P
  16. ! D5 v0 [1 P" F
  17.         // Логика для агрессивной фазы боя/ e. z- v" ^8 L5 }
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    1 ]) T7 x! H' S" e
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");! B+ W5 W3 A; }4 A
  20.         : S( W4 B! [$ M- _0 q) a
  21.         // Увеличиваем силу атаки в зависимости от типа атаки* U) ^$ D! W( F3 L" {
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;1 ~7 U, U/ F9 G
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    & X" I- S% C7 E" I' r( m
  24.     }# B* _$ F/ N9 c6 _2 n: D5 V
  25. }
    # R& ]5 u9 u, F& J# B
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки3 P$ I% M8 G3 T

; K8 r) S$ k* I, a8 o, y4 K
  1. // Пакет org.l2jmobius.gameserver.model.actor7 f" V4 u  T0 T
  2. package org.l2jmobius.gameserver.model.actor;8 g7 y5 ]- h  B( U

  3. : ?$ ^' |7 v- f2 y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- o+ U8 z) h: G/ F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    & [/ h: E6 ?1 h( E/ S" Q
  6. 4 E6 X1 I& p. H' P5 W; b
  7. public class Monster extends Creature {
    $ f' z; G- K+ `/ Y1 \* I3 k0 l
  8.     private String name;
    ( W' M, }! b0 M- p
  9.     private double attackPower;
    5 {) A/ s* c) x  E4 z
  10.     private MonsterState state; // Текущее состояние монстра. }8 a2 E7 T, J9 P
  11. $ Q( U& S2 h- j3 N
  12.     // Конструктор монстра
    % g& E8 z. T* F0 q& {2 e  `
  13.     public Monster(String name, double attackPower) {0 |7 Q: Q& A: c  I0 C0 S
  14.         this.name = name;
    4 V% u' N+ P2 ]/ Z8 S! M: G! C
  15.         this.attackPower = attackPower;
    . `9 s3 ~) j% v# x
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию1 f0 n; N7 T0 h* V; b# _2 O" N
  17.     }6 R, f! G2 l- V8 }4 \3 o" Q8 b
  18. - Y! B5 c0 q; J. p6 G
  19.     // Метод для смены состояния) c) f; e2 S$ ^* y' V8 k
  20.     public void setState(MonsterState newState) {
    ( [2 L$ c7 r# {- C$ q3 ^* I6 y9 ]5 j
  21.         this.state = newState;
    5 r! }8 Z1 u# K8 _/ U
  22.     }
    * [  B: t( w% I6 o! Y

  23. . ?9 J0 y3 N- D# Y
  24.     // Выполнение действий на основе текущего состояния* K) d, m  F0 n1 S, I2 b) S
  25.     public void executeState() {! v. {, \. q; k0 e. @/ L* }$ m
  26.         state.handleState(this);& _7 U7 {3 E1 H2 v' O, r* h
  27.     }" V/ H# y. m* e, m0 c2 a, c
  28. 1 q  l' K! m( p, {% x7 m% a+ E
  29.     // Геттеры и сеттеры
    * F: c0 X: X7 ^: [
  30.     public String getName() {
    ! G) C8 i/ y% O% Y1 {
  31.         return name;  r9 f" q" B9 H* ~( u
  32.     }
    - C& ~7 V+ @' [

  33. ) F% u% O- T) [5 J5 K' z! V! f2 F
  34.     public double getAttackPower() {4 f" h# h+ c3 M" S; k. o
  35.         return attackPower;
    0 k, S3 s) B- j
  36.     }, b9 f: R6 e/ E. j& }8 y

  37. + ^7 O7 i. ^: ?' z! N' }
  38.     public void setAttackPower(double attackPower) {
    # A9 s. Q2 l! e
  39.         this.attackPower = attackPower;
    ( c; z! r/ h" Y: k
  40.     }( m! {7 q2 w) |) H$ U8 c
  41. }
    $ R2 {  k5 m" U
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
% y* |" `8 b$ n) [( Q/ t" H
7 H: Z& Q* @( u9 C- g! `: e) l3 `' Y
  1. // Пакет org.l2jmobius.gameserver.model.battle3 l" v: @2 ?, M4 ^; P4 [# F( I; R
  2. package org.l2jmobius.gameserver.model.battle;
    1 v" Y' a" }/ G) A; D5 W5 Z, E

  3. ) m7 e$ Y# X, h1 g/ s8 w- A4 _9 @$ x
  4. import org.l2jmobius.gameserver.model.actor.Monster;! N# I' r% h: F
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    & R  a* i- K( D

  6. 7 K3 }2 x: G6 Z6 U: ]
  7. public class BattleSimulation {
    & ^7 U. H! b- W- \4 q* I, \& |4 v
  8.     public static void main(String[] args) {* K  ?. m& @/ T8 ^5 P
  9.         // Создаем монстра7 s  Y: f" ]3 {& J/ U/ x
  10.         Monster monster = new Monster("Дракон", 100);
    ; Z, z  v1 ]- e, M, z

  11. # t. A* ?3 y) G; D+ v3 O2 h
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ! E; }0 v8 x8 S! [  _6 Z
  13.         monster.setState(new AggressiveState());7 {: s$ v% N/ o
  14.         monster.executeState();
    ( W! k4 P, a5 ?7 n# {! x4 ~
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак) o+ D% r% K& y7 S5 t! c- _+ J
  16.     }9 ~/ `$ G- q- Z
  17. }
    5 q4 y" h6 P4 w0 U  f; v
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
( ~4 k, T" X: u1 KЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
0 r7 E5 k: F# s  D' x6 z+ J) @* |% e4 g  l. \

9 ?# ?7 |# m# b
1 z$ H( a1 r' j! m& w4 V* [
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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