Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!/ L& B; E* z7 W$ E
& u$ k: [' a' d$ P1 \* k

5 I* b* Q# W. ~; VЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ P- Z4 J6 t9 }" }) |# {7 K% tЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 `5 ?! }3 c3 `! p
Астралия ?; h: L4 ~$ A/ W  w  n

& b; l/ \3 J8 A

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
) `( N% {8 d+ z. e+ A% n$ c2 |, oВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
: [6 O8 z; f) {7 a+ f, l; \& r7 H1 n1 r& }7 q0 k
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
# U0 @, U) \' a  B( f
AlexCoder опубликовал в 2024-10-16 18:31
0 H# `0 f7 H' _5 Z0 I2 ~День добрый!( h3 ~, Y9 {# F. U
В статье описано взаимодействие игрока с N ...
* C' U! z9 g3 M7 O
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 8 r3 ~* c3 o. n

; g3 u% |. n, kЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.* `  B; M; k2 v4 o0 u

7 w" W/ m! x# Z: l4 j: D1 kШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 o: K! B1 t# p' r2 i1 S6 @  F
7 ^1 N* _" f4 `5 G$ U4 `5 D
  1. <font color="Green">// Пакет для состояний монстра</font>7 i1 W; z- D6 r4 ^
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 O0 k+ Z" b3 U4 \
  3. <font color="Green">2 U* `% ?4 K  D5 O
  4. // Интерфейс, представляющий состояния монстра</font>
    9 A& U0 I6 H8 h7 h* X
  5. public interface MonsterState {
    : [- k% J0 F3 d/ s% e& S
  6.     void handleState(Monster monster);
    ' D+ S8 X- C; \) A8 m4 N
  7. }
    8 X: D$ _5 ]& B6 u5 v( i5 p4 O) D
Скопировать код
- S! F' `2 Z9 E, ]2 q& v
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 z* E2 @; g0 D$ \& S; I4 J8 S
7 p5 {9 B+ k! U6 W: u9 H% M
Класс для начального состояния монстра:
( A. f8 a9 c8 I4 G% b0 L: ?
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>+ ^1 Y' U( L' N3 b: f3 @
  2. package org.l2jmobius.gameserver.model.actor.state;
    " f# U5 j4 }5 `1 s
  3. ! e6 f: Q# p1 I& Q1 d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 o( H+ X$ O5 C" j6 e
  5. ; `# Y# K$ f9 |
  6. public class InitialState implements MonsterState {/ g! J% J, D0 C; B* K+ R+ S
  7.     @Override3 ^# ^) W: ~2 B8 f8 L! X
  8.     public void handleState(Monster monster) {: Q$ w& M5 q( {/ H
  9.         // Начальная фаза боя8 N8 O' {. @; L9 ^; y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");4 U" T5 c( [; M+ Z3 P- E' B0 d
  11.     }: {0 L( m: n9 u! s: E
  12. }
    , J# ?; ~+ @( w' {! a
Скопировать код
+ j" g5 s* q5 D$ \
) U8 ?( Y( Y9 c& @9 Y; u8 b
. u  e1 m" q% w
: M+ L) ^* I* C' B
: f* l' o9 N; C8 {3 h- x! a" r4 u
3 E- K, n# r4 {: O) j% J
: ~' i; O! O$ n2 B
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- c7 ?5 \5 j4 {" n3 }. k
0 r; G8 V( b, }. {5 qЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( W& k2 O! y& ]; ^- t
- {, @1 ^1 I- t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.% t% w& y+ ?' w! R. U+ [

$ X/ j9 k* P' n- B& z
  1. // Пакет для состояний монстра
    , b) E: h8 K* a( T& V2 h8 ^
  2. package org.l2jmobius.gameserver.model.actor.state;5 m5 d5 t7 \: Z! c2 f, W! ~

  3. ( C+ p' F, q( o+ [
  4. // Интерфейс, представляющий состояния монстра
    7 P- ]8 N+ k) a7 Y2 t8 \
  5. public interface MonsterState {
    1 {% L5 t" F5 l( N  @+ S( U7 O4 p/ O
  6.     void handleState(Monster monster);; R! x, x5 d! b) x( z0 R+ z
  7. }
    9 i' P- r9 F! o
Скопировать код
4 s8 F5 I+ t0 U# p- f. q$ ]; Q  k. \
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 N& h* V9 s6 G  g! s
, ?  n5 R! A8 y6 S4 AЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  D- ~2 x, m, W: i0 f" F1 _
; h, t& ]: B3 _4 }
Класс для начального состояния монстра:
% l& t% s! ~  o2 @0 Y# I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state: t% Z1 l+ \. I& F! q
  2. package org.l2jmobius.gameserver.model.actor.state;5 \: o4 i: e1 b& D

  3. ) O) J. L: U+ d6 L( w9 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . e( M; ~0 S5 ]# F8 ~/ q
  5. & f, z6 x. _- R1 a, u( _
  6. public class InitialState implements MonsterState {
    * f4 Z- M1 _( p1 N6 G/ e
  7.     @Override. X3 G( V7 M+ E# m' O6 K4 B
  8.     public void handleState(Monster monster) {
    ) U) |5 A' k6 [. O& B
  9.         // Начальная фаза боя6 R3 J) w% w. _( }8 t3 W3 W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    - h" {: L8 h& B6 I; S* d3 M5 ?
  11.     }
    / U6 k2 K& b0 U$ D2 V  v# W* V: h) L
  12. }6 |- k( C  M( y
Скопировать код
Класс для агрессивного состояния монстра:
( Z) C3 V  A. y' B7 Z: p3 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ l0 a9 n" O! b, `- e! _( ^) C2 i
  2. package org.l2jmobius.gameserver.model.actor.state;6 f& q- ?% W# H+ N3 ^* D

  3. , K3 C) t  V2 e, M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( p0 ]8 A. m# a2 Y

  5. $ g; t- G2 ^4 w3 Y3 g" Z, z
  6. public class AggressiveState implements MonsterState {
    3 ?5 H1 y* E' I- h/ H
  7.     @Override
    4 I4 x! h6 L% s) m* y3 f3 z( R& k! S
  8.     public void handleState(Monster monster) {
    1 J+ H, L4 {) m: z
  9.         // Агрессивная фаза боя& Q/ I2 Y" K0 V( {# m/ @
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    8 L9 @. Y! R2 C. U0 L) I2 F* `
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки; @0 ]; z/ ^: g6 S2 ]
  12.     }7 I9 Y! b; a$ g4 J
  13. }
    1 D, v, n% y# h  I
Скопировать код
Класс для финального состояния монстра:
# V4 L. }) l2 t' [0 s; y) i. c
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ E# P9 h  |8 p: p+ V% @9 {1 K5 f
  2. package org.l2jmobius.gameserver.model.actor.state;
      f8 P" M7 G3 p" _. d
  3. 4 n+ D# L! a( L; t
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    1 v2 r) n1 ]6 g" w# b2 `

  5. - Y7 S* y) }) e" ]
  6. public class FinalState implements MonsterState {* c4 V4 \8 M# o/ t& _4 p
  7.     @Override
    ( H# q% ?, b* S, o# J
  8.     public void handleState(Monster monster) {
    6 f: F2 R# X/ E  e3 g
  9.         // Финальная фаза боя5 ]# _( |5 U- l# Z3 w+ n3 z; d7 g. N
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    # p9 H7 @6 f8 {- R
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки0 ~8 R+ \) ]# k  E  D
  12.     }1 u$ K$ {/ J8 E5 J" D! o* G
  13. }
    3 @  V; \$ a) a6 N# n4 i9 G0 r
Скопировать код

9 e6 d0 \7 J% u) }. i5 Y" J- m% F! \Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.% k" U: M7 a+ ~4 v& g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    5 |/ }' R! F$ E( `9 ^6 P
  2. package org.l2jmobius.gameserver.model.actor;
    4 [9 B6 u8 \! W5 m
  3. ' x) ~0 y2 B5 Y7 ^4 H$ B8 W) V
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , n/ N5 g" N' S& f% c. C* `. r6 v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 `( t* l6 E' S) W) F7 ], o9 v

  6. % Y' D  W. T% [! |! ~7 ~! a
  7. public class Monster extends Creature {
    " ~7 i/ Y! H$ t  e) v: i# |
  8.     private String name;5 j& q3 C" O! u: G
  9.     private double attackPower;7 B5 v8 |  D$ _' R( S
  10.     private MonsterState state; // Текущее состояние монстра
    ! G) j) W. U) d8 V& P4 ?
  11. ; ^0 y$ u& k5 h" F! P
  12.     // Конструктор монстра) A: |3 P$ U$ o
  13.     public Monster(String name, double attackPower) {
    , ^7 E5 A! i0 ~& w) l
  14.         this.name = name;! V! M9 q2 |) o! v* n" `6 m* M
  15.         this.attackPower = attackPower;3 e* b& D# l6 @! h
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние( V' F) p, Y6 t4 g8 `/ P
  17.     }6 B& [1 X" C8 Z1 X  P6 K

  18. ; q4 v- h# j- K& J) ~
  19.     // Метод для смены состояния
    0 V- U" s. t: R( a$ |/ p
  20.     public void setState(MonsterState newState) {
    4 {3 u# x  e1 G, }
  21.         this.state = newState;
    / ~. ^0 ?, C$ A6 H$ B5 V9 s' Q% P# p
  22.     }
    , {" q7 @5 v6 k

  23. 7 @6 M$ [5 b) m
  24.     // Выполнение действий на основе текущего состояния% V8 M+ B1 e( f# }9 x
  25.     public void executeState() {4 ~3 y( q4 `' \) c( t) s" C1 S
  26.         state.handleState(this);% ~, Z. q# w7 }' j% N/ O% Z
  27.     }
    5 X! \! ?( q- ~( w

  28. ' n9 z0 h! E7 S0 n; W8 D; g7 u
  29.     // Геттеры и сеттеры- t, l9 r3 \3 z3 f, n1 @8 _# T
  30.     public String getName() {: y3 k1 [' c0 h2 n3 w
  31.         return name;
    6 H* s9 w5 f; @! ?/ ~6 c, t
  32.     }
    6 z7 P( }$ \, Z  r0 h& J. H, I+ n' b- q

  33. ' f# n  i5 d7 {# j/ N* x- v
  34.     public double getAttackPower() {; `9 r6 r* p+ K! I
  35.         return attackPower;5 c  L% x8 p  ^; \, k4 c
  36.     }- P7 ^7 m. t# l: Q  ]
  37. % O. }+ l( S  b$ _2 Q; [: d
  38.     public void setAttackPower(double attackPower) {
    . k. K" A& v$ d& |" ^
  39.         this.attackPower = attackPower;$ X0 {# t4 s5 Z4 q! P
  40.     }; F# v( S% d( b3 g- [8 E* M9 b
  41. }
    8 M  {9 d8 l7 {# U" I+ W
Скопировать код

8 P) W! G1 ^3 m. ZШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.* G% U+ E" P8 I1 e7 g. B5 d

) O2 X9 h, u4 j& K+ Y, j
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ! q3 R8 H- R+ g# q/ ~$ I
  2. package org.l2jmobius.gameserver.model.battle;* C3 l; \# r* n6 T3 l1 ]( V

  3. 4 w2 U& ]& s1 q7 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . [! f. K6 H  }& V, s
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    : ]6 F! ?" A+ Y2 g4 }6 Q/ E9 C6 j6 s
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;% x( x: y# ]( l# r" p% K
  7. " y" F: H( @1 A" N( }
  8. public class BattleSimulation {: r& u9 P+ h" o; |" o
  9.     public static void main(String[] args) {' v5 y- Y) M# V' f6 K
  10.         // Создаем монстра с начальной атакой
    7 z, U7 e9 y( ^( Y
  11.         Monster monster = new Monster("Дракон", 100);1 A+ G' R, B' n1 ]3 J
  12. ) K) Z% L9 o* p- P6 u9 f
  13.         // Начальная фаза
    * S& ]. q! x3 w; [; V
  14.         monster.executeState();
    % Y" y! W' d( `, N! I1 C6 v1 V7 e

  15. - t1 X$ O9 ^' W: N5 `: V, W/ P
  16.         // Переход в агрессивную фазу! Q( R! a$ C4 l# e  S" _; n
  17.         monster.setState(new AggressiveState());: w3 e' p) E5 R
  18.         monster.executeState();
    3 B- M  i: I" e$ V% p+ f
  19. 2 y3 K. ?& ]& _; u
  20.         // Финальная фаза( ~5 ~1 S* B# J$ G8 `7 Y
  21.         monster.setState(new FinalState());
    * N8 a! `* b8 G  l" y: |( l5 N
  22.         monster.executeState();
    - L! I. Y; g/ `. u" d( T
  23.     }. l9 I. Z* N5 O8 m
  24. }
    5 o. J& d5 G4 G& u- \
Скопировать код

: h! n; p: `) d0 n3 A& O) UКомментарии по структуре пакетов и классов:$ G% X) l) ?4 B
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ C7 Y" X1 q) C' o1 @7 ~1 l+ Z- q
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
+ M& H6 P% m! N; mЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 J5 Q& l, I4 H  |. z; `/ k. f9 T4 x  n  W6 N+ C
# w$ d  W3 p: U4 |
( l( w* v. ?6 j5 R( e2 m1 I/ {4 D
- A* D6 v! @; H2 U; d# O

+ F8 ~% v8 I5 D
% W7 Z2 Z6 b% S2 i* Y3 q& y
7 a& u3 V% L5 L' h$ r9 K9 f* ^% Y  U  i# m, q

# `5 @4 y4 Y- \- i  h& k/ @; a2 v+ o$ C. H, M, k* V

- s5 \' X0 J: j5 J: r/ Q
/ u; m/ T! r5 y9 L- x3 o& f8 N; k- t" R% l4 u2 X& S( S
5 S  v4 y% S$ e9 s; d; _9 E2 r* t: l' i$ T
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
7 g& W0 u) x$ z4 v* e) u9 {Для управления сложными взаимодействиями, такими как  ...

, q! J) E: Q; o6 e2 }. _7 @Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
" W+ ^* w) f5 O1 w' BОтличный подход! Использование шаблона "Состояние" де ...
8 S' z2 `$ p0 A3 j
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.- n" l) D' L( W8 ^5 o( p# j
0 y: l/ d8 Q! _3 d
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.- T) E6 n8 D8 B! }2 B& K

. b1 ?7 J& P0 J6 T$ q
  1. // Пакет org.l2jmobius.gameserver.model.actor" a. D7 a& f. E* e! B
  2. package org.l2jmobius.gameserver.model.actor;
    + y* j' O0 L3 t2 u; ]' d2 T
  3. 4 W' Q4 e" b3 F3 A. J$ R0 L
  4. // Перечисление для типов атак
    : H/ f8 M/ h$ G+ T! g0 \) [) }
  5. public enum AttackType {
    , }( v% E( P# b0 q9 ~# z
  6.     PHYSICAL, MAGICAL;
    3 k2 u+ D8 e$ R
  7. }) [6 l8 |( [4 m" {, A
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.  e7 x8 S3 F- {# z: V5 X
Обновленный класс для агрессивного состояния монстра:
. c& J0 V1 V5 [& B9 p& |$ P& Y! T0 j7 D, v% y1 b5 i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' ^4 G9 p- g& u2 W% F4 b0 m- B
  2. package org.l2jmobius.gameserver.model.actor.state;
    & c4 x$ G1 U- M8 v

  3. 8 e# _: I  ~6 G
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , p2 l0 Z9 @! f7 O; M! P! Q/ \$ q, w
  5. import org.l2jmobius.gameserver.model.actor.AttackType;+ G, q) O2 K# A4 m. ~+ B
  6. ; X: p3 }& f$ G! y
  7. import java.util.Random;6 V7 ^( F2 v; f1 g
  8. 0 |! C9 \' O8 \  T- T
  9. public class AggressiveState implements MonsterState {
    $ ~! b: D1 F! p" s  k* j
  10.     private Random random = new Random();% }. V4 k2 t; I( ^. m6 J

  11. 7 u; {; e& X; w
  12.     @Override0 y- Q, N  a& A$ K2 H! y* Y
  13.     public void handleState(Monster monster) {
      r. Z" v$ h- E/ q+ H
  14.         // Выбираем случайный тип атаки: физическая или магическая8 @. t1 t  ^9 l3 O0 }
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    . c7 X1 r7 P" a: O; a

  16. 4 ]/ T7 \* ?3 Q- W" I# m+ k5 Z
  17.         // Логика для агрессивной фазы боя8 o, t2 t( n2 }( M
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " & L  V' Z) s6 ]" o7 ~
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    * h' u& A) n! G3 W- x
  20.         " `0 ~6 S# z6 z3 Y3 b, c8 ^# i7 b- c
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    : V6 y" [0 \. \2 p1 ~
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;) m. p: V0 j0 m: L
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);$ K# C! ^& O9 t/ ^: M- @$ \0 c: C6 ?# @
  24.     }) p% U" p  ~9 Q5 O& a' A6 k
  25. }
    8 q* u8 e3 _+ i- |& q1 a; m& o% y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
) U& ?9 q! y0 K# y9 [' q4 N
/ }9 ^4 Y* C7 o! a' t% W
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ( _8 x- j! I/ B- Q6 O, N/ g5 ]: I
  2. package org.l2jmobius.gameserver.model.actor;- [2 o+ [8 g1 r+ \5 G1 X: h0 \5 S
  3. & d# E4 G4 p: N7 Y- Y2 ~" j9 h
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    $ H6 M( t: B" a% h0 y9 h
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * W) r  i  T- B* U
  6. $ G& ^! f5 ~# T6 I
  7. public class Monster extends Creature {
    6 x* j* Y" H+ U7 ~# x: f
  8.     private String name;
    # U. e/ h8 L9 q0 ^5 {# T+ d4 H
  9.     private double attackPower;
    8 Q8 S6 A3 |- d, h- \3 X) @- s2 U9 q8 V
  10.     private MonsterState state; // Текущее состояние монстра6 f9 g" A& Q/ Y0 C4 x

  11. 2 ?- X# ?) r: ^, d& I
  12.     // Конструктор монстра2 c& w  q$ r* A" K. ?
  13.     public Monster(String name, double attackPower) {
    ; F" b; p* d, G7 u) z2 u
  14.         this.name = name;) r" T7 M% p% t' w! n
  15.         this.attackPower = attackPower;+ Z  D' e- B. S1 C- p
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    & O* E8 r1 D$ |1 z3 k" n" C& i
  17.     }
    * X3 s; [8 M" F& y% D0 X0 k
  18. + ?+ T2 C9 Y9 m7 n8 n, a
  19.     // Метод для смены состояния! b" A% T: x1 d! U
  20.     public void setState(MonsterState newState) {# z. f( V- |- Q; R% k# C
  21.         this.state = newState;# [& l- O  _7 l5 G7 q, G
  22.     }  N4 c4 ^) W4 G/ J9 O( G

  23. ) Y' p# e1 _/ n0 A3 q9 H
  24.     // Выполнение действий на основе текущего состояния
    6 W+ `1 n# @& x
  25.     public void executeState() {
    ) E, [/ r8 T1 M0 ~1 j  v
  26.         state.handleState(this);
    " {- y; O5 O4 A/ X  W: X- X
  27.     }- n) s0 n* m$ Z/ {) j4 ]; p! ~
  28. ' ?! `! u8 o% s) W  C' T! C
  29.     // Геттеры и сеттеры6 n% @3 m4 e$ B3 g6 C
  30.     public String getName() {
    % Z( ~8 I1 I- V  M5 Z: X; H
  31.         return name;6 L8 z2 k2 D4 y% p$ F$ M  ^! c+ `
  32.     }
    + m8 X' ^  {/ x* C% O: R0 w

  33. ! c, B- c4 m& F" h' D4 l+ L9 x
  34.     public double getAttackPower() {# Y' N6 @% {7 K! ^; [3 m" |. c
  35.         return attackPower;" f# L- T: `. l7 S
  36.     }
    6 F9 d# W7 L( S4 ~

  37. ! [! U) ?0 }2 B/ p9 U' A
  38.     public void setAttackPower(double attackPower) {
    / F9 V0 g! r  e# n  Z
  39.         this.attackPower = attackPower;* e. E) j. K# m2 W
  40.     }! X$ s. O) ?8 L( Z& u$ ~2 A8 K
  41. }0 l* g/ }5 l  D! y6 ?3 ?; G% p5 @
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
& g% ~: E. Z  C: ^4 p: h) W$ C1 R2 e
  1. // Пакет org.l2jmobius.gameserver.model.battle% w9 t! U" I" c3 U
  2. package org.l2jmobius.gameserver.model.battle;/ ]8 R6 q/ @6 P$ A% r1 b9 c

  3. 7 z2 p& G; e  r  ?/ G9 o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( e) x& M$ z7 V& T, a# J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: ?, j/ O) v; B/ q

  6. $ L8 a9 E- ]& D  ~
  7. public class BattleSimulation {+ \7 {$ @. N2 o2 L# _/ }% _6 c. `
  8.     public static void main(String[] args) {
    4 h; v$ L, B; D. ?2 s
  9.         // Создаем монстра
    , z8 K7 x+ w0 R" n  F6 G
  10.         Monster monster = new Monster("Дракон", 100);
    0 E1 V: U, I8 q6 a% j; c. ?. Q

  11. # [* J, u3 Y2 R; l
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    0 a6 z+ G5 y- A' p/ ]2 ^
  13.         monster.setState(new AggressiveState());7 R1 l) s! f. Q( c
  14.         monster.executeState();
    3 [$ c6 v1 i5 X% R0 Y
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    3 |4 B# X0 J1 b/ }  K) K
  16.     }
    1 x4 {! H1 i1 r* t  k6 R
  17. }
    $ @) i+ y' e$ B% k: Z! {
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
' a$ u7 S7 N. N' L8 fЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
+ T5 ?/ k& L$ n1 }3 f
+ g, j$ ]$ f0 K& C9 e2 U0 w$ z% ~  t$ ]: ]( i. |

1 v1 n, ]1 [  D6 ^5 ?. ?
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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