Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!% j" g# N: X. o7 e0 ~5 h
8 `( V3 Y9 ?$ |. R, b0 A  d
2 ]' J: C- ~2 S
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы./ X2 Y3 w% `' P" j& n
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
- f* ?; b- Z5 }Астралия ?' r2 R  _. u; V( m0 f: b
( u+ `2 m, z2 U( w

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
3 H& M2 L$ f5 }) o$ Z1 d$ R0 E/ XВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?: \. H! c" J) I& J" s0 a! S9 l/ C
  f5 b: V* l2 M+ i; `
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ( ~( e3 u5 f, ^
AlexCoder опубликовал в 2024-10-16 18:31
+ I9 P3 i& t' ]+ d- f" fДень добрый!: p7 N9 H4 \8 q  C
В статье описано взаимодействие игрока с N ...
. `' P9 B2 ~! y7 `5 n/ Y
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). # S- {; R* ~0 ?

3 C6 A3 `6 w! v: eЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* [3 E; d3 `* D+ k; u
+ |  Q: I! k3 g, A5 O% HШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ V8 f+ f: ~0 f0 P
4 r7 T# y, }& ?
  1. <font color="Green">// Пакет для состояний монстра</font>7 e4 c; l" H+ D( c& i  r% x
  2. package org.l2jmobius.gameserver.model.actor.state;/ s  b) j4 o+ ?& W* f5 A, ~
  3. <font color="Green">
    % t- b  P" i' f- f' w% ?
  4. // Интерфейс, представляющий состояния монстра</font>
    5 s* I' T- {( i
  5. public interface MonsterState {
    7 v  Z$ Q5 l9 }8 v' Y+ w! r
  6.     void handleState(Monster monster);
    0 v* i% J7 w0 T" A5 t$ U
  7. }  Q( ~9 f, s6 w, M7 g. n
Скопировать код
; a4 p) [6 q2 }/ x+ c; M
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.& D5 R! B: w5 q' m
# T- j4 q# [1 z2 h4 D7 R
Класс для начального состояния монстра:
4 G) u" K3 X7 [1 r5 v
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 J$ w6 e3 [* f
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( T, T8 a- V/ f9 I- W

  3. + V& C! `9 Y4 Y$ z& G: k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ |; h( W. d$ a7 }- z/ b6 [
  5. " k2 K! [' k- W8 J, D- E
  6. public class InitialState implements MonsterState {' d: K: ]9 F$ C; L: }2 E+ S2 \$ `
  7.     @Override
    9 s# K5 R# g8 f. T; J
  8.     public void handleState(Monster monster) {3 {  `4 M8 v2 _$ u5 K
  9.         // Начальная фаза боя0 x. s) l8 k$ I
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    4 }# F' P( I" Q+ ^1 L4 r
  11.     }0 N( Y, q7 ?5 w- U# d+ F
  12. }+ Y" z, H% j  u( H& H
Скопировать код
& F  c. Y  L) F' t* D6 s4 g5 r
! v% ~9 Z7 U; a' v6 f* G

: J* _" x" k; U7 N( l4 A3 f( M
$ k% a1 c2 m% U) Q% B. E( n# Q0 @3 w+ C3 h  D3 O2 }
, e) J" y! X9 b3 C4 M+ Y7 E; }% s

& z7 K# T0 Y$ J. L+ E" E& j
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( P, a; I2 U7 S" ?4 T; @- _$ O* j2 B; i! @" Y8 C
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
! y# o" n7 I  R( O$ {
* C. ?! W; k+ ~2 GШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' W) e' }% W/ P, d2 A
( I& U, P* x7 n1 c
  1. // Пакет для состояний монстра8 x. @6 }" ?' u, O- J' c
  2. package org.l2jmobius.gameserver.model.actor.state;
    / J: S8 X1 W5 L
  3. ) v) w4 m( ?! N( f/ w. G
  4. // Интерфейс, представляющий состояния монстра
      c. d4 S3 L1 q. F3 \  H* d' Z
  5. public interface MonsterState {1 ?3 ^( U2 C* x3 d# h4 {5 B* a
  6.     void handleState(Monster monster);
    ; j7 Y; b2 ^" n8 s, h" }8 b
  7. }/ b! p$ m8 D3 O( j7 y- a' Q8 N5 }
Скопировать код
: P: R* a0 ?" _) x' |  t; r6 C
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. - [- ?* w% H: o8 |+ Q# {5 a$ M, l( F
% c/ E% |: [  `4 ~0 D& ^' T
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
- q) @6 n  M, z1 I+ G% }
7 H6 _* Z) D/ [3 ]- M; G; vКласс для начального состояния монстра:
9 T' P# ]* `7 \3 M
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 L) u$ }$ O+ w; j2 ^1 f: A! `
  2. package org.l2jmobius.gameserver.model.actor.state;
    , [2 F8 G  U$ }/ R7 x

  3. 5 x0 {& L  }! h5 G: a( P* i6 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " {3 Q! V) N' R% S% x/ S; x0 ~
  5.   F, j- H7 A$ i) |/ l- G/ P6 b, q" O8 h
  6. public class InitialState implements MonsterState {2 R" f1 ?  u6 O1 l5 b+ U% \
  7.     @Override
    3 `% w; v% Y' p6 G% g2 x
  8.     public void handleState(Monster monster) {
    # i  q5 l8 p. y
  9.         // Начальная фаза боя
    . Z& t2 U; K3 O; \- W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 O5 Y- T, H3 W* u/ J, _
  11.     }
    8 t# t" P8 b4 K+ H6 d
  12. }
    0 `2 I. n( x  Q/ C
Скопировать код
Класс для агрессивного состояния монстра:4 a% I0 w" G2 S0 d) U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      K! H  ?+ @. J- |- p  S& U: x
  2. package org.l2jmobius.gameserver.model.actor.state;
    % B8 Y9 J9 H& I5 p& e1 d* \
  3. 7 D, K% i* \4 p4 |
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 s) D' r0 j1 ~4 Y; z

  5. # J; e# ?, G1 n1 S+ G8 {
  6. public class AggressiveState implements MonsterState {
    5 C5 z/ L* t( K" d- f
  7.     @Override
    " V5 G& L' n) L5 [" W5 j- F
  8.     public void handleState(Monster monster) {
    4 v7 }  m+ U! h1 }; m) N! d$ ~9 N% q
  9.         // Агрессивная фаза боя
    % [( U- Z. `8 L8 ?9 z+ [
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* \$ d8 a; R4 ?+ c* O
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    7 ]  N8 ]: O1 y; R
  12.     }
    7 i: l3 T/ D9 W0 t% e; `
  13. }
    / V1 G1 q, d. B
Скопировать код
Класс для финального состояния монстра:
' d+ c( _# d& Z9 x. w( K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , Y" i$ a4 y& e6 `2 u. h
  2. package org.l2jmobius.gameserver.model.actor.state;
    & ?7 e+ S. X! S
  3. 7 \/ d: _3 {9 t  q& u
  4. import org.l2jmobius.gameserver.model.actor.Monster;" b9 S  w( r* R% C' {/ l

  5. ; @: m6 g0 l! I7 v
  6. public class FinalState implements MonsterState {% Q5 [# a% e! [" \1 M
  7.     @Override, g2 q' l' w1 [: N" N3 v1 Q
  8.     public void handleState(Monster monster) {
    0 o. K8 m& q' @
  9.         // Финальная фаза боя
    $ l& P8 }! P1 _
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ; q. q$ V4 ^5 S8 j* U7 n# b
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки; t5 _( k$ J  V! J2 K* e
  12.     }, b' I. g  z2 L  L6 _) m
  13. }
    8 D7 O$ t2 F9 G; {/ v
Скопировать код

; ^/ v% T  [, Q, a0 S$ _Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) b8 ]# W' o3 H# X. A' I* H& E6 \
  1. // Пакет org.l2jmobius.gameserver.model.actor" z8 O! e. T+ w: N* F- B( h
  2. package org.l2jmobius.gameserver.model.actor;
      k/ @2 w1 p9 y, ?
  3. ) j' x7 \. g+ k4 c7 r
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , A  d! h) E4 Y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;$ }( z9 R7 Z3 l
  6. 3 v% o0 w' E& ]5 D/ b9 }
  7. public class Monster extends Creature {' e7 F# G& |, @+ j
  8.     private String name;
    1 Y! s- |  ]5 @  {
  9.     private double attackPower;
    ) w" ~, ?, [4 P. V0 \2 e
  10.     private MonsterState state; // Текущее состояние монстра4 n! w, {4 E% Z3 f8 k# }, r4 {0 @1 f

  11. 9 o5 w, ~  m) ?% B& p" }- P* {
  12.     // Конструктор монстра
    . q, s5 W4 A( \  N! Z
  13.     public Monster(String name, double attackPower) {; t0 H) _& C5 g: d: _
  14.         this.name = name;  ^/ \# }0 _- Y7 ~! E" U
  15.         this.attackPower = attackPower;
    4 R9 A/ g; g7 g, M. h% e  R' Z4 _0 w
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    1 h( K3 Q1 X# W
  17.     }! k) D' E$ Z2 N6 z# X- M; I7 a- I, z
  18. / v- P3 H' O9 ?# k, v" q' u
  19.     // Метод для смены состояния" J6 ^' F) A' o1 C" {4 _
  20.     public void setState(MonsterState newState) {5 O- ~2 Q, A4 [) r) R& k* e7 [
  21.         this.state = newState;1 x: e8 B# i# ^( B8 ^2 W3 q
  22.     }' j" s7 E. E/ ]4 @$ T& D3 P7 Z* Y

  23. / m- n. `0 c# F  @# p
  24.     // Выполнение действий на основе текущего состояния+ M; ^: _4 \5 u1 U/ e
  25.     public void executeState() {
    0 A4 ?6 e5 `* }1 z$ ^  t5 }- t
  26.         state.handleState(this);
    ! T, ~; m" K& @3 t; ]
  27.     }
    & s8 L: r( {! d/ |

  28. ' N; ^6 z4 v) s! R
  29.     // Геттеры и сеттеры+ X2 A/ u3 m% N5 ?% w
  30.     public String getName() {
    9 M- c, d1 y2 V: t' U/ T
  31.         return name;% |; E, \0 P0 {5 E) j& ]: B
  32.     }8 n* e0 R! e3 F% s1 g8 b$ ~
  33. ; {/ k6 k# w, k1 Y6 y" _: |
  34.     public double getAttackPower() {
    3 V- z7 V" {( {9 C; D" E
  35.         return attackPower;8 |# f6 m7 s# a- q: \
  36.     }
    * E. L7 ]$ l& E4 \

  37. # z: W& ?& G0 ]+ P- B$ d
  38.     public void setAttackPower(double attackPower) {  e/ E  x4 u9 S( Y
  39.         this.attackPower = attackPower;+ d5 x8 o0 Q6 Z) X$ K7 _
  40.     }1 }0 m1 h+ w$ E
  41. }0 r  B  X" c! q, h# s( w
Скопировать код
( D1 O( B' g7 n7 a2 Z- `# ~
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.5 m% e5 J6 {& d& ?% N1 u. e  H
/ Y  _! C5 e& ], `  Y: o- j& {
  1. // Пакет org.l2jmobius.gameserver.model.battle* W6 F9 O6 k3 k( w! ^& q1 a4 P
  2. package org.l2jmobius.gameserver.model.battle;
    ! [" B) m$ R2 O) D, [6 z# f  ~6 p( o
  3. 6 }. D7 o+ Q: e7 \+ X2 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;% |! o+ ^' ?% g) n5 A; X# C: @
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ' k5 i, ?4 S5 B. B* T4 b3 q4 w6 @
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;1 E# E6 d, T! m: {8 f9 v
  7. . Z1 @1 h" D1 l/ r" z+ A
  8. public class BattleSimulation {5 V# {' r, I. t. Z  f
  9.     public static void main(String[] args) {  k  G8 e# Y4 X2 f4 n  h
  10.         // Создаем монстра с начальной атакой; ]+ V) h! H! {2 Y
  11.         Monster monster = new Monster("Дракон", 100);
    ! G  ]% w; a. O% O! _  b6 Z: U" R& o

  12. . Z( x  ?% n$ M( ~4 w7 ^
  13.         // Начальная фаза& b2 o" L0 g$ e' x& }, G
  14.         monster.executeState();. H8 K5 n5 m, I3 T9 c

  15. . }7 V/ X0 @. ~3 W6 R3 M, P
  16.         // Переход в агрессивную фазу- q' U9 C8 Y# x( S) {2 f
  17.         monster.setState(new AggressiveState());6 s+ [9 v2 ^% K( @" q
  18.         monster.executeState();& A' U! m1 h' o! b9 f7 V# H0 _

  19. & O5 S4 K5 ?% |8 S
  20.         // Финальная фаза
    : s: P& P" b5 K0 Z
  21.         monster.setState(new FinalState());
    0 a  l6 V/ h3 c/ ^4 ?5 Q( x
  22.         monster.executeState();
    . d0 {3 e& k) e. O. ~
  23.     }5 F$ d4 S# d' A: R5 d$ L
  24. }! |! E6 E5 ~  m* \7 j! C
Скопировать код
/ @9 t: t& G# J- i* `3 s
Комментарии по структуре пакетов и классов:4 c; [, I6 k$ Q) x5 C
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- r+ O% Y" p" J% r; S
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.0 j+ d- P( ?! A) d$ q! q
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!% D3 V/ ?& x. o2 r* D
/ m/ I8 R) H% z5 @

$ n4 m" A( l3 y
# q% {# \8 A) ]& a9 M' _
7 T3 x2 \% T' G; X" F& d) Q& f; i: a  N$ P$ z/ L" o' ~6 a, L: }( _2 v

$ h3 j/ f+ ]+ Q  \+ z3 E5 }: o5 Y. C1 I1 z8 g; O! U

& _' g+ g* I' a" T# o) l9 A% C
: q. b9 M- x/ K, J
" s( Z! n/ T9 V; r- \2 Z8 L" L3 @: _* U5 ~: T

; _+ i2 p8 L$ a  h3 q. F
4 W: E" \; a& f- c' n2 q+ Q. U- s* a' I/ ~
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04, E3 M$ f" k* Z! v6 `* y. {
Для управления сложными взаимодействиями, такими как  ...

* @5 A3 H& @+ h7 W% u) b- o* E" PОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21) j4 ?0 U/ k, O. A
Отличный подход! Использование шаблона "Состояние" де ...
9 Z  }+ b' i2 K, \* `: n
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. v6 j: S/ }. }# ^/ K+ d* w

: ]4 F3 _( r9 Y2 eШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.: ]* q  w) s" z0 Y4 O' w- Y
% y" `- i) I5 C+ f1 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor( v$ E+ ~  Y$ b* K. E8 B6 b# L' |
  2. package org.l2jmobius.gameserver.model.actor;
    - ^; ~# s8 o! u
  3. . M( p( _2 g1 x* I5 F9 I1 f) Q
  4. // Перечисление для типов атак% H9 y, @5 k% d4 r
  5. public enum AttackType {
    ) {) j! \8 q- Z( ?" ^1 F; G
  6.     PHYSICAL, MAGICAL;
    7 H3 Z; Z+ u  x* q9 Y9 X) h
  7. }
    $ z: q' w' w4 R( H
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
2 B/ q. R9 _+ E$ F. JОбновленный класс для агрессивного состояния монстра:
0 \6 o: |7 U% B  e2 w9 j- c( K* t3 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # S( m7 ~1 h5 t1 q
  2. package org.l2jmobius.gameserver.model.actor.state;: h/ m; M) H# `
  3. , V0 C. e+ F# j4 t1 e: I; F1 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 W' |6 q; l! p( O
  5. import org.l2jmobius.gameserver.model.actor.AttackType;) v9 V8 F9 \! K7 t. @4 ]" R, d3 l

  6. 0 @2 [% ]: P. I2 c) O' I
  7. import java.util.Random;9 M; Z# P( M( n
  8. # `" ~) ^: ~- y/ L- d
  9. public class AggressiveState implements MonsterState {) X, y5 l2 d8 D3 L% r
  10.     private Random random = new Random();& _- _# K1 G, Z! ?) [/ e

  11. ; ^: s* p2 {' [
  12.     @Override2 t4 j+ W' W& R- O4 K& {+ S
  13.     public void handleState(Monster monster) {4 t) J& t. Y# `
  14.         // Выбираем случайный тип атаки: физическая или магическая
    8 V" o) [. t4 h5 k4 f# o0 o
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    5 v  u# u) a1 a" K; l

  16. 9 p4 C* P) _( c) I( E. v
  17.         // Логика для агрессивной фазы боя
    & g6 E; r: l3 U" n. s0 f; ?* A
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " + |  q7 E" b' \
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    : j. q0 y0 C" W) u  {) l% s% w
  20.         6 [' u0 B9 j4 D( i! Y3 _6 T
  21.         // Увеличиваем силу атаки в зависимости от типа атаки. w+ k/ f* ^* A( r
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    2 G* R( a& v. G6 k. E
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    / P3 K* O$ i$ a0 }- O, L
  24.     }: p2 V$ t% l4 y6 c
  25. }3 w1 \/ c+ Q) t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
; l; Q( S4 ?2 u7 s1 T- t& ^0 `; p+ }
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ; L) w& R# p* y, g( L1 s3 t
  2. package org.l2jmobius.gameserver.model.actor;  C7 e6 b9 U+ c( w8 |4 o+ [% S

  3. ! x* f, C( L- f* t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    * F" x2 k+ z$ W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    / |- `5 ?4 H  t/ b4 B
  6. + B5 @0 p! M2 `' E7 b/ F$ L- n; L  a
  7. public class Monster extends Creature {( F4 S0 ~( L9 ?" K  X
  8.     private String name;/ V1 F  c" J" I6 t" _! W0 `7 O
  9.     private double attackPower;
    " D" \6 |' h# U& }2 b8 N# x* D! p1 K
  10.     private MonsterState state; // Текущее состояние монстра
    ' P* A0 N' h% U- f
  11. 6 i- f$ E. y& E6 B) q( G9 G3 P
  12.     // Конструктор монстра8 E: y0 k( I* H  f
  13.     public Monster(String name, double attackPower) {* s7 T# F. K$ Z  D5 P! u7 y
  14.         this.name = name;5 q% b5 n5 z4 N, @9 w3 r
  15.         this.attackPower = attackPower;; @+ v+ i1 l& ?/ o0 i7 O9 G/ b: j
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию9 {- p. G) i; k) E, e. z, W- y1 ^
  17.     }
    - M. M( w* d5 X0 r) R& B9 V3 X2 U
  18. & a- r( {& d# I1 w4 S
  19.     // Метод для смены состояния
    * L- d" d# m5 g" n+ _' _/ \
  20.     public void setState(MonsterState newState) {
    ! y3 j5 P0 ]1 L1 a6 t% C
  21.         this.state = newState;
    9 p2 ~: z/ z! c9 s( A2 A
  22.     }
    : T4 k/ S  N3 |$ K, M
  23. , V! L9 b: L% q8 |
  24.     // Выполнение действий на основе текущего состояния
    1 P3 u" X5 I5 `. e! t+ A: x
  25.     public void executeState() {7 i8 u' ?' w7 y
  26.         state.handleState(this);6 z3 Y+ H! x! m! A
  27.     }
    1 ]# {/ ?4 {* S) f/ F$ T+ d( q

  28. # m) R# S! {# X& H% Y' S* O
  29.     // Геттеры и сеттеры
    - N3 Y; F7 i+ x5 H! P  X
  30.     public String getName() {
    3 ?6 F4 l. B/ I: W
  31.         return name;" G' w5 x+ T- Z+ e7 V5 k
  32.     }% ?' g1 ^4 G: D* [# N! P* g
  33. 4 \5 v% q# f; m5 c; e1 {
  34.     public double getAttackPower() {
    $ X. a( O9 m8 C6 m
  35.         return attackPower;
    * U0 J: K" g8 c
  36.     }
    # B$ I: Z+ ]5 o# c

  37. 7 T# W) b" ?. b- }. ]6 Y# {0 K, Y1 `
  38.     public void setAttackPower(double attackPower) {; Z! Q/ [- W' \: e, d5 y" X3 o
  39.         this.attackPower = attackPower;) }' C9 X) ?3 K
  40.     }0 O* p: S$ z. T& `3 _/ |- X9 s& L
  41. }, O% G5 g( ^2 }1 P+ T3 r
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.0 k2 S, ~# A' F* X6 z1 o

; w! f6 P+ W& n* P
  1. // Пакет org.l2jmobius.gameserver.model.battle
    & h( Q6 S$ e. C: w% @# n
  2. package org.l2jmobius.gameserver.model.battle;
    : J$ s8 j; }; I; z
  3. ( K2 e. ?: Q9 [: }1 c
  4. import org.l2jmobius.gameserver.model.actor.Monster;* Y- I) p" s( h: z# d3 ]9 T3 Z
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; N4 v8 M  x! Z; }2 d( n; Y: ^/ u( b
  6. : {7 B% y2 Z% n1 f+ N0 F# z. m
  7. public class BattleSimulation {5 F3 L( \3 F2 E9 h+ p" ~2 I
  8.     public static void main(String[] args) {3 k8 w% e$ s+ |& s
  9.         // Создаем монстра7 w% n; n' {5 S& y: }
  10.         Monster monster = new Monster("Дракон", 100);, G( e+ @0 B. ^1 c& l

  11. $ w; T& C4 S' `2 f( l- N
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    " h, T4 B8 E. y( \5 g7 K# O) I
  13.         monster.setState(new AggressiveState());
    ; `# R. k' b. |+ Z# ?
  14.         monster.executeState();9 N2 F3 X7 U/ S; |8 H3 z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 u9 ]& e: k$ v: M
  16.     }
    % i$ b# W3 ]  |! f
  17. }/ \' ?* l3 j- N+ p
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
& F( Y/ _5 m- Y/ sЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
, ]% D5 O/ F9 a3 g! x6 V+ [+ q' t" ]2 y" A0 E7 f
3 S+ r" f. e- E) i

9 N1 p* \' ^/ s$ I- }9 ]$ J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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