Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!# v0 U+ X0 W. S
, V) g4 [" E0 \9 s4 X$ J
/ o* X, P2 U" ~& L
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 b4 O; N4 p7 n( q" [3 G
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!6 ~9 s/ q: n6 n. `
Астралия ?
: \6 Y$ y; ]& ^7 s4 v# j) d5 B* z, v; k! S3 h& n% ?9 `

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ K' M; g! }) ?& P' J) \В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
! E. X( `7 r+ a7 S
6 G0 x- i' A" }' f% _; M9 v4 I  ~
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 " E4 v& d' E. a  N1 ~
AlexCoder опубликовал в 2024-10-16 18:31
1 U3 B: h' @( h' WДень добрый!4 R& @( t& V9 d: z8 H; ?9 f/ Z
В статье описано взаимодействие игрока с N ...

0 ]; b- N4 D4 R) ~- q. P. h# W+ ^Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 C: g7 p" e: T/ b% i5 J

6 i" o  c) A5 X& y, EЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 B# c* \1 Y7 P5 g1 M7 j
2 ]8 Y; r  [9 J5 s" f  a" ~# B& C0 A
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
  T( |: m/ r5 {/ S. |$ \) i; A# |( n
  1. <font color="Green">// Пакет для состояний монстра</font>8 F4 i. Q9 @3 K2 Z& y$ o0 W
  2. package org.l2jmobius.gameserver.model.actor.state;4 U% D" f  B9 z/ F6 S3 P5 H
  3. <font color="Green">
    ' ~. I) {, X+ Z3 F3 g
  4. // Интерфейс, представляющий состояния монстра</font>
    & d! f$ X$ C2 _
  5. public interface MonsterState {+ o/ l7 |2 \! z9 c
  6.     void handleState(Monster monster);0 q3 K& d; |/ D# z) e. l  o
  7. }
    ! j7 S; b6 ]3 }8 B- T
Скопировать код
+ ]4 R$ @# j* f) x5 z: D
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
9 y7 e. ]+ `* L5 f
% p3 e& k# {' \1 A3 _( y  }3 l: OКласс для начального состояния монстра:
9 g0 e' b9 O% G% ~0 l8 V
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    ; Z8 H. h7 K7 U+ H1 T
  2. package org.l2jmobius.gameserver.model.actor.state;1 O% H: ]- T$ t8 }" h3 S. }% X
  3. . t5 ^& N) L' R0 Y# i3 W5 G. [
  4. import org.l2jmobius.gameserver.model.actor.Monster;. y" D" T1 Y9 y' t# p
  5. 0 b7 n1 W& W7 I% A. _$ R
  6. public class InitialState implements MonsterState {6 u4 {# x4 ]2 Y; [
  7.     @Override
    9 v2 J" f5 o% H/ A% t  y
  8.     public void handleState(Monster monster) {
    2 X* g3 r9 B; F- [" p+ f
  9.         // Начальная фаза боя: \! X" {2 \( l3 I5 A
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");! ~6 ]% G. n( R0 S* b
  11.     }6 G9 x) a- O1 D& e, s! D
  12. }" \+ ~* Y  d5 S
Скопировать код
0 t& ]5 r0 v* g, P

' o& H# ~/ |$ ^
1 D4 t# l+ r5 A% o$ A0 W( J
8 H4 ^' O: h4 A6 c' C7 M% i0 P% ~% R* f# I% M$ q

8 Q5 p, c+ |1 `% b* t0 y& M- r2 e3 N# l; n( T* k
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * L' f" P: ]+ @) f, O' f/ z
/ L7 M( `6 F$ Q9 g( j
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% W* K7 d4 X. T* G, N$ P5 Y; x2 s
' F- I2 T7 y* Q, Y  M* O5 y, J; I
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.$ a7 ^/ s; u0 q9 P+ I2 D6 O
2 l) n6 B# q- r9 [$ X  ?  c
  1. // Пакет для состояний монстра
    7 j1 S( l, f4 N& P( U3 u
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; \8 G+ @. ~0 K( Q/ {4 |% W

  3. . F* t  a0 P- y
  4. // Интерфейс, представляющий состояния монстра
    8 S6 o- L5 @! [! ]
  5. public interface MonsterState {
    9 g% D$ W; T* X* ~) F% ]
  6.     void handleState(Monster monster);
    9 M- G- @' R8 O: [+ h; X0 \
  7. }" `6 G; e, T- K. t6 S# \1 G
Скопировать код
* U# `. _& U/ m' ?
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. $ ~: [. t9 j8 o# C

5 m4 V6 g# s! D. w! e- XЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.' {  z) J! L2 Y5 D
4 V2 n, B# l9 D9 W4 v2 S
Класс для начального состояния монстра:$ K) L$ d+ e3 K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + y5 I7 d0 `1 F' i7 ]
  2. package org.l2jmobius.gameserver.model.actor.state;4 b# {) b5 Q( t; Q" _( z

  3. 5 E! A0 q$ Z7 a; K
  4. import org.l2jmobius.gameserver.model.actor.Monster;1 ~% F9 [" ^$ ?. R/ z

  5. ' \9 h3 \. L" J+ Y0 [
  6. public class InitialState implements MonsterState {3 d& ?; G  L$ m" Y9 U
  7.     @Override; y6 c& h! l$ o. S0 g  G0 ~
  8.     public void handleState(Monster monster) {
    6 Z: x; K/ [, g# u8 B# w8 k6 w3 F
  9.         // Начальная фаза боя
    1 ~1 h( ?* g4 s
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 G0 f2 Z: w7 S3 S4 }
  11.     }7 T1 W* J4 ~3 M( q9 c) v7 X
  12. }
    7 \5 c# D% ?0 q: ?! `
Скопировать код
Класс для агрессивного состояния монстра:
, P+ r& P# r: `% N% c; m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( k8 O3 E) Q% C) v2 V/ ]6 e3 U8 _
  2. package org.l2jmobius.gameserver.model.actor.state;3 J- `4 Z0 O% U0 i' {5 C

  3. / \& g  G7 i3 A9 `
  4. import org.l2jmobius.gameserver.model.actor.Monster;# L% M5 w% v5 e' S9 c" k& D& ~
  5. $ l& C$ A; J$ B2 t4 G7 l! T) n
  6. public class AggressiveState implements MonsterState {1 z* v/ J/ E: E
  7.     @Override" I; W& V, H# N/ i8 S% x+ F
  8.     public void handleState(Monster monster) {
    - a* ]3 x3 s7 J8 t$ O# L
  9.         // Агрессивная фаза боя7 G+ }  u0 P5 ^( H, z
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");6 E6 |9 i0 ~/ H% C- x
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки. J4 Q* s. v2 v+ w8 ?1 p- D
  12.     }
    0 ^# N5 ^% O4 m4 r4 i
  13. }
    9 g; j+ J+ R7 B4 M% n5 F
Скопировать код
Класс для финального состояния монстра:
. D; ?# {% _* [! v: u
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ I& u: \" X% l$ V/ Z' n8 G- X
  2. package org.l2jmobius.gameserver.model.actor.state;
    " J, {3 x. w5 V& d0 o
  3. % v9 _' w  }+ v
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 J0 u+ C( e5 X( i' W

  5. 3 z# U1 ^$ Y, M3 o; x6 Q
  6. public class FinalState implements MonsterState {5 @% {: i3 s8 f) O# G9 ^2 \
  7.     @Override- d" e9 ?3 \0 ?8 m  h& C
  8.     public void handleState(Monster monster) {
    ( E" {( p* C$ w" m" a3 E
  9.         // Финальная фаза боя
    % L* L( P- O. b; ]
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");/ R5 Y. U" P4 v- ]9 m& m4 f- Q9 v& \
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 A; d3 E9 Q5 s. a- J6 u% d
  12.     }
    3 t! [% A, m5 u
  13. }+ N4 {: {: x/ @2 {# c4 w& d9 ?
Скопировать код

9 Z; X! o) {* e7 h9 LШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
0 G% q$ I5 A" a/ @( E
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % ^) B/ S0 ~+ N  P6 x: t. ~
  2. package org.l2jmobius.gameserver.model.actor;# x, y: ^3 y; T5 y/ x& c* O

  3. 5 e" n7 n% m& n( z; A
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;9 B! l/ q8 k$ J% s# k$ ]% I2 y8 U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
      _8 a0 V" }, R% e& u; N6 {8 h
  6. 1 N% g/ s# S! \& I. K9 F
  7. public class Monster extends Creature {
    1 B1 T6 q1 ?% `, ~; ?: v( S# U
  8.     private String name;9 |- G; w% Q+ \8 T
  9.     private double attackPower;
    & }6 E# S# K- ~  ~5 u; i- |* Y
  10.     private MonsterState state; // Текущее состояние монстра
    & D; [% Y/ N# Z; T( K$ n1 l' k
  11. & j+ U5 k4 `8 W  V1 G3 O
  12.     // Конструктор монстра
    . z5 J- c1 @! Y: p) o. |
  13.     public Monster(String name, double attackPower) {7 C8 L: a3 F8 T1 p2 T3 E
  14.         this.name = name;
    5 q4 B( L* L2 C5 K
  15.         this.attackPower = attackPower;
    : R- p% M$ _& _
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ {, N+ M% {" M
  17.     }
    1 s0 F# }  m$ M. O1 {

  18. 6 k, ^! w  P$ x
  19.     // Метод для смены состояния
    4 V' Y9 P& c: r$ i! r
  20.     public void setState(MonsterState newState) {; A6 G* D. R; Z' j
  21.         this.state = newState;, T* [# g# c/ x/ o$ E* v% g
  22.     }
    3 f% O0 n) j" T6 L; a
  23. $ a. s1 q! f7 |5 U& x1 c
  24.     // Выполнение действий на основе текущего состояния
    ) n% F" m5 _6 s7 F/ I
  25.     public void executeState() {
    3 B2 p4 |6 M. A( |7 b0 K# n6 D* ]) t
  26.         state.handleState(this);& h) k1 o) t0 @5 T/ ^. g
  27.     }" l9 A' D; @( k  k' W! n0 P/ _: l
  28. % z8 I: S% Z, w
  29.     // Геттеры и сеттеры* J; _/ L3 V0 o# ]
  30.     public String getName() {, n$ ?4 d( U  H. m% ~1 c0 g: K6 R
  31.         return name;
      E# A( U% }& N, b( k1 _7 u1 p
  32.     }
    , m. c2 j% q( o# D/ `

  33. ) R. x7 J  i$ [6 d8 m& u
  34.     public double getAttackPower() {' h# ~/ @  g# V6 f
  35.         return attackPower;; C/ ]8 K: U3 g8 i: T
  36.     }) `2 e6 G9 v0 j1 k# m) B% E

  37. $ _+ ^$ {  k! Y) f* H, W- a# k
  38.     public void setAttackPower(double attackPower) {; a/ I' O+ C! A1 Z; b/ S" C* c
  39.         this.attackPower = attackPower;$ U( r9 w  x5 x# `
  40.     }
    / q# F6 T! V5 O- Z; |7 x: l: j
  41. }" t3 x6 e5 e6 L; I
Скопировать код

7 h, {: x2 D5 l5 h. s: x. tШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 U9 A" i5 m, y, J' |
6 I' h, Q; p8 |: M) x! P% {
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # I8 W: s0 `7 M: G  d# t* z/ g
  2. package org.l2jmobius.gameserver.model.battle;+ }& k( R" g6 [" q2 F2 e+ v5 [

  3. 3 k. Z2 ~; s. M/ M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / V: k! c" n6 q3 A8 ?! v8 z) x
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . W% ?. C3 b# h% X: Y5 a6 O
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;0 a! b9 n. `  p" i1 ^" |0 K
  7. 2 J& ~+ T4 B, h6 e3 F; k
  8. public class BattleSimulation {5 B0 R, H& n8 V) W
  9.     public static void main(String[] args) {) w1 f, n& a3 w) p; z
  10.         // Создаем монстра с начальной атакой7 k4 e! H+ i+ G
  11.         Monster monster = new Monster("Дракон", 100);
    ' ^# _2 T  n! V: S2 i
  12. $ `6 W. m% ~) s% s. F# @
  13.         // Начальная фаза
    ! K& S  w1 L9 k# b2 h: r6 @
  14.         monster.executeState();: E" l- }$ `0 q

  15. ' _, x( A+ S: E: e
  16.         // Переход в агрессивную фазу( j. U; n. A& v* R
  17.         monster.setState(new AggressiveState());. o* O! i1 H8 T4 ~: {9 s) Z$ @
  18.         monster.executeState();
    3 Y" `/ s7 r: u6 y$ Z

  19. % {+ l' Z; @% d, |7 }2 B3 F
  20.         // Финальная фаза
    0 H+ R) _2 n9 x$ p
  21.         monster.setState(new FinalState());
    3 C7 j- M: F* Y( g
  22.         monster.executeState();
    / m3 A# C+ i( S; y
  23.     }1 Z% A3 W8 l6 u$ C) x4 r8 v
  24. }
    & I" q; M/ \0 j5 E1 a7 c
Скопировать код

, E# t: t) h; Y: ~Комментарии по структуре пакетов и классов:
- B8 H* K: n& j5 Q: o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.& X# D$ N9 a( H, a9 g
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; m& Y- J0 ]" vЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' M2 R& V% R0 [1 s8 W9 x
' v+ U3 h4 y$ D( b+ G
0 [1 n% k4 B# n5 N' C0 K/ |3 ~$ |6 Q# v$ U

* E* q' @9 L3 g9 ?
3 c2 v1 f8 y4 g5 o" h, r8 `2 F5 R' o6 ~7 Y9 \/ V- T! n. X7 H6 N) ~5 L1 `
# O' X* Z/ @1 l) Y7 A1 a
' E6 A3 _3 @$ G$ D9 P( G/ W8 `
  G" v. P9 N' R1 K: O
- R/ W. T/ v2 Z/ f

/ m& C/ v2 ^) D- r! j9 H" _' I
2 o  ^. h: {/ b# `8 i  G; K  a. g  p% A2 w( s. g  [2 q' M* S
7 X9 H2 _6 s* D- y+ q) i  m' |
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
) }2 g% h$ x: ^! N8 `- `Для управления сложными взаимодействиями, такими как  ...
& e! A4 O1 Y- A/ l, t* Y% R
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
/ ^1 t# k, |2 ^9 L8 ^Отличный подход! Использование шаблона "Состояние" де ...
1 B' {* M) p# R  z$ g  n3 C
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. }0 y5 P9 y$ e5 ~( S! b. h7 A
# P  _7 G% h1 P- vШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.; |- P8 m( {# D5 G' s" K) U
  Z% e4 Q/ @  \3 E5 g: N% l
  1. // Пакет org.l2jmobius.gameserver.model.actor: g5 F' Q- P! n8 e$ U
  2. package org.l2jmobius.gameserver.model.actor;
    2 `- w5 P9 j0 C# ^% M' P1 O
  3. & M! X: C5 x, ~: S1 F8 t5 W
  4. // Перечисление для типов атак1 H+ r  [4 W4 q# i; Q4 F& @
  5. public enum AttackType {
    " M/ H' }- p- k# d: i
  6.     PHYSICAL, MAGICAL;$ F# Z6 V! G% b
  7. }
    2 G( K" \! ~/ i8 O, G
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
- r$ ?# j/ D) N0 F+ u" qОбновленный класс для агрессивного состояния монстра:* K& P. q% a  s9 K

! f* [0 ^2 V, C/ z( J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 c7 q5 M! k4 j4 V% }* D1 i
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 C9 o' e  V* {0 j/ A

  3. $ r# K) J- ~. b
  4. import org.l2jmobius.gameserver.model.actor.Monster;# z: V( j$ f# ^/ J( V# j4 s
  5. import org.l2jmobius.gameserver.model.actor.AttackType;/ V/ [3 i" Y, L$ r( k
  6. 1 ^$ i- S( M: D$ S0 `2 e
  7. import java.util.Random;% n0 o/ H6 R: h% m: ~; C6 K

  8. # S( G. |/ _$ E0 q% k( f
  9. public class AggressiveState implements MonsterState {2 k0 X/ {" |4 T1 g& b3 `" v
  10.     private Random random = new Random();, @2 b# W# g0 s

  11. - ^, U5 L, \7 b' R
  12.     @Override
    ) T% V/ o, F1 j3 Y0 |
  13.     public void handleState(Monster monster) {% i! _+ _/ {& e1 f
  14.         // Выбираем случайный тип атаки: физическая или магическая5 \- f2 j1 i0 X1 m; l4 ]; u
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; Y+ ^8 O( l: k8 ~4 s% E( _
  16. 1 ]$ X' M0 T; H9 x
  17.         // Логика для агрессивной фазы боя" V8 m4 G; N! E6 ]- h0 |& o
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 8 b# T1 k1 W7 s
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");0 @, \8 O; T  I3 o
  20.         1 K& d" B" M# E0 y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки- D; o& m# A. Y3 k) L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;! ]8 A  p' e/ K- L( B
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    5 m8 q. g- S% J
  24.     }$ ~; r) F6 P: M3 x9 e, U6 f0 i
  25. }
    7 P5 r, z% D& C* Y0 ]0 e1 V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
# c  W6 @0 a: }3 v! k# \0 ^/ t" q8 O0 F! ?( w
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % V, u2 O. N+ H' X
  2. package org.l2jmobius.gameserver.model.actor;7 }1 L! q3 d* l7 b

  3. / N7 ]- q9 m) @7 A) n
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;6 ~/ z1 t/ G/ X5 P; U: C8 g% _
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;+ Z/ n4 S; T; s( n9 v- l
  6. ) T( t+ y) V0 X5 u0 \: z  B
  7. public class Monster extends Creature {
    % g, |" ^: t. O7 B5 J3 Z
  8.     private String name;( V# D( T# x  ?4 G( h! p' M, G% a
  9.     private double attackPower;
    ; g( M' n# U. K, s  f8 f7 g
  10.     private MonsterState state; // Текущее состояние монстра
    " Y9 _7 |4 F1 {5 h
  11. * e7 i- _* B) R7 E6 E( K
  12.     // Конструктор монстра
    + v0 L$ v( F  L( i( P# }
  13.     public Monster(String name, double attackPower) {6 Y0 O& b1 G8 U' I4 Q0 @' w0 [
  14.         this.name = name;
      X- T2 N: L! d: q5 A( S/ M
  15.         this.attackPower = attackPower;% N' M; a- C! {- l: R$ e
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    $ @' @4 ^$ A: r  R- W7 X
  17.     }
    % T4 O  e( a7 P6 d! L3 W

  18. : I) p( x! n1 j
  19.     // Метод для смены состояния, G$ q$ B% T4 H9 y$ |# t  ?# g
  20.     public void setState(MonsterState newState) {
    6 T, r1 Z. g4 W
  21.         this.state = newState;$ v6 ^6 w( G' m! I1 }
  22.     }+ _0 T( z' z  w4 v4 t3 m- o0 y
  23. . k: a, v% ^. m. u
  24.     // Выполнение действий на основе текущего состояния& M9 n% f! Q2 m8 [, q
  25.     public void executeState() {
    $ W$ s% c! v' u1 Q
  26.         state.handleState(this);
    0 |1 k1 }; c" {/ v
  27.     }
    ) ?2 ?' ^+ |% P0 i! ?

  28. ! x: K& M5 Y1 t9 L
  29.     // Геттеры и сеттеры; L3 V" P9 ]# G5 D
  30.     public String getName() {! e7 |% I& j8 N8 |: i% z
  31.         return name;! N- B4 w" r6 j# k5 n
  32.     }, s1 [. h5 k/ n- N# Q6 {
  33. 7 Y+ |+ ]) P; m8 h) p6 K* ?
  34.     public double getAttackPower() {
    0 X" c) {) p: g; e/ V
  35.         return attackPower;
    1 Z( T" Q4 x; x+ X" n) M
  36.     }
    / e2 w. Z6 A8 [/ q
  37. & h- T% \% l) \  l% F' c/ B. _- ^& ]
  38.     public void setAttackPower(double attackPower) {
    5 h8 _5 V  e( c: Y
  39.         this.attackPower = attackPower;8 z9 \3 l% c7 w) r
  40.     }
    / m' O) y% r  X" [. |3 G+ o2 ^
  41. }3 X9 F' L# @3 d! U& d' \; V& w
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
5 p- ~( O3 w& M5 K6 f
$ I5 ]! \8 F% o6 j
  1. // Пакет org.l2jmobius.gameserver.model.battle# o' }: Q' I# w8 Q5 Q
  2. package org.l2jmobius.gameserver.model.battle;; f4 C% y, D- C+ A

  3. ; H; c# ~8 V6 D! P  ]: u4 k$ r
  4. import org.l2jmobius.gameserver.model.actor.Monster;( A- n! w' [3 ?; }$ u& m2 x
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 S, @7 |1 [: G: r% {8 M

  6. ' S2 O/ U9 e+ D) y
  7. public class BattleSimulation {
      o! t' b- q' W8 P) \& L+ @
  8.     public static void main(String[] args) {
    & ]3 h( x# R7 \/ W+ a  h  o* j
  9.         // Создаем монстра- ?: W3 n" @7 x" W0 z* h" O; w
  10.         Monster monster = new Monster("Дракон", 100);$ R5 L/ N0 f2 q- U, P/ c7 y% F
  11. ! Y7 m+ L/ O; R
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак/ W4 M: u% V; E0 o8 t
  13.         monster.setState(new AggressiveState());
    # S3 Y/ T/ ?0 P$ k' [
  14.         monster.executeState();3 r- C& \0 c$ j' w# C0 U
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 q; W1 I9 D9 E/ K. N1 V
  16.     }2 }% Y6 T: k% h# h  H( V
  17. }
    % ?( M* T$ Q; H( r& c( l
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
( |. [( o6 V) f' [$ gЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!- j5 c' s" ?; \8 h% u! q3 i

: [& i$ Q8 Z% j, C
$ K  W! C# Y1 a+ }; c/ H6 b: s5 {# N, q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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