Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 x, R8 a/ l* k8 `# g$ Y8 H9 M0 [

$ I8 a, _% K! e1 I, u1 Z

) |* f+ y# r8 ^Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.# y6 A- |: f& s0 z; O; w7 T  k
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 Z( M* U/ o, e( SАстралия ?
* i! C- w7 a# X5 x( H7 z. y' \4 a! S/ p3 n) _

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
; ]3 V# i/ u2 S& n. eВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?% |$ G1 ?. W& Y7 H
5 y# V+ Q9 v! c6 f
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 , I/ Q  g9 j0 \) l$ L8 {
AlexCoder опубликовал в 2024-10-16 18:31
$ [! T( \; ^) f& ?6 D) |День добрый!( p+ r) @! H4 L6 t9 G, n
В статье описано взаимодействие игрока с N ...

  w2 h' j  @8 I5 |  h3 bДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 p( l( x; \8 K; c
& g4 b& R0 @1 E( H1 Z, E/ n7 bЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.; k5 n# J% R" c. `
" U* K4 o4 j% e0 x0 a, T
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.. `( {+ p0 `  [0 G4 Z1 ?
0 @) T% B8 p1 U8 H- ~
  1. <font color="Green">// Пакет для состояний монстра</font>3 K( b! K; t9 ]" M! @
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 @0 [, R+ f) Z, K3 l6 O% \/ }- g
  3. <font color="Green">
    % f' j- P/ e5 E" g( ]* ]4 z
  4. // Интерфейс, представляющий состояния монстра</font>' K2 z, t# G" B$ I/ m: U
  5. public interface MonsterState {4 ?+ s' Q3 @- W
  6.     void handleState(Monster monster);
    # r. V; ~% ?0 Q
  7. }" o) e0 ^, l6 H( ]; l9 Q1 R
Скопировать код
2 r. D4 }# P; x( n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; E) ~; p# i) F9 n
, ?; p: J, j: X
Класс для начального состояния монстра:
! w# C+ A) |# ]& T3 p# R" ?
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>2 s5 ]7 A+ ^9 n# B
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 Z: B- C6 n" D2 o& m" d

  3. . Q+ p0 j5 E  _* ?# K
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % P- f/ R, u9 g; e% ~7 A

  5. 6 c0 |* x' I5 b, s* z: ]- t# e
  6. public class InitialState implements MonsterState {  B# _8 A, ^9 r" j4 b+ g1 w0 N
  7.     @Override' r& C$ E+ H6 ~% m  L2 Q
  8.     public void handleState(Monster monster) {/ q* A% @6 U# _, W9 b6 ~
  9.         // Начальная фаза боя: w$ P$ f( ^0 W  @
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    1 @% K) }( G: ~; w. n
  11.     }
    / D. l1 j; c. N& q
  12. }4 ~! C' _2 [$ {0 W4 C& k
Скопировать код

) |7 c/ ]" X; C# a! d: k7 _9 V8 e& B' r
- y. u& N/ F- F% E: U% Y+ [
6 ?  c8 W! S- @" k* h
. R/ g- ~9 `" f* T, H! p4 d4 i

$ [5 G. s/ m/ b2 b6 |8 h! p  I0 n/ T& k/ @/ `/ V* h
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
9 i% Q0 c# S/ g: F" r$ j* f6 Q8 ~- r/ _7 B% x( d
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ h9 `% I9 \5 L% z1 ]

' @% {/ w/ m; w5 _( |# }Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* d; }1 u7 ~7 f8 g4 q8 f' _/ R1 u0 A6 K; N( S; ?
  1. // Пакет для состояний монстра
    2 g9 P+ X" @7 k3 A9 ?
  2. package org.l2jmobius.gameserver.model.actor.state;4 K. k/ |' F' ?

  3. , ^' t! w$ _  j* A0 D. [
  4. // Интерфейс, представляющий состояния монстра9 m; \: @+ f! e6 R6 v( \
  5. public interface MonsterState {
    1 I& a2 k  G) j5 e
  6.     void handleState(Monster monster);) ?( g- e7 z. c* }0 [4 P: `
  7. }: }( B) A6 O) z1 F" i
Скопировать код

1 ^( i+ D7 i4 F! I+ A, b; @; X. \Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 8 B* |. {/ C- j9 \6 A6 [& x
" @2 p) }+ ^5 {& v: m
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
. q! v! P# @$ S8 A9 `4 o# D# }' d1 F* ^6 U/ i
Класс для начального состояния монстра:! c. j, L. ^" |5 o* O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( [( i- R1 R/ _7 `+ @, a
  2. package org.l2jmobius.gameserver.model.actor.state;6 Y2 H3 f5 I. x/ j+ U

  3. 0 N; \5 d0 G. O0 ^' O, l
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 `& l. a( P% P8 d! [4 L' H/ d
  5. 5 Y! A1 i. n8 z/ h( ?8 ~" y
  6. public class InitialState implements MonsterState {
    / d9 ?3 x* `1 `% F$ ?! c: t
  7.     @Override9 E2 ?4 n9 A0 p
  8.     public void handleState(Monster monster) {' S/ Z& o4 }3 I% {8 K7 t
  9.         // Начальная фаза боя- T" n1 X1 ~( m9 U9 ~  @0 j
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");5 h& S  o' I8 \1 A" r, m7 O/ J
  11.     }4 K) `+ U2 }4 G0 T3 v* n
  12. }
    * i1 l( X8 g* ?" V' X
Скопировать код
Класс для агрессивного состояния монстра:
$ |/ K$ I. I4 l* Y9 P3 R7 Y+ h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ `0 c  ]! O, j0 H5 [
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 w9 Z0 R) ~. B& {

  3. * ]7 T3 S; O) N( o& q
  4. import org.l2jmobius.gameserver.model.actor.Monster;; ^$ o. Y; U. |* ]; m3 x5 \
  5. 3 `! e5 Z+ D$ l5 d& v; n
  6. public class AggressiveState implements MonsterState {  w. t9 C) w% A+ h$ ^
  7.     @Override) X* }' I5 l, e# q; g  g
  8.     public void handleState(Monster monster) {: u* }# o7 f# Q0 N$ j6 f; F
  9.         // Агрессивная фаза боя
    5 Y( }  m0 d) _; f
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 [! R! W) K* I  A
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки7 ~; d7 \$ d2 h7 I+ Z
  12.     }8 X$ @" h; I5 g# i8 _
  13. }& r4 Y  V" f" i/ b) M4 T
Скопировать код
Класс для финального состояния монстра:
) {, ~2 i; v* s. A4 s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    $ w( u9 c6 {, z% I' A- i9 Z
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! i( b, f/ R1 P( S

  3. 8 ~. b# O: N# b. g* C+ h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % G  _9 U: x1 D; S5 C/ F3 F

  5.   N) D% Y) J  J: J; _& b
  6. public class FinalState implements MonsterState {
    + k, p# q+ \* o/ B  A1 `$ h
  7.     @Override  o* O: ^. }1 i/ T5 B4 Y
  8.     public void handleState(Monster monster) {1 n& T& m& x& I+ b; y8 Z; o% U
  9.         // Финальная фаза боя
    8 S# E7 M$ a  o% O4 Z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");: @( t+ y' r- M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    0 B/ A! ]9 H5 k- k6 }6 O7 d* D
  12.     }/ B0 }+ \7 E  L3 Z8 D
  13. }( q/ r7 M, I' m# G! I
Скопировать код
1 a, q9 V8 p9 K& A, W5 q0 k
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor., r# M9 d9 H2 n% j
  1. // Пакет org.l2jmobius.gameserver.model.actor
    $ S. w  [% b6 k% k( |2 O. c
  2. package org.l2jmobius.gameserver.model.actor;  c+ n% ?' @, g, P7 q
  3. 6 ^) E6 M& O9 Z* V+ F
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    % }' U- f8 _( j. g* |
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    5 v' R' V7 i* `6 l, @5 F
  6. ) w! ^) J8 ?. c, Q' u6 R1 K* }. i
  7. public class Monster extends Creature {. @$ Y1 g& v- C6 }! }2 F* _) @
  8.     private String name;
    $ `; v0 `* f2 I4 T5 w# d
  9.     private double attackPower;& N5 G. }. q% |8 h- ^, ]
  10.     private MonsterState state; // Текущее состояние монстра& v2 e. i0 t: k: u4 }- m/ M4 }

  11. & E8 T% Z/ P* U  V
  12.     // Конструктор монстра
    & m! H0 E5 Z' M; H; T
  13.     public Monster(String name, double attackPower) {
    $ S* M8 p; a! L
  14.         this.name = name;8 [3 Z2 D! x+ Y% g) i5 o, j6 ~
  15.         this.attackPower = attackPower;$ L- C) J* A4 e( m
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    8 E9 I2 }6 D* f* w& A3 H9 p
  17.     }
    5 X8 @: A! B# _- l1 i
  18. - Q; ^- t  ~- {8 Q) L* i
  19.     // Метод для смены состояния( q$ c" Z* ^( i# t- U2 g5 P7 e1 {
  20.     public void setState(MonsterState newState) {
    # Y+ ~# z6 C$ L
  21.         this.state = newState;
    , V, S- D8 T" P/ d
  22.     }6 K: J' E$ f/ ?" i, J, K" o4 C$ b2 ]8 T
  23. ) N" b" N! M( X( W* ~7 a
  24.     // Выполнение действий на основе текущего состояния* h1 ]* d( _0 h# u- x* G
  25.     public void executeState() {2 x1 A/ |- Z( ]/ p6 y
  26.         state.handleState(this);) Z- w/ U+ @( [! D, k6 w
  27.     }
    + [5 H6 S( C+ ]% Y4 _
  28. $ b3 a. G' c0 _4 g
  29.     // Геттеры и сеттеры
    3 @3 l( b, X  q9 |4 r
  30.     public String getName() {1 w9 R6 \* S  y2 x( Q
  31.         return name;
    8 S% y  h# _4 m9 M3 L  g
  32.     }
    & ?1 n" I! y# ~2 Q( m: X, Y7 [/ R
  33. 2 O& y2 ^' u' c4 w2 H) X1 v' A
  34.     public double getAttackPower() {0 q* n2 ~# M2 q& ?8 j
  35.         return attackPower;5 O8 o, h9 F( U6 G
  36.     }" D/ o9 B+ m( Z3 D4 \
  37. # v1 C" {+ K3 g( K# m, j* d; R- \
  38.     public void setAttackPower(double attackPower) {+ P0 B/ @! Z$ W! d& L' u
  39.         this.attackPower = attackPower;
    5 I$ i( Y* ?& b8 y. ?
  40.     }
    3 b# @1 n: R" i  Z
  41. }
    & a4 G- E. p/ R$ V+ T2 T0 Q
Скопировать код

1 r) L7 O9 x5 Z2 @Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
  v  a6 r0 c% X# t1 b  _% u) P. G4 X1 W2 l8 v
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 J# E# W8 w* W
  2. package org.l2jmobius.gameserver.model.battle;  ^; \# X5 w: u" F1 k4 T& ?
  3. 9 ~' W( t* E0 D8 P" g, n; _
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    : I. H  H  d, ~* s5 x
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    / _, s( w/ W3 w" G
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    6 H; z4 X4 K9 {+ C, {# ~9 n9 ?
  7. , M" y, v* ?$ ^, d& N9 R
  8. public class BattleSimulation {+ v5 i9 D% y9 I* w/ W4 h
  9.     public static void main(String[] args) {) ~. L- I7 ]  {5 P! H& U6 U: r
  10.         // Создаем монстра с начальной атакой; w1 R! ^+ P  k( v; p8 ?
  11.         Monster monster = new Monster("Дракон", 100);+ f  L: f; f6 O  p
  12. 9 ^0 x; P' B$ {
  13.         // Начальная фаза
    $ s* E1 j& b7 V2 [
  14.         monster.executeState();
    2 _) E- n7 a1 B4 j2 K4 ?( d
  15. ( U9 m/ Z% \. L( Q4 E6 o
  16.         // Переход в агрессивную фазу6 Z' E4 V& ~, O& I. z
  17.         monster.setState(new AggressiveState());
    ; j4 w( t# u: F8 ]  K/ y* z
  18.         monster.executeState();, H7 Q! M3 b1 v  R# q* z; z
  19. 7 d$ b% `# |/ O( e
  20.         // Финальная фаза; w  x6 H: r7 p% f, l
  21.         monster.setState(new FinalState());* e8 ~; e4 M& P+ |
  22.         monster.executeState();2 A) c+ l8 E2 h
  23.     }
    % p/ I) m8 M0 \) V
  24. }
    : T4 f( |* n$ J4 d4 n
Скопировать код
4 @+ Y) u" h8 B, a3 |; T
Комментарии по структуре пакетов и классов:" X7 [& K6 D2 _/ \! `, Z( O
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    8 \0 F, e+ F: m+ [1 J- a0 P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." E2 c7 \" h1 N: S- E! j4 k
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
7 A5 p9 U* c2 z! Q: Z5 o4 o6 t9 v/ y2 q$ j; T: j' O

& E" W3 J* Q2 C) y$ K7 P. q: @) D- N  C' h3 @
. f4 J7 z  x; p  b4 Y3 c

9 s: |0 ^* z$ f1 S0 P
3 C& x  k- ~  ~) f+ e
' h( Q, a( d& l0 G: `
5 R! F/ p, e  @" W& ^6 U% N1 _2 G, ~8 J! E! {+ t6 e
4 O; V* f- X2 b$ C5 Q
% W* p- o0 u' B2 W0 w
2 h7 F8 u  g3 S( k

: d7 G' X, G$ E  O$ B6 P$ F! A8 `! f1 j
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
, W& \  I4 r+ ?  |' i+ wДля управления сложными взаимодействиями, такими как  ...
" g- R/ r% }. E
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21, }" `  F5 l7 O# Y$ p
Отличный подход! Использование шаблона "Состояние" де ...

4 w& V  q8 o8 \  {- HХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.! g5 E9 c6 f: t* X8 @- W! Y

" T4 ~8 Y9 |2 q' b& G" GШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.' F9 f3 z- z% O$ p

4 I% E. c) V2 [. R% p: W: O
  1. // Пакет org.l2jmobius.gameserver.model.actor
    2 A; `! x, f5 u
  2. package org.l2jmobius.gameserver.model.actor;( _) D6 c  {+ \* ^- x2 D" x( M

  3. 8 C- P" }4 ^: q% o
  4. // Перечисление для типов атак
    . I9 v; j; H4 b5 ?% j
  5. public enum AttackType {
    $ }2 Q0 l' l# v7 {1 v" b
  6.     PHYSICAL, MAGICAL;, j/ M, ~2 T, i4 Z' }% k6 [$ ]+ p
  7. }2 ~% H9 U# x& I$ |& K
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.; ~% v$ Q0 `% i8 R; B" E
Обновленный класс для агрессивного состояния монстра:
/ Z2 ]8 f  v! R1 \- H! y5 y, i4 H) @* V6 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & Z. Q4 J/ I7 c1 O/ T3 C/ I
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 O2 c3 O+ a) k
  3. 9 B9 i4 a* K% n1 T
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " H. a4 X$ U5 Q3 Y: U
  5. import org.l2jmobius.gameserver.model.actor.AttackType;7 \* H, j# `1 k( X
  6. 6 L4 Z4 h, `; f
  7. import java.util.Random;0 Z- R  p+ o+ V! V

  8. ( C4 F9 y, o  ^7 u( e+ C. y
  9. public class AggressiveState implements MonsterState {
    2 o- R1 G/ {+ N. _
  10.     private Random random = new Random();
    ! y5 U4 E; c9 X' s6 O, h
  11. 3 W5 w/ P; y* O# M: V3 M
  12.     @Override
    5 @/ a9 v0 {: H) K7 t& w
  13.     public void handleState(Monster monster) {
    3 \4 _7 d9 k& W' E
  14.         // Выбираем случайный тип атаки: физическая или магическая
    % d- V, N/ t) z1 [8 X8 [
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ; i. Q5 u2 T5 Q6 m
  16. & j$ _7 q  ~; l8 C: e
  17.         // Логика для агрессивной фазы боя
    ! @- Y/ D& X* A# I+ H, q( K
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    " A5 {; c0 _& x+ N; Q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");+ j- X- ~2 S! W9 h% B/ H
  20.         ! p/ E1 {, d5 N" G# Y7 r0 P
  21.         // Увеличиваем силу атаки в зависимости от типа атаки  y3 O( Y$ O2 ~6 M: S5 X
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    6 P9 w9 F4 d' \7 C- }8 P& H
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);* v2 a) _; T$ R5 P
  24.     }
    0 H* `; h( c% K" F# L( i% |5 v
  25. }
    ; V! _' T. }) y
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. |& s7 Z7 ]+ J9 a  |- Z. H3 X3 [0 m/ V* [( Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 y4 t  o# T0 u8 F( d; T0 i
  2. package org.l2jmobius.gameserver.model.actor;. D( K3 J! ?/ N( \: M' l) g1 F
  3. 6 m9 ^1 J  N0 t- t/ `
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;# N! h0 C  A1 m" \$ u$ p" \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;8 x: y, M8 S( F8 R4 F
  6. * {3 s, F0 l, D5 R( `. s( l, ^6 R
  7. public class Monster extends Creature {! m9 |4 y1 k4 a  U- o+ w
  8.     private String name;
    ( C1 s: n8 X: v7 ]6 d% m
  9.     private double attackPower;0 |5 n- z/ Q3 C, O5 a
  10.     private MonsterState state; // Текущее состояние монстра' n9 S$ G; L) L

  11. / ^2 F9 |( e' _6 A5 Z& S
  12.     // Конструктор монстра8 a& n+ T- B* {9 [1 N6 s  J" n
  13.     public Monster(String name, double attackPower) {9 ~( o$ u+ S, D& M7 Y8 ~0 m2 [  h
  14.         this.name = name;
    * f# K- I; e/ \% z4 I
  15.         this.attackPower = attackPower;
    6 Z7 R5 `7 g5 q! ^  E+ i
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    / v' K8 G2 J+ ^$ H4 Z6 j6 E0 G; \, \
  17.     }& {8 w  O; [& ~5 v. v& V* Q2 ]

  18. 9 Z) [9 f6 a3 {# x2 t- o9 q6 g
  19.     // Метод для смены состояния
    ) e6 C" i8 g$ G( |# F) O4 w4 w
  20.     public void setState(MonsterState newState) {8 x* Z" a5 `% a. S7 A$ K
  21.         this.state = newState;. F" Q  `  }. z5 y9 D: |
  22.     }
    8 n6 K! A: K; c$ _3 m
  23. 7 s: r7 q0 Z2 b' @( x7 z9 m8 _
  24.     // Выполнение действий на основе текущего состояния
    1 u' V1 W( h! f- _' b, B
  25.     public void executeState() {
    / B4 I9 m- o9 j( R
  26.         state.handleState(this);
    & Q& e4 e- f6 @( s) n
  27.     }
    2 ~$ U# ^8 X  a, C2 z

  28. , g% U3 ^% W$ S2 `( N) T
  29.     // Геттеры и сеттеры4 E  A0 Y3 F& I# W/ i5 V( v
  30.     public String getName() {% o% U% G' l* h9 \
  31.         return name;
    % `2 q. P8 p7 r7 L. F) D) Z% Y7 x
  32.     }) v0 M2 P; w/ `/ v/ h/ v8 n/ |

  33. % |6 {, }7 d2 {# L# U$ G
  34.     public double getAttackPower() {
    ( y7 R2 d) [% P
  35.         return attackPower;
    0 t' n( R2 q8 h4 g$ P; Q
  36.     }: A6 e2 R6 Z6 i! e9 ?
  37. 1 F( C- C, A* B, C6 @  \2 G
  38.     public void setAttackPower(double attackPower) {
    6 S: m+ B1 q, d) h' f* G
  39.         this.attackPower = attackPower;! L( [& l* W6 L6 E6 C0 \
  40.     }
    7 d+ W, n) i4 P6 B4 v3 k! P3 z
  41. }
    ; {: M' J9 k9 n* ^7 V, w& p
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.# q, C$ P# O+ T% a' A, i0 g% C

% E; w! N1 P. ^/ J6 l. n% @& [. l0 p7 V; }
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 X: |/ `5 ^" V6 l3 t$ g
  2. package org.l2jmobius.gameserver.model.battle;
    ! \6 c% |& C/ s2 n' `

  3. ; ~. F) c: W" _. v2 a2 u
  4. import org.l2jmobius.gameserver.model.actor.Monster;( w+ Y; e2 q& L+ o; w; S
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 @0 s8 i- C' I. _
  6.   H) j3 Q/ l0 a0 O5 ?
  7. public class BattleSimulation {2 r4 z. _! ~+ |) _+ B
  8.     public static void main(String[] args) {3 l5 S0 d9 d8 [# S. Y( x
  9.         // Создаем монстра
    % |# k9 x" X. {3 ~8 k3 I$ O
  10.         Monster monster = new Monster("Дракон", 100);6 J( N0 z) a. _9 d2 Q2 f9 F; V
  11. 3 V( N) v' i7 A0 y0 L# B! K8 q
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    $ ?( [! Y/ }+ p- \/ M! g
  13.         monster.setState(new AggressiveState());
    , J% k0 R9 u4 _' n2 c' Y
  14.         monster.executeState();6 v$ i4 ~! O5 ~) l3 {4 B
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак! \; d/ S- L# s
  16.     }
    / B0 j& l* m6 a& m0 u9 H
  17. }0 K5 Q. T  A2 R! o0 _! T
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
; a. [6 X! y! R5 P6 _# IЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!' m, K+ ?2 a0 q/ _) Q: ?/ `- L

: ], w% U( @& i, M! `) _- v
% D9 h& z% d- F+ i' R' s/ V, K  G! ]4 x5 O; x' Q
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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