Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!) P7 ~, Y" H6 }/ v- I
2 [! T) m$ M" }% r: a

( [0 m. v! D! K$ @7 z& Z  xЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.7 ~! d' `7 i) O7 b" z( f+ \
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
3 F- g4 ^, Q( f7 AАстралия 🌟
8 Z5 _8 `7 X% s, p2 v! K. o: i5 I: `  w; v

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
* }! C7 a, s1 q% `8 KВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
* I$ @2 \, T! g* F1 Q8 i$ p, X7 ~' E, b
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 ' }' o9 y7 z  T
AlexCoder опубликовал в 2024-10-16 18:31
' m; Y3 Y4 h* Y% ^% n5 lДень добрый!
% m* f% L+ l$ S! {1 b# _( LВ статье описано взаимодействие игрока с N ...
$ ^, v( a2 W3 a" u. ~# ^) R
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   `' D/ N1 c! U& j& U# y
# u* j) l7 j9 F1 v- Q" ^9 T8 O
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.0 H. b8 B! e9 @! `  d; i) D# P8 v
: o1 \8 V! e. l0 A2 `
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
  z5 I6 D8 L% c- Y. U" o5 f. ~5 h! p# ]( p& `. n
  1. <font color="Green">// Пакет для состояний монстра</font>3 b1 e: G0 t6 N! }) C& I
  2. package org.l2jmobius.gameserver.model.actor.state;) f" P" L- q' q, R. z
  3. <font color="Green">
    1 Q7 r, t/ |. u* _
  4. // Интерфейс, представляющий состояния монстра</font>8 h* [$ o+ r) q1 v, V1 T  G
  5. public interface MonsterState {% _4 c# B6 q5 B: ]
  6.     void handleState(Monster monster);
    7 L$ u: G! x# [. X! \- {
  7. }* F: a3 R5 m1 v4 P+ D& Q- \% ?
Скопировать код

3 q/ u$ `) O" X$ t# R. KШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 X) x) @' j: E% Q& x; t. e# B1 l2 x
' m/ _. n+ m: ]Класс для начального состояния монстра:5 B$ z: @  C5 p
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>& u- W$ q( y# ~$ M3 a6 |2 {0 I
  2. package org.l2jmobius.gameserver.model.actor.state;  @$ A( y0 j! Z& T7 p

  3. ( c. n1 {3 B6 [9 t
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ {! p) Z* k6 L" T: Y# [6 @9 c' d1 F

  5. $ j& N  M' N+ ?6 [4 w" f3 G
  6. public class InitialState implements MonsterState {( }2 D' |+ }; T8 Y9 X
  7.     @Override
    8 A0 r+ Z9 t% I, S
  8.     public void handleState(Monster monster) {/ _& H( c. T5 z/ y3 n2 R6 k, H. D
  9.         // Начальная фаза боя
      U) g5 K0 [7 ^1 o
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    * K5 T. l/ ^! M/ E: |+ @8 o' A
  11.     }- H3 g4 K2 U, ^9 c7 k
  12. }) k1 [7 O; n5 e4 h, q/ A$ c1 ^
Скопировать код
1 }2 z: j! t- Q  O1 k" q

( L% E) G" g* X) z+ W- {9 _6 Q$ E0 J! Z9 N  k6 \' O

6 c. i! W( x1 E5 u
  o4 q- v! Y4 y3 D* ?4 R1 g
: n' D) n. t1 v1 N" \
4 R; G- \* W& r3 Z
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( k6 T4 ?1 l5 u. y- D, {3 l) b1 D' M
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 i+ Y: ?; M" }2 J

$ E8 k1 ^$ i9 l% R" m4 sШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* j1 n7 C# Y- x* Z" G# s; y6 ~
2 S7 ~  [' i) W# u( Y3 a: V$ D: D
  1. // Пакет для состояний монстра
    ; F. t3 [1 |% W8 q) u4 g
  2. package org.l2jmobius.gameserver.model.actor.state;, t* D9 e% E2 [0 A1 D
  3.   H8 L( x1 ?  E: q
  4. // Интерфейс, представляющий состояния монстра
    3 P9 T; M1 V: Z4 I; [/ Y$ n
  5. public interface MonsterState {6 s( u9 q6 O. s+ W; i& M
  6.     void handleState(Monster monster);; F% t" y0 P2 U: U: ?9 L
  7. }- n+ S; j; K5 i; G
Скопировать код
% q# x: z# }0 {9 r5 R4 n5 E
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + f+ Q7 W* ~4 C! ~1 P1 Y
3 S: Z4 E: H. n, P0 i# I# D1 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ d$ `( _' N& p3 q2 A& y9 K2 `7 q. ?& _5 B/ \
Класс для начального состояния монстра:
* i' j' \5 ~* `' s5 J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . f- P& I! I) L* `3 W. }
  2. package org.l2jmobius.gameserver.model.actor.state;
    & u* T$ A: C) y/ E" q% O
  3. 9 ^- `7 K* _. Z) V
  4. import org.l2jmobius.gameserver.model.actor.Monster;  T1 _2 t# F  s5 d% d. {% m
  5. 4 k1 ^3 S% ]# x$ @, D
  6. public class InitialState implements MonsterState {. }2 C3 n% f( E, d1 z7 i
  7.     @Override! }  j$ B0 A$ u( ^, N$ e- T
  8.     public void handleState(Monster monster) {
    , m! _/ Z8 m" n! m
  9.         // Начальная фаза боя
    ) S% M7 |+ z6 Z/ W6 ^+ ~5 {/ O
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");; K1 g( }4 I2 ]7 S
  11.     }
    + ~! V5 N  Q) i8 u; n6 ?1 E
  12. }; L( L2 z: k$ {
Скопировать код
Класс для агрессивного состояния монстра:
4 n  }9 ?+ ?; B1 Q& B: o2 n
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + x9 E. `1 ~/ o% q4 l
  2. package org.l2jmobius.gameserver.model.actor.state;- v: n: z3 F( @) k8 I& m

  3. : H6 h, |: K& S+ Y" F3 N, R) @
  4. import org.l2jmobius.gameserver.model.actor.Monster;2 G, h  A' A" ?! F

  5. . X/ _9 K" Q. h' F6 f* ?1 |& n
  6. public class AggressiveState implements MonsterState {' H9 p9 x: [, v0 b* L2 Q) s
  7.     @Override
    + y  ^7 X$ b& M- i& c5 s9 a9 ]
  8.     public void handleState(Monster monster) {
    % u, O8 I4 `( C( h* X0 ]
  9.         // Агрессивная фаза боя- G: F5 D6 D, N) R1 K# L
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 n1 P) _) A5 U& Z& C
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    2 O, p# S  M5 H3 `- b  A8 ^9 W
  12.     }
    % z* h' O8 }9 o9 u
  13. }0 g# |! x1 q+ u9 B9 v
Скопировать код
Класс для финального состояния монстра:0 Q/ Q( E- X( T$ S' Y1 V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " {) |  b0 D. p7 Y3 P9 g( e
  2. package org.l2jmobius.gameserver.model.actor.state;' s2 F6 k! ^* _+ G

  3. + L. `. D( x4 H. C# {5 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      W( f7 N/ @0 `7 F; q0 S

  5. 1 ~9 H$ @1 _0 b7 X* ^, w
  6. public class FinalState implements MonsterState {# L' P3 z$ E" Y8 b% A/ r* U. _
  7.     @Override
    2 v; m, O. C) k) Q3 ?
  8.     public void handleState(Monster monster) {
    4 `+ K8 M( `) Z/ q
  9.         // Финальная фаза боя
    4 J- g2 X& G0 q  i
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    8 f" h* t1 b# v, v- @2 P
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 [2 p! T( q% P8 w- x* G4 D
  12.     }! v" |, }8 r- I5 \4 l- \0 O
  13. }
    7 T* U/ F& |+ y% j6 c+ ~) N
Скопировать код

" h- `$ S  U2 \( ]$ g% G- O: S( |/ cШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ M7 h9 s' q* Y0 ~" H  S/ K
  1. // Пакет org.l2jmobius.gameserver.model.actor5 P. f7 ]# O* l: Z% K3 Y5 N
  2. package org.l2jmobius.gameserver.model.actor;
    ( F9 Y2 {% i. u/ M. m# X
  3. . E9 a1 H) H, Q" m' z+ N
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % M, ~1 b2 Y8 T) z& `8 X" C! }
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % z; m8 ]( x, \( s9 m- V
  6. 8 p6 e/ b+ V+ z# c
  7. public class Monster extends Creature {$ G7 l5 Q: e0 y6 f" V
  8.     private String name;
    + B% ?$ ^  q+ }
  9.     private double attackPower;
    $ n4 X% W# ^3 G/ H2 B, p
  10.     private MonsterState state; // Текущее состояние монстра- p! y. r+ g0 U
  11. 4 S, \2 X! t+ I' l% K/ a' }
  12.     // Конструктор монстра7 r6 C2 N) x/ ?$ u- L+ X' w
  13.     public Monster(String name, double attackPower) {
    9 R. o# Z8 E0 i- D  {+ R8 N) W& ]
  14.         this.name = name;
    % d- o/ @4 h! V$ H9 h  r
  15.         this.attackPower = attackPower;
    8 n8 h) m9 R: w% [8 a" g
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    8 G. f- F0 [" ?, d' [# f
  17.     }* y! K! ]- [# o
  18. $ k( _, I; p+ ?/ D2 N
  19.     // Метод для смены состояния/ h7 T& S& Q2 D& A6 D
  20.     public void setState(MonsterState newState) {! ^( d4 [( y) ~% ?/ t3 B8 l
  21.         this.state = newState;
    ! [% E! P* d0 Z4 o  s9 |1 d8 }
  22.     }' j# V; s  S. B# o
  23. + r+ l9 x& X6 M4 L, v2 g! V$ }6 l
  24.     // Выполнение действий на основе текущего состояния
    0 Z3 U+ B1 Q6 w
  25.     public void executeState() {+ E3 I5 X; M& h. i- q' L
  26.         state.handleState(this);3 Q1 ?" I+ C  M0 e( G* K  X
  27.     }# U" h" h3 A% y2 k: e
  28. " D! d) x; Z8 v0 ^: }2 b+ H6 b& O
  29.     // Геттеры и сеттеры+ s! X1 R( y& l. C) @" p3 m
  30.     public String getName() {
    ' b- ]/ S3 I- K
  31.         return name;
    . S; O0 G. x- b$ y6 V) V6 d
  32.     }# t: d& V8 z3 A% ?/ }! K; x
  33. 2 }5 Z6 a! d4 y, _/ [5 }' w' r
  34.     public double getAttackPower() {
    - i* o* a0 Y1 n6 N
  35.         return attackPower;
    + M  F6 [% R2 v
  36.     }1 X: ?) X. U+ g; Y1 i

  37. - c. x4 `3 P/ F% j! W& i; @. e
  38.     public void setAttackPower(double attackPower) {7 x( i" q- x7 Y
  39.         this.attackPower = attackPower;& L2 r" P7 n) }
  40.     }
    % E9 x3 t$ l! r$ A
  41. }+ Y0 o. W$ ~6 o# X
Скопировать код

& \: `0 t' L8 {4 g: gШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." t( q: U. ?9 y, ?( F6 p

  U) |/ J. Z9 p3 `+ H7 t9 j1 P! F
  1. // Пакет org.l2jmobius.gameserver.model.battle4 ]7 j  x, B; t  a9 H
  2. package org.l2jmobius.gameserver.model.battle;- P  m8 t1 T) S: _, d

  3. . k" o" u% j3 m% X
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 @8 b+ S5 R( L4 _+ u
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- U' P; Z6 \) S, \' J
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;" C! K! q3 Y' n8 K/ K6 Y* ~

  7. 3 I) e, a8 a  I- m  C" l" T5 g
  8. public class BattleSimulation {
    9 S7 |  n4 ?8 @: {
  9.     public static void main(String[] args) {1 R' s8 W9 t$ H3 i2 M7 Q
  10.         // Создаем монстра с начальной атакой# E( t. Y/ `: v( _$ M+ k$ w
  11.         Monster monster = new Monster("Дракон", 100);! C2 B; ~' C) W! i$ b- [

  12. 1 G, Z+ t. `3 L
  13.         // Начальная фаза
    . u. [5 h( Y  y
  14.         monster.executeState();
      M. p4 z+ x! a" }5 Z# I
  15. ' D+ j+ Y- Y6 K$ J
  16.         // Переход в агрессивную фазу2 B" ^1 S7 r( |
  17.         monster.setState(new AggressiveState());" O6 |) R5 _. Z0 t$ C
  18.         monster.executeState();( p, L' p/ S/ K
  19. 0 z- Z( M$ g$ d
  20.         // Финальная фаза( R# r1 \1 ]; n
  21.         monster.setState(new FinalState());
    5 [& V' |8 r# [) l
  22.         monster.executeState();" l2 i/ {% h3 }/ ]; y
  23.     }- w1 v$ c5 O* g+ p. F7 \
  24. }5 N- m; w7 _/ V9 g' z
Скопировать код

( g8 f" F$ D/ f4 h! CКомментарии по структуре пакетов и классов:9 \8 F0 h9 {8 K- y$ \+ {( K! d
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: K- S# j* m- P! s2 c* d: N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." D1 _' |0 O6 b7 V
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!1 F% v8 y3 @0 r' u; t; |  S$ L

; x" `. j) {7 X% h. C% D- E0 ^+ A& i. V. k8 `
7 v% O; E3 Q# L, S7 [  L) K

8 Q+ Q2 _. |& T' c, w! y  B# T1 ?; E' U7 g! l9 Z# g

4 }5 i6 I! Q& f( t) e0 H  y) T+ Q, b1 k' H' t
( ]" k9 _( ^8 _' u" n3 L6 l( N

0 B4 Y$ O* Y' y0 s* Z8 y. i% ^* _( W0 M4 o1 m( g

- V9 |* U; h8 B3 k" N8 Z, ]* s' c' L; C" f2 c& l) {3 i5 c* b/ s
9 V9 j) b9 S$ ?. p

; T1 u+ V' H  a
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04+ S8 q% o6 d9 P7 F* R
Для управления сложными взаимодействиями, такими как  ...
7 I" n7 x$ v* J; c8 l# T4 [! G
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
; B) t' J: S5 H" \# bОтличный подход! Использование шаблона "Состояние" де ...
0 n1 t% C1 P" _4 f, O' T4 g
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
  [$ F) a; E. f% Y& d, l9 [6 s* i, q0 {# R2 E( `- X* e
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
7 R) z- X0 J% w8 e$ W: w; ^( F) h# Z' o2 w$ F7 r. A2 [
  1. // Пакет org.l2jmobius.gameserver.model.actor* r0 N& K/ o8 y1 p- m8 z# S3 @+ D
  2. package org.l2jmobius.gameserver.model.actor;& D& o7 p2 Q) q6 @

  3. ( d3 W" Z0 k3 @+ G7 [- c
  4. // Перечисление для типов атак
    3 X- u# M) t8 p" |6 ~9 M! [- S
  5. public enum AttackType {$ E; o3 b5 A4 J
  6.     PHYSICAL, MAGICAL;
    4 c5 g# w5 N" G9 j4 _
  7. }
    2 p8 z+ o% d# h3 e" k, U% y
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
# W- \% p0 I' e6 g7 M6 K% ZОбновленный класс для агрессивного состояния монстра:6 \/ Q8 i' G# r8 P% @

; B6 G2 {8 L' s+ k7 ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( R" a! C/ R6 f
  2. package org.l2jmobius.gameserver.model.actor.state;9 s6 {4 X6 P' z! u3 b

  3. 5 `, |) ?  h! Y# ~' N0 ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) ]: o- ?1 n6 y2 F: Z" v
  5. import org.l2jmobius.gameserver.model.actor.AttackType;! d# N: S: i- ?1 p% }& h: h6 ]) M% q
  6. & ^' |7 a% N+ t8 U8 l& G8 ?' f" a
  7. import java.util.Random;
    : O  V: P# J) |7 K7 I5 \5 M: [  q
  8. 1 C7 F( b2 ]4 L$ d5 w7 K: k
  9. public class AggressiveState implements MonsterState {2 p8 k$ b3 }9 M' B: k$ ]
  10.     private Random random = new Random();+ ?( S8 X3 v5 Q+ N4 M: z
  11. 7 D% \- V( R. d( U1 N8 K: F
  12.     @Override
    2 B4 W# K8 Y, x0 T" Z, U
  13.     public void handleState(Monster monster) {
    ! F' |5 V! l/ H2 \! d9 j
  14.         // Выбираем случайный тип атаки: физическая или магическая# u8 Y3 W- y9 E1 c) i8 V* U" L% @- z
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;! Y3 K7 {8 p2 o2 E3 i
  16. 0 p, N  _% w. K: Z/ y
  17.         // Логика для агрессивной фазы боя
    1 e$ u0 p  D4 j. n/ O
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 7 S; m' U( ], `; H0 R: }, u$ B7 R
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( @: D! l. u1 O5 M# Y
  20.         
    4 s* h1 P* t3 b* v% |" K
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    + D  `) j2 w6 Q4 m( u/ D
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* ~& Y0 u$ E0 ]0 B* _$ y
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 N& O( D5 @3 G: g0 V* e& A- q
  24.     }1 G  M3 @$ T7 D- o
  25. }
    ! W( J* f! G6 ^* V
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
  ~6 U2 H; z  m! B. @! o/ K) i
. r. m, R% J& b- m# f) ~' U9 b
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ g: A* k- N7 D7 \. r
  2. package org.l2jmobius.gameserver.model.actor;6 A( b; W5 l: O# \2 [5 S: _

  3. : q' c; B) p# I6 W
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;* r5 d4 ]. A6 X$ f
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    9 p: G/ E  R# C0 l
  6. ' c' y4 z* I% v+ M" Z7 s5 w# Z( U
  7. public class Monster extends Creature {
    ' D! N7 Y. w/ T% ~# T! c* V
  8.     private String name;
    ) E( L1 J/ i/ J2 z
  9.     private double attackPower;
    , ^7 u& V( M0 r
  10.     private MonsterState state; // Текущее состояние монстра, \+ @, @( V* u* ]8 i" m7 g- G
  11. 4 D6 r8 o; {, \+ d% E2 _8 \
  12.     // Конструктор монстра
    # K2 c2 D* R& y7 F- o8 |7 `- C( m
  13.     public Monster(String name, double attackPower) {' z: m7 `/ I  W3 {1 H# h! E
  14.         this.name = name;6 ]1 @# [; }/ f3 N* G: m5 u3 U
  15.         this.attackPower = attackPower;
      |# J' k/ X' C
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
      {! }9 o9 v( V5 L% r* d; a; b
  17.     }
      v9 ?6 f' j: g: M# e' q
  18. 4 Q/ n. o$ _' Z5 y# k1 w
  19.     // Метод для смены состояния% Q- O4 {% J  R5 U; w% U
  20.     public void setState(MonsterState newState) {; d8 ^9 ]9 M: j5 m+ y/ B, x
  21.         this.state = newState;4 H# y* f! Y% s( C  g: T3 h
  22.     }7 Z2 J% A7 Q5 z% H! d  w
  23. 8 q( ]& C  D# S
  24.     // Выполнение действий на основе текущего состояния) c0 I8 K9 L  t3 k
  25.     public void executeState() {, H  r: q  O. P1 U. \) @
  26.         state.handleState(this);
    & I, Q7 O9 }$ }4 Y
  27.     }, O  @" X2 E- V# x) l

  28. $ }. I! a3 J- Y& n* F1 Q) n
  29.     // Геттеры и сеттеры
    9 n+ ]  T! f( N1 x+ a8 X7 e
  30.     public String getName() {4 I8 n6 H+ T" x( r- p
  31.         return name;
    0 W6 y8 h- X* w! ~7 z+ A
  32.     }
    5 X% O# A& w4 Y0 W/ V

  33. 5 Y5 n* u2 X. r/ p' X! o9 v  `
  34.     public double getAttackPower() {
    . P" c- r5 a5 s
  35.         return attackPower;
    & J" x" A$ T2 j
  36.     }) p4 ~6 K  ?; }5 k
  37. 5 G  L3 C! Q6 U$ U. |1 `: B
  38.     public void setAttackPower(double attackPower) {" L3 O9 Y; S4 i1 h' v* F0 h  q; h
  39.         this.attackPower = attackPower;
    9 m# d* m- ^3 r! w% p  Z
  40.     }8 Y. k6 F/ V: B: y# T
  41. }
    " c6 x( W# J5 s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
' a  j4 K  ~4 t% P3 ~/ F& `, V% v8 l: H: a5 g) C; V" F$ Y: o
  1. // Пакет org.l2jmobius.gameserver.model.battle
    , \6 x8 `/ g, N# I1 y, B: ^
  2. package org.l2jmobius.gameserver.model.battle;
    " n  T$ W: p" t( u6 M
  3. 4 B7 e5 i4 D2 P9 I9 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / y9 c  W- [, {0 }6 F
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    * R6 b" \% D  V" P  ~

  6. & R3 S* K9 `  ]
  7. public class BattleSimulation {6 i: w) L" W% r) X
  8.     public static void main(String[] args) {' O# K  t% I; h6 f2 ^* B& C. \* u) J
  9.         // Создаем монстра
    " O/ n- K" Q* F3 m5 d2 O$ M* H5 c
  10.         Monster monster = new Monster("Дракон", 100);
      q: T$ r  k8 T$ x, o5 R4 z
  11. . C2 k/ L, Z- ^8 K* f3 u
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак0 L$ F& }$ K# P
  13.         monster.setState(new AggressiveState());
    8 _& i' G0 R% F0 M5 Y4 S0 @
  14.         monster.executeState();
    & Z/ c. h1 Z* g) M! r
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 D8 l: I% I3 _1 I) q
  16.     }
    + m, i( K2 O, T& s& e4 a4 _' Z; O: H6 x5 j
  17. }
    % z0 p+ }+ |# S
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
/ \% F* v, H: _/ w- aЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
% Z$ x  v2 V; t9 T" n* L; S8 r8 R
2 O  H1 I! |6 T9 s* s  z& |- Z. Y  k/ F, l( T$ ?" o& c- ^. A

; {, D9 W1 ?! O' u) a
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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