Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
# Q# O- x5 b0 t  v. H& W' C- B6 t. D' v/ Q8 ?& `2 E* \; \

7 h" T0 ^& J$ U, S/ ^Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
: ^% [. w" E8 M" }, PЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 O$ h+ n  o+ f) GАстралия ?0 q0 `$ L2 M5 o

$ ?8 _" s) |/ x1 X* x- b

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
7 Q, ^2 [% T/ S7 M0 W5 q! n; `- F5 }В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?' j4 Z+ D1 ~5 S1 F. n3 J8 l1 {
# j/ `' [! x0 v% N6 ]: A' x
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 7 N; P3 T0 a6 U1 ^
AlexCoder опубликовал в 2024-10-16 18:31
  N3 m- q, s( L+ `- z7 O% B" SДень добрый!% y& {9 m/ T* y! p7 b) x
В статье описано взаимодействие игрока с N ...

7 E8 b' X- ]  q+ J5 TДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / t' N- @3 I9 p$ Y

0 l1 s; L) o& A4 W+ k( oЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; g) ]9 }+ k7 E4 H

9 V: X& B/ _% e) F# HШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! P. Q+ G3 w) g: H. Q+ D0 {
, e+ n3 G- P; E* c: z2 S7 Z! g
  1. <font color="Green">// Пакет для состояний монстра</font># X8 ?8 R1 c* O$ A* W. }
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 x2 [9 [7 W+ r' n( U* L$ ~' V9 p
  3. <font color="Green">  C9 O7 y) d3 `% [/ ?3 d- g$ {
  4. // Интерфейс, представляющий состояния монстра</font>
    % J8 [2 ?& y$ n* ~. i: z
  5. public interface MonsterState {3 {' g& |; @; Z: h. u$ g
  6.     void handleState(Monster monster);
    ( w0 L% [4 c- [! A7 y
  7. }( X! V9 n  H4 d
Скопировать код
& O4 n* B% M1 a8 N3 C; F; B  ~* Y
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
3 u; I3 l  l+ K( Z* L
. w$ L& d7 J, EКласс для начального состояния монстра:8 a3 w5 i; K  y8 j1 s% W
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>: @# X  Y- P! Y  y/ V" ?1 e' F* ^
  2. package org.l2jmobius.gameserver.model.actor.state;* r8 Z4 L6 U1 `4 Q" ~2 a! b
  3. % p' h% O8 f- O9 U8 D$ y1 q1 L3 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;" m3 i/ s3 N* E6 Q" T2 {8 U
  5. . Y$ S- o' [7 l3 |8 t& |2 r
  6. public class InitialState implements MonsterState {
    9 D' [1 e9 B0 t7 B; ?6 S2 H# W
  7.     @Override
    7 ]- d3 I/ z+ {. C" D! Z
  8.     public void handleState(Monster monster) {  i/ w4 u: B' m) Y
  9.         // Начальная фаза боя0 \4 y; {9 f( `" m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# P( O8 N: f( C* u4 s; t& g: G' A8 p
  11.     }9 B# c/ g  K8 q- G( Y5 X' A1 Q
  12. }
    3 Z' L! @9 T( G+ r- I3 Y& C
Скопировать код

+ ?# D- o# o* [( `  ?& f2 T9 _& Y! ?/ c, l5 ?: o

; s; g, C. w* M1 v, ?: Y
/ o0 u5 M0 G, Y: J+ ~' F
8 W! q, h/ Y, ]9 g6 j* M4 K! F9 B; C! C1 a: ?( y
6 B9 N& Y( R0 X' K+ e
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). & p2 ]2 B6 r, \  \& `1 M

5 E( P" h$ Z7 c* `) M7 AЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.) ^5 ?  `1 k' G
% ]# u7 U( s% @! U
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.0 C. L/ Z  D( p8 ?3 J

, K* {3 y, `; N* l' I9 i4 V
  1. // Пакет для состояний монстра& y% C# e( c, w, I) D( m
  2. package org.l2jmobius.gameserver.model.actor.state;
    . r; R! B0 g- ~9 U4 B; ]% _
  3. : s* F" O& C4 q
  4. // Интерфейс, представляющий состояния монстра
    " s. s7 F3 T6 U$ s% Y5 N1 k
  5. public interface MonsterState {
      H; _- F0 m* d& a6 Q# |4 l
  6.     void handleState(Monster monster);5 b9 S/ J# i: m) s+ N( |) E
  7. }
    : g6 W$ \& I7 B" ]* @
Скопировать код

. x( ]2 N7 \. ]4 V' t9 b3 P" jШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" J1 E# G! P- Q7 R
  H/ a. d4 P% j4 u$ b, T( ^) KЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ m( J1 _7 w+ Y9 Q$ H7 A. v! p1 X! b

" {7 g, y! I7 z( R. |Класс для начального состояния монстра:
; x3 J6 B: [$ _2 ~$ b% ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 l- v- A) z7 J4 l- p' l
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! b: m7 J6 \+ m& O7 }5 K: b: F

  3. $ T3 i5 |7 E- R* X. J& K
  4. import org.l2jmobius.gameserver.model.actor.Monster;( m1 p1 K$ H4 o4 J& m. A
  5. 8 y; _& p% x! y/ R8 Z
  6. public class InitialState implements MonsterState {, V  t; d5 i: o- ~' W
  7.     @Override
    ( Q. r5 w. R( X
  8.     public void handleState(Monster monster) {7 J7 a" P% S( y6 j! s
  9.         // Начальная фаза боя" K6 O8 |! j" Y# b( C% M
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
      o+ i  U4 @) K" l* C' T
  11.     }
    . z& U) @% s- ^# c
  12. }9 e/ |7 g% V# f% `2 r
Скопировать код
Класс для агрессивного состояния монстра:0 S8 A7 y0 w0 u2 b( U4 O- \$ U& Z" O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : ]- A. u& _7 Q! f2 F8 i  w( o
  2. package org.l2jmobius.gameserver.model.actor.state;1 I# _5 r4 j' Q0 _! S7 Q

  3. ; y( U5 X/ c: U9 b9 {0 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;) x1 U7 k5 S' Y

  5. # v0 r$ Z- A  w/ _5 [+ Q
  6. public class AggressiveState implements MonsterState {
    " l" _6 ?9 }3 [- j1 W; G9 ^
  7.     @Override
    & z1 l! G0 t& F& z
  8.     public void handleState(Monster monster) {
    . h6 X1 d0 T2 S" j; U. L: h) B- l" [
  9.         // Агрессивная фаза боя
    ' c" N, G+ u& r# L: T) {9 n4 R+ c
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");! j' W/ K; I. M7 @/ y+ v
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * }4 K* L4 @9 g  [
  12.     }
    $ l* c4 S# S/ G: H6 k- J
  13. }
    ) z! [! X( V& p1 _7 u9 }; c8 u% Q
Скопировать код
Класс для финального состояния монстра:( p% ^' t& l! r! @) Z# A1 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 p6 ^7 }; S& G; [% e
  2. package org.l2jmobius.gameserver.model.actor.state;& ?4 m5 U+ e2 M- f, N" l6 W

  3. 5 e2 ?7 @/ e: p1 d/ i7 m. n" m) X
  4. import org.l2jmobius.gameserver.model.actor.Monster;! P" j8 U2 V) ^( q1 u* [7 Q  d& Q5 c
  5. 2 ?& H, k! W* d, w2 c- h
  6. public class FinalState implements MonsterState {+ e; p9 o6 t% t' g2 c# @
  7.     @Override( d9 b, v6 C& \. S, e- h
  8.     public void handleState(Monster monster) {
    2 }4 X5 t( }' Y
  9.         // Финальная фаза боя
    9 P, {- D! g3 G% c; U/ _( t
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");# s" Q; Y2 \3 ~% W, H( [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 e7 W5 f  B- G" w3 h
  12.     }
    % e1 A: v4 w4 @# l: d1 i/ X
  13. }
    5 m+ ~( H: R. @6 B- U6 L
Скопировать код

- I9 u( }: L( \  |4 S) P% v' ZШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! {! Z7 k' e: E2 h: `
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 F. a. {. l! Z* s6 L
  2. package org.l2jmobius.gameserver.model.actor;
    . S5 G. l  \, ]; q) }8 l5 K; z, G
  3. 4 ]# q- H: k, U8 R0 n9 _- W+ l
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;! g9 w8 a6 ]' R0 W' f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    * D4 E" z+ ?1 B

  6. & U- d  k6 H: E' M% p7 n
  7. public class Monster extends Creature {
    . u; J: _9 Q% i2 e
  8.     private String name;
    8 F) B; W0 J( m6 G' d
  9.     private double attackPower;
    6 L  ?$ I% p; E1 e/ F; O( v0 j  a
  10.     private MonsterState state; // Текущее состояние монстра0 ?+ ?3 j  A. G: y& ]1 w* ^  W

  11. 4 `; @; |  [( i* R3 Y
  12.     // Конструктор монстра
    ; y" {$ p; _. _6 z% Q5 h% p
  13.     public Monster(String name, double attackPower) {6 x8 x5 w8 e5 C* ~8 z0 X
  14.         this.name = name;0 b) z' ~/ ], \  R9 V9 ~
  15.         this.attackPower = attackPower;; K! N' l' U. a9 ~" i3 e: s
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    6 V3 I1 P( X  m- F2 l9 Y$ U
  17.     }" ^+ i2 Y7 g' N6 N/ \/ w+ `
  18.   g* ^/ B. p4 |- X; N/ S. O) _0 n
  19.     // Метод для смены состояния7 ^  W& z, m& R1 Y' p
  20.     public void setState(MonsterState newState) {; i7 W, h4 X, G6 Q" h# z# @
  21.         this.state = newState;5 d5 @3 ~% V5 J. w: Q
  22.     }
    : r7 E' _' W0 H' H# g( G) l+ A) {

  23. - P0 v# c% S+ g$ |5 R8 b" {
  24.     // Выполнение действий на основе текущего состояния7 B3 w1 o+ u# U; m7 A1 Q# ~+ H
  25.     public void executeState() {
    - z" o& ~) H+ Y: B0 N9 R
  26.         state.handleState(this);
    ' n, V/ o( S6 z; A
  27.     }
    . Z2 t2 N& j/ ^1 v

  28.   g) N* [; d1 _; N& r4 G
  29.     // Геттеры и сеттеры& [( q# G1 T' C$ v/ b5 v( G
  30.     public String getName() {7 R" i8 Z! R( G$ z8 d: s: V
  31.         return name;5 i" g8 Y" u4 _3 ~1 Q# D1 x# [: ^
  32.     }
    ! Y4 t" B7 T  Y; a5 o
  33. ; n& m9 ?. z0 j: B9 M  J% [
  34.     public double getAttackPower() {
    $ h$ V0 p; x. R/ Y. ]
  35.         return attackPower;! v3 v: ~( W7 W1 C* u  N. L/ [* `
  36.     }
    7 R/ B* R' M6 ^* u9 J- G% h
  37. ' x6 r8 d" P, y
  38.     public void setAttackPower(double attackPower) {9 N7 d# a% @1 u
  39.         this.attackPower = attackPower;, c0 F+ [* b' u7 _8 ?
  40.     }3 W( X! J9 I/ ~- u% g+ ^+ X
  41. }3 a/ N$ D4 t8 k: q
Скопировать код
4 n0 T9 I8 y$ f: p5 \. z
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
% N# c/ C/ r4 b4 Z: r5 @
4 J1 F& _0 J* i5 S4 p* w4 G
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # X' E' T. K  j; V. I
  2. package org.l2jmobius.gameserver.model.battle;
    9 q0 S( Z, e1 `! g0 ?; m7 F/ q2 T9 z

  3.   e& J+ I3 `) A: x( x2 z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 u3 D. O( }4 c) s/ X' h
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- ]$ L7 M' m% L2 K- P4 p
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;& p2 s. T) b7 b* ^2 K' x5 k
  7. / u$ u( [9 i/ ^# j% _
  8. public class BattleSimulation {$ ~0 c' |2 @+ Q5 f! m
  9.     public static void main(String[] args) {0 d% J( F* i$ x7 `- U6 K2 x( B
  10.         // Создаем монстра с начальной атакой
    * N, `& x$ Y7 r7 u7 V3 w+ d5 Q: d
  11.         Monster monster = new Monster("Дракон", 100);6 O/ S% [3 X" t

  12. ' {8 `; K5 H9 M3 z% F
  13.         // Начальная фаза
    8 ], b! n. g, n
  14.         monster.executeState();/ m( d1 c# h$ _+ _/ |$ u3 m" a9 {# ]/ `
  15. - u7 p. [+ Y1 i* p
  16.         // Переход в агрессивную фазу
    & R7 V# j0 S! Y7 P. }6 K
  17.         monster.setState(new AggressiveState());5 F! l7 j" r8 V0 z; K) i2 X; G
  18.         monster.executeState();
    . L/ c, q: T3 M9 k4 |1 m

  19.   f# B. g; H3 j: \
  20.         // Финальная фаза  x+ P4 z' Z7 a# O0 p$ d
  21.         monster.setState(new FinalState());8 S2 C, h3 H! p! @' a+ y
  22.         monster.executeState();
    + I, s8 o  Z4 @$ t
  23.     }
    # I- t. X! p0 [6 I
  24. }
    % m" C; _( S  z$ G3 L; x4 t' ?" Y
Скопировать код

8 h  c# k. Z, o( ?! s6 YКомментарии по структуре пакетов и классов:
( B: X$ G9 {- v/ _4 C
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    " V: T- X) C- B& {( L! t
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% f; b: |! R- p7 z5 CЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
3 L( D/ k1 R$ U" g. R0 y  f" Q) D! q- w( B
  ^0 u- z8 @& e- d+ H7 i0 ?8 |
6 S0 y( O6 U* U: O) ]3 g

. s4 P. L2 f, F, {- M$ q# ?+ B  j, a+ h
$ [$ N. g" L& ~8 S; k0 ~/ Q! L1 p
2 l; y% a( {" }7 u$ ?3 k
$ R' h7 L+ ^5 R; @
9 B7 ^) X6 f4 ?9 g

% _2 d: t0 A" b5 e& E
9 {7 {' P- p! G- j0 v3 B2 u1 Y+ o" Y7 X- e4 e) R
  U3 |, U" t) h- |7 \

/ t: O8 B& @7 @; j7 F; m1 y
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
+ ^+ z# F+ Z+ G4 BДля управления сложными взаимодействиями, такими как  ...

& U7 E" `3 f1 n- T. NОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
% v" k& }5 i: M5 cОтличный подход! Использование шаблона "Состояние" де ...

5 O( ]+ S) b3 i0 J* ^Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
/ t# I. g- C/ w* Y/ [) G! y% u* C7 N1 E
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.5 h5 G, m# G3 c1 E
9 ~: Y- e) h$ q: d+ o
  1. // Пакет org.l2jmobius.gameserver.model.actor4 b. G& I0 ?4 v$ v  p3 I- n  o
  2. package org.l2jmobius.gameserver.model.actor;
    ' A6 |4 l8 y# `

  3. 6 x: C$ D, P) u
  4. // Перечисление для типов атак
    9 w2 n: U# a: w! n4 Z
  5. public enum AttackType {0 Y. u3 {) n' e2 `
  6.     PHYSICAL, MAGICAL;4 G9 i, W# M0 w/ ~& o
  7. }
    $ d  @5 k; e; P8 a- V7 j
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак." B# M. h: p. H" V8 F
Обновленный класс для агрессивного состояния монстра:, ?: h+ V. U& _
. v; |, [4 R; M" U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 G9 U5 I, m. D4 v0 Q7 A8 d
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 T2 W2 h8 C* L8 K

  3. : {& b& K# T6 J) C
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 ^- }) c" x" t3 w
  5. import org.l2jmobius.gameserver.model.actor.AttackType;( G- J  `, z* @

  6. 3 }# Z. |7 K; O" q* u8 Q; d/ c
  7. import java.util.Random;
    # n6 @2 i' Y' S5 Q5 W  j

  8. 9 C2 o* ^: X1 I, h  U" O' s
  9. public class AggressiveState implements MonsterState {7 a8 x# d5 i) ?
  10.     private Random random = new Random();
    * T7 Y- C$ ]% ], k0 V  \2 T
  11. 9 F0 P- k4 v5 t: g9 d7 k- d
  12.     @Override
    * t: H- a  t% i. M) z6 h9 P
  13.     public void handleState(Monster monster) {( O/ A7 h7 t' S+ s5 a
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 q) T0 j; K. h) X+ P* `
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ) x7 x0 B5 b' C* \

  16. ) m+ Y# s6 X' e" B3 L% i
  17.         // Логика для агрессивной фазы боя
    3 V7 Z# P, O) \- m6 a
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " , x% d2 ^2 F/ C! {8 S0 A4 v; }
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");( |- z9 Q2 _; \* \
  20.         / f5 D$ S# C# ]+ C" U( l6 u! B
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    + q# g) J. s8 e  ^6 I! q  r4 D
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    / M9 ?- J1 N; E! i( b
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);/ n! d1 o1 c: d4 _+ W
  24.     }$ v. H1 E" N- H
  25. }1 V, v% N( p5 o
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки$ p; m  ^. Q( L. X+ c0 O& z7 I/ Z
; `! e# p  P, R, s7 n
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; ~* p* o7 r* W
  2. package org.l2jmobius.gameserver.model.actor;' Y- W9 a& v9 |. o- D& s1 l  z
  3. ' {4 u* ]7 ?! e! j. B! z
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    + }/ c/ ^- C+ q9 F
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 g# e  L* T/ T. Q% I! }; S4 X3 z

  6. " x. C, {& k, k, }) _# m% q6 q
  7. public class Monster extends Creature {
    $ x+ J. I9 ]5 `' w* }
  8.     private String name;1 q$ V* \9 O1 P1 D. e4 L
  9.     private double attackPower;
    ' n- Z( T& J' f/ O- w! F8 V
  10.     private MonsterState state; // Текущее состояние монстра' E' ^) `$ z* J

  11. * d" Z! _- a  l, m) t4 u9 Z8 M
  12.     // Конструктор монстра( k$ _- I! W# {8 n- |. o
  13.     public Monster(String name, double attackPower) {
    & {" C6 A9 y7 k# J, f+ T
  14.         this.name = name;
    2 a1 d9 v; c, H. G
  15.         this.attackPower = attackPower;4 N! y  G) \4 c
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию& o2 L# i1 @. C* f6 {
  17.     }
    2 o$ k# b6 K; e, ]' S

  18. - n- N6 I6 K( p! ?
  19.     // Метод для смены состояния
    0 D" R% e9 b0 H
  20.     public void setState(MonsterState newState) {4 ^4 E; w2 y, }
  21.         this.state = newState;# O" Y  A" ?7 q' H+ @
  22.     }. y9 m/ z0 K0 q; }, @) _. O/ L8 D

  23. 2 w. h2 n" _4 z- G  z9 M, |9 s: W
  24.     // Выполнение действий на основе текущего состояния% w7 X0 G0 C2 L$ ~- K* ~
  25.     public void executeState() {
    ! F1 w( b% \3 }: Z5 w% u
  26.         state.handleState(this);
    2 b6 m( D- y* R. \3 W7 w
  27.     }) V( M2 P) j( n7 Y3 B9 w0 c( _
  28. ( V9 q5 C* @5 \5 W1 q8 j; ^* E* e
  29.     // Геттеры и сеттеры* ?* G/ j; U( s* S% g
  30.     public String getName() {  j  ?1 a$ Y5 V1 G1 O
  31.         return name;, r9 L' a; t1 `3 n$ o. l
  32.     }9 b2 ]: h' ~- d0 [$ Z- @4 o- p
  33. " A6 V8 a# d. v& o6 c6 `' x
  34.     public double getAttackPower() {, m, N1 s# R* v- G$ k' S0 o
  35.         return attackPower;
    : @$ Z* B* T2 M0 k- s; l
  36.     }
    3 K) Z3 _+ ?1 ]
  37. 2 s5 ?* `, b; r  S  w7 m! ]0 Z1 H
  38.     public void setAttackPower(double attackPower) {
    " ^- ^# y. o5 b3 z
  39.         this.attackPower = attackPower;* F# j8 g2 O. J8 {6 {- h
  40.     }
    " N4 Y* k% P* Y. T& M* q$ H
  41. }
    . l# t+ R; e% h! l* r
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.2 `# \4 t( W: Q
/ A/ w2 w, w+ x7 d) X- ?
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 b* L. R$ K6 B; K1 h) c  v
  2. package org.l2jmobius.gameserver.model.battle;
    ; v4 V' ]7 L2 T; V: k3 Y

  3. % `1 ]- l# C( ^5 a5 T9 n% u/ C
  4. import org.l2jmobius.gameserver.model.actor.Monster;$ ^3 b9 J; ?  u: h1 t- f, y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      X. H; G$ N7 h) i9 B4 ], n. ]# v

  6. # R, U! e/ Z7 i- m
  7. public class BattleSimulation {6 b- ]% X1 ]$ a9 B8 F+ ]
  8.     public static void main(String[] args) {
    7 b9 ]# C9 Q! A2 N' q1 z6 q
  9.         // Создаем монстра5 e! U5 q, W( X& s8 j# |
  10.         Monster monster = new Monster("Дракон", 100);! v7 y! v5 H5 J1 t+ L

  11. 3 o3 A* |5 u% U! i
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак: M0 P9 {! E% x5 J
  13.         monster.setState(new AggressiveState());
    * S. I, z+ d1 K2 K1 x; u
  14.         monster.executeState();% x+ [6 v& S  M# T' L2 X
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак9 i2 c9 z2 E2 }
  16.     }
    / s& a( s- i' a4 ?' k  F2 J
  17. }2 s7 u" Z- R8 w6 b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
0 z) ~. h& ^0 k! |5 uЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
3 w+ P6 t6 \1 t( R3 t# V) |
3 }  {5 g4 P% K& j8 x' e3 I/ ^9 D) K$ D' y/ h0 z: P$ J
5 S) `7 ^! j+ r$ _8 x0 R' P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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