Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!0 Q0 X( d! M/ m/ n( r9 C# w( s* n2 J
4 y; p* L% q) z! S+ I: l

9 _4 I" j# B5 ?Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.6 H0 s( E( }2 D& w* X
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!9 p8 Q+ A$ ~5 h) {% |
Астралия 🌟; s. m% _" D  W- X$ G, t( s2 v" i1 H6 f
* @. @' z4 D% p  |3 f

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
* s; b6 y6 B6 w* bВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
- ?7 S4 b' g; e1 V7 u$ P, J9 O8 h, R8 A! x6 _; ~* P" r  F
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
# G# U& J8 j7 u: W7 U* b6 Z6 h: m
AlexCoder опубликовал в 2024-10-16 18:31
0 p' C2 X% `8 p8 v9 h: pДень добрый!
3 A, G' p+ b) p* v8 v, WВ статье описано взаимодействие игрока с N ...

9 W- p# o% c2 V2 u" y5 `4 U3 DДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 L7 x0 @. s! x. K+ }: ?
' |( _* U/ P. E9 Q; P! p- A; UЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.2 C, \2 {: X: k% ]  \# }2 i6 U
3 n" B; Y& n8 j' y# E
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
/ U1 ^9 q" t7 T( g& E/ C4 C0 J
* t; p, V8 P$ o: J
  1. <font color="Green">// Пакет для состояний монстра</font>
    * \2 \" R1 |7 C: I- o7 x
  2. package org.l2jmobius.gameserver.model.actor.state;' p8 l5 k$ y- o4 s/ U+ n
  3. <font color="Green">" M: D" U7 H0 O5 F, ~
  4. // Интерфейс, представляющий состояния монстра</font>7 E8 ^! Y; U5 `3 }
  5. public interface MonsterState {
    ! [' Q( U3 n( T
  6.     void handleState(Monster monster);
    & R6 J  b6 ~) O% t+ n
  7. }
    ' Z3 i) U; Q+ ~& V  X
Скопировать код

2 F2 f$ b2 q; Q" w9 f* hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
, c& ~  }: K/ y$ \
3 [4 {9 D2 j3 }  \5 e& o9 U" CКласс для начального состояния монстра:2 z9 }8 e3 r( x) M1 J& u7 d8 s4 ^
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    $ w- o1 G! D) T  [
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 H" p. O/ Q# x0 r* X: C  u. p# |
  3. + k$ B/ a% N  _9 l* d( f
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 {% {/ @* @5 L3 v- w& G! ?% e

  5. 7 ?' i3 O: d/ Q) a' L
  6. public class InitialState implements MonsterState {( y" A% _! ]5 R3 C) e) \  B6 m
  7.     @Override: \/ z( Z! f$ ?4 H) \  N9 E) G2 i
  8.     public void handleState(Monster monster) {1 X. j2 U; m$ {0 r8 Z; h+ k
  9.         // Начальная фаза боя& i2 I; o6 Z' w* Y
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    & a. H( h4 d. ^2 k0 S
  11.     }
    , Q7 O* A; i  p8 l. L4 Z% V, }( H
  12. }2 \1 G* J% B, {9 W: @4 o
Скопировать код
# m5 t9 J" S+ u( A

7 X: ?: l$ U- J( E" e( f3 K# G" |4 _) d0 G" \
8 W  D! U' h0 }
; f; ?+ d1 k+ b- H3 A3 n
+ ^9 H' y1 a! G  E6 Q. Q$ x

+ _! P; g3 I- j3 ^" V& u- s7 s
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 y8 ~7 l5 d& D6 L9 h: z  R0 a
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" }- N5 Z( ~* f8 B" F
* I: M* v1 i, }" `* M$ ZШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 ?1 d$ t( ]+ `8 d2 l" V# I+ T" B7 i. H8 N4 ]* H
  1. // Пакет для состояний монстра
    " ~. r' L3 o7 O7 X+ R7 U1 \
  2. package org.l2jmobius.gameserver.model.actor.state;
    . O! ]4 U, c- |0 q

  3. 5 B$ \' G1 ?) M, A
  4. // Интерфейс, представляющий состояния монстра- t  F) t$ b; `8 f, b/ K0 c: k
  5. public interface MonsterState {. K3 Q3 W4 e/ G1 h6 W7 U0 i
  6.     void handleState(Monster monster);% N& y: K! R# v
  7. }
    3 r3 K4 O4 y) L
Скопировать код
# ^7 u% V6 _& T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; c0 N  x6 r0 E3 A* D
& i  b+ q. i( z% `" {# C
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% j" r; |1 i; u( M" a1 L

0 t8 j3 p2 @' G2 }5 o  `Класс для начального состояния монстра:+ \+ b) Z. }% V8 ^  E9 @
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ) s7 |) ~: E; w. d  E
  2. package org.l2jmobius.gameserver.model.actor.state;) p5 F6 h  W) h+ S, {3 l
  3. 9 W4 h7 _$ W+ N! g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' }. h, k8 X9 p& u' O( O) N

  5. ! B: r1 T. g- L6 M! J0 n# f/ K
  6. public class InitialState implements MonsterState {
      d9 ~9 Q" r  x: V; A
  7.     @Override
    ! z: i3 d2 V( _. R) G, P' R) X+ o7 T
  8.     public void handleState(Monster monster) {
    0 i) ^% O8 H. Y) p( O
  9.         // Начальная фаза боя
    ( u9 k) R" T% ]
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");9 b! V/ X0 W" x) }: v
  11.     }
    : k  @1 }& h/ W: S# n) N! x! l- G
  12. }5 U; p; u0 Y' t. n& e" u- f& R( y2 J% M
Скопировать код
Класс для агрессивного состояния монстра:7 u% T3 `1 {6 l5 O0 w& ^
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& b- ^$ n2 _( A' Q  r8 l
  2. package org.l2jmobius.gameserver.model.actor.state;9 X; e: e4 D+ G; o  L
  3. 0 z1 V/ `# y  X7 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( K6 K( `7 h* d

  5. ' S, f$ f" g: z5 S3 c
  6. public class AggressiveState implements MonsterState {: X) B6 U  Z$ N, Y  X
  7.     @Override7 q( \5 D. L$ x
  8.     public void handleState(Monster monster) {
    # M' F; q6 `1 a3 ?$ U) x+ e8 V
  9.         // Агрессивная фаза боя
      i. }4 O& u% s4 @& w/ V/ Z1 v
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
      ~/ Y6 Y2 q. ]* e9 A% b
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки+ j, r' H) y% k
  12.     }
    % s! W, y( E* C  u) F% H3 N1 u
  13. }
    # R: y( B/ h: q% b& k/ X
Скопировать код
Класс для финального состояния монстра:
% c4 i& W" x; A' B, e/ z8 v( t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state* W) D% o7 V) W* p' e5 T) t
  2. package org.l2jmobius.gameserver.model.actor.state;1 `0 g+ Z8 N( |2 B0 t9 U: I
  3. * X& i# U4 j) _+ m$ L- f/ |) e! H
  4. import org.l2jmobius.gameserver.model.actor.Monster;0 l- }5 f1 J! d5 u/ [) O! O8 ?# c
  5. 5 Z) P3 [# ^% ~3 s0 v* q
  6. public class FinalState implements MonsterState {& m1 W: A. c. s5 P" [
  7.     @Override! z6 `+ b7 a, ~% K; e8 V' R
  8.     public void handleState(Monster monster) {3 |) t. q& W+ d: J
  9.         // Финальная фаза боя
    4 D! B; }5 N8 L) s+ F
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");. F* R- I) B9 T1 P+ X5 o
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" y4 A! Z3 _# g1 t
  12.     }& Q/ ^2 `& t2 W* _
  13. }
    ( r. w5 s& l. q0 F2 _: D
Скопировать код

' M9 b. ?4 p' [3 a. gШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.) G; Q' d4 J& g( f: o8 O0 L4 |
  1. // Пакет org.l2jmobius.gameserver.model.actor, V' T/ [8 g: `; V5 L* u+ o0 u
  2. package org.l2jmobius.gameserver.model.actor;, _9 X" v5 A. J% m5 k3 v" J7 l) H

  3. . R' C: g, s8 ~9 a" f. |
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    / ]- E2 Y$ J3 U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: E6 n5 f: K2 ]5 K0 D

  6. : M% P8 c* L% H8 Z: D
  7. public class Monster extends Creature {
    $ d4 Z. ~" l7 A% @  A. R9 ^
  8.     private String name;
    7 o% ?4 n  x  y2 r, b
  9.     private double attackPower;
    3 X6 y& j; [6 s. U6 Y1 a/ b7 m
  10.     private MonsterState state; // Текущее состояние монстра
    5 O8 `; p7 a' }/ @
  11. 3 p  S' }% q$ P4 r" d5 j+ K
  12.     // Конструктор монстра
    % t' B) {" G, i  Q1 d
  13.     public Monster(String name, double attackPower) {2 H. G3 F; b$ x% h& \' \# V; y3 }
  14.         this.name = name;1 m) W4 g+ c) G5 r% e: u$ t& ^
  15.         this.attackPower = attackPower;) M5 d' c8 x/ p( B! e0 W/ q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    : G$ |& p# t' o
  17.     }- l8 j% V  Z/ @( @( A2 ?  p! P) j
  18. ; f5 O2 T- k. S& D9 a7 u1 g
  19.     // Метод для смены состояния
    0 M: v: ?" u! ]4 C+ ~& `) Q6 b
  20.     public void setState(MonsterState newState) {
    " k7 P4 [3 h0 |6 ?4 m' A
  21.         this.state = newState;
    6 m" P# d/ v8 _5 _
  22.     }
      v# Q. d! ?- n9 e  T7 n6 S
  23. / P: W* l# C8 w4 Q/ x
  24.     // Выполнение действий на основе текущего состояния
    * n+ ~; b  i- P5 U( @
  25.     public void executeState() {- Z/ C  H& ?/ }4 d; \7 O
  26.         state.handleState(this);
    4 `3 D+ A) \) d* _  m, P4 S
  27.     }
    0 `9 a: a7 j( o
  28. . a* ~6 D# J' T
  29.     // Геттеры и сеттеры
    6 R$ a% T8 ^. A/ y
  30.     public String getName() {) ]; H  [% ^( q2 D
  31.         return name;$ M9 }4 u% R) d3 |4 y
  32.     }2 r3 u; g" X/ f+ i- l

  33. : T+ }) B# C4 L3 i
  34.     public double getAttackPower() {. L+ H( E+ ?$ E! D! r2 T. g" L
  35.         return attackPower;, C$ `% \% Z$ b, {& @8 v- V$ c
  36.     }
    9 h# Z; w4 d, c

  37. 8 ~* S1 O" J6 z$ [6 w
  38.     public void setAttackPower(double attackPower) {; t2 V) Y/ l6 N  C$ X
  39.         this.attackPower = attackPower;
    1 J( _( a5 L) B
  40.     }4 |9 A) q9 w* Y; I! t( x
  41. }8 P% u5 S2 u8 l+ V7 U
Скопировать код

: ?/ w0 ~  @$ u1 q. G: A' }0 uШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! w# V1 b" F5 [, x  R2 V" T$ [$ @$ B+ A  F
  1. // Пакет org.l2jmobius.gameserver.model.battle
    9 @' e! s' L+ y% V" `5 F5 t* p
  2. package org.l2jmobius.gameserver.model.battle;
    / `4 I' b  W# C6 x5 f" j; @9 Y
  3. . r" I; y, d. F1 R" @1 V
  4. import org.l2jmobius.gameserver.model.actor.Monster;: Y; _, ], N( i9 s& v' N, `  g
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 A# d# h$ S2 G, k% [1 o0 L
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' W* c+ w( {% Y$ Y6 D
  7.   a2 ~# S3 g- O3 X
  8. public class BattleSimulation {% _# o1 G3 y: @2 `; a
  9.     public static void main(String[] args) {* z+ o% m% ^; L- ^* l: q
  10.         // Создаем монстра с начальной атакой
    + o3 ^5 z- a* v8 P3 m3 f
  11.         Monster monster = new Monster("Дракон", 100);
    , Z" E! W6 z; @5 ~$ c

  12. 8 R7 [# r1 B, F" k5 J; z( q4 k
  13.         // Начальная фаза
    : @1 M4 t. j  Z$ A) Y. {; U
  14.         monster.executeState();
    3 l: x7 c9 i/ p2 F

  15. : {6 b2 Y" t- c/ r
  16.         // Переход в агрессивную фазу- O' I3 l' h2 p8 p( }
  17.         monster.setState(new AggressiveState());
      a6 ]3 j/ n7 z. F
  18.         monster.executeState();# s7 v0 R- G, u) n- P. b

  19. " E7 N) l. h  g% N& Q
  20.         // Финальная фаза
    $ h, M5 u: r- e; n% C
  21.         monster.setState(new FinalState());
    " f: f  x1 M6 \; D1 o+ G
  22.         monster.executeState();3 r0 o% q8 A9 P. I+ B$ \6 o- p
  23.     }
    # H6 i8 I5 B: O5 B3 w6 P
  24. }# Q( ^- B0 W! c
Скопировать код
  `) \& L/ ]1 y- w4 j2 c" f
Комментарии по структуре пакетов и классов:0 u/ r7 Z# O; N' |$ S& ^
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.# E! d: a: ~. i. p9 t8 F7 v' B
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ O$ n$ X* ?  d/ EЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 |2 b# P! |; r' Z" M  X

2 }6 x' G8 s1 s" }6 A' N0 S  E
( M# }  T& r+ w- P1 q) A) P0 N$ a; W
% e) |( y1 Y- A2 h$ a! E8 |
2 A4 S: G- V5 {/ i  _  B8 X9 e5 ~
; a0 l" R( S5 e3 W( a9 Q. G9 c0 q9 \4 U0 P; q; W3 M( U
8 W6 `7 ^3 g; s; k+ e
0 W0 D' v9 _0 k
  r- n4 m- H6 f

" e/ Z# A/ M8 P/ O0 I$ a& ~" _. S/ y! B- n6 b

% v. a( u- o& Q# `3 J3 P9 F0 h9 w. x
0 e. w0 ]4 U$ z1 f5 ^
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04& m* M2 m* h2 L) T9 F$ H; R
Для управления сложными взаимодействиями, такими как  ...
! ~& q) v# z7 A8 H3 d: J: z
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:216 w7 ^+ ~5 T4 X/ Y0 |) i
Отличный подход! Использование шаблона "Состояние" де ...

6 ^& a( \* y) p+ \+ ^" IХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
. _9 p* k1 D5 c! f0 ~7 Z! N. d1 Z' r0 R9 ~* j4 U
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.7 W. G, I0 Y0 n6 _

# p" O5 `9 X1 y5 q$ w
  1. // Пакет org.l2jmobius.gameserver.model.actor- ~/ b( [! ^9 Z
  2. package org.l2jmobius.gameserver.model.actor;2 }# X0 ?: B2 D0 u% |. U( U

  3. $ T. [1 D& _" e! D
  4. // Перечисление для типов атак
    * N3 ?% {& H* R5 w. g
  5. public enum AttackType {
    ) c  _4 i. U. @8 y5 s" Q3 r
  6.     PHYSICAL, MAGICAL;+ o- R0 e/ K: ]+ K- T# q% y
  7. }
    ; A7 K3 O9 y: z9 T2 P6 N- i
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.5 A' y' Z' [8 k9 _! v
Обновленный класс для агрессивного состояния монстра:( {+ }3 P& T: o: O5 y1 H

/ y) I$ [; L* N, d) [
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( V% }9 H( U+ [- j" ~* V
  2. package org.l2jmobius.gameserver.model.actor.state;& ]8 Z: P. R2 H2 a4 `, n* k
  3. $ o, J" c. |9 q% Z7 u' |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    6 J- J: l6 s* {3 ~2 N
  5. import org.l2jmobius.gameserver.model.actor.AttackType;$ Y: K+ P8 P- Y

  6. - Q6 ]: ]" j4 B0 E* F5 a) S3 A; j
  7. import java.util.Random;
    + j+ F/ Q. s% W# B; Q

  8. # G5 B& g$ L& g0 d
  9. public class AggressiveState implements MonsterState {
    * L" ?- d9 D+ c% W# l
  10.     private Random random = new Random();
    ' h1 t) e+ m$ J8 c5 Q, P
  11. " F* d2 R. L) {0 P
  12.     @Override) v2 K. s/ w  S# w4 ?6 }
  13.     public void handleState(Monster monster) {  B: c& g! h/ e$ D8 I
  14.         // Выбираем случайный тип атаки: физическая или магическая
    : S$ p4 r! j/ S. @& [' X( G1 V
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    5 o, ^1 k2 m( h8 c

  16. " Z6 ?# C" }% H' b( _1 ~& k
  17.         // Логика для агрессивной фазы боя6 S2 }2 H  Y+ `8 G( q3 m/ Q
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ) w' F: a7 y  X6 r+ k0 o" }  H* K! Z
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ) [3 G0 n( h2 ~6 J
  20.         2 u7 O; q+ s. A# D, y% s# m6 ?
  21.         // Увеличиваем силу атаки в зависимости от типа атаки8 H5 ?1 |& w7 X  P. _
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;+ E+ O3 }/ g  s" ^" H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    6 j- O6 b+ s7 q( S$ X
  24.     }: q2 [/ [* J% S
  25. }" }/ ^# D7 s/ O( a0 a7 s! D" b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
+ I& l  \0 b/ q, l# D6 ?+ w& \' k6 G2 o  O/ r! X% {, t
  1. // Пакет org.l2jmobius.gameserver.model.actor1 H% g; T% T) p# Y' N) L
  2. package org.l2jmobius.gameserver.model.actor;) z: C3 j2 c+ H- J& ?7 g: l+ p
  3. 6 c/ }" L1 e+ m! m. V! Y/ ?, A& @
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 p/ \( g8 E6 ~* P0 ^. G
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;/ B5 X# o4 j8 o+ K' v; n+ p9 e

  6. & |; Y* U2 R! m2 j. S  o2 \9 ~
  7. public class Monster extends Creature {2 P% P1 j/ d& C8 {1 Y, P$ L9 ~
  8.     private String name;
    4 `2 z5 |/ T; N( X/ a
  9.     private double attackPower;
    ! d0 t; N6 ~7 a# S- R2 V' @4 X& g8 s
  10.     private MonsterState state; // Текущее состояние монстра
      R5 L2 I5 y/ z% J, P/ j' r# A

  11. " r" K* W5 j! J3 t2 c7 K  ?
  12.     // Конструктор монстра/ K* E/ v$ y  [! J
  13.     public Monster(String name, double attackPower) {
    5 X) y2 L4 s9 I& V/ ]: P9 }# l
  14.         this.name = name;
    0 e8 x& f8 [& z: g. u9 O
  15.         this.attackPower = attackPower;
    / c4 {% P3 E# b
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ! M8 S" h1 I+ B" X
  17.     }; [( j4 p: x6 E  N  E

  18. 8 g- m; J2 Y, t, V7 g- s) v* e
  19.     // Метод для смены состояния
    $ O2 N2 z2 B7 Z8 A2 T
  20.     public void setState(MonsterState newState) {
    $ W8 e) G; r; u; N8 f" l  h  T, Y
  21.         this.state = newState;* d3 Z& V: m  ^) F6 p
  22.     }
    & \2 D. i( B7 ~' @

  23. 4 E0 c( ?0 o+ q0 h3 }* C( X
  24.     // Выполнение действий на основе текущего состояния  a4 C1 a6 h3 F+ c) E- @
  25.     public void executeState() {
    " N# ]" S/ U0 N4 U7 G1 ~
  26.         state.handleState(this);9 C- c' _* @, ?. Q, E
  27.     }8 K- s  R8 K0 w) n! x
  28. . y3 c3 O) s+ }) P2 J2 P" w
  29.     // Геттеры и сеттеры7 |& X, }3 ]( ~8 T' R
  30.     public String getName() {5 g9 G+ s" f, W1 d" @
  31.         return name;
    3 J+ C) T- K- y, M0 a
  32.     }
    ( _7 F2 ]& r# e% H
  33. * |( B9 y, Y9 D1 N6 ]9 I& v" p
  34.     public double getAttackPower() {
    ' j. r0 `8 H# i- |- K( f
  35.         return attackPower;
    ; U5 j; ^  v6 a) _: w
  36.     }
    6 ^3 E1 u0 A  T1 f6 |- K% p

  37. : N$ {, @4 n  A
  38.     public void setAttackPower(double attackPower) {
    . b+ ^9 ~5 ]* _/ _+ Q; ]1 T
  39.         this.attackPower = attackPower;4 m/ `0 J  F  A# {0 L9 O
  40.     }9 V+ N" b8 q1 N. i3 Y
  41. }
    1 G# r1 S5 u4 L) T/ `3 S2 s
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.7 T  ]: c1 O, D  U

1 V+ Q/ P- r2 j4 y, l* [% o) G
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # k. z  o3 W# A3 W9 U4 q8 |- y
  2. package org.l2jmobius.gameserver.model.battle;; o8 E/ s; B* ]- J) Z. h1 `/ k

  3. , D! P  e3 @8 |1 c' d! [
  4. import org.l2jmobius.gameserver.model.actor.Monster;" \2 R: x6 e- z! L1 E
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;8 T& H8 n" n# t
  6. ' F$ z. f+ \0 [& ~
  7. public class BattleSimulation {& I( P4 F2 U4 B# ?7 R1 z
  8.     public static void main(String[] args) {
    ! H2 _7 f6 ^) }" W6 V& k$ `. q
  9.         // Создаем монстра
    2 l+ ^  \# K9 F  {7 L
  10.         Monster monster = new Monster("Дракон", 100);
    5 T$ l! M7 r$ }  c' l0 }: @( L
  11. . s0 o% G4 Z2 r! O- t
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    / _3 H  p3 B6 }" [% G" ~  r
  13.         monster.setState(new AggressiveState());
    - r% c" e5 a9 l# N/ r* ?5 K9 S& ^6 X5 R
  14.         monster.executeState();$ K7 U$ d1 S* T2 x* F
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    0 p2 M9 m" F0 S3 p1 L, k: Q) z
  16.     }# C1 q# u6 B# T& R
  17. }
    , t# p8 }9 g1 Y& d$ G
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
  G  Q  O& K2 y& t/ f& VЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
" x' H2 i. p- y; c& V6 c# j
7 R; |, A4 `1 x' P+ k7 _; u) x! Q) t, Z; D  k: L
7 q0 \* N2 l8 a% E" M& g4 }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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