Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!# V& T# _/ \2 X9 J3 i  o

- {  z9 G- R& g& [4 H" x, E) n9 t
) P0 l; M( F. H# n
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.: p* |5 A3 y8 a9 S$ ]; M+ t6 m
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
4 a" G" Z' w8 x" RАстралия ?$ ?' Y( X& M& e  {- E2 S
$ ]% ~4 C; t. B) X+ T5 f- C& a

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!: p5 q$ e; a2 @; v% B
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
7 F; C3 H/ b2 m" M$ m2 Y% I& W- F8 t$ b5 q# @7 D' q9 a
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
# E- K1 O4 ^3 Q3 s
AlexCoder опубликовал в 2024-10-16 18:31. R# c: r7 h- k# d) f9 X) l- O
День добрый!% O) c0 }5 Q4 V0 S8 z% x
В статье описано взаимодействие игрока с N ...
; j( M. v9 A7 X
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). - f1 B, T5 s. Q+ r, f, v, k/ j: c1 L% y

; o3 I- f* z# G2 ?4 ]' R: ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( z; h) C* v) `- }! W* T8 W2 M9 C' P& e. ^
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: D, _4 q' N! D3 I9 U8 F( ~% l9 J: T+ [$ P5 R$ ~7 u
  1. <font color="Green">// Пакет для состояний монстра</font>
    5 M5 \! Z; S; t3 a) P
  2. package org.l2jmobius.gameserver.model.actor.state;1 K; d6 K7 M/ m, O6 }3 _; e
  3. <font color="Green">8 d7 f% b3 o3 k. F" \
  4. // Интерфейс, представляющий состояния монстра</font>7 V! S3 C8 [' ^8 k
  5. public interface MonsterState {. ~# M" l' x% |2 ^! ^# C$ i
  6.     void handleState(Monster monster);
    ' z% l1 U8 C+ ]% _
  7. }
    9 }; k' f" e  P% `
Скопировать код

( ~/ q4 a6 f, B, i7 Z* ~% g7 mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.! t) m5 f* _, V* z9 c
$ c6 N4 p, l7 h" X5 P" U: h
Класс для начального состояния монстра:8 u2 p4 |/ E6 N/ l
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font># k, X' V0 ?  u3 Q7 n
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 P8 H/ S$ \/ d# a1 I: u# X

  3. . F% K5 G5 \) M+ H
  4. import org.l2jmobius.gameserver.model.actor.Monster;# K; e$ O2 A' o$ j
  5. & L& O7 {" w- }2 h. Q( x. ~% V2 H
  6. public class InitialState implements MonsterState {
    , |: f. z. T! ]  K
  7.     @Override; D. y& `6 ~  R7 n& `
  8.     public void handleState(Monster monster) {& ]# Y/ g4 O* @/ S( e3 G: [
  9.         // Начальная фаза боя
    ) F! L' S  l: ?' x7 i+ z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");) t. H, h/ f8 b7 \0 k7 [7 c* Q0 b
  11.     }
    0 S6 T& p& G& E5 J
  12. }
    2 O! v1 c: H  p3 A1 Q& ~: w
Скопировать код
( N; _/ e$ c4 v* z5 U
: s1 x! Q7 y( r* _
, D7 a8 y8 M% w  T$ m) M* O# Q
4 x5 }/ `# Y% g5 D  |( r
$ e. ~8 H9 |  s9 ^; b

/ }/ G0 L, X/ r$ A9 c' D
+ c, ~  s+ V8 {$ Q6 u$ F
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). / I3 ?. W! s3 P2 h6 Q
8 C" @  H9 l& R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
# R4 A+ L! V" r9 u/ f+ M- M  H$ K# r' @1 a! ?6 }) D  J3 [2 \) Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
; r( ?; s; A+ G. e3 |
* a8 @3 C$ O5 A
  1. // Пакет для состояний монстра
    9 e$ N, I( ~7 i; N
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 c5 |9 v) \% J; Q) n# J' l* ]% X
  3. # E: t- Q+ L% C$ a, B
  4. // Интерфейс, представляющий состояния монстра
    & G; ?, H# }' \4 \1 ~; f/ ]* n
  5. public interface MonsterState {# D- Y& P4 {" p. W% \* Q5 q
  6.     void handleState(Monster monster);! c& Z8 c& v1 P7 |8 }
  7. }
    & @: d: x6 M3 U; _, @/ r) Y2 e0 i
Скопировать код
3 c% k4 [6 |, [* [7 r
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 o* a/ H4 K# O, U. m) k  z% ^; r+ D2 d0 I% O' z, K% J  }
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
% j, K  }# I0 c, Z. Y9 {
5 l2 @4 y5 R9 n& G" _, aКласс для начального состояния монстра:+ }4 `* F4 ~1 z! [: a0 D5 P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state9 M. j  i$ x6 \1 b4 M  W
  2. package org.l2jmobius.gameserver.model.actor.state;
    / d0 ~4 s' W- z8 f
  3. 6 X' l1 B' ]- @: j' f' `# M- k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 l  T1 _* c4 j7 U+ ]0 P! w- f9 l
  5. " L9 k9 L# D8 ]9 \( \& r9 n
  6. public class InitialState implements MonsterState {- O) o, d3 w1 s
  7.     @Override% _( `* G3 `7 |; d! c, k
  8.     public void handleState(Monster monster) {- d9 b1 Z* d. @8 B
  9.         // Начальная фаза боя/ t/ c7 W8 {- m) P4 l
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ [+ D, }5 r4 B) E
  11.     }
    9 }' b% z. G0 C0 _3 t
  12. }* m: E+ G5 L; ~8 \5 @
Скопировать код
Класс для агрессивного состояния монстра:
" }  k5 B! J7 v  b% c' i
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 e5 c# ^  C* t) ^" e( e1 {
  2. package org.l2jmobius.gameserver.model.actor.state;$ J& {  i# q! K! o; b

  3. 7 a8 \/ z3 o, ?4 r0 x+ A+ ^. F0 _" P0 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    4 z- U8 G1 N( o" |: C% O

  5. 0 Z! ?: l9 |- q
  6. public class AggressiveState implements MonsterState {
    & T$ r* I* {& G% M
  7.     @Override, @- v% u& d( I) K, `
  8.     public void handleState(Monster monster) {
    # o  S& H! ?) W
  9.         // Агрессивная фаза боя1 m5 Z& L) j5 ^* U! _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");& }3 \0 G$ B4 N5 M! D. w
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки1 g# f3 t" [/ i) _. m
  12.     }
    - |2 b" K) ]1 m7 o$ v. K7 I# l
  13. }
    . A8 |5 h) C- M3 |# j- r  ?
Скопировать код
Класс для финального состояния монстра:
. A, o! z* `$ d& F3 N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state, Y! p0 f" S, X0 n, j0 B- s( e
  2. package org.l2jmobius.gameserver.model.actor.state;: ?7 {. t: X) t2 \
  3.   O' u# _, l7 q* [/ q1 O8 H0 v( n
  4. import org.l2jmobius.gameserver.model.actor.Monster;- v. y0 K3 ]; c8 A: K$ A! `5 s

  5. : G  B: {7 i3 W- U! K! g- k
  6. public class FinalState implements MonsterState {8 I. B  i5 G& _' w8 e+ b2 Z6 Y
  7.     @Override1 w( c% }4 X% W/ `" K) n9 h$ K
  8.     public void handleState(Monster monster) {
    % J' Q5 j, t9 o$ _) I( {' t7 _
  9.         // Финальная фаза боя
    ( [4 N7 g4 ?% R: U
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ( a+ y9 D# Q: i7 A  m5 F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки. P9 b" W0 i: S& W; C; `
  12.     }' u, v2 g7 L8 F2 n1 `
  13. }
    ( o6 A. I( j2 {
Скопировать код

; h; N' F4 b+ ]$ k4 M" {0 tШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.9 s: y; W. ?* u) s0 V, L* ?
  1. // Пакет org.l2jmobius.gameserver.model.actor+ d" @) g! V, ^: ]$ k9 C
  2. package org.l2jmobius.gameserver.model.actor;$ r5 P8 S# j6 o) {0 i- Y
  3. 3 i% c" x7 ?  f7 J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : {: ?1 Z4 A+ c. i2 K8 K
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % d! X. V% ^' {5 q- M$ G

  6.   q9 A! }' V# h: d4 m( U
  7. public class Monster extends Creature {! t% X7 Z( Z1 k* I; }
  8.     private String name;9 d. q( U: [! s$ r+ C* d5 R
  9.     private double attackPower;; G* w; i" K# g5 t# n" T3 u* ]
  10.     private MonsterState state; // Текущее состояние монстра6 N' b+ s& C7 @  I+ U4 Q
  11. 1 r( j8 ?5 g% P2 q
  12.     // Конструктор монстра
    8 V+ y" A" k2 j/ H0 d
  13.     public Monster(String name, double attackPower) {
      L* u% t, ^( ]$ }
  14.         this.name = name;
    : e' a9 E# b( |
  15.         this.attackPower = attackPower;
    ' h1 Z' q* m! W, m, F: M3 C
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    0 ]0 _. V' x/ i% ^8 d
  17.     }+ @, b% B: \" G6 Z! ^1 x  L

  18. 0 _* x4 t6 p! K
  19.     // Метод для смены состояния' P+ R  K% ^: i& _; q9 J: r( S
  20.     public void setState(MonsterState newState) {0 a5 I7 H. n" O7 {, a0 a% d4 C4 m
  21.         this.state = newState;+ @4 F" S  e1 J8 v: k
  22.     }
    9 N" o; x8 Z; w6 V8 d

  23. : C+ H7 a: F" _8 t6 q
  24.     // Выполнение действий на основе текущего состояния
    ) X" J1 L6 l5 i) k3 Q: X
  25.     public void executeState() {
      _- f1 O- i* Q+ Q* @9 F6 c
  26.         state.handleState(this);8 R$ w8 A. X+ i# ?) A
  27.     }
    0 j8 d+ I9 A, c) N/ P

  28. # U7 U& ^/ @! _$ z, V* ?$ D- F
  29.     // Геттеры и сеттеры
    . i, l4 z, z* ?: ^( D+ a
  30.     public String getName() {
    8 s; w) e3 d3 ^" L2 `
  31.         return name;
    : Y  j  {( X  z# I$ t' _6 }! d( O
  32.     }
    % v: G4 Q/ _1 [; O" ~7 u
  33. , r, S  R! X- @% K4 L- o% a( d
  34.     public double getAttackPower() {1 ?1 e9 C2 o2 y  b) _  L
  35.         return attackPower;
    : d+ a7 w/ c3 l; Y; w2 l8 g
  36.     }
    ' V  J! Z' G: T6 N  R  {' S. a

  37. 3 t  l) l- g/ k. @* z+ [) p
  38.     public void setAttackPower(double attackPower) {
    ! p% p7 k! v2 v& q2 k* c8 J+ K
  39.         this.attackPower = attackPower;0 l" b3 |7 ^. F0 [
  40.     }, z2 r% K* }# U' i5 t, D
  41. }
      q" B+ Z3 ^; N' T
Скопировать код

' L5 k, ~& U) R) EШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.7 }, I9 W* b# Z. g1 N, e/ _! ~
( `8 f1 F0 v& Z+ L7 X/ U
  1. // Пакет org.l2jmobius.gameserver.model.battle8 H" m; b  O- V/ W- r
  2. package org.l2jmobius.gameserver.model.battle;6 M( X) H! d& i0 K5 Y

  3. 0 L7 ]4 q) h( t* J
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : \* _" T# d6 A% ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 j, G) f: C4 c% V) k
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' [# B# z5 C1 X( r% R# h; ^

  7. 4 v+ R. |" z' h! }
  8. public class BattleSimulation {
    % h1 `3 }- V: M! S2 ]
  9.     public static void main(String[] args) {  a- @0 M2 C) g# T/ k9 Y
  10.         // Создаем монстра с начальной атакой
    # x3 A1 x. z" W& a
  11.         Monster monster = new Monster("Дракон", 100);6 h9 j4 e  a- K7 Q1 ~6 R
  12. 3 X9 v& Q" p0 T6 B1 S" V
  13.         // Начальная фаза! i7 Z9 `; G; g# [1 u, X3 s
  14.         monster.executeState();
    7 O, V: t; l% s, \+ K& o

  15. # g1 k$ ^: L# ]$ ?  t" }! R: u
  16.         // Переход в агрессивную фазу
    7 `% N5 E+ o3 l; _6 D
  17.         monster.setState(new AggressiveState());/ G% P3 C5 v- |6 s" U7 `9 C2 Z1 w
  18.         monster.executeState();  l7 Y. l6 t6 f- g; m& k
  19. * }" T* j- q7 Q* p; p) F3 A! ~$ t+ z' a
  20.         // Финальная фаза
    # t$ s' `8 M+ c% `- V
  21.         monster.setState(new FinalState());
    - l- p8 Q* Z; h4 t: P9 B0 _
  22.         monster.executeState();( N& b" }% O8 `' G' E! Z* F
  23.     }
    ! {: |/ X8 F1 [2 J) L, m! y7 O
  24. }
    : \3 k! H* c" x9 {3 {
Скопировать код
& b; w3 J0 f2 L! i- j+ M9 I
Комментарии по структуре пакетов и классов:
6 B! T) n4 o( G' p* I- S
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.9 x# U/ \0 Y7 {7 A1 ?& x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.3 ?7 z% A/ Y  d
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!9 z# U. _5 |% \! L
! s( v: @- c" R  O& p# C) o

+ b' O) m% F2 p  s6 y; f
2 e8 M" M* n' T1 v8 \4 l0 _& \- U; ~. T8 l6 U

' J2 z' ~2 N+ Y2 y
* F& \+ W* ]3 N. S! @( j; R  n/ w2 k% x: @# a4 \/ b( o

) {, }* ~5 O! {  o- h) _3 u7 w
/ F5 [/ ^: t( |* o3 ^0 N- _
  o  W: }: S8 L& {* B. }* R% n. z" u0 Q5 I  o0 e/ f
5 `- p( `7 L, B/ r0 o" c
2 N, ?2 {! g4 X! x8 R

: p) Q, Z# M2 |( d( ^
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
1 t+ l1 X; K% C7 |5 I  ^$ KДля управления сложными взаимодействиями, такими как  ...

; [- Z+ ?3 [$ l" {Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21  N2 H# b3 i* \. D5 D) B
Отличный подход! Использование шаблона "Состояние" де ...
8 i4 c+ Z) }+ N9 U
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
; V4 H  `5 S3 ^5 _6 i
0 P9 q" X. d/ ]$ LШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
; Y: t( Y8 h/ e9 A$ R+ l) o3 J9 ^( |% p/ p- _6 {
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , c1 x0 E" e, L9 T! r
  2. package org.l2jmobius.gameserver.model.actor;4 k6 W) n4 G. |, G2 M: U
  3. ) v; _) j3 _0 J# i4 E
  4. // Перечисление для типов атак
    - X& a# \5 ^, |3 Z  `
  5. public enum AttackType {
    0 N  Y/ O! j; Z/ m3 O4 z
  6.     PHYSICAL, MAGICAL;4 m7 S5 q7 F: C" u- n
  7. }4 @$ }) F( E3 \& b" a! z8 F
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
/ u- I8 p. b5 k" i: c, [9 ^% ZОбновленный класс для агрессивного состояния монстра:
" @. U1 N/ y4 w" U5 {6 g# V& n4 a+ R8 `; [! x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      Z, M; f1 C+ }6 ^3 i: r* N$ P
  2. package org.l2jmobius.gameserver.model.actor.state;
    " }" _8 h' s) q
  3. , r& ^) X- k6 o, n7 F5 o
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , T2 O8 m& r, D3 s/ X
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    3 E1 p$ h+ \- B, b
  6. 8 ^! r0 \8 o6 B- U
  7. import java.util.Random;
    4 r! i. t1 [3 t( J

  8. 1 B: J+ q# T: A  K0 x8 P: V
  9. public class AggressiveState implements MonsterState {
    % G% c! ^7 L3 s" Z  W8 `. W. _
  10.     private Random random = new Random();, P$ w: z' u7 o7 {* {/ A1 v

  11. 2 W/ W# q+ `2 q* t8 |1 A5 J' ]9 j
  12.     @Override
    . j' t+ e. i# g/ C6 b3 e7 e
  13.     public void handleState(Monster monster) {$ `/ V0 ?; h: E* M+ |* D4 o2 H! `- w
  14.         // Выбираем случайный тип атаки: физическая или магическая
    7 C. T  Y4 r/ |8 H5 ?. S9 H/ H/ k# N, F
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! a1 v9 e6 N6 Q0 c3 t' s
  16. 8 q: N: m5 Y% C" F# A
  17.         // Логика для агрессивной фазы боя
    3 I  O4 h0 I$ n$ o; {3 G3 y# t
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " * w% ~* T$ p, t! v5 p) v6 _4 m7 d
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    0 b# x/ n  y5 I: i
  20.         - \6 `. Z) T# J, r0 x
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    ( L* y% I$ r. i, |1 s
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;# Y; y: c8 L* ^  `! o! b
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);% o% v9 c$ f5 a' X
  24.     }9 d* o+ S" H' m: [: l: \
  25. }4 h! M% U2 g( k, X& ^
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
0 e' h/ r% W* M4 W- [2 F- o/ u  }2 H
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . s# @7 j, k6 I' e% a# S
  2. package org.l2jmobius.gameserver.model.actor;; x3 l3 J# n. `6 K8 N  D
  3. ; [# R! O( i2 U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ S8 n/ P. J0 W; g% ^
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % O" [. j; y: @- A+ y* r& o4 ?0 Y. k

  6. * I& H/ n; Q6 u
  7. public class Monster extends Creature {
    ) f4 R& h$ k6 L' N
  8.     private String name;4 t  k/ P7 r3 R6 R, n5 H
  9.     private double attackPower;
    ( P. d* G  b( Y4 X" o  N
  10.     private MonsterState state; // Текущее состояние монстра
    * j# Z" [# p, o3 \  _
  11. . e, J' y+ x+ ^
  12.     // Конструктор монстра, z9 f3 Q5 U0 U1 V: b
  13.     public Monster(String name, double attackPower) {: g8 B" y! _4 }$ w
  14.         this.name = name;
    7 ^0 h  ~% @" B% u
  15.         this.attackPower = attackPower;8 O0 G1 c( D  w, u9 o
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию* ~  x+ _2 [6 H, D* i9 y; P; W
  17.     }: b# M1 p$ e5 m6 C4 P; H' M

  18. ( x  N- a' z6 t3 V. D
  19.     // Метод для смены состояния
      N$ R- o. p2 w% {6 r9 W1 f
  20.     public void setState(MonsterState newState) {1 |# K% F$ M1 F; ]9 C) Y! n
  21.         this.state = newState;
    2 w! ~! R+ w( U5 _
  22.     }
    9 K0 h* Y1 L# ~7 n+ A6 B
  23. , I+ P) n8 E5 L* ?! g' w
  24.     // Выполнение действий на основе текущего состояния
    6 q2 x2 m$ P% ]. c. ?& g: `3 X  T
  25.     public void executeState() {
    " b, u; M# b) t% [
  26.         state.handleState(this);  o5 ^% d1 U# b" R% S4 ^: l
  27.     }/ s8 e/ L5 d4 ?, s( C& C, ~
  28. 9 b: ]' `; _+ _" G! ?4 d* D* N
  29.     // Геттеры и сеттеры
    9 B3 X! A, T9 `5 }
  30.     public String getName() {
    , u: U+ _& R  Z5 M! W) v2 z3 e
  31.         return name;( B2 i  t: h/ K* Y% z2 @
  32.     }3 J# A  E0 Y, b, ?3 ^5 P9 V$ ^
  33. 5 Y* X7 N6 m0 U5 R$ ~& _) {1 S
  34.     public double getAttackPower() {8 b3 E5 J; @; q1 u; E  X3 {
  35.         return attackPower;
    : e$ e0 }: @5 i; M3 c
  36.     }' x  x8 w8 c! S! o+ j

  37. ' g5 W0 S2 Z' l( v& N' L) q
  38.     public void setAttackPower(double attackPower) {7 Q8 X$ A4 s  D7 I3 |9 F% ?
  39.         this.attackPower = attackPower;
    / t% B8 I& A, }6 Y# [
  40.     }
    / Q# T8 W, @# I  K7 X  F
  41. }
    ' s! h1 O8 Z! D+ M
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.8 _4 x/ r& R( L0 L5 E

( ~" G  H# p; H% ~
  1. // Пакет org.l2jmobius.gameserver.model.battle
    4 O$ y0 ?5 F& Z: u9 r% @% M' H5 v+ S
  2. package org.l2jmobius.gameserver.model.battle;7 F( ^% w' T) L2 v! S# G. R) t3 P

  3. * w( u$ ]+ ^4 t- ?+ b
  4. import org.l2jmobius.gameserver.model.actor.Monster;- E' z" u4 J9 a2 H6 D& u. v1 J
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% F; x% O8 N* m5 `! f; u
  6. 7 u9 s/ K- ~3 r
  7. public class BattleSimulation {
    2 r  G, Z0 O- V8 V. H
  8.     public static void main(String[] args) {/ Q/ N: C9 @3 x
  9.         // Создаем монстра
    * }4 r6 [/ @6 \; ^
  10.         Monster monster = new Monster("Дракон", 100);' S: k8 [5 Z% m

  11. 0 t+ W# d% }* `- z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    3 S  b) t; Z! @0 w9 N1 ^
  13.         monster.setState(new AggressiveState());
    7 k* l' N3 U1 A, d4 c
  14.         monster.executeState();- O( w0 o) G8 f5 h7 |$ l8 A7 F5 ~1 p
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & |) @! f' S) S. B7 r; G
  16.     }
    ' X2 d2 q9 P3 Y! \0 S& W
  17. }0 e. Q" w$ c, ?8 n+ [% k$ ^& n
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.9 }2 U- W% \9 g0 I: F
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
% ^5 G/ I) ~0 y3 m% _- N: u/ F* B( c9 E2 F2 H+ @1 p
9 R+ n0 k$ j. g* |  c2 a# U, R% k
% }: K4 e+ [  U  l: R9 i
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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