Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!+ M5 [& N- S; D+ D+ S

3 K& }$ k7 s/ Z

; I- M' L2 {" s, pЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
: H2 |7 w3 n9 hЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!  C  N0 N' x7 |
Астралия ?
* Y. D# B0 Z- m, a# \+ n- W9 D& Y: R6 w- w& N

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ H  x* I8 N  @В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?: G1 d8 q8 p8 }7 K* i, T  z& p
6 h  U/ W" N" G: ~$ \9 \  D
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 " }7 n1 O' z0 i; N' U1 M
AlexCoder опубликовал в 2024-10-16 18:318 `0 C& J* X& O: B9 M
День добрый!. E3 ~- \: K- }( L1 w6 ?' N* N
В статье описано взаимодействие игрока с N ...
( o: X) Y, L% ^: T. r7 ^' n
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
/ ?( B% o2 p. c  ]9 Y/ k5 B7 \* ]. g7 l' V# ^5 I) b8 O# @
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 e) N' {' j% X, t' x2 _7 r
' U% w# k" _/ m& m$ x
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' c# V: h# f# }5 u

- r7 G. {3 ]9 B7 k; Z- a4 f
  1. <font color="Green">// Пакет для состояний монстра</font>
    . W4 x; f, A4 m" T& `! X! ^" V2 `
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( h7 ~5 |$ y( c- d3 S6 n' q: I
  3. <font color="Green">
    / A% y* Y# {" f+ s3 Z* H
  4. // Интерфейс, представляющий состояния монстра</font>3 @& N( P4 g) ]; `# s" r
  5. public interface MonsterState {0 p& u5 W* E! v; s
  6.     void handleState(Monster monster);) ~& g& K$ @( h& |
  7. }
    : S4 {# J2 c. r6 p( F% S
Скопировать код
+ u# Q* E6 F  l
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 G6 P7 ~: e1 q3 d( }" w6 V* x, y! {, T
Класс для начального состояния монстра:
' K+ f' f" B  O$ y$ k- t" z
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>% _& l, H! f' v. W- c' D
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 Y/ |! G6 q" K! H
  3. 7 V# ?* Y# u! ?4 P4 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ D# D& a% L0 T( o1 @( O" j

  5. , p$ H, A9 U& B' R0 t! s* t, a; |
  6. public class InitialState implements MonsterState {
    / B" M# f7 x9 m: }
  7.     @Override% V$ U1 Z. `" B8 i
  8.     public void handleState(Monster monster) {
    ' b# j$ O( ], p& O! r, G
  9.         // Начальная фаза боя
    0 ~4 \' ~+ n+ l4 j
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( A7 n* h) B2 M+ c
  11.     }4 v! e) o+ O$ p7 Q  ?
  12. }
    " i& P" n6 A3 g/ O: Z
Скопировать код
+ c' D7 y- q: S, \( `

' O9 b* M0 r" N3 N4 D
% o. g  B/ M/ j" i/ A; `
8 D( n! A; l8 q7 l' C# I6 g+ ?
5 M7 z# e  x' E, @' i! f$ {& h9 F
* c) d. F9 m* w$ |8 Y! Q/ R  W- K
- V" n) u$ y8 G
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 3 x+ N& ?% {2 \1 C9 ]; _5 V/ _, f8 Z
0 v5 C) Q9 J+ k, _
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
7 L) f7 a) W4 n: W: i; E" D7 M' W- Y! a5 u
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., f2 o# l' U5 i* r& \* H
  N5 C% c6 b+ ^  `' D
  1. // Пакет для состояний монстра
    7 [& t& d1 |0 W0 X; x) e
  2. package org.l2jmobius.gameserver.model.actor.state;6 \; f  q8 L6 Z

  3. 5 u1 r' c" m- G! [+ e" Q
  4. // Интерфейс, представляющий состояния монстра: a+ g" K. ]. J* A
  5. public interface MonsterState {. ]0 P9 D; ?$ |+ L+ Z. R; P
  6.     void handleState(Monster monster);
      a) y+ f/ ]/ K; t
  7. }( m% E$ N% |* p  m
Скопировать код
. }$ J  t" I/ @; C, Z3 _
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 7 D6 L) I" D0 n! P* d( I

; Q1 W! f! x5 d- Q  ?0 E+ eЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 h7 a1 r! ?* P/ A

' B" v- I* ]" x% {7 DКласс для начального состояния монстра:
- @3 q/ |* R5 i' F" E. a& U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 O% o8 {4 W5 X4 I' u
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( v& y/ |- G. ]3 A0 d" s9 x3 f6 [7 X
  3. 0 Z% @, a3 F, @- r) P
  4. import org.l2jmobius.gameserver.model.actor.Monster;% M# o9 t& a# F1 u) H% X( D

  5. 0 B2 H4 h3 Y) M, f
  6. public class InitialState implements MonsterState {
    2 W; j7 g& C4 s& A; n1 B0 A
  7.     @Override
    ( u1 I; m8 u4 d  d2 v1 p, ?8 J, M
  8.     public void handleState(Monster monster) {  y) |( h9 Q9 q# l
  9.         // Начальная фаза боя4 p, {0 E, m8 H' x5 }7 m6 \8 V+ `2 e; A
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");+ J* p: W+ p* N3 u( |$ m9 K9 g
  11.     }
    : @7 j% K- Q1 }; W. U
  12. }
    2 B% O" j5 _# Y# g2 l
Скопировать код
Класс для агрессивного состояния монстра:& h& @# ~+ r4 I( t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 I2 {/ A1 n0 D2 y9 p9 h
  2. package org.l2jmobius.gameserver.model.actor.state;. o$ a' I. B! Q. k9 e4 X& u4 t
  3. - d- C( c  u9 p/ ^/ U' t& p
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! ^# \/ V. a6 U* z4 m$ X/ |$ _8 F

  5. 4 H7 m- m3 n6 H; _, x: M  j* t$ M: }3 R
  6. public class AggressiveState implements MonsterState {& p* A2 a) x5 c
  7.     @Override1 j' S5 R6 k2 E$ o6 g. @( }
  8.     public void handleState(Monster monster) {' u' G; a" u5 A# ?" D. X
  9.         // Агрессивная фаза боя
    - a4 l5 S, A) G0 A/ a% {
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ' x, i0 @" I+ t% ~0 {
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки/ B3 f2 d, X" f: r8 ?, l
  12.     }
    " ?5 ]5 |% B' E* G6 c. ~) v
  13. }# h; J, X5 ~; g& P# d
Скопировать код
Класс для финального состояния монстра:  z% s+ a4 z  v0 N0 w' E: F
  1. // Пакет org.l2jmobius.gameserver.model.actor.state( i6 c6 x* h1 W0 J* \( ~2 t9 |
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' A0 {; [& [' Z
  3. % b" e2 l5 m) y; h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( @0 P4 N" _! p1 X6 n# n/ j5 t
  5. - a9 Z7 P. H- o. Y
  6. public class FinalState implements MonsterState {% F5 |/ L, k+ N# x! ]; W$ Y: d
  7.     @Override
    2 S& t# r# P. @8 m/ l' n
  8.     public void handleState(Monster monster) {
    ( B) r' G  _4 t& A$ d5 ^+ d
  9.         // Финальная фаза боя
    $ S# M, }: g; d' v) R
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");* E4 t- j2 s5 l2 p+ n/ F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки  y$ T2 s7 g; B: D0 m
  12.     }
    , ~" V( o& _# E0 j' X/ t
  13. }
      h. }! D5 i. o3 z
Скопировать код

) w/ @5 m9 F" u- a  jШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' `( c. K( R  X
  1. // Пакет org.l2jmobius.gameserver.model.actor
    3 m, U# L' |- j' ?8 Q' _
  2. package org.l2jmobius.gameserver.model.actor;) V# A* w8 X$ S! f$ b/ J

  3. 4 }% B& m- q' |# D% `) i
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; }, k+ B. ~# E. `! L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    , y- j9 W6 p* {) q4 p
  6. ( n$ a# Z4 o- K5 ^' h
  7. public class Monster extends Creature {
    5 V8 q+ T0 ?3 o
  8.     private String name;
    2 ?7 u" J8 r8 d6 t8 W6 t4 e6 I7 V
  9.     private double attackPower;
    / }7 W4 J# H3 }  r5 x
  10.     private MonsterState state; // Текущее состояние монстра4 k* |7 z9 [" h6 Y# {4 O# x
  11. ( [) |5 b  y' ~; Y
  12.     // Конструктор монстра
    2 x7 X( ~& o' {
  13.     public Monster(String name, double attackPower) {+ r7 ]' c8 Z; l9 l
  14.         this.name = name;
    # S, o  O/ S+ K9 X7 }
  15.         this.attackPower = attackPower;7 Y. n/ P! g0 P4 ^( T* o7 o; z' t
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние5 w% p1 U5 X2 u2 w3 k  e4 g7 _
  17.     }
    6 S' O/ |( ]& q; R3 }% v
  18. ! z) y  x5 X1 ~
  19.     // Метод для смены состояния- E5 a. n. q' E; Z
  20.     public void setState(MonsterState newState) {: C  Y; |5 T6 u. o* G
  21.         this.state = newState;
    # z5 ^$ M; ]8 x6 G% O/ c
  22.     }
    5 |  R- A' o. R* U3 g4 v

  23. 8 ~* p' B! g6 Y- S$ p
  24.     // Выполнение действий на основе текущего состояния
    2 n+ j& c5 i! m& z$ c% Q
  25.     public void executeState() {3 Z4 e( I8 t2 j' z) T
  26.         state.handleState(this);$ w( _* ]/ F- f2 y; r
  27.     }; A" ^& i3 @: S0 c* Z# {
  28. & z' D9 h: x6 f9 A5 S* f
  29.     // Геттеры и сеттеры, l# w, T. {- C' _1 v& S
  30.     public String getName() {0 h* A9 ~, |9 q! H
  31.         return name;
    ( m. n0 `& W; u) s( Y
  32.     }
    % z8 T% n) {0 C! `
  33. . o3 |6 ], V. e# _1 H. j
  34.     public double getAttackPower() {
    & F2 P* B+ ^# g( t
  35.         return attackPower;
    + q8 @2 h$ a  y! ?; m& {
  36.     }% b7 @) Q3 ]8 x9 p* ]

  37. * q- O( V- R9 K' S* r- ]* x9 y
  38.     public void setAttackPower(double attackPower) {
    " [. J  M; x6 y3 X; I
  39.         this.attackPower = attackPower;
    ! y" `9 M% ^. s  \, C0 h& P; N
  40.     }
    - Z9 }- {- M/ x8 @
  41. }7 ^# @7 n$ l% \( X- H! S: n7 T. l' q  r
Скопировать код
) k) X  O8 I4 D
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
  [8 A* [7 v* _5 o7 H
9 i3 q4 B! \' u* Q, s: s# c
  1. // Пакет org.l2jmobius.gameserver.model.battle
    1 d! w9 j: X+ w% b" q3 @
  2. package org.l2jmobius.gameserver.model.battle;0 g( H  u9 m" ?% i; ^0 T( k

  3. 3 l2 m* q4 z/ |) j2 P
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / }* A- T* n+ S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    , H) k% k5 F: K% [# m* j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    & R# Z" M" k  ^3 z5 u/ m

  7. & b" I# c/ `+ v6 b8 O; p
  8. public class BattleSimulation {7 j6 A% W1 W2 h3 D! u
  9.     public static void main(String[] args) {
    . ?# `% g* g( P; N! p9 [
  10.         // Создаем монстра с начальной атакой6 t# g% }$ [. f
  11.         Monster monster = new Monster("Дракон", 100);
    & c4 n) u; w+ I7 G
  12. 1 V* }' r" z3 g& k
  13.         // Начальная фаза; b0 [8 }( T3 o
  14.         monster.executeState();0 N; C. f* r$ x  C2 v

  15. . W* {+ n: w( b+ g& e( t* y$ Q5 ~3 f
  16.         // Переход в агрессивную фазу
    5 [) f4 r+ C" H# B
  17.         monster.setState(new AggressiveState());
    ) e6 {' @1 ?0 n. V) [
  18.         monster.executeState();' `+ h& ]" y  }, y1 t7 \
  19. 7 B4 `7 C4 L2 I# r3 L
  20.         // Финальная фаза2 q# w# f) U3 f6 N% f0 j
  21.         monster.setState(new FinalState());
    : T. B3 w6 c% v3 L& R/ y; t0 O
  22.         monster.executeState();- I4 y1 F/ m. D1 C1 I/ @5 @; f
  23.     }4 M8 q( y6 C9 F2 ^9 P
  24. }
    ! D; u! S2 [8 Z: m, Z( Z
Скопировать код

1 _) T) a! L& g9 _2 b7 I' k$ eКомментарии по структуре пакетов и классов:
2 X4 D& D6 Y& ?3 P" B
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.3 o+ u# ?! G1 \& @$ E5 C
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
8 Y9 B" Y9 o8 X% D9 ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
4 R; M, e$ F6 _
. [; H1 F5 J8 ^4 ?
" q0 k2 x$ _% u, r( p+ V2 G  G1 F* {# u+ b9 W8 V) H
' j0 ~* \9 M% `, M: {# T
  X* T8 M% s: s: r! y
2 x: a7 b3 D2 U7 b) E/ Z5 b
4 B* b/ {" l$ ]! P- m" y  E

0 ?& s/ F6 l4 Y7 ~+ E# ^
" e; N' b7 J" O- z9 u- _% A. {1 j+ J0 w5 R
* t, W* L# _5 M. ]7 R9 B

, `+ A$ O' g9 k( u' c! }+ G) L" ~5 x) D' r$ N8 }& F
% c2 l  R  I2 F$ ^/ D- [& s
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
+ N( A% ]9 g4 D% o% S+ Z/ v/ {2 DДля управления сложными взаимодействиями, такими как  ...

) ?! N3 @/ r9 UОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21/ [# l! k" D. o1 U6 O+ r6 v5 x
Отличный подход! Использование шаблона "Состояние" де ...

) p; k3 N! F0 w+ b1 aХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.3 r, N: f3 q) z& N
8 {" c; |% Z$ j) n7 f2 n
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
; R+ z6 V6 o: z" e( y% r' S3 q0 ?1 x
  1. // Пакет org.l2jmobius.gameserver.model.actor
    1 N. L9 N  z+ Z. F4 T2 a" s8 ?
  2. package org.l2jmobius.gameserver.model.actor;
    # a. {9 ~, q" N. K8 U) }& o! [& ~
  3. . V% W3 `7 h- i* u5 o  n8 S
  4. // Перечисление для типов атак
    * e/ M9 S  q! e: n3 x) X5 f3 e" ^
  5. public enum AttackType {
    ) e. G5 q9 d- ^& J. _
  6.     PHYSICAL, MAGICAL;+ g9 ?" E9 |# N/ n! ^
  7. }6 w6 _- E0 l3 `
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.0 [# p, l& Z: J/ v/ q: I. C
Обновленный класс для агрессивного состояния монстра:
& [1 X& v- P- X& s0 e& X" s9 f8 R+ |4 p/ p! W* S5 Q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    " C7 S" S4 X5 Z" C8 q
  2. package org.l2jmobius.gameserver.model.actor.state;; O  f0 P* T8 A! i* ?9 U  q

  3. ! Y7 M% `; U! C: H& m  L' L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' l  o: w( b0 b- p1 g$ K) B
  5. import org.l2jmobius.gameserver.model.actor.AttackType;& U& E  d; y+ L' z

  6. 8 {2 o5 L, q+ t- J/ M8 P; g/ k
  7. import java.util.Random;
    6 u! S+ W+ i* y- r! R! D
  8. ) b0 _: J9 w9 S
  9. public class AggressiveState implements MonsterState {
    / r* {/ C2 l$ d  M( b+ ~
  10.     private Random random = new Random();; E, j* d. g- V% i5 l1 H

  11. # M3 t, R3 Q: V9 v8 B8 q3 y* F. f
  12.     @Override
    . Z( v3 Y8 O; F# W0 v+ \
  13.     public void handleState(Monster monster) {
    7 r! E& s7 b* R4 g8 k2 w# X6 Q5 G
  14.         // Выбираем случайный тип атаки: физическая или магическая
      p% i6 S" k( b6 b+ _) Z1 q7 B% J
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;2 h# ~5 l# ]( X" v: }/ A
  16. . o& G$ U; \% S1 d* z  i
  17.         // Логика для агрессивной фазы боя% [5 ^; ?( d4 }0 A
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " 4 L6 B9 I9 Q; a! i
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ( ]8 Z! m( [$ O
  20.         
    * h- b# R0 g1 o7 s: f
  21.         // Увеличиваем силу атаки в зависимости от типа атаки0 D: I6 M) ]+ C1 u  T% l/ {
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;  F4 V4 f* N' O, E9 \( x% s4 g
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);) J7 ^, x( r5 `( a( s* F/ c7 ^2 v" R
  24.     }* T" w& a. n" ]8 I4 R7 u
  25. }/ G3 ]4 c+ x3 m! m: D# L5 t- j' t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
/ {( X" y6 ~' U+ B8 k8 Z+ j8 W4 c6 W. F" v/ T* O
  1. // Пакет org.l2jmobius.gameserver.model.actor6 W/ n4 T2 C, F% r. c0 e0 L% Q
  2. package org.l2jmobius.gameserver.model.actor;
    % ^& [9 |3 z1 A: q3 ?

  3. 6 q6 X9 f0 |: X" a. S1 K( Q' j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    - |- Q9 t5 Z0 ~4 t1 J3 o: d( n
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    - t6 d- k; O, ^! `, E- m

  6. / {( Z9 v8 B" O; ]7 \' p, w" u
  7. public class Monster extends Creature {$ P1 ?1 [; i) e6 @: Y! a
  8.     private String name;
    5 {* S6 V# F, j! w
  9.     private double attackPower;
    0 x( H( Q& m/ w( w
  10.     private MonsterState state; // Текущее состояние монстра  H( M, t$ e0 k3 l; e
  11. 4 P( |6 v. \& L5 S( j- R
  12.     // Конструктор монстра
    % D. _- n# _  S) M+ U  P* w
  13.     public Monster(String name, double attackPower) {
    0 c3 U% @( [  ], ?# Z4 B- e9 S, d
  14.         this.name = name;
    : s5 F8 O; d% a; l5 q5 O
  15.         this.attackPower = attackPower;2 x. m/ L. s; s& O4 C; a" h
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
      d. @2 ^. U) i9 c+ P  a  {
  17.     }
    + U9 V) S4 o: i

  18. / C' i% U* g% a' Y5 Z$ z/ Z" E
  19.     // Метод для смены состояния+ I( q) m) B* E( J1 D
  20.     public void setState(MonsterState newState) {
    * Y: i3 ^& g# f3 e
  21.         this.state = newState;" ?/ o! [  v. e5 @. }) C
  22.     }
    . i9 k! Q  p4 o$ i- ?/ C2 t, Z5 e
  23. / G0 K+ S# Z1 X2 X+ O: \& e, _' k
  24.     // Выполнение действий на основе текущего состояния2 j0 w; c/ E% Y
  25.     public void executeState() {
    $ B/ i3 Q8 w; X! ]; h
  26.         state.handleState(this);
    # Q4 O8 p9 s$ F2 c! `
  27.     }7 R1 W/ a0 N0 z" M  ^( [
  28. 5 f3 x, i$ ]% q( A8 e6 l
  29.     // Геттеры и сеттеры
    5 V. h6 u: ~, `3 k2 I
  30.     public String getName() {( s0 D6 {* b. w
  31.         return name;0 a6 ]# k2 m) W4 u- i0 x8 t8 I
  32.     }# Q5 O6 L# I3 N- o) P/ f5 R( Y) K

  33. 5 d0 w8 K# }5 J  @: j
  34.     public double getAttackPower() {
    ( c! Y9 L% r3 C/ E# l
  35.         return attackPower;
    9 V" H9 |- P2 L  B1 T- p
  36.     }
    : a/ z7 Q+ c( }5 \/ K" K  y. |

  37. ' R: p  t* {) e/ F8 j. s8 h, I
  38.     public void setAttackPower(double attackPower) {
    6 @: j5 L1 ?  T* A, D
  39.         this.attackPower = attackPower;
    ! j$ o5 w% k# H# N1 G! [; j% e
  40.     }1 l& q3 \3 r* N
  41. }
    # S" m* G, I4 E
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  D) [: G2 w$ y: ]$ C
$ o" j9 D$ [1 R9 M8 @/ j# r
  1. // Пакет org.l2jmobius.gameserver.model.battle0 H! D7 Y  o3 r5 D3 M4 v
  2. package org.l2jmobius.gameserver.model.battle;
    5 K) @1 p8 z* R& T% R4 i

  3. 5 R; X( A# m. {! @7 r6 F' C
  4. import org.l2jmobius.gameserver.model.actor.Monster;) U* n9 F  }$ k- v, X7 I
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;4 r$ [" K/ u! X" U* D
  6. ( b6 Y  q" a1 ]" E5 {
  7. public class BattleSimulation {5 S* |7 l0 c' I' N4 L
  8.     public static void main(String[] args) {
    3 R3 V/ Z1 M9 ~0 U* }" \
  9.         // Создаем монстра
    ( ^* F: }, X; i% D( N& j1 m
  10.         Monster monster = new Monster("Дракон", 100);( \5 m% B6 f) F) C
  11. ! M" o) @) x* Y* F, q8 L
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    # u0 m+ @$ h2 G. j' x  A3 R
  13.         monster.setState(new AggressiveState());$ ^& M& v% [5 k
  14.         monster.executeState();
    % n$ ^# y/ x5 B1 M/ G  b& q: E7 s
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак, Z" J, P) `( M* z( O9 T9 Z
  16.     }
    ) @' ]3 }* N! I: ]2 W" S$ K8 @! U. f
  17. }
    2 z" @$ v3 ?+ @6 b
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
7 x8 K* [. J  Q* KЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
% C3 n4 w* A' f7 m9 v
, o6 ]2 }, y) E9 I
8 ~) K4 e5 z" z. I4 X9 B2 Z& j8 A+ h, m# [# _$ _
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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