Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
! E% M" p* ^! h5 O, L; t3 [5 E3 ?; h5 v% u9 g

& K; q: a! w& k: q1 m9 nЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.$ ~9 ?7 h5 r- ~1 L! C+ T0 j
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
. C  C2 _2 d: B1 J1 I( }5 ?Астралия ?
2 ~" v- S7 l7 O, D! Z% v. p+ \) r) L, `' [

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ g( b0 ~- {" o4 U" _/ eВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
6 a% S4 X; p9 U2 s: R# c/ w% E9 T5 b
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 3 y6 f( `/ ^9 C8 B
AlexCoder опубликовал в 2024-10-16 18:31
! J! [# v. d$ w: R0 A. ]3 z. \День добрый!
+ T) U2 w8 A! w6 j# V3 u7 _В статье описано взаимодействие игрока с N ...

4 c% O' D/ {2 l" u% p* L3 x7 OДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) E# ]2 z, |1 R: l# T

4 D  ~& Y. p; i9 fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.& ?8 Y! g. k3 J" O6 y) V* h0 ~
5 f  |4 Q# J5 c/ A
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
) b2 T3 ?+ D/ C; m; r0 U( ?8 Y; d1 a0 ~8 B5 v4 s
  1. <font color="Green">// Пакет для состояний монстра</font>
    ; e9 G" }" n" ?0 y4 X
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' U  b3 h; l; R$ @: W! D" v* n/ h
  3. <font color="Green">
    - }+ H2 ~; G9 k. H9 P
  4. // Интерфейс, представляющий состояния монстра</font>* T: C  B2 f! P
  5. public interface MonsterState {7 }; K5 D  S2 Z* P/ g  b
  6.     void handleState(Monster monster);
    ) W" ~3 G! I! T+ F1 N' G
  7. }- v4 I. ?& S8 E$ g
Скопировать код
" R/ Q# x1 r5 D! S4 r" m- a/ m
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
5 i; F! s/ ?5 A) f& G
2 G- ^/ n. t* o/ X1 U0 o9 nКласс для начального состояния монстра:( I8 g0 ]5 Q8 v/ S" T
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    9 H- Y9 n7 k$ q$ u
  2. package org.l2jmobius.gameserver.model.actor.state;
    - c, E1 t4 ?# @5 {
  3. 4 J8 o' X; a" U% c
  4. import org.l2jmobius.gameserver.model.actor.Monster;& R  ~1 W9 d( j
  5. 3 O' G$ U9 l8 C6 Z
  6. public class InitialState implements MonsterState {! j2 l6 H' d8 E" }% K' U% q8 k
  7.     @Override% ^: t2 S( _/ r9 O1 U
  8.     public void handleState(Monster monster) {) {" T1 w: s: [, W
  9.         // Начальная фаза боя
    * D" m; Y  ]3 U  ]! E9 ?1 }
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # z7 G1 [- Q* Y1 F# C/ X/ o* E
  11.     }
    7 [, z' A' k! \" h8 @
  12. }0 y6 f3 ?" a$ U6 p5 Z" a7 _; R) Z1 }
Скопировать код

8 P% L) ^7 e6 s7 B1 a2 n2 ?
' {: H8 y$ z' `) J' c
" b/ _. ^8 _* ]( i( x7 a# l: }4 c2 H* j: w/ F( M0 F) C

% T6 l! U' N3 d6 a. Y
, Y9 v+ H8 e5 b
( ^# E# y4 j; l3 I
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ) w3 _5 \+ X% ^; V7 f
! a6 d/ g+ s  G- w3 F* p% Z
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# t0 W6 U+ D. v# e8 R9 b' o' z' Q8 R( y+ D: l# J1 n
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* ]3 K5 V3 Y5 \" ~% c: a8 F6 Y+ i8 [$ O% @8 X& B
  1. // Пакет для состояний монстра
    & r  s1 A. ~* R. l7 }
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 N! z' @8 ~5 g, n3 x. C
  3. ; H1 y5 D. K; U" n, [8 Q2 n
  4. // Интерфейс, представляющий состояния монстра
    3 K" A) a" z5 i: I, n! c
  5. public interface MonsterState {
    9 l* C7 o) Q! E5 T% f
  6.     void handleState(Monster monster);9 t$ T% e0 U' ]% j8 N1 K, @
  7. }3 K) ]8 D+ ]6 ?$ ]' M3 ]
Скопировать код

1 V8 d2 K. Y0 ]% J4 ^" \. L. y1 wШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 2 ?4 u& X2 W2 D( p
( i" u+ [3 a; j3 U9 Z/ s5 E
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- z5 @6 Y0 e( n$ f/ F7 a
5 c6 ]& q8 ?: _8 {6 O& JКласс для начального состояния монстра:
8 {2 T2 y/ x5 Q4 i2 K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    0 o" r$ ~% N- u
  2. package org.l2jmobius.gameserver.model.actor.state;3 g& R6 |' h  ~6 T) ^8 o) n. m5 @
  3. 0 O# t6 g" Y8 t) B  o! o
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 C" @- Z8 X; Q
  5. 3 h3 N$ }: G) {9 f' l- i
  6. public class InitialState implements MonsterState {
    ) g$ w( B6 t: K
  7.     @Override- g% u& a1 E% _/ F
  8.     public void handleState(Monster monster) {
    . B4 p8 `" r7 {) r" A& p# f- K
  9.         // Начальная фаза боя7 g5 P% u- W' p  f; U8 P1 X5 Q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");  J+ Z6 H1 b' g7 r9 ~5 u
  11.     }
    3 T" b1 W, U0 V+ {
  12. }* K7 F1 ^7 G/ l; e
Скопировать код
Класс для агрессивного состояния монстра:
4 [3 V! C1 m5 Z8 T$ E# W( `8 @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state/ T( H) m6 ]' I: @" E* U
  2. package org.l2jmobius.gameserver.model.actor.state;. {( h% J; m+ N, S$ l$ }

  3. & B- ~5 g8 o4 P: I# ]2 {
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! X/ o% C. g: Y

  5. 8 Z9 M% k2 I+ t" W- u6 K
  6. public class AggressiveState implements MonsterState {6 h6 z- e+ M! \
  7.     @Override
    ( r. f: {1 p9 w' r' r. a  V. T
  8.     public void handleState(Monster monster) {
    . W; u) J: I4 O  Z0 C
  9.         // Агрессивная фаза боя
    - ^, r2 \/ ?3 w( I$ Q, Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 h2 \+ C* }2 r5 x( \0 C  }3 n
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 E) R' E/ I) i! {% o$ d' r4 x
  12.     }
    * t, S3 [& Q9 u4 R' M6 u
  13. }
    2 e: t7 G8 B. N. ?( y
Скопировать код
Класс для финального состояния монстра:3 _1 R$ L1 L  H2 }9 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    5 G. O2 A9 U5 e& A2 `9 j: K5 O
  2. package org.l2jmobius.gameserver.model.actor.state;( H$ D/ R$ z1 @8 v+ ]6 W* s; ~
  3. " R0 B& z8 l: p. p& t- Z+ ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;- ]1 U$ N! h; `2 o8 m& `$ L# Q9 O) j
  5. 7 D% ~3 {3 U. r5 w( S
  6. public class FinalState implements MonsterState {
    # ]2 W' }3 d, p. {
  7.     @Override; C& n  f% R, a# v  x8 T, h
  8.     public void handleState(Monster monster) {
    : v- y4 E' [3 x$ i3 X  ^4 B
  9.         // Финальная фаза боя8 O; I, }  r6 o; K
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    8 E9 K  h) ^4 o4 q
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. l" u) l; v# Y8 V0 k8 y. |
  12.     }4 M0 \  l) z9 ?$ l* }
  13. }
    5 p, G: k* \! g' |, b
Скопировать код
! b& V1 v$ M6 L) |9 i4 I
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( z% r3 b3 j1 L! h3 u" [
  1. // Пакет org.l2jmobius.gameserver.model.actor4 x3 F( v/ d. k% O/ }# W
  2. package org.l2jmobius.gameserver.model.actor;
    2 S6 _+ ^  S' {1 o7 P
  3. ) Q0 q: o& B4 y  }3 k) f' e
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* b% F7 H7 l6 s4 O0 J
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 y# b8 R" h9 e/ u# O+ i; T
  6. 7 t  H% c5 E$ U# Y2 k
  7. public class Monster extends Creature {
    - l  t/ z0 B5 d9 V. C
  8.     private String name;0 V# N. g8 i  O5 m  \
  9.     private double attackPower;& {. I3 M6 [: E
  10.     private MonsterState state; // Текущее состояние монстра
    % f3 u. J# a' N
  11. 1 ?8 I& u4 R4 k% x
  12.     // Конструктор монстра
    * C' B: S. V7 R% G$ _/ r" }+ i
  13.     public Monster(String name, double attackPower) {
    5 X1 q0 G9 M8 n4 D8 G" Z' _, n
  14.         this.name = name;- i& O& ~9 i3 ~( A4 `, |! [& z/ A
  15.         this.attackPower = attackPower;
    % l( ?1 u# b, m+ Y2 q# y- m* ^
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    , G' R, Y/ R& O! S' m6 o% r$ M
  17.     }
    ! W; M. I1 I( o6 g
  18. % Z4 [$ [* ]2 X) \! d2 F, P: g- J
  19.     // Метод для смены состояния5 n" S' ?- T8 {( M' B4 a
  20.     public void setState(MonsterState newState) {: ~0 R8 z1 a$ G) X8 _
  21.         this.state = newState;; Z* e2 ?: Z+ i! D  ^
  22.     }4 |0 X8 p( n0 g: F) ^
  23. 3 }% b  H; E7 p% t3 v! f
  24.     // Выполнение действий на основе текущего состояния
    , n1 \! _: b2 b3 f
  25.     public void executeState() {4 |( G$ I: b2 Q2 x& G6 W  h' |+ G
  26.         state.handleState(this);
    4 a; s/ ]) n- M4 w
  27.     }
    6 X* t1 b, v' c- d1 ]4 G# _6 C+ j
  28. ; b& Z4 \) r1 B+ |' m, P  Q) p
  29.     // Геттеры и сеттеры
    + n4 M) Q' s* r9 G+ h, |: B
  30.     public String getName() {
    ) I5 S: h* S- H7 j+ }* c
  31.         return name;# r) f. q9 e; ?( ^
  32.     }5 N$ O# Y1 D+ X
  33. % H+ O4 t' f  P0 f
  34.     public double getAttackPower() {" v( I  ?& R$ C& r* I
  35.         return attackPower;- Q, o; t' s( y2 u% ~
  36.     }
    7 \4 l0 U/ X6 G, g- z: T

  37. 0 w8 v4 E2 p& n
  38.     public void setAttackPower(double attackPower) {7 A) @5 X7 u; `( N7 X
  39.         this.attackPower = attackPower;7 J$ Q" }5 L. F* |1 S
  40.     }
    7 G( j% i- F  }# e" O" \; u
  41. }
    + d& g; P; X1 u' \# Z# ^- I6 I  H
Скопировать код

% f5 x; }) q6 D4 Z6 nШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. p) p# b- O1 d: ]( k. o+ \, }4 k4 J9 _
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ; W8 @. k( `4 u1 [" r5 H
  2. package org.l2jmobius.gameserver.model.battle;/ j% X$ f8 {" V8 Q' z
  3. 0 r0 d. t  B$ ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , z' P* o; K8 V- J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ( r# @+ _4 }  |4 H+ I4 z9 ~% t6 B
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;  e/ E2 d1 K6 b" [5 r
  7. 2 R. X* ?- T) N6 @4 Q8 ]
  8. public class BattleSimulation {9 ^: b' K+ ]; Q! @% q0 Y0 U
  9.     public static void main(String[] args) {
    ( W8 u" m* P1 z' Z+ l5 x6 ^1 D
  10.         // Создаем монстра с начальной атакой
      O) [+ @- L9 R
  11.         Monster monster = new Monster("Дракон", 100);3 X- Z, W* f2 f
  12. * N/ S; K5 Z! H6 h2 {5 Y' `
  13.         // Начальная фаза
    ' ~7 W+ s4 x/ y. e4 b
  14.         monster.executeState();
    7 Y! H7 ?1 F9 P
  15. 3 b) v  r: U$ z) D
  16.         // Переход в агрессивную фазу
    5 F! Q& K- M( k! w5 _# c4 k$ k- k
  17.         monster.setState(new AggressiveState());
    1 b1 E' T2 ~" U# \4 i
  18.         monster.executeState();- Q# D( C4 Q; `6 d6 P* `

  19. 5 @) \( J# d6 r) q2 X
  20.         // Финальная фаза% s6 g- {. t2 M1 I# }. g
  21.         monster.setState(new FinalState());; t* D% a9 d# n" X
  22.         monster.executeState();" o* z' Y3 L2 y7 v$ F2 k, a- O
  23.     }
    & }0 J4 J# }* D* U- G
  24. }
    + S; L- ]- A" ~$ R- @2 L
Скопировать код

; C: R4 B9 |; G" R& @& lКомментарии по структуре пакетов и классов:0 f7 M$ h& G% r& Z. J' Q
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.0 H- P; s7 M! n; z) I
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.# n6 E' P6 t- w% ]
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" J1 ?' M/ e0 V5 I8 A2 ~4 \8 }7 J$ G

: n& d& r  b* ?9 f
" l( @" ^& h, [" B2 A+ t4 J  f( g# q
1 T8 g" V' ~# i

# s$ i; o. O6 p
4 m) h* ~" S6 f
, m: s7 C( Y% Z# m3 k! n
( V. z  E! }9 p4 U# q" @4 Q/ u
- p# x2 F8 B' K, t  W% ~" _
8 s+ _! d3 [! g; o2 n
6 }5 z! F# ]# ]' n5 I: a  J, p% g
' g6 u" C* G5 q9 {+ j8 s) q" x
% C' ~4 H* g( _7 Y6 s- }& [8 T1 S3 o
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04% }5 L. [6 k( D5 o
Для управления сложными взаимодействиями, такими как  ...

. k8 ^) T/ [5 r9 v" g  p/ IОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
( ^8 X1 {* z( M/ n& [) [$ z% cОтличный подход! Использование шаблона "Состояние" де ...

  Q* H# g. Y2 t0 u6 P3 k8 CХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.% {3 @1 Q% x: N; y) J

9 d, }- W4 B- |+ q: H/ }Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
$ I3 Q$ ]  g7 F3 Z
# c" P- f" A1 y8 O0 g
  1. // Пакет org.l2jmobius.gameserver.model.actor
    2 j/ ^! ~! U4 ~+ L5 V
  2. package org.l2jmobius.gameserver.model.actor;
    ( M5 I' F1 G# C  D3 m' B
  3.   R0 i& [. I3 E2 _
  4. // Перечисление для типов атак0 o# }, G7 W& \) p9 Y/ t9 K
  5. public enum AttackType {
    - @/ h2 M6 q( T/ n/ k8 C3 y
  6.     PHYSICAL, MAGICAL;5 l3 a3 y2 M9 B& b4 ^6 }2 e
  7. }. t. S( z9 a  K8 b4 u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
" b% v7 F1 [+ m+ Y* aОбновленный класс для агрессивного состояния монстра:
  r% A1 ~9 Q3 M2 k2 w9 J. i( V9 F0 Q  q; J5 M+ M, r' X1 z
  1. // Пакет org.l2jmobius.gameserver.model.actor.state6 ?5 _9 M: P+ r: B6 R
  2. package org.l2jmobius.gameserver.model.actor.state;  D& {- j. T: r. ~/ @4 M

  3. 1 J  |- o! m- q5 [0 ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;' B) S6 H, l! b4 X' m' R* e3 }
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    6 S$ D6 Y5 @# \3 R  Z, A4 c; M
  6. . b. l1 c! `3 L# m6 o
  7. import java.util.Random;3 o. K7 P0 i- y% h% y4 l

  8. - F( ?% X9 }4 k" {/ R
  9. public class AggressiveState implements MonsterState {
    0 J8 |# {' P' ]. ^
  10.     private Random random = new Random();
    7 e  m& R' z# ]0 b# R
  11. " a  q6 Q' T0 N: c9 |
  12.     @Override
    1 f8 _/ A1 b4 @
  13.     public void handleState(Monster monster) {. w0 a7 L. J  O8 _' y* L3 X: K
  14.         // Выбираем случайный тип атаки: физическая или магическая: q  K. F7 z; p" n8 l; e
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;. `6 k& ?1 e0 d5 ~" s$ L5 M

  16. 0 }& P) x/ V7 s$ K
  17.         // Логика для агрессивной фазы боя
    - K% b# A8 E3 @4 }( {! k
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    9 X# ?+ g) J( J3 H* C7 k  h. n
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    / I% @8 M6 n1 F# T
  20.         5 {) v/ @* _3 R8 r: g
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    8 ^+ J  b4 }0 m9 [- g$ S* }' _% ^
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;, R, L- E  W4 N
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);- u- l& T7 t4 _
  24.     }
    2 |9 @; ~# n2 w. m
  25. }
    $ y' N: n' n) z  {/ M7 _0 h# H
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки8 s! ~4 i6 D& Z/ M- c
5 ^& U" u: M8 P0 }$ |
  1. // Пакет org.l2jmobius.gameserver.model.actor  r/ u  r2 n  @6 Z9 F' D- u- K
  2. package org.l2jmobius.gameserver.model.actor;
    1 ^# P" I  T4 e* |: U6 a$ W

  3. 3 R1 R' s# l3 _) Q8 |7 p. {, N  B, ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;/ b  \; t! d" ^) ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % z6 P8 v2 y2 b% t' i5 A( z

  6. ! c3 W  e  I! ?9 q& q' i' c& g
  7. public class Monster extends Creature {7 L: q* Z7 f) J1 \' }; r2 F& `
  8.     private String name;$ p" Y1 r. _3 Y
  9.     private double attackPower;
    , p& u8 R7 Q/ y5 n, ], A
  10.     private MonsterState state; // Текущее состояние монстра1 Z) m' g; E1 x. K; ]% ~/ q. Z

  11. + `1 M! I4 K. R5 J: R9 [, e+ X) C1 N
  12.     // Конструктор монстра- G, ~. H8 w, y1 f1 }( O
  13.     public Monster(String name, double attackPower) {
    : n# u$ C& H( x3 _: {! I! t( B
  14.         this.name = name;
    ( g7 w: P  B+ g9 Q
  15.         this.attackPower = attackPower;
    8 c4 O5 u4 w& B. c" L, z2 B6 N
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    8 _4 ~5 y9 h: _* Z! I; Q) ^' E/ E1 e
  17.     }( L( F; e, M( k, ^
  18. 6 b1 K/ Q$ Q; h
  19.     // Метод для смены состояния; c& J' h9 k* L0 v- o9 y2 T' h
  20.     public void setState(MonsterState newState) {- O* F- S" b. `. k
  21.         this.state = newState;
    . u7 F; b5 Y; i- ~9 r: F8 Z
  22.     }
    ; F' b; |! I" c1 r/ G
  23.   k. Q( v# G5 u8 g: v- @
  24.     // Выполнение действий на основе текущего состояния! i, l% E. [& w. v5 E' t
  25.     public void executeState() {
    , r0 z  }# ?, d5 W7 n
  26.         state.handleState(this);
    / T" d' E* K6 [; P. Q/ L, \' b2 |: `
  27.     }0 T% h7 Y* E1 Y! r) e

  28. " X4 x! L- J' y0 K
  29.     // Геттеры и сеттеры  u2 `: i' f2 l3 H! `# _' l
  30.     public String getName() {  c* o9 p" F8 q$ ]) L; b
  31.         return name;5 `* I$ O5 S$ v/ u* [
  32.     }5 y" k% w- D, D, @
  33. 8 H8 {% p! [6 p; k/ u
  34.     public double getAttackPower() {
    4 B3 b4 m- Y, \. p# ]/ ]$ o
  35.         return attackPower;
    " B! ?5 |  N" |- J: Z9 `1 L
  36.     }' T2 d) b' B: i' h3 G

  37. " @9 s/ _* Z0 b+ C$ `0 C- u- K
  38.     public void setAttackPower(double attackPower) {( i* ~& P7 G1 d0 e' x! Z) Y
  39.         this.attackPower = attackPower;
    4 F# M1 Y8 `" L) H
  40.     }2 I: F6 M$ t8 f4 Q/ t- E$ a6 y
  41. }9 s+ p0 H! O; d& S/ m( d
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
- U# O* \0 A; D$ F' W' j3 H2 E! X* c. J) i
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ( F* q& Q. _* J
  2. package org.l2jmobius.gameserver.model.battle;
    " j1 k! @# e" q9 j& L- F
  3. 9 b9 C& E% O) v: W8 @' d2 s) u
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 q: z, e$ k, m' m. m$ s1 j7 G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;4 @( z7 a  }% B8 ~+ K! }  Z

  6. . l  Q. i9 }5 s
  7. public class BattleSimulation {
    % I/ R) W# Q9 J% u$ E
  8.     public static void main(String[] args) {3 u$ G# y" w( p# t, Q2 A& u
  9.         // Создаем монстра8 c7 q9 X! K  Q5 L5 e& R( M
  10.         Monster monster = new Monster("Дракон", 100);
    ' ~: r4 b, u# \2 Y
  11. ) ^+ h; |3 i9 L1 n; H5 |# o
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ( H1 q0 X7 ^+ D6 `
  13.         monster.setState(new AggressiveState());3 Z8 L; M$ @# y3 z( U
  14.         monster.executeState();1 h4 }2 P, _$ p9 t
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак" t+ @1 X3 `& `4 }9 o8 C5 O
  16.     }
    4 \6 O% W) F: |9 M9 L
  17. }# i3 w* ]+ Y  _" G
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.3 N- y) j3 @* S; O/ u% P/ c
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
+ `" g5 F$ y% U, [; I# _, ?
4 L5 ]' D, E6 s8 ^
# N' k5 }- L; V7 b( X/ J+ K1 i0 n9 }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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