Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!6 \3 h% p9 \$ x1 c

, s1 n( n; v* W- c8 H

4 S5 o+ T0 U3 T. pЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
# l9 C" g. l% B- f3 n  VЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!9 b* s+ C5 M+ p0 B, {" P& _+ z
Астралия ?
# X0 ?  N- n  E3 d7 D- b. n& ?
' E$ c2 P( R, G# W1 G8 F; e! V

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
  p# A$ N7 |8 A; Y  z( OВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?1 \6 m& N" R3 f& X1 \$ A1 Q% d
' _2 Q9 r) s& F0 e( V- ?
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
4 c; @( U" _2 g1 b! J1 A
AlexCoder опубликовал в 2024-10-16 18:31
, V. M, {* C+ v; Z: r3 FДень добрый!/ ^$ B  W6 @( P+ `
В статье описано взаимодействие игрока с N ...

3 j% v. H! M6 n( fДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
% ?2 ^8 I7 K0 W3 r! Q
, i, ^! i, d2 f+ X8 V# ~Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; v' @! ~) t9 c! n8 F

" {9 F6 f- R8 Z5 rШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
% w* g# I0 y0 l$ H- }! M, I* y* L" C9 A
  1. <font color="Green">// Пакет для состояний монстра</font>
    1 ]7 N. A. s! d) r1 j4 D9 N
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' g- ~% H/ ^5 ]9 c% F5 f
  3. <font color="Green">
    9 a; }$ O; S, _0 K9 \$ p
  4. // Интерфейс, представляющий состояния монстра</font>
    2 J6 B; s4 ^, j' o3 l, S9 c% ]% I' d/ b
  5. public interface MonsterState {
    % a3 Y( p8 J# @: w  s  y
  6.     void handleState(Monster monster);
    7 _; ^9 {! P! ]8 W: ~
  7. }2 _' P" g( p" d
Скопировать код
7 z  R3 D7 F0 G! z
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.7 x8 |7 W" w! d. u- R
3 G. ~$ e' ]3 j% C" P1 t% ^
Класс для начального состояния монстра:
  E& A7 H( i; i4 ^6 D' c
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    1 h4 C! j( B( u  ~
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 X* E3 L( B* n" {0 [, t

  3. $ C% p6 m. @5 j; Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;* `; d3 p( ]* v, k* j: u

  5. 0 V& t* H8 U8 E# \8 q! h* l
  6. public class InitialState implements MonsterState {1 b1 H( I$ T' E6 f2 n
  7.     @Override
      [$ a* B. }/ c& x9 B) }+ n
  8.     public void handleState(Monster monster) {
    9 M( J/ H% v7 @- p
  9.         // Начальная фаза боя
    + e5 f  q1 q! K2 \% u
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");) u, ]. N  P, {/ _+ r, E
  11.     }( Y( ?3 G6 n- |5 E( r  j
  12. }
    ! ]0 g0 |/ h9 G( o; v
Скопировать код

2 X- _9 K% m- b9 K
% ]) I# l; `; Z- T  ~% K6 |0 z
- U2 F* F6 o& E8 g. B
" D0 H3 F2 D7 [" P2 Y! p
6 ~8 ?! {# U8 q. C1 m; }5 z
- P; h, |8 o' ^7 n
, x5 E3 i3 \0 R8 l/ L- h
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / h: a1 w& L; \; F8 y7 \/ q
2 m5 V2 n0 {4 G8 a" ]" {6 Y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 S, V! y8 m; p; N" I% t1 g
+ K+ j7 K% D0 |+ Q/ wШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 s7 T5 j$ |4 L7 Z- E& @, H9 U, p3 I( l) g# u
  1. // Пакет для состояний монстра
    . V6 w4 D1 i6 N2 I- ?, p4 |% s
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 J. h, {- w& r; S% z. ^
  3. ( x' F1 [4 T2 e$ O9 V2 @% W0 p: ^
  4. // Интерфейс, представляющий состояния монстра
    $ L& U3 J$ P8 M, M% @3 Z
  5. public interface MonsterState {
    . h* P5 D  ~4 {: M% u& E
  6.     void handleState(Monster monster);1 e5 L4 Q% u: E: A2 L& W
  7. }; c( u) V/ q0 ]  q$ B7 `  {: T
Скопировать код

/ r* M% l% x5 z& T( C0 zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; M# B; ?! g  ^' U
; b1 J+ b3 j' |4 ^1 _/ _5 n/ G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.* A6 D2 [9 Z7 o5 n7 r5 p5 W  M0 M

. g; }/ B& ?) Z; ZКласс для начального состояния монстра:
% O9 ^  `5 B4 g8 L9 Z/ v+ Q9 l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    7 o. |0 Z. a' g- g# J1 ^- P6 q" g
  2. package org.l2jmobius.gameserver.model.actor.state;  J: v3 l, n% M# D* P

  3. 6 F( i7 Y+ k! h" E3 E  _2 H+ a
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . ?' B  D, Q, D- x
  5.   D$ j5 t4 z: M% }5 y- q4 J
  6. public class InitialState implements MonsterState {
    ; p2 N+ j' D) g; u
  7.     @Override
    : ]* Q: ]4 M; N* q- Q
  8.     public void handleState(Monster monster) {; J  ~( ?2 o0 w0 |' {
  9.         // Начальная фаза боя' R* \$ L8 ~$ P1 t/ P, J. @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ N. H1 m0 f$ P, E9 U% Y% U
  11.     }
    ; z. d! d9 [2 ?; m# w9 x8 o
  12. }
    * k7 R# S+ y9 S. Q) I1 W
Скопировать код
Класс для агрессивного состояния монстра:! k9 D, X, i  I8 t" S& n% S
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 a: v" g- ^3 p5 G! f! D1 c# F9 D! N
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 b2 H- m& s. C/ e* R

  3. : _3 B9 n" N+ t5 H0 h# w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) Q$ j& ~; N" T. [

  5. 3 r6 \  d$ [% ]. i* t1 U$ i! H
  6. public class AggressiveState implements MonsterState {, i+ ?: Q% A$ s: P3 r3 Q7 Q) x
  7.     @Override& _/ f) g: [! {3 D, i+ @% ^+ y- f
  8.     public void handleState(Monster monster) {; ]# n; a2 U) z
  9.         // Агрессивная фаза боя2 z# m" l, j3 W8 u- y, ?! e6 @0 i
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");3 ]- s- J9 W* u' G" I& c$ C; ]
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    * C$ X8 g. K  g/ t* \, K+ m1 e
  12.     }5 }! C! t1 J7 t) b, c! P
  13. }- q5 D) \8 q6 b/ P, u
Скопировать код
Класс для финального состояния монстра:- E% l' M1 u2 m/ k8 ?! A% h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( f9 E0 V. V: |3 `* U
  2. package org.l2jmobius.gameserver.model.actor.state;4 X0 w- }3 v9 s; c
  3. ) a; }- D; u! O
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & Y7 z+ X* Y) g7 y

  5. " k9 _' G2 u" u" q' t
  6. public class FinalState implements MonsterState {& M9 U. z& y/ N  q2 N4 C; Z# Q
  7.     @Override
    6 G7 q8 T' t( N% A7 q: m4 _$ w
  8.     public void handleState(Monster monster) {
    * V, U; I) C3 z, h2 n1 J
  9.         // Финальная фаза боя9 {* y9 A% u0 R$ Q$ ?3 }, G. z0 o
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");: m6 ?# `/ c: F! a( f3 \0 n
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    , r+ c8 A; C+ `! G) o
  12.     }$ _8 y: v) X7 `. ^/ A: ]$ S7 L7 V
  13. }
    9 U# E) B$ {6 D3 q3 w
Скопировать код

- F/ S# T4 j: x  UШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., y$ i6 ?1 w; P
  1. // Пакет org.l2jmobius.gameserver.model.actor4 t( B" t3 d* m2 t
  2. package org.l2jmobius.gameserver.model.actor;! W- b5 `  T$ L  r/ C

  3. 4 G# U* N. z! x' V
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;' i5 e/ R" l$ ^
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;- g4 ]( u, X0 Z5 f  N

  6. ; @6 A  Q  W" l
  7. public class Monster extends Creature {6 U  j0 o7 w  N$ g5 G5 S
  8.     private String name;+ A4 K3 W8 \  `' Q- I
  9.     private double attackPower;
    0 b* ~0 [; ]. R
  10.     private MonsterState state; // Текущее состояние монстра
    $ ^. y; m  d. F  f+ t4 W! H/ c6 U6 u
  11.   P" s; G) M& v3 Z- g
  12.     // Конструктор монстра% U3 q) G# u% b' g2 e5 T
  13.     public Monster(String name, double attackPower) {5 ?$ N1 U  ~; `6 B6 L0 N
  14.         this.name = name;3 n; U* f% e' e( `0 ~5 F5 ~
  15.         this.attackPower = attackPower;# E6 _" @0 p* U* h! X% q- v
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние  g& e* n7 S4 Q2 u" N
  17.     }' ~7 o- {9 |/ A& V4 \
  18. * ]4 t+ i- `- v- \- P( G6 b! F. x
  19.     // Метод для смены состояния
    7 M8 U$ C; B3 P" Z3 Y) X6 H. M
  20.     public void setState(MonsterState newState) {0 L# A; `$ T) M9 `3 H
  21.         this.state = newState;
    , Y, p/ }9 L$ c  B8 I5 k2 [5 f
  22.     }( w+ N5 v% u2 W4 D, \$ x
  23. / u0 M6 w+ \5 `( |" a
  24.     // Выполнение действий на основе текущего состояния
    : P* u+ d9 |" m7 ~; |
  25.     public void executeState() {
    ( @( z4 }: F2 Q7 [7 }1 T
  26.         state.handleState(this);& @3 M( n6 X( D9 ~$ s
  27.     }
    : ?+ J; I- n5 O+ w2 ?7 Z

  28. 7 `1 Y3 v4 F, ]9 N) t' f
  29.     // Геттеры и сеттеры
    8 Q8 S9 D1 z/ N2 p; W& C
  30.     public String getName() {
    $ `# y: ?" P9 c
  31.         return name;" q7 i) v( I0 q3 ^  o- y
  32.     }
    ! D* k% S9 n4 e4 f* a

  33. , N/ _0 e$ ]- Z" K7 l9 C3 u7 K
  34.     public double getAttackPower() {
    - k2 ^9 H" [- G7 T3 r
  35.         return attackPower;( G+ t: v6 Y8 ~4 x4 ^
  36.     }
    . V4 a$ ]' e8 B

  37. " D( w7 H6 l) T
  38.     public void setAttackPower(double attackPower) {( Z. S) a) \' H" f9 ?
  39.         this.attackPower = attackPower;) a5 f3 O/ F, P2 {& Q
  40.     }
    1 E& E; J# K; x3 s" a7 U
  41. }
    , a, u- ^  o0 D7 f' l$ W3 ^9 J  p
Скопировать код
8 x6 m) r- i0 e$ p( J8 B2 i
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
6 j) n/ t0 J% i; S( a* N$ ]
7 h3 k' G- h1 m
  1. // Пакет org.l2jmobius.gameserver.model.battle/ _/ o1 V4 t+ L( ~, T
  2. package org.l2jmobius.gameserver.model.battle;% q  \- K* |2 I) ?

  3. ! C8 l6 L1 Z) b5 F* H/ p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , t1 ~- d8 E9 X5 n3 W. P: e
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    - `5 g- G$ ?. u, `* L. {/ |
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;9 u. j4 r/ s# y$ P

  7. * U6 S/ q* U8 O& F* N, R
  8. public class BattleSimulation {
    0 F7 b  ]+ p, i$ ]
  9.     public static void main(String[] args) {1 S5 `! K0 I7 Y$ G$ k# Z( y
  10.         // Создаем монстра с начальной атакой
    5 @% F2 R0 ~2 f; S9 _
  11.         Monster monster = new Monster("Дракон", 100);4 |( V# [# z5 V1 T

  12. ' f6 n0 k3 N/ v+ E9 M: |' V1 O& I
  13.         // Начальная фаза
    4 l% A, u  g1 _
  14.         monster.executeState();# F8 H3 H8 D3 d7 {1 k( q

  15. + I+ Z. J9 k) L, D. o9 T
  16.         // Переход в агрессивную фазу) X) W! C" X6 ]# G( G
  17.         monster.setState(new AggressiveState());, J0 t4 z, C# {7 i/ X1 L9 l
  18.         monster.executeState();
    % G: A1 S3 V) q

  19. 5 p. N2 \3 _0 `
  20.         // Финальная фаза; K8 r: V' h1 p2 c9 P" h7 J- f
  21.         monster.setState(new FinalState());
    9 I9 e2 {( Q/ F$ D) [
  22.         monster.executeState();
    ' m1 a7 R* K& z3 Y0 S3 ~; y
  23.     }
    2 c' q" N' ^  k7 E  N, ~
  24. }' Z! ~! i3 q# a: v2 v9 N
Скопировать код
7 C7 d+ W6 ~( m  T* x1 b; f& b
Комментарии по структуре пакетов и классов:
& o" X$ L* r% ?5 F1 h9 |! s
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    ( ^9 A. d5 r# J, `+ x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
( {* P( y, J- P; N( b! c  ^Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 Y( G. `$ I6 {% a1 `* o* v
5 B# Q3 u1 b8 b' ]+ o2 _& c' ?# u% H
, v) z* T# D7 O! Z! W/ T2 T

8 w5 ?. `5 S, c0 R. M* {5 ~0 F
9 o% w' r3 |0 l' g9 k# R& \
  g& R: F" c2 f: f3 G& Q7 ]0 M/ D  e3 t, J4 h. j) b
% ^6 b( D" L4 p/ k: |
1 ?$ G0 k  \! l- X

3 h2 f8 e" Z. u& Q8 U5 A
% P8 P! R1 w' e/ g, h; d3 V/ D+ ], L5 s4 P
1 y6 Z% w: l4 H  }5 a2 t/ f$ M* m
  g, X! K5 [/ |9 }
3 _: x: U5 V, }* T( i7 U7 e0 q1 @4 P) _
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' O7 w8 t! Q& S* \# E' sДля управления сложными взаимодействиями, такими как  ...

) h  X, P  S0 qОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
2 z3 f/ g- m3 {8 ^1 r- b2 OОтличный подход! Использование шаблона "Состояние" де ...

; i$ s! J7 s+ S5 B* w$ m4 XХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
! Q* o/ G- \# j( m
; z' T5 k* ]1 ?Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
, Q+ S8 P4 J/ q/ m8 z# R1 h9 B9 w, W2 o) x4 ^
  1. // Пакет org.l2jmobius.gameserver.model.actor  z% D' J# p$ F1 a: ^" L
  2. package org.l2jmobius.gameserver.model.actor;
    % }, c0 K& x9 V. ]/ d0 l
  3. + Y9 B) G: ^3 Y8 {  A
  4. // Перечисление для типов атак
    7 `7 I- M, [$ J6 f% v' a0 t" |. M
  5. public enum AttackType {; n% l/ q# n) @+ p2 m
  6.     PHYSICAL, MAGICAL;& l6 e" o  Y8 ?3 A* a* a
  7. }
    " J0 U5 S/ C7 \1 E, K, f# @
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.8 B6 }5 n5 b# i; Y: o# }3 E& C3 ]
Обновленный класс для агрессивного состояния монстра:7 P6 \7 z# c. W5 N
& |6 y' ^+ `# F; q/ I: h. T( r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  Y3 Y6 S* N; j+ a. Q* R) }6 |
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 C5 I5 M% h0 a3 R# i, N* Y0 V* W8 s

  3. ( J8 g! A$ v; M3 T! x" G6 n1 m
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . e# J( {5 V- [  p! P/ w. Q7 r
  5. import org.l2jmobius.gameserver.model.actor.AttackType;$ ^( I) A. w8 b

  6. ; c. C+ i) x. C4 _( u; c2 t: s
  7. import java.util.Random;% |0 l, j, o+ i/ ?- {
  8. 6 X. O2 l9 H- g" B' X: I5 [9 Z
  9. public class AggressiveState implements MonsterState {
    2 q4 r. K& s" w9 J9 j# U- W! q
  10.     private Random random = new Random();8 x5 G& U; M4 |- V5 K( o2 o

  11. " G7 D; j9 s4 ~1 H  w  i: w
  12.     @Override( J& b4 o, t$ r
  13.     public void handleState(Monster monster) {, h) r8 s1 g  S0 t! T9 s
  14.         // Выбираем случайный тип атаки: физическая или магическая1 z' b0 t; }3 n/ i& ]
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    " n4 c% B% ?. _6 {) R$ `( O  [

  16. + |/ f" l  x* X$ ^) ?4 Y  E/ J
  17.         // Логика для агрессивной фазы боя
    % x" V: \9 E5 l, [5 ~* n
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    8 [! Q9 f. z% A$ L
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");% F8 S2 s6 z. e) D( {* r
  20.         * y, k* L8 O* [- ?$ P8 Z0 M* @7 J
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  A# L. Q/ @" @  S1 O0 z7 m* w
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;' o+ j- P: R9 A7 Y3 o& O2 |
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 L, Y& F2 b/ }5 B/ _
  24.     }
    8 I8 D' u$ ]8 C1 n2 |9 a. L
  25. }9 i) p' p4 G( v9 n: J9 p3 r
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
* d  ?8 B2 w1 Z% k
0 P8 _) B( }* L; h) S; E
  1. // Пакет org.l2jmobius.gameserver.model.actor# j8 {# K7 {1 S4 Q5 |% }$ ]
  2. package org.l2jmobius.gameserver.model.actor;- B  b; P& z4 ]+ l3 |
  3. 1 y9 `( q9 s+ `3 H1 ]  R: g) ^
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;8 n. @. J/ D' \, E8 \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: b' n7 v6 ~; u/ O; [
  6. . h' _2 o9 d4 H6 L5 P" [4 c" u1 E9 a
  7. public class Monster extends Creature {
      A7 x, v9 ]' J
  8.     private String name;
    - A' t  U' n$ @" c/ F7 E) o) Q
  9.     private double attackPower;
    1 W. r$ ]9 P' I& I3 E4 y& x
  10.     private MonsterState state; // Текущее состояние монстра
    0 t8 l* z! }6 \9 W+ n2 V
  11. + w4 z: K, t- V# i2 m
  12.     // Конструктор монстра
    ( Y5 c' a( }" d. M6 k
  13.     public Monster(String name, double attackPower) {
      ~, Q# [; S" O) G3 E$ ?7 K
  14.         this.name = name;! i, p; v8 f" e2 |
  15.         this.attackPower = attackPower;
    " w: Z1 ~3 x4 e" d
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    1 S/ R2 U2 {! @% {1 i" S
  17.     }1 L( m8 }- l' R- j( R) l
  18. 4 ^6 w) @) i9 o: `( i+ q; J& @. d
  19.     // Метод для смены состояния" E/ N  A1 q) s8 g1 ]
  20.     public void setState(MonsterState newState) {' x6 J- s; x$ \. i9 Q% x
  21.         this.state = newState;
    ' f2 B! b$ G" P* s" e$ V
  22.     }5 A* K0 N: s8 e. o6 }6 ?, J$ e3 L
  23. 4 M! \5 f$ i- M4 W. b( G
  24.     // Выполнение действий на основе текущего состояния
    " O5 v  q, }# @6 v* s
  25.     public void executeState() {
    - L& u% }' s* T
  26.         state.handleState(this);' b; V( y: _' e1 r3 o: W/ o/ W
  27.     }5 _8 m* x( B5 j1 e1 d% @

  28. " {1 ]6 n. P. r' R# L" n
  29.     // Геттеры и сеттеры' _. X, X+ t! O
  30.     public String getName() {' n" A" M$ k* r4 Z* \- }
  31.         return name;
    2 X$ Q; z3 z, g; T3 n! V
  32.     }0 g  R$ `6 k, W

  33. & d! D, T: w+ v. O1 C; X& }
  34.     public double getAttackPower() {. Q) L( v! [3 S  x  T& F
  35.         return attackPower;) u# @6 A: j% Y6 P  T/ \" [
  36.     }. B3 ^7 ~0 I* R: Q% j; {7 N

  37. + \; Q# [8 u8 Q/ R3 T- ~) \5 |6 j
  38.     public void setAttackPower(double attackPower) {
    & ?# W. z6 i# z' I0 P8 W1 j
  39.         this.attackPower = attackPower;
    & K8 r! W$ ~- r- l( X$ x
  40.     }
    0 r) g7 {/ D; r% z6 \/ C
  41. }& k  E7 e/ \6 t$ K; {
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 d& E5 E, F8 J  K
& C* m# {* D2 k  c, P9 W! a4 g; |
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & ^. u; _7 m/ O
  2. package org.l2jmobius.gameserver.model.battle;
    . E- a. m! Y6 I" R
  3. 4 G2 w, s8 Y) V7 K/ h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . L6 F2 i5 P3 m+ t% A! v2 d! V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    5 m+ \; e5 @, w/ C
  6. . [( t6 K3 I; [+ w: Q1 |( D; s
  7. public class BattleSimulation {+ r6 G( S1 x* V' [
  8.     public static void main(String[] args) {: E3 S% n9 {# z: j
  9.         // Создаем монстра
    $ r5 y! D0 z. g$ Z) ]$ A( ~& z
  10.         Monster monster = new Monster("Дракон", 100);% N1 L$ }/ M1 H; x+ W
  11.   s5 W( |4 p# \  j& \$ E; ~
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    4 Q  ~! P3 A! Y& T5 B
  13.         monster.setState(new AggressiveState());
    ) \! A  D: D* Y. Q' ?
  14.         monster.executeState();% f4 {1 k/ K5 b
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
      q6 [2 g4 S- q8 g; e
  16.     }
    % S: ?: W+ G) L* E# L6 _) G$ K4 |
  17. }
    % j1 h! g  C" ~7 G" V
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
" i; }2 X0 v( j. a2 r) x& p- _8 MЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!" G" [* P( T+ j  }3 c, c, e

; k4 X# R: U4 q0 f! \7 E. T" s" l8 \: t! a4 l* i: v' n2 c

1 J: d5 ^. M6 @" b: J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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