Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!) h- V' o% q5 P

6 o. C& `+ c( T* r& n- G
+ k. S, u: s$ P! @( F& a
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
: }+ V- [( o# F  MЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 W8 \# t: {( Y& z* b6 h: j/ T
Астралия ?
4 E+ @7 E8 V4 F
: N7 `) I; E. c) `3 m

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
3 s5 K/ x3 P0 B% w6 F' |, ]В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?+ N/ K2 ]- X) Z- z3 t( U3 ?5 w
" I2 j2 u/ q3 v
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ x! H( m5 G0 b$ f! l7 L
AlexCoder опубликовал в 2024-10-16 18:31& v. ^0 L9 s0 `
День добрый!$ x+ g) D' u2 u; ~1 z- u  r5 ~
В статье описано взаимодействие игрока с N ...
& N$ c  V2 D: H; W# E" p
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 r7 n, B+ |0 r
6 v+ W5 K1 _% d* F) s; s: @Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
3 Q% y6 K% u  [( |$ T
" [. K& R4 Q6 b; PШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.( Y' }4 i" G5 v3 P4 F

' j4 T# p6 B% S% s2 ?6 \9 [. w/ G
  1. <font color="Green">// Пакет для состояний монстра</font>
    ( O. z' r9 V: R3 E
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; z* H2 o( K* l! ~
  3. <font color="Green">
    1 a; `7 b! K+ N9 A. U& b
  4. // Интерфейс, представляющий состояния монстра</font>6 M3 g/ H  Z8 D9 N" F3 O
  5. public interface MonsterState {3 [8 h5 K" @* ~7 F) q
  6.     void handleState(Monster monster);8 Q+ I! _: c* b4 c! l0 l8 J' B4 \
  7. }
    3 t8 t, b5 x1 e  V, R0 c* p/ X
Скопировать код

+ m- Z/ e1 X8 R0 FШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! y" k( S" R) \( d3 t
  R0 ^9 M( V% J3 t, w7 Q: W! _! t
Класс для начального состояния монстра:
% G9 k) z' I. @' P6 O
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    $ z+ @% U  z# \' M$ X  p; w
  2. package org.l2jmobius.gameserver.model.actor.state;) R0 {6 u$ y0 f2 A3 O

  3. 7 ~  S/ W7 V4 a, ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 D! b6 K# r" U' K% U: t7 u
  5. + D- g  s  x; Z
  6. public class InitialState implements MonsterState {/ v) a4 H7 b# }# u- y% M
  7.     @Override+ B6 Z+ t$ r. J$ l. y4 R& I( E
  8.     public void handleState(Monster monster) {
    ( ?* B' L" `, `
  9.         // Начальная фаза боя
    & o* o5 {% C2 U; i6 z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" L& N0 s# S$ m& ]9 }
  11.     }
    7 ?3 f" b$ u5 N6 Y, u5 l: u
  12. }# E9 T0 i  _1 i: ^* |
Скопировать код
6 p: j0 k3 _4 K. |

0 N+ y3 |( C6 [+ H+ Z& I& }, E
, N6 j6 {/ Q' C1 h0 r" I# d0 @+ X" d/ a
* O* c) K6 u7 z7 g# e
7 \7 S  G  _6 _0 Q
, Y$ U* B& v1 V5 R* J! D
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 Z$ `5 E4 M& b7 z7 ]; \  W* T1 c# E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 k$ X1 ~) c/ h# V5 a1 B4 E& f2 m) o

. e- z, ]6 a+ j  ^; e% ^4 jШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ @- p$ g# Q+ n
7 V1 ]6 R0 [$ `
  1. // Пакет для состояний монстра) {* t$ T+ _0 A' ^1 }; x7 w3 ?4 P. ^) b
  2. package org.l2jmobius.gameserver.model.actor.state;
    % c9 l) J& b; ^5 {8 h
  3. * c8 N9 W( x. h3 P+ m0 H6 S  u7 k
  4. // Интерфейс, представляющий состояния монстра
      b0 L* K# i& c' l
  5. public interface MonsterState {; R* H- ]& ~" B, D! Z
  6.     void handleState(Monster monster);
    1 g" {+ D; a! I! @6 J
  7. }+ f& E& k9 N3 B6 Q
Скопировать код
; h0 T! G- P6 |, L" m0 U) V, h* R
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ' t- T2 b" a, m0 G; Z) r8 H  Q

% c8 U/ K, `5 D* [8 I3 }Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* o9 F0 i5 ]* v- n/ }& i( H
: m! a  u" Z. s. |; e1 J" y, z
Класс для начального состояния монстра:
7 ]/ d2 k# v% X0 ?- x4 D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ v; |, m) d! x' `$ Q0 o+ ~8 K
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' A9 i- t3 _4 d( X- X

  3. , N' C+ _3 E; l+ x
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 T& F* v* ]( U  F5 [

  5. 9 C" _% f- t/ c" @  ~2 i- E
  6. public class InitialState implements MonsterState {
    % B) A2 A$ {* q
  7.     @Override
    - p1 ^( t: v' k9 ?, w8 `+ g
  8.     public void handleState(Monster monster) {
    8 b7 L1 e; k( p/ f) z5 f# A3 R3 E
  9.         // Начальная фаза боя8 \7 m6 r6 p: \: G
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 k$ Y3 i: t0 k, r; o
  11.     }
    ) V. P& `0 I; |( i
  12. }
    3 z3 W" O+ x+ Q& k- _5 d& P
Скопировать код
Класс для агрессивного состояния монстра:
9 `* H6 d- \* {  l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; ^! X  b6 w3 s: a, S
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( P8 K( {9 v4 B

  3. . u7 ^2 f4 m. {) a' u9 n9 e3 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ z/ J% q9 z9 Q% y: k5 y7 T

  5. + |, d( P) V" o5 N; t$ ^9 x
  6. public class AggressiveState implements MonsterState {4 e" V! e7 T5 z, ~) R+ R* y' i
  7.     @Override
    3 x+ T) d* [, o8 u0 c2 U
  8.     public void handleState(Monster monster) {+ H9 ^- O# W- ^& x6 [, @8 y
  9.         // Агрессивная фаза боя& |8 {! u$ d! Y& `& O
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    # ?8 [! R9 ]. K- Q8 z# y+ C5 [/ _5 a5 r
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    " ?/ ]; }# V  A, S6 F
  12.     }0 i7 `+ j8 Y/ R, a" g
  13. }
    . D$ y# U! V! Y3 e5 ]
Скопировать код
Класс для финального состояния монстра:
$ k4 @3 S6 R* i/ e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 u3 N+ M+ t# @* v
  2. package org.l2jmobius.gameserver.model.actor.state;5 _8 b$ _# e1 m! v. c4 t

  3. : C5 n6 I$ Z, E4 ^1 w1 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;8 Z: J) |8 U2 [. M9 T2 A  n
  5. 8 d- O+ \; U! ~3 o  b
  6. public class FinalState implements MonsterState {: e( I# I; ~+ O5 J  x" p
  7.     @Override
    $ h" t7 N0 O  i' z$ I+ E6 Q7 [% e
  8.     public void handleState(Monster monster) {8 I# P4 H& k4 ^6 j" w% S/ u% v
  9.         // Финальная фаза боя8 i1 {" z( _7 t7 z( W% x3 K
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    / N, `% X- `) a
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    # o/ L, q6 {4 \# P" E# J: P8 r
  12.     }
    + c% Y1 Y! Z2 b1 @
  13. }7 c) E- G, b7 ~5 Y, X1 a
Скопировать код
) H4 G: J; r: a3 E9 t& z2 y0 D5 X
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
% {, m' V9 D& k! M# o
  1. // Пакет org.l2jmobius.gameserver.model.actor( s, b5 A' X1 D6 k/ ]
  2. package org.l2jmobius.gameserver.model.actor;' Z0 I2 x0 j/ Y0 W

  3. ! j9 \) D9 }) n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;& q- {9 W$ R2 ~" F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- ]% C% z  Q) t, Y- T. w% @
  6. 4 V9 D; x* ~7 y  d
  7. public class Monster extends Creature {
    $ b1 }' S3 u, U! d
  8.     private String name;) ]2 C8 x" c% f6 C+ r; G
  9.     private double attackPower;
    9 s- \5 p; w% [7 q; t( s" R
  10.     private MonsterState state; // Текущее состояние монстра
    3 r/ Y! {- p+ ~9 z" w+ d
  11. / N# c7 r' v9 T
  12.     // Конструктор монстра
    , @: x! t# R0 p3 c9 q9 O4 D
  13.     public Monster(String name, double attackPower) {
    6 S) J  Q$ }! U  `
  14.         this.name = name;
    - V. e9 o2 q, Q- X
  15.         this.attackPower = attackPower;! d4 ^/ {7 t% C
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 C1 D' ~+ f) ?# ]7 F& Q- N5 |# v
  17.     }
    + n: u- j8 r" I% A1 h! L, p
  18. 5 C) t. ^% p" \0 G/ r
  19.     // Метод для смены состояния
    , S* @) F6 G; `7 n* f
  20.     public void setState(MonsterState newState) {; B, N8 E! A$ [6 ^7 h1 C' h
  21.         this.state = newState;
    6 N0 E: a: Q5 x9 S  d" ~. A
  22.     }
    # X' {, K# p; r, h* e0 ?* e, K
  23. . b* a5 m# J9 L3 {# a
  24.     // Выполнение действий на основе текущего состояния
    - {% p2 D- x' t3 u6 w$ f, T
  25.     public void executeState() {
    , C0 x' J5 v3 d
  26.         state.handleState(this);
    % j/ G: t8 E( i# ^% s! h* _3 j0 T
  27.     }
    . r5 t% p, r9 d) g9 w/ _" H6 c/ C2 d

  28. $ ^, Z* A0 S# ~" E4 N1 Q
  29.     // Геттеры и сеттеры
    ; ~: D' e+ w* u) c+ S& G9 r' E4 ?
  30.     public String getName() {& {) M+ ?$ j/ d! ^) C+ @3 ]
  31.         return name;
    & y- L# z' _9 W( o5 r+ f' D
  32.     }# o! c2 o$ T$ G8 ~
  33. ) e8 y- m3 v2 d3 W
  34.     public double getAttackPower() {* ?. o1 {! ^  T5 W- B
  35.         return attackPower;. b# l" x0 h& H2 N0 @$ o% a$ H
  36.     }: H: H& K5 z5 J1 s( P
  37. ' R/ j& c2 ~9 K1 R- @
  38.     public void setAttackPower(double attackPower) {; Q+ }& C1 `/ @7 J
  39.         this.attackPower = attackPower;0 K; W% G0 k- @4 i! G% m
  40.     }
    " v  N( J  O3 f
  41. }7 Y' W/ F3 h& N# D) u6 S+ }5 Q7 C
Скопировать код

# L; ^! q4 e  T& `7 |Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.9 j* T6 H" i7 ]+ s+ c3 o4 B

1 U, l4 U1 f! k7 K" B% N6 }
  1. // Пакет org.l2jmobius.gameserver.model.battle
    + H- G* C% q$ H& p
  2. package org.l2jmobius.gameserver.model.battle;
    0 f( q4 t6 i$ y1 X) z, v' Y

  3. # D9 s; ^! |* @- v- m# w5 V* n  w# k
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 p( X: N# J: e; S* n8 f6 Z- m. z& F
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    4 c& j/ M. v& b6 o! j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;* x' C' F/ |% R7 Q" D2 u

  7. " |7 q5 U% V* N" |
  8. public class BattleSimulation {
    $ P' \3 w6 w* p6 s# l1 b
  9.     public static void main(String[] args) {( F$ k/ _$ k/ N/ @
  10.         // Создаем монстра с начальной атакой
    5 w4 n0 J$ P2 T0 ~2 |: g2 C
  11.         Monster monster = new Monster("Дракон", 100);
    0 c# e/ I. E- \7 ~8 l- R2 _
  12. 1 u& z8 P9 r- w' M: w
  13.         // Начальная фаза
    1 U8 h, Q1 X; _
  14.         monster.executeState();
    4 \. `; l# Q( z9 _3 ~  j, C# G
  15. 7 z2 m  g$ {* j0 D6 t* s, R3 c
  16.         // Переход в агрессивную фазу
    7 ?4 a. I# S, ?$ ?2 Z+ P2 @0 g
  17.         monster.setState(new AggressiveState());
    + N3 L& B% P/ _. N# _
  18.         monster.executeState();5 D) m3 _9 B7 H

  19. 0 y/ b1 Y* R# T8 d
  20.         // Финальная фаза" t3 I& O! ^# _2 X: z
  21.         monster.setState(new FinalState());
    ' m, _5 a3 Y) P- \% ~+ r+ a, _
  22.         monster.executeState();# Q, M$ V" Y2 Z% e% S+ F; X
  23.     }
    % R0 v4 y" p0 g2 [0 u
  24. }7 ~* ]& }& N" ~
Скопировать код

+ G* a+ l& N3 W7 l* e& yКомментарии по структуре пакетов и классов:
+ Q9 [: _7 c% H) o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    $ w) ?; m8 L) }  q( _
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% J: X0 I# i7 {3 i' TЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!: [9 m  P' O' F
) O1 y) B* Q  a$ d5 C
" [# u6 j1 C6 Q+ C$ d6 ]( w; A
4 T% i- K  j9 ^$ {( z. f$ h7 q

  W- z* t+ q$ z* W# g  S0 n+ @2 }: Z# E# T& M6 Z3 w
4 `3 Z) _2 Z$ O9 J$ [/ x& Z6 m
1 `. l  O* b. U1 ^

/ Q( }# q; A* ?. b3 Y% Z7 l3 K$ W5 m% _+ ]* {

. M( ^$ |2 T' {/ o# K( }' K/ p8 `3 o2 E& _) f
7 ~+ b8 n. y; s) F3 G
0 w! g9 [/ q* @2 j' W4 C) Z& A, f

7 r7 }1 z6 e  n0 Z& ~; E
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04, z% Y5 i: K5 ~! [+ r% ~( u* I
Для управления сложными взаимодействиями, такими как  ...
4 t8 U( ?/ @. J" c
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:215 L8 a6 z* c0 A( e3 v
Отличный подход! Использование шаблона "Состояние" де ...

" e, J/ s9 f0 AХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.8 W$ v# h$ N! ~
2 K7 h4 X9 x, ~7 `
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
7 R7 g0 R5 h8 `2 e: G, d* Q
3 w2 {2 b1 i, L% `: H2 q1 H4 v; h
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; d1 _1 m3 z" D) b- x  ^
  2. package org.l2jmobius.gameserver.model.actor;7 {( [/ q* {- j  P

  3. 4 p* C) e/ w6 ^4 B- p/ a
  4. // Перечисление для типов атак' o* j3 N9 b- B& u! @7 i
  5. public enum AttackType {
    3 _5 s) z" }8 k
  6.     PHYSICAL, MAGICAL;
    ; C6 ~  I  }$ L+ x2 ]/ |+ g3 ^
  7. }
    * ]+ ?' i$ V0 e# B
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.6 r0 L: j) n- x
Обновленный класс для агрессивного состояния монстра:3 f4 F$ w+ w# k; X- i
( ]9 a) `& A8 L: r+ O( \  m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 o8 h$ _) l) Y8 @; O
  2. package org.l2jmobius.gameserver.model.actor.state;
    + t- H. L- m- |4 ]$ d& t5 t4 ~- D: o
  3. 8 P) Z! V4 \  G9 i0 I; K# l" Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;: b& L+ g5 n  P, l4 @# j7 F
  5. import org.l2jmobius.gameserver.model.actor.AttackType;8 n- ?% P7 U/ N# _  {' s% h( \
  6. - s. [8 }- c. ?4 e7 y, A
  7. import java.util.Random;
    2 {* H9 R* U- `3 ~
  8. - A6 A9 w: S1 P3 d. Y
  9. public class AggressiveState implements MonsterState {6 F$ b7 a' p* j3 u. b( {( _" I& U
  10.     private Random random = new Random();2 e' f" E! N* m' [" d% j$ ?" q
  11. 6 ~% Q1 d  `3 V) Z/ b/ Z
  12.     @Override
    ) J- c- W# x% _8 p  B
  13.     public void handleState(Monster monster) {1 h& k/ [; j* R1 {
  14.         // Выбираем случайный тип атаки: физическая или магическая7 E  F: d/ H0 V- k" Z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    " N2 n- Z: O: z, M; S7 n+ l

  16. 4 M2 G) _3 R4 T3 L7 `' |" p
  17.         // Логика для агрессивной фазы боя
    + v  u5 ~: Z2 k  ]
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 E9 m: W4 x6 e0 P) x5 U8 q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");3 \" B9 r  v$ {' p
  20.         * }1 `( u+ j% A& G7 T
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ! ^( \' K  B4 _8 f# G
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    " ~! g& G0 j; E# E" K
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    7 E" \: ^- L8 g9 I5 d
  24.     }
    ! Y4 O1 d1 L9 \4 ^+ l: {
  25. }# p* k& t$ f7 G$ W0 ]
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки) f0 p6 f( `8 Y9 Y) {( B# z- p1 D" `

* p5 m" E2 @- A% V+ |, X5 X2 `; e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    - J3 @% `- D9 v: b7 _- h6 P
  2. package org.l2jmobius.gameserver.model.actor;: \( G  C5 K) O: v3 }; u
  3. $ c6 y6 I0 w+ b4 N' u
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;% d) o& m3 |  y" p
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 T8 b8 I+ w: w# r% ~! [
  6. 9 u8 x: |2 L( e' K6 Z( H
  7. public class Monster extends Creature {
    3 G. d/ Z) x' V2 A7 B5 ?; F9 n- c
  8.     private String name;
    ; }( Y7 G) v7 e4 O
  9.     private double attackPower;
    2 @- ~$ r0 P; e! D. G0 C7 {& o$ K
  10.     private MonsterState state; // Текущее состояние монстра3 y/ r) X: H/ }5 o9 f
  11. 6 U1 t- S2 Y, b# \) J  M" B5 [
  12.     // Конструктор монстра
    ; z, ]6 }- {2 @$ t8 A3 r' o
  13.     public Monster(String name, double attackPower) {6 \# ^; l6 u, P
  14.         this.name = name;
    5 F+ Z/ D6 S2 m& ^
  15.         this.attackPower = attackPower;
    ; }" @# L6 o1 B1 S- i9 K( i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию! c6 }' `5 q$ P3 K% u$ t
  17.     }1 Q9 R+ Y6 ^3 T# s9 c1 R( m
  18. 3 t  K/ d2 ^7 X3 B9 e
  19.     // Метод для смены состояния2 q+ U) p, ?* }
  20.     public void setState(MonsterState newState) {
    4 x! T" F3 v7 M; {( ?
  21.         this.state = newState;/ c/ N' S' T  V9 n8 E
  22.     }0 k) C* }# q& u2 e& K! T
  23. $ t" d$ b9 v0 f+ a9 M
  24.     // Выполнение действий на основе текущего состояния
    3 K! e1 f) J, x. {9 ~
  25.     public void executeState() {1 ?( ~0 b8 f$ E4 V/ E- x
  26.         state.handleState(this);
    6 N, ]. F9 O6 [  y, H
  27.     }6 i9 q& ~# x% f7 A/ }
  28. 5 n4 I7 s# X% o! ~8 s* D
  29.     // Геттеры и сеттеры
    ' X9 O* Y5 N# J; U( l0 c7 J
  30.     public String getName() {- c: y( p9 w4 M
  31.         return name;3 X1 z4 C+ T2 z* u6 ]
  32.     }
    ) N( M. W. h! f+ i% d) @3 ^
  33. ' G5 i) T0 b! y, y. e
  34.     public double getAttackPower() {
    ; l8 w$ W7 h  t; s/ ?8 H% }8 P
  35.         return attackPower;
    : o8 w# q+ k4 f
  36.     }1 h5 F6 X1 X/ l& P- ~  n0 Y
  37.   m3 F6 Q' j* b6 @/ h% n8 K
  38.     public void setAttackPower(double attackPower) {! O* [8 R5 C% \$ X& I2 V8 i
  39.         this.attackPower = attackPower;9 M8 I& g& S1 ?; ]  f/ ^
  40.     }
    $ G; [2 w! H/ m, e4 e
  41. }
    , R! u5 b% m* }0 x
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
! U2 h+ z2 x. p$ x- c5 H0 v6 [* j- t& ]9 d4 Y( f2 l- z
  1. // Пакет org.l2jmobius.gameserver.model.battle/ M0 K* f7 L$ t! ^& a7 S2 h/ Y
  2. package org.l2jmobius.gameserver.model.battle;7 q  X, n. W! }, h% X5 _' Q2 C

  3. - a- ]2 R7 K3 D. J) p* z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 Y  G; h. a9 t" V/ J2 s  g8 W+ }
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 M1 J! {* ^7 @; o" A) |

  6. $ F1 ?3 u7 C) w5 L* t8 r
  7. public class BattleSimulation {/ S3 h9 |6 G! I+ X. J5 D% Q
  8.     public static void main(String[] args) {$ i0 ]1 Z; V+ F$ P
  9.         // Создаем монстра( u$ q- v" S" c1 v- z3 }& G! H
  10.         Monster monster = new Monster("Дракон", 100);! l+ ?( l$ H% l- }" ]

  11.   B# G* o' D- T. F4 e
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак% P- y4 a; @1 `: h2 G! S2 V
  13.         monster.setState(new AggressiveState());
    2 ^3 X- U# x5 U2 g
  14.         monster.executeState();
    * D' [$ a; W( p( G9 |: K( [
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ! ?# B: K. R! {( k" d7 f: Q
  16.     }6 p) S+ N% J5 U" R0 U9 H: n
  17. }
    . B& R( X* G: K' s5 ~
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
% C: I# D: u( J4 DЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!5 V2 y$ y8 k7 V. `; o2 ]

( L& I2 \; s- I6 n2 J' ^
: e* n; c2 j1 D! `, z* A8 K" X! M! r9 U4 ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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