Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!( R) E. @2 b3 E4 X
; R6 T/ y' T6 X  c7 A

& X2 ^5 k1 E2 t; J# \- W$ w) X4 `Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.9 Y/ `3 I: L$ ~  W; I
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
  H. ]; P& X9 U- P% ~3 M3 P& iАстралия ?
. `4 s8 S; y1 V$ c" S$ F8 h" h! b

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!, w& {) t3 w5 r
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
, g2 U. A- p1 p# \( s1 v9 F
' D0 q: C8 V+ P3 x6 Z, q
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 5 k1 X! w4 W0 i3 f* O4 @, y4 c
AlexCoder опубликовал в 2024-10-16 18:31) V3 r: y; \6 U( d6 {
День добрый!# H5 C) A: ^7 U  E, S/ o7 J+ @( {
В статье описано взаимодействие игрока с N ...

- d& i0 z" ~, W: ~+ SДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). , O6 _" Z; U1 a+ b* V" b
# W( K& ?3 `9 H
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# [' S5 l9 D, q. b2 l4 I& l
" ~6 p9 s$ m" k1 I% n' ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния./ Q  A; P; X# Y8 ~+ F, z! M4 Z2 I- Z
9 V! I0 v1 H7 E: N  W8 t  v
  1. <font color="Green">// Пакет для состояний монстра</font>% ^0 D% p- h+ s6 Z  u; {0 }3 Z% n2 K
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 }1 y, h" z# P! `! u
  3. <font color="Green">
    & b7 l7 M+ l6 o8 a6 S
  4. // Интерфейс, представляющий состояния монстра</font>/ h/ _: q: h9 m$ o' }* [) {) W
  5. public interface MonsterState {
    3 v# ]: `; E& S1 m+ S* }
  6.     void handleState(Monster monster);  k' m; k  f4 d
  7. }
    * Q+ o" W3 [0 p+ c9 U
Скопировать код
  s9 V4 q% [! r& X( _% G0 u+ b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
. F' p  F. Z4 S& u) _
  ^. ]( ?8 c! L2 L( ^9 _5 N6 VКласс для начального состояния монстра:
/ T+ {+ U- w- T6 `5 n, {* v! T* N) ^) T
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    / S: ]- L/ ~6 g( H
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; j* y8 T6 N% X1 s+ K! ]

  3. , U! D# }  ], J* K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - m9 O. v. i9 h: V+ {. t: t

  5. 0 y8 m7 B; i1 n
  6. public class InitialState implements MonsterState {
    / |/ b: f' n& ?7 A+ t; x
  7.     @Override3 v  z# x, q0 o/ ]
  8.     public void handleState(Monster monster) {
    0 t! L, g) Z  p; j
  9.         // Начальная фаза боя
    ' N% P7 |: q3 Z) Y! N
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");% J0 ?# H8 o0 f1 {
  11.     }8 E' H# E' C: @* N4 L* g" X% W" E
  12. }
    6 W! j2 k7 T! k! @
Скопировать код
: P: c( l. r  P7 T
2 k! {5 O& B& L  r1 D- s

! U0 f/ O8 p* q6 O! i/ [4 @9 Z/ S% b0 n3 T
. F  o: r8 {, Q) F4 K

1 l% ?& }4 j) c, ]
0 y5 O! `1 {# l5 r, s2 L
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
# P8 {& s) ?, Z  s2 ]
  O+ g8 {+ V+ ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 J  y  Q% a* ?0 R: F: q

5 ]( C# @- @, Q( k( |" G9 C( GШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 h, j& F" Q4 p) R1 u& j

# O! N2 u" `, i$ ~6 A  C- Z
  1. // Пакет для состояний монстра. }$ l6 z" ^& ], I
  2. package org.l2jmobius.gameserver.model.actor.state;
    + U7 A3 e7 z  J
  3. / V; F) c0 Y& l9 z0 x6 C% a% s
  4. // Интерфейс, представляющий состояния монстра
    ) A0 u' g4 O, H5 [9 ^7 ]
  5. public interface MonsterState {* d% j+ Z; o" {! M
  6.     void handleState(Monster monster);
    ; L* b. p, V! Q
  7. }
    / `# O! s4 E9 C( \
Скопировать код
" M0 ?+ L* y, H; X& |0 H2 T2 o
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
; \7 u' X/ `: w2 S# \) I: @
9 ?& V2 U* ]& U4 {* m: qЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ l2 n; [3 O+ q8 O. @

" [" }4 e1 S5 g. rКласс для начального состояния монстра:
7 R, k. M6 n! B8 o2 k1 j8 d
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ m+ X! G( j! b$ r
  2. package org.l2jmobius.gameserver.model.actor.state;# \; M% f( ~) f! v4 ?0 N8 a

  3. # B7 T. ^" Y" M; U! S1 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : {! d0 b& |- s
  5. 6 ~+ b7 m% [( c! Q/ q* Z
  6. public class InitialState implements MonsterState {2 U0 Q6 L5 _0 _
  7.     @Override
    $ r' V' e' c8 q0 o( C/ p
  8.     public void handleState(Monster monster) {
    9 P! z4 d7 E2 t5 Y7 S! d# X
  9.         // Начальная фаза боя
    ; U, c9 h! M1 ~! o& r$ ~, k
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");, L: A* @, c+ Q+ m
  11.     }
    % ~3 P/ e3 C! F$ r! n) u
  12. }2 j  }6 C8 G, ?+ j" V+ ~% s7 {+ P
Скопировать код
Класс для агрессивного состояния монстра:
' J% c6 }+ c! C# l$ t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : o4 d/ C- P8 S  v5 o
  2. package org.l2jmobius.gameserver.model.actor.state;
    - `- o( b$ N5 z" i

  3. + h, L' g9 u3 C% e& ?& N
  4. import org.l2jmobius.gameserver.model.actor.Monster;  I7 [3 O& K" j% @5 r. Q* z" p8 f

  5. 5 x( T+ J7 G# R5 g5 N' J
  6. public class AggressiveState implements MonsterState {
    ' I& P5 y! a" \' s; q  ]- e
  7.     @Override
    0 K+ A0 u# t% ~6 v
  8.     public void handleState(Monster monster) {
    $ p4 e$ q8 ~/ j# H& h3 |0 C9 {
  9.         // Агрессивная фаза боя* n: j& }$ b+ \' _
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");  [( k! c6 i) v' M
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' u0 i$ _1 ?% d3 i4 }" T! Q
  12.     }/ A! P. j% Z: \8 d6 x! l" n4 E% B" h
  13. }% B- F; r1 k$ c: \  q9 }; d4 _
Скопировать код
Класс для финального состояния монстра:
( o3 o+ z' q" ~* p3 T5 Z- U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 m+ A8 C, ?. f( {0 ]) [2 N
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ y6 h" ~% M  X* i  J4 _

  3.   K- F! H+ b+ [+ t$ H
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + G- h; t* I" j2 t; d

  5. ' V! e1 D) r& t
  6. public class FinalState implements MonsterState {
    9 q# K3 P  J2 k) w/ n
  7.     @Override. B1 t* x: r6 j+ D
  8.     public void handleState(Monster monster) {+ {/ ]7 J2 Y9 d0 [: \
  9.         // Финальная фаза боя" T; h- Q# \+ q2 T6 {
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    4 ?4 }$ {) p$ [
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! t% M9 t1 P0 s1 K' I+ n
  12.     }
    . f9 L% l$ Z( S/ E6 }1 }, O
  13. }, |0 B8 D$ ~" b2 @, l: Z" e: w
Скопировать код
' z) C0 M& j  ]& v2 I2 z" h$ n
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.- k# W4 A: `2 L# U$ B8 R
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " W* a/ P( a- i  M+ y2 K; D
  2. package org.l2jmobius.gameserver.model.actor;
    ( Y( |& N- V0 {6 o. Q
  3. ) D. X% ^' Q- r1 A& C& i1 N
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* W; o5 V$ B4 p7 D4 `8 f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;& Z4 J0 D7 y& k7 }4 S$ u& C
  6. ( v1 w( t) \! P# z7 R- N, S
  7. public class Monster extends Creature {/ p; w& O2 E" q7 g1 `
  8.     private String name;  h5 |1 V1 l$ ]
  9.     private double attackPower;
    2 e+ c$ S% v0 t0 H7 D
  10.     private MonsterState state; // Текущее состояние монстра1 `; {7 ^7 {* b7 E% v9 k* `# @' M4 S' p
  11. 2 i5 W& W- A) K( f* ^
  12.     // Конструктор монстра
    - w$ H: P+ d4 J$ X7 A0 b" t1 x
  13.     public Monster(String name, double attackPower) {$ A6 P- P$ g8 Z' m
  14.         this.name = name;9 A6 I8 q9 @( e9 u( w
  15.         this.attackPower = attackPower;( D3 B; O! L/ {: m! D; _
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    - r5 ]8 N3 c$ K' J
  17.     }# U" Z1 B5 z  D2 f3 b. y% ^0 v

  18. ' h/ u* @1 n: @/ d
  19.     // Метод для смены состояния
    & q" Y4 G* V/ y) S& W2 u9 W0 s
  20.     public void setState(MonsterState newState) {
    % q- A* g. f" `! ?: u- `3 n
  21.         this.state = newState;# Y) v+ w7 |9 M
  22.     }
    + T1 n- l+ t# Y; J( `
  23. + p" u2 t: Y3 l8 B
  24.     // Выполнение действий на основе текущего состояния
    3 h4 h  A4 Y0 ~5 ]( }0 s3 j1 S7 A8 P
  25.     public void executeState() {
    9 Q3 ^; ]4 F# N6 H/ J# b$ i
  26.         state.handleState(this);: q/ k4 g8 |3 ^; G+ H# P0 @
  27.     }
    9 A' ^& d# b. L+ w  y
  28. 2 X8 q  E- k9 u9 N
  29.     // Геттеры и сеттеры$ R/ u4 v. e7 ~  [+ @7 b) h. D( c
  30.     public String getName() {$ Y9 z# l0 C3 Z. B' D
  31.         return name;
    5 L" ~% h: `4 [8 d; Q* s
  32.     }5 L: L; m% {  @+ {( `. R( c
  33. / [" N, B4 y7 V- x) o. [  `! T/ w
  34.     public double getAttackPower() {
    ! f( X! t( m0 {4 \
  35.         return attackPower;9 }) Z9 f9 v. I4 }$ [* S# l
  36.     }
    & |$ W3 I) C5 T

  37. 3 x7 e, J. D6 {; j+ e
  38.     public void setAttackPower(double attackPower) {
    9 q; q9 [# h& L8 r5 e% s3 B
  39.         this.attackPower = attackPower;" S: [2 b, h* J& i& c# x
  40.     }5 f- H& d# B. c# U- [: X
  41. }# X% @8 n" a, ?8 M# a: B
Скопировать код

0 I& w+ m8 i6 b8 z- ?2 G. iШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. e% L5 ?% T' P" ]& a* @& g9 Z; V$ Y' n; j, l% a- o5 q
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - V$ M/ z* ]+ w  Z% x
  2. package org.l2jmobius.gameserver.model.battle;
    ) Q' M5 ?2 [& q- E
  3. 7 L: i7 c' S) Z1 [0 N" v
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 z4 y  l' d- h/ P( Z1 e6 y) Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
      n1 t' N5 M/ g
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;, P' R! V/ U7 q2 R3 E

  7. / k6 S8 C4 {1 l! C
  8. public class BattleSimulation {
    7 D- ^$ {2 n9 j2 `: d
  9.     public static void main(String[] args) {* ~: J( e9 E5 t6 ~
  10.         // Создаем монстра с начальной атакой5 C# @( R' f# g1 w! ]
  11.         Monster monster = new Monster("Дракон", 100);! f/ i% W! {# a' T+ g& d& D

  12. ! T5 x9 b. r+ r
  13.         // Начальная фаза
    / h# g8 o/ b5 ~3 o
  14.         monster.executeState();4 `( C$ N( m  m
  15. - c% v6 B. _" t& {
  16.         // Переход в агрессивную фазу
    4 e4 s' ^. z& U7 c
  17.         monster.setState(new AggressiveState());
    & x) x. n* K$ y0 k3 O
  18.         monster.executeState();
    3 C- t% t, J$ J7 w
  19. 7 _3 \! _, d7 J6 }4 E7 g5 M
  20.         // Финальная фаза
    3 C7 D) {0 O$ t# w' n' `- ^  i
  21.         monster.setState(new FinalState());$ J- [1 r4 m2 |$ z5 o9 y5 V
  22.         monster.executeState();  i- F& n5 o# G
  23.     }
    . K& _/ g, W& f
  24. }; ?4 R) ~) I) J
Скопировать код

; \3 _2 t$ }, V, qКомментарии по структуре пакетов и классов:
* y- \0 ~# \9 i& i/ F3 s0 R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    % U" c. v# P+ `& k; S) F
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код./ l. e8 D+ v: {  b( ?2 Z* D
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 W0 H9 O* |7 p. n. g

$ A- L/ f) p! N9 p" L7 D
  w  c& D! u4 P' n5 ?% `8 @5 p5 G8 f0 J% u( C

. b, E+ o- c! r, \( B2 B1 g3 j: D) w
* Q% U. n9 t3 F5 I2 R

* e. G+ d' W3 l( o$ t7 R& @: e/ @0 z4 c9 y6 \" B' j5 W" E: f

5 e, k) `1 d/ @+ U" q# B9 a
( u  {, D2 u* x
0 C% z' A& Z7 d; j/ j. n: h( v9 t  k8 L

, W3 n! c" y4 J& o& i( h  V. w' d/ Y# c& Q" j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
4 O; Z2 J( ^5 _) Q* b- EДля управления сложными взаимодействиями, такими как  ...

! ]6 R- j6 a  @, D7 D  n) X* HОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
8 D9 [; H: y4 i9 b& v+ qОтличный подход! Использование шаблона "Состояние" де ...

, [  ^+ x* f( f0 J* a! ^Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.5 ?5 ?0 Y) ^5 ]" ?( g9 ^

3 _/ X, Y; g% ^1 E, ?Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.6 D% Y9 c* o8 I8 o6 D3 N
$ m! E! V% o! T. `
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ B- g$ y$ k6 g$ b1 g: x9 P
  2. package org.l2jmobius.gameserver.model.actor;
    * P2 o- n1 U& w" w7 H

  3. 5 g: B. G0 |5 {1 r+ V& W
  4. // Перечисление для типов атак
    ( ]% D- ~. C& X# e
  5. public enum AttackType {  H* X% m/ U7 f0 _& O* _* P/ v
  6.     PHYSICAL, MAGICAL;
    ( w, z: f/ U- g' ?
  7. }
    ) W5 K$ t0 r3 x% A% [  d. L  q
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
) O" z3 n& b" |% l/ Z) x, ZОбновленный класс для агрессивного состояния монстра:) w7 r1 e+ T5 [

4 `6 u- P4 X8 k1 B
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 J* S8 U6 v# O7 h# H
  2. package org.l2jmobius.gameserver.model.actor.state;" q, v: q# M  C( i

  3. ! c1 U& b, B) r2 i; ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;! c" C3 n9 O, D+ o' Z& X
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' p2 n4 }) ~$ j8 n

  6. 6 B: ^- _1 c/ ~- P+ d
  7. import java.util.Random;
    ( U* k0 v" e8 b# ^' I
  8. 1 o* O$ ^6 W; E8 _; r5 c/ `# S2 Z
  9. public class AggressiveState implements MonsterState {
    - _5 I' f" ]0 B6 ]
  10.     private Random random = new Random();3 U8 y; m' ~( C1 U, p0 x3 Q
  11. & x5 T1 K  G( W+ `9 s- n1 p$ t
  12.     @Override( K+ U: s$ W9 t8 o8 ^
  13.     public void handleState(Monster monster) {+ G+ p6 r* J. j+ C
  14.         // Выбираем случайный тип атаки: физическая или магическая
    " i1 ~* s' U/ l5 @& v/ a' ]
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 J2 I5 y1 `$ e1 T( |0 T; B

  16. 4 ?" d! M: H, O
  17.         // Логика для агрессивной фазы боя" Q2 N7 Q* V% d  d+ ^; y
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ' r; q7 |' r' G0 x; g0 a
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");- E. n- D4 d! d) B4 u  \
  20.         # D, C1 o1 n3 h( O
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
      o* ^; J8 u7 }) Q$ _3 n( L
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;" B4 y- w; z! J+ ]
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    $ y3 y: H6 P: N0 h, t
  24.     }, a; f* D& k! e, y7 R6 x
  25. }! \4 G% U  d5 E: v' N! q, l
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
2 `$ J# W  W0 o5 G# o! g" n' B* W/ c9 u
  1. // Пакет org.l2jmobius.gameserver.model.actor  _' q3 ^7 ]: I4 h8 y* [
  2. package org.l2jmobius.gameserver.model.actor;3 p) h2 z2 v0 L- o# g/ W* [
  3. 7 `$ l+ p' `/ J' V2 e) J, k
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    " |- ~4 n: j, R- I; @$ Z( t+ O
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    $ \& z, z3 G4 N3 B; j0 p
  6. 7 T  B% C' X/ g+ ~# F; |
  7. public class Monster extends Creature {0 r+ A+ p7 t! ]3 t# ~/ ]8 ~; B
  8.     private String name;
    . U. b# M  {& ^: z. w
  9.     private double attackPower;
    ( j& u+ _& i2 I' }8 }* ^% {
  10.     private MonsterState state; // Текущее состояние монстра  ?" W: r* q: _0 s9 V

  11. + G5 y! d% g# W! p! M0 c
  12.     // Конструктор монстра7 U+ g# C5 X% e& F1 g! e
  13.     public Monster(String name, double attackPower) {& G0 Q+ e8 ?. }- O( o' P
  14.         this.name = name;
    : e4 L- t+ G* F6 g% W7 z' E! U0 K
  15.         this.attackPower = attackPower;+ C% V7 `; n2 V9 q$ a
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    $ h! F9 q  {0 e2 q7 b$ E5 I
  17.     }
    + [0 v8 k1 b3 M0 F
  18. : [8 ]& m- n3 ^: g! d4 u% P1 V' \% g5 w
  19.     // Метод для смены состояния2 {$ B: W$ b4 r4 I8 h6 v& C
  20.     public void setState(MonsterState newState) {; J) O0 g6 Z7 ]
  21.         this.state = newState;" d2 E, l: F* G$ y! p! f& L# ]$ t
  22.     }  C- }( }) Y4 I& Y' p& _6 ^

  23. 8 Y" m& H3 \5 A; p$ M/ T
  24.     // Выполнение действий на основе текущего состояния4 {! z+ v( h' K' ]/ ~) Z9 l' z0 a0 w
  25.     public void executeState() {& R7 \0 x9 b  u# I1 i4 s
  26.         state.handleState(this);
    ) w7 B' u% _. }# E) H0 \
  27.     }
    3 G4 d; `: x5 x2 G  ^0 V
  28. 8 e0 Z4 E6 V2 D3 j. s
  29.     // Геттеры и сеттеры; g" `% U" z8 L% l8 A0 r
  30.     public String getName() {, ?: G4 O- B2 B; {* c- w  X6 {
  31.         return name;( Y' D" I# G% U4 H0 l
  32.     }
    / [" w7 Q3 P" H# i; f, j
  33. ; h7 a4 C( a4 |6 h1 b
  34.     public double getAttackPower() {" }5 W0 D0 j6 Q, x
  35.         return attackPower;6 M, K+ r1 \, Q% G' q
  36.     }
    - @1 U5 f! e% M- M/ T; s" G

  37. * e) {9 O- g5 a' E$ W) D0 g- y9 r) ^
  38.     public void setAttackPower(double attackPower) {! C1 v7 D: x1 m8 P8 V9 f+ N
  39.         this.attackPower = attackPower;
      p+ t% |9 X# r& y" \" }
  40.     }8 V8 O, V5 F- |  l( S
  41. }: e6 g! Y5 \% }8 _6 g* Z! W
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
. m7 `- k$ y/ U! G% ?
0 R  Y9 y; ^1 f0 N, d
  1. // Пакет org.l2jmobius.gameserver.model.battle1 v& M/ s3 `( i% }0 \5 `  p
  2. package org.l2jmobius.gameserver.model.battle;
    + _# A" s; R# j3 U% p. Y/ p

  3. ; G) s  m3 L5 L& i
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      U' I$ O# L6 x, t9 J1 q, l0 z% i( [
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    0 B7 K  S2 Y; J: w
  6. * j9 ]  b$ q7 ^; l( i9 s6 r
  7. public class BattleSimulation {
    6 u0 k5 t# R/ j! z9 [$ T9 `
  8.     public static void main(String[] args) {3 m  v4 e! ?) Q" Q5 h7 C- [7 D
  9.         // Создаем монстра$ a( R2 O/ k+ }/ ~) y$ c4 m
  10.         Monster monster = new Monster("Дракон", 100);3 \7 p0 C; ?& x+ j+ Q1 l7 g, m; i
  11. 4 n: E7 s6 c5 ^9 o
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак; t9 X1 H, z; T9 z5 k& f* _" [
  13.         monster.setState(new AggressiveState());
    7 a! ~1 Z% \2 E' o* w4 A
  14.         monster.executeState();0 U, e7 Q9 s, @. Q# x
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    4 q% g8 E- X" d
  16.     }
    ) e2 ]+ X3 [' _+ }
  17. }- w& Z; `& Q- G! D& S4 J
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
3 a# S7 |  U  Z, K' Z" b/ H, IЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
) u8 e* F) L0 {
, w3 {, k& Z  J# u+ Q# g
# t3 W% W2 u& r
$ D; C7 C8 d( l+ u6 C+ y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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