Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  W1 @- l' g$ z8 h, Q4 Z

+ g4 h$ j9 p- o6 C7 ^8 ~7 s

$ ~6 ~; O5 z. d( G6 H2 D$ CЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
6 B3 g0 F# Y3 QЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!  E  f* `, A$ I3 M
Астралия ?
. i/ x8 J7 i0 f: ~' K; n; b# u# i0 x( a

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!: u' G" r; z% a7 |1 [# o
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- M5 k1 x9 O: c$ v9 H$ W% S( y2 Y# v' ^* y3 m6 j1 g
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
3 c+ t$ `- q2 A' F: ^" C
AlexCoder опубликовал в 2024-10-16 18:311 w% }/ I# ^1 m9 v* N+ V
День добрый!
; Y+ A) B0 ~5 Y- l& BВ статье описано взаимодействие игрока с N ...

, W8 o9 f  U7 _+ K- fДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
) q$ Y  S0 B+ i, H7 J1 m0 @
; I8 V# H& \; A( sЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 x1 k, t- X4 J2 E+ @; x- Z3 ^
5 h2 u9 m  {, X5 x( FШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 D6 M8 g. ~0 j3 D! X  r7 v( }- v) Y' B- i/ D) Y9 l  ?- z
  1. <font color="Green">// Пакет для состояний монстра</font>/ t/ O: Z1 p' ]$ X: i2 k
  2. package org.l2jmobius.gameserver.model.actor.state;, G& j" d- C2 e, {" ^
  3. <font color="Green">
    5 k9 ^. C, B. ?0 E* R
  4. // Интерфейс, представляющий состояния монстра</font>. x7 G1 ~: h% v. R
  5. public interface MonsterState {
    & W, ^6 B- A! n2 L  L# `, e
  6.     void handleState(Monster monster);
    1 B5 A' k8 _- L* v- X  A, c
  7. }4 ~9 `$ \3 n! w3 |7 b1 E7 p
Скопировать код
: I7 k7 U9 H, `* D, H2 f# w2 |
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ S- c+ X: q/ Z! O' l
0 F$ {6 w( A6 R% h# fКласс для начального состояния монстра:
2 h1 N0 Y( e' O& O( g- z& X: U" ~
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>* L2 p1 }) N! Z: j9 U. ]
  2. package org.l2jmobius.gameserver.model.actor.state;0 {' N) m( M. z: t- f! {
  3. 3 j3 v" y2 M  v4 R
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 C" M& Z, t; f8 T1 ]. D

  5. 1 H9 U9 \* G/ E# G. E
  6. public class InitialState implements MonsterState {
    ' \% g9 A: d  m7 B* f
  7.     @Override
    # K3 w' @& L0 H/ F, T$ k3 n: h/ `
  8.     public void handleState(Monster monster) {3 P, g7 k( m  @
  9.         // Начальная фаза боя
    + g# F2 G$ s# ?9 Q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    " H! ]0 C7 _& S/ c2 B  r6 ?
  11.     }* i: p1 Y4 |7 g
  12. }, `; I5 F- N) I, Y
Скопировать код
- \9 P! G* h1 q7 ]' O

( d- P# O8 _" k! K# q$ j& P2 b6 p8 i+ m5 Z& W( T( G. F
  u3 Z5 ]  }1 `- C5 {# S

# b7 t! Q1 P* N0 f2 f
% Z* L0 U3 G! R" {
, R+ P2 P1 U6 J( ?  [: Z" |
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 5 t& @6 I5 P8 E) t! J
8 k1 a7 k0 J* r! ^. q
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
$ L! O% a: c8 J& O8 z9 `! a# s5 R8 w6 R& l- a- D
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( w4 i( o9 \0 \7 P
7 H: H  }+ ?3 v/ {
  1. // Пакет для состояний монстра: U& b# H1 k; b! ~: A1 x
  2. package org.l2jmobius.gameserver.model.actor.state;
    , z; {- ~. L6 ^0 F0 f
  3. 2 ~# m: F6 u- R
  4. // Интерфейс, представляющий состояния монстра, K8 `$ o, B5 E' X1 B/ Z" t2 L
  5. public interface MonsterState {5 j* l4 T& _/ y0 O, R
  6.     void handleState(Monster monster);
    * |% h  Z  c2 @* N* l' T
  7. }
    ) U2 R: T9 D% p! h
Скопировать код

9 t' W2 |' q# c3 ]% V7 BШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. : ~7 L4 k6 i. {& J2 O

. A! U9 ]2 k: G( \6 N5 d$ u/ VЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.8 t$ d1 B( J# ~/ A7 L7 ^

+ k. q5 W  [; Y9 D2 FКласс для начального состояния монстра:
9 F0 e9 b5 }2 p3 R5 V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state" o7 q8 m6 F! o( Y7 F1 x0 g
  2. package org.l2jmobius.gameserver.model.actor.state;* i& X/ Y) S0 \8 M; Z* r% f! H" K
  3. - \$ S+ c8 [% w3 n9 Q3 f. g+ c
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 n& `( |; Q! G( G

  5. 7 Q) s, r0 P/ O# N4 }1 I, t4 Q
  6. public class InitialState implements MonsterState {; L; t: a8 m- O6 j- j4 z9 z0 c
  7.     @Override, y1 v7 M: j( Q5 `, o
  8.     public void handleState(Monster monster) {
    ( d% s; A& L3 n# F% R3 {, a
  9.         // Начальная фаза боя( j/ m4 x/ G1 [4 d5 M* Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ! P; `. q7 E, J6 Z& t+ _4 J" U3 G
  11.     }
    3 I0 O5 x7 j, q& ]# ]0 u9 f! m
  12. }
    . j* h0 x% v" T* F! W8 J& O
Скопировать код
Класс для агрессивного состояния монстра:
/ _6 z; h$ D  J( b: Q  v* f; `
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      \" e2 k7 d0 i9 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    / U* E9 i! J/ W& ]
  3. . k4 Q" c% v6 T" q3 q/ ^& B# N
  4. import org.l2jmobius.gameserver.model.actor.Monster;: n6 r/ B. X+ n% Q3 \
  5. 7 M* X. l, V) y
  6. public class AggressiveState implements MonsterState {
    8 E7 F9 M! @$ h. l+ w) {4 O
  7.     @Override  P5 K  |- x: e+ ~3 y/ R
  8.     public void handleState(Monster monster) {
      [2 k. d0 M: S% g
  9.         // Агрессивная фаза боя% L. O9 E8 ?1 ]8 c+ H
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ) x2 g0 \+ {$ V
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 \  i0 I4 m5 z0 S& e! {# ]7 u  Y
  12.     }
    % j6 A" p" Z9 c- Z
  13. }0 a% u( A& e- Q" [' }
Скопировать код
Класс для финального состояния монстра:1 V1 l$ \4 m0 h2 s; S$ M# S
  1. // Пакет org.l2jmobius.gameserver.model.actor.state! o; w5 V; |) b
  2. package org.l2jmobius.gameserver.model.actor.state;
    , w. I( ]& {3 o# e' x+ i: u
  3. / {3 ]: [4 |* j- W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : O- U+ g2 {  X2 B/ R1 ?! j  X
  5. * r0 u( O- p1 B, d- S0 Y
  6. public class FinalState implements MonsterState {
    ( A6 Q0 s- d7 M! J+ c( e
  7.     @Override
    6 ^# a8 A9 [* N0 N, H
  8.     public void handleState(Monster monster) {$ S1 v+ i! T0 f1 s" q
  9.         // Финальная фаза боя5 f/ J9 z0 u! V# H5 L
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    + i. a3 `/ U0 P6 `' o6 ~
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    5 _+ M! H* B, ~  z; ~; a
  12.     }
    # @4 T, m$ V/ r9 X7 r7 b
  13. }+ G# u. c- x/ D* B
Скопировать код
; r/ r/ s# H/ x6 C$ |  {# \
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) I7 u! q& R' |/ i
  1. // Пакет org.l2jmobius.gameserver.model.actor0 F0 x& e3 ?7 {
  2. package org.l2jmobius.gameserver.model.actor;# N) d: U$ y" S6 j. P  D# ~/ Z3 o
  3. ( p; S# M: U5 j( K0 |7 y
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ q3 L4 k$ u+ l5 h9 X% T5 G, B1 Z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ; P* {) L& U4 `% W

  6. 4 d( j/ S3 Y. y. o1 h
  7. public class Monster extends Creature {
    ' l4 U6 H' ]2 P/ M/ j1 }& \- H$ t
  8.     private String name;" F" D! r' K7 w1 }3 y
  9.     private double attackPower;
      {* K, t8 W  h# ^9 V
  10.     private MonsterState state; // Текущее состояние монстра+ u* d' y7 o& b
  11. / u/ m/ P  @$ W, R! ]# \
  12.     // Конструктор монстра9 P" @0 G* O; l3 \7 J: E% {
  13.     public Monster(String name, double attackPower) {4 ?, f1 I- m1 L7 n+ Z: i$ V
  14.         this.name = name;
    2 h8 f1 n  R. j: a; \
  15.         this.attackPower = attackPower;
    + c, l* r0 V( t- y1 G
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние' M1 [: E6 k1 r6 g$ N8 t1 n
  17.     }
    , U+ `1 l: a. B7 g' l/ _/ a

  18. " N8 s7 w) Q! h9 c0 s
  19.     // Метод для смены состояния
    ! T7 x/ l& c; n" }. @/ \
  20.     public void setState(MonsterState newState) {
    ! b6 w7 d! [  ]# {* q2 `" U! S
  21.         this.state = newState;
    # h& @: h' B( ~' K7 O) N5 G
  22.     }
    * m1 I+ m& c: P/ f, b5 K

  23. * N7 i' k# X9 u. N+ r: W: ?
  24.     // Выполнение действий на основе текущего состояния
    , R2 }; u+ ^* p7 R& P
  25.     public void executeState() {
    1 m4 X) j) L& S5 C5 b: o( c
  26.         state.handleState(this);6 ~$ b$ l7 E4 l0 |
  27.     }
    % c/ A, a0 u" O# l2 l8 f7 H
  28. 6 e/ D" I3 P0 K
  29.     // Геттеры и сеттеры
    + z6 ]$ N' i5 R2 ?* i2 {% n
  30.     public String getName() {( H8 R4 v& Y! O4 T5 c
  31.         return name;  U9 v$ L: @8 m. N
  32.     }; V0 V: d" f$ ^8 R6 k4 @& j

  33. 0 w$ {* q6 @/ h: F
  34.     public double getAttackPower() {
    9 y9 c- Q# z/ `! D  g2 L
  35.         return attackPower;
    1 Q* B. `' s6 W
  36.     }
    ' r7 B4 f0 e# p
  37. % @  b4 M; V0 W# S0 n" s7 }5 O
  38.     public void setAttackPower(double attackPower) {
    . B; v$ l7 ]+ G- X
  39.         this.attackPower = attackPower;
    7 M) m3 k: J5 G5 d( ?" A
  40.     }3 `/ q6 [' U7 L- l2 R  \
  41. }
    7 L7 H: u5 x4 H0 ~- @0 a$ K
Скопировать код
7 H* S" a2 P( m4 K& ^1 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.0 A# ~" u2 O1 l# j; {$ @9 l& y0 a

8 q" C2 f; {* e- \) @1 b* i) w
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 o0 v" x; N; x: |  z5 j$ o
  2. package org.l2jmobius.gameserver.model.battle;2 P7 Y! L, A" {- [( z' V0 L
  3. 5 s6 O  N0 ]2 {$ L0 D8 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * @/ q5 a5 M4 |+ p
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! i# \, d$ k8 t& b7 l! O
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    : @8 d0 y! e) e& h1 S3 f& O; Z

  7. $ v' u& l" }, P- g% f- m( d
  8. public class BattleSimulation {
    * ~$ Y. O% X4 w1 p* H$ A
  9.     public static void main(String[] args) {- ?* e0 k+ Q& K) r, v  Z( V+ x
  10.         // Создаем монстра с начальной атакой2 o, p! I0 v8 c% V+ O& w  e7 H
  11.         Monster monster = new Monster("Дракон", 100);. v+ k* B; B) M* C

  12. 6 Y' i  h8 B1 x+ X: X  s4 k. _
  13.         // Начальная фаза
    % [0 [, ^# T6 Y5 `) ~
  14.         monster.executeState();9 M3 s" M5 N; R2 ]5 d1 k7 Z

  15. " k- r3 @* `/ S, ?  F3 L% l# F
  16.         // Переход в агрессивную фазу  J' s$ R( \; X0 G& P: w9 L, b7 l
  17.         monster.setState(new AggressiveState());
    7 O) z- |4 @* G9 j0 v
  18.         monster.executeState();
    ( w' o/ D  h7 [" N

  19. 0 v( X, k; P2 {" `* g$ D$ v- Y& e
  20.         // Финальная фаза7 ?- [4 o% a5 [5 [
  21.         monster.setState(new FinalState());' {9 W9 q$ V: o7 J
  22.         monster.executeState();
    4 _/ _, G1 l8 d" h* q) r, j
  23.     }1 ^' P9 X5 o1 o
  24. }
    2 {7 n1 n9 N+ x+ y4 B* H5 T
Скопировать код
2 F7 ]' v. u9 S0 q$ Q* {
Комментарии по структуре пакетов и классов:- g8 O+ t$ v3 U
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    4 g4 N# `5 n8 A; X$ {: ]5 L
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 z2 d/ w& n' L4 NЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!+ U. k. b. [- T( x
% I4 k0 n+ g0 d' d0 H
* \) i6 r& v+ w! c: s6 N
' p4 N5 u# D  V+ b% d: E; {; p& j

% O7 _; [. [% o8 i9 I3 d  B" @! ~6 ^: ~
! W- T  o( a5 s+ c0 ~/ C

# C2 F, K( o/ f" v7 l: s- L/ [
* H0 d( Z: w( z' a' P; q
2 I" q6 e0 [- E0 x" ^
9 _* H! c  h7 Y7 x- ?: |$ [0 ^0 y, i0 c( C" E0 h3 ^
! q+ s+ U3 D$ Q; W' j

0 H; O, S5 G9 C! |
: A! M, Y8 H: Q% u
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:044 w$ j( P2 G" V1 M0 D
Для управления сложными взаимодействиями, такими как  ...
; P! U. _6 i. e0 I; Q/ ^) U
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:214 y+ m" T2 A: \! |5 ?$ A
Отличный подход! Использование шаблона "Состояние" де ...

8 V; |& k8 d; ^* F/ `( QХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
3 z7 ?% m! }6 Y2 G$ |1 x6 I! ^) Y0 F5 `5 d( F9 r
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
) r: e! C5 `" ^$ V# }  o. M3 j& d% Z
  1. // Пакет org.l2jmobius.gameserver.model.actor
    7 W# Q' Y: F3 y9 i2 s4 e& X
  2. package org.l2jmobius.gameserver.model.actor;, T' g( @3 e; j2 q3 d" N

  3. ! t$ V& V/ Q0 Z  G; g% D# n
  4. // Перечисление для типов атак
    # D! U1 ~/ _7 d4 E& f0 O1 X
  5. public enum AttackType {
    9 @, S' t. N1 ?/ ~
  6.     PHYSICAL, MAGICAL;7 ^# q4 @7 M3 H- ]! Q8 y
  7. }
    8 Z+ d' ?# t) h
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
  ^+ v# T6 P6 a/ U/ d* qОбновленный класс для агрессивного состояния монстра:
6 k3 Z- w* q" I& D+ S! R% P" m3 j5 c) g$ k# D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % J2 Q$ r; R  E
  2. package org.l2jmobius.gameserver.model.actor.state;  _3 W( \# N/ k6 ~* O
  3. $ T1 s% ~8 ^4 P+ Q' O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / [! P  L. ^  v/ i
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    5 F/ s- q" J! l4 J5 w" m

  6. 1 c. v/ U$ b! l) T$ I& G7 R1 r
  7. import java.util.Random;% y9 D* n& l4 _& B7 P* o& j) V" h2 g6 i7 ~

  8. ( e# T& F* K$ J$ V6 s7 a) Y
  9. public class AggressiveState implements MonsterState {7 g" b" @+ ]+ P9 D" A: |# Y
  10.     private Random random = new Random();
    . F0 q6 ?  H$ @  D
  11. , O' W5 U/ O1 x. [4 w& D
  12.     @Override( C- l% }& O9 Q# d$ C
  13.     public void handleState(Monster monster) {
    , o* `1 C2 C$ L7 p  b. Q, v. Y
  14.         // Выбираем случайный тип атаки: физическая или магическая0 e5 G# Y3 l: M* f( L% Q$ o
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    $ R. ^5 N0 H* L; {/ @5 |
  16. / n# Y" \/ f2 u- T
  17.         // Логика для агрессивной фазы боя
    ' X+ \5 M' p) z7 C, O" Q9 t
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "   N" x. x! B% J( ^' \
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");3 v7 G# y7 y/ v% J& D
  20.         : ?0 Z% c7 m0 y0 `* y! U. T8 W
  21.         // Увеличиваем силу атаки в зависимости от типа атаки; Y, o. R6 x6 ?8 L8 j. h
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;9 h7 [  L) [6 U' C" R
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);/ L7 W2 j5 O" F! E- X' V) r
  24.     }
    5 }8 Q2 n- J8 e0 ]' f" [6 e
  25. }
    7 q2 y1 W: @3 N3 i
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки4 K" `: K0 n' S* P' r) Y$ i9 P
3 i: K$ _" }, D& D" A( D7 q
  1. // Пакет org.l2jmobius.gameserver.model.actor! {: n+ Y  J/ @  O
  2. package org.l2jmobius.gameserver.model.actor;
    5 J  l6 u* M+ A( x; c
  3. - _" [# g- X: Z! e2 Z0 X6 t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- r! F. Y9 `+ @5 F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    : \8 F2 {3 ^5 {5 N4 z: ?, L5 v$ n
  6. * x% H0 Q  Z  c2 S
  7. public class Monster extends Creature {! Q; m; c5 R9 L* o4 l8 m' V+ V
  8.     private String name;( W  U" m* x) k7 l* W
  9.     private double attackPower;
    ) ^9 M( |, b+ N  H6 ]6 @6 ~( T
  10.     private MonsterState state; // Текущее состояние монстра
    3 _" y9 W# w% Q# F: n  V
  11. * J% {% Q& P# J( o) L. P
  12.     // Конструктор монстра
    ' l# E. _) Y  C5 a# m$ S+ Q
  13.     public Monster(String name, double attackPower) {
    2 E) `+ l9 q% L2 P
  14.         this.name = name;
    6 n' i# C7 @! x5 j6 j* L5 W
  15.         this.attackPower = attackPower;
    ; z! H( n# K. }9 G# ^; B
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию" X& ?, H( w6 b3 Y5 W6 C2 K' A
  17.     }
    : m& y' P( B3 q
  18. ) q: a4 ?2 w. p, f( O
  19.     // Метод для смены состояния) v2 N7 i0 V; Q1 I. G
  20.     public void setState(MonsterState newState) {
    2 d/ n- G$ d4 @1 z/ |
  21.         this.state = newState;
    / t, \8 j/ K) `9 w* Y
  22.     }
    ! A, _# f1 J" Z3 i* j4 f
  23. ' K& w6 r- x7 Z; a9 t
  24.     // Выполнение действий на основе текущего состояния$ \% J4 Y$ A& n( ]; t
  25.     public void executeState() {. i. Q! ?4 p  |6 [( B5 R" o
  26.         state.handleState(this);
    4 {$ @* \! l5 q5 o& w5 s1 m' l+ ~
  27.     }. T% E3 w: ~9 e/ V' L% H

  28. 4 u! c3 B2 O' Z
  29.     // Геттеры и сеттеры" ]+ n8 c) B7 x: p9 L- _: h6 i
  30.     public String getName() {
    % A( e$ D4 k" N
  31.         return name;" ^0 b/ W! B7 O$ V- _- D% ~" q
  32.     }! a- R0 X& V. O* n1 X* u
  33. & m% R7 p9 |9 n, ~* _+ t
  34.     public double getAttackPower() {
    / K$ R, U! v2 P. e+ u1 U) ~7 a# Y$ D
  35.         return attackPower;: _: U( W  a* t9 H' N
  36.     }/ I/ L# a, J+ Y9 x" w8 V3 l

  37. ) {) ~& e0 ?; O- K
  38.     public void setAttackPower(double attackPower) {
    : Z+ Z! ~: k6 i4 b' g7 m- |
  39.         this.attackPower = attackPower;/ ~$ X) y5 e6 D% e# S; ^' w
  40.     }
      j+ m) i  \+ O# [: [
  41. }
    & @) `6 ^; Y8 G! b8 G) n5 @
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.3 p0 q, a7 E: H2 V9 d3 u# c

6 X$ ], ?$ I# s+ u. ~7 B% v
  1. // Пакет org.l2jmobius.gameserver.model.battle8 l) K) T$ S4 j) Z
  2. package org.l2jmobius.gameserver.model.battle;  \+ Z% ~) O, P% _0 {2 V* S% F

  3. 4 d* }8 F& D% t& |! B3 q; s. m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % f( _( Y; {5 B3 _4 f0 e: ?
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  t' u  x8 |( w9 _
  6. 6 ~9 S' y" R# z; a
  7. public class BattleSimulation {, l& S: u8 r- T: @8 j2 n. j$ w5 n% V
  8.     public static void main(String[] args) {' l, {* B( _* q6 V) m4 y$ K- h) A
  9.         // Создаем монстра
    ! z! I. }$ t6 h7 l. k' D1 c4 h
  10.         Monster monster = new Monster("Дракон", 100);
    $ P1 _6 M, d, a/ Z$ R  Y6 S- q

  11. - F$ b. l5 R. X1 [% O/ D3 j) S
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак, t1 B& H* a* Z& \  m
  13.         monster.setState(new AggressiveState());6 F7 y8 t# w. Y( B4 E5 q  H
  14.         monster.executeState();
    , ?8 ~1 H" Y6 D/ r8 B3 z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак+ z8 R) J3 c$ m
  16.     }# t0 I$ a1 r8 g
  17. }7 w1 }( R; v( z: F
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.. W  C, [8 [5 t) o8 F! R0 C
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
3 l& l' M5 ^! t! X. @2 [' D/ H
3 l* G+ C4 j7 Q; |( B) E' X& A- b9 F' i1 f( b. N7 H

- b! y- `- Y: N$ O* Y% w
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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