Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
/ C2 u+ l+ v) r1 H( Q2 N
: k5 [* \5 s, X2 c
6 G% o6 i, Q* L* }8 `) w
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
+ g4 f! n. l+ r/ xЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 b& v$ l; i2 [8 {# Q1 N& A
Астралия ?, N' f7 U' A/ M( D9 ~+ |' I
5 D, P: ^. B# U

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!; g  L4 U0 c  B
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?4 \1 v7 F; F5 e9 }) d. A8 l) v

# U9 T$ ~6 Q( b0 y9 S9 y: C0 o
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 / H/ z- d! Z8 \$ J# k
AlexCoder опубликовал в 2024-10-16 18:31
$ ?( O; j( E* NДень добрый!
2 _# v: {4 a! x5 T* mВ статье описано взаимодействие игрока с N ...
  Z% C% `4 Y7 D8 I( L7 o) R
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ C: X" U+ M6 s1 d
+ Q0 t6 \" t& f) u( ], I9 bЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра." W' F9 u' E" u# J9 [

2 i$ S9 y  V! @+ M8 C7 ~& dШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
8 p1 i3 R& o; p8 o: X4 l) `5 [$ \- c( S3 L) |0 p9 m
  1. <font color="Green">// Пакет для состояний монстра</font>
    - a: |+ }* b4 P
  2. package org.l2jmobius.gameserver.model.actor.state;# r: |) q1 W5 j) z( X
  3. <font color="Green">
    ; _" y/ c" D' q8 e; f  ?
  4. // Интерфейс, представляющий состояния монстра</font>9 N: }4 d1 K! O- M$ V5 ?
  5. public interface MonsterState {+ O( x$ `" i1 S7 L" o& n# |
  6.     void handleState(Monster monster);, |6 v: ~3 p, a# S
  7. }
    4 r( c3 o2 c1 Z) M
Скопировать код
6 \2 `" A/ z5 D  u$ k
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 D8 {% C% h* I* f3 Q- A* f8 Z$ l& g7 Z' G: t
Класс для начального состояния монстра:
0 u0 W% \4 m- U8 c; ~% H2 }  t/ a9 c
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    3 g  Z! ]; n3 @  n; n* w
  2. package org.l2jmobius.gameserver.model.actor.state;
    + m8 D7 u* w# f8 j" f

  3. $ G4 A) n& Y' R: K% W. c0 O
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 v/ {+ I7 O3 k/ s5 A

  5. 2 ^( D8 n7 M0 I, B. ~
  6. public class InitialState implements MonsterState {
    1 F4 ^. o: y0 u
  7.     @Override1 }" R& ^5 Z: E4 J0 {1 J$ u0 \7 ^( g
  8.     public void handleState(Monster monster) {8 {, |3 e( s/ A! l" s/ R" U+ G
  9.         // Начальная фаза боя
    ' S, z! ]8 U3 E7 Q( |4 c7 i7 a
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    % ]5 [" g/ H& S0 ]% z* ?
  11.     }
    ( b# x! i5 N: a5 o
  12. }
    $ h: r8 d/ b- @% G% l2 p+ F) C
Скопировать код

5 V5 e5 X& Y8 ]5 d5 \% k' z5 F. w( |1 S+ V

: e% e" E: n1 o/ s! S
' Q' K+ F6 r: v
( u6 n! ^# z% F1 u9 X0 B, s- [' i
2 e4 E" }, e7 \6 O4 o( ]( k8 C  }+ Q/ B0 s9 U; O. s; \2 H
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- Q. l$ [# i) l5 m8 X& z9 ?6 Y$ T, D* Y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.( ]1 c, J: G5 }* r5 r0 |

4 _3 ~3 H6 I$ E) q4 b$ ?Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 E2 G' O! |3 }1 J* Q

! G2 b$ `+ m9 q8 b
  1. // Пакет для состояний монстра
    0 L4 j! }, _8 P* N
  2. package org.l2jmobius.gameserver.model.actor.state;
    4 P# X" P1 h6 v
  3. ' V8 ^  v: J. c7 p2 P
  4. // Интерфейс, представляющий состояния монстра4 l2 X3 D% I! x
  5. public interface MonsterState {
    % O* X1 k9 s8 W3 [
  6.     void handleState(Monster monster);
    0 l7 {- u1 V  W& I# L
  7. }
    3 C- r" V# k6 @6 R! m
Скопировать код
* v7 F* }  F5 W$ w" d
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.   @1 r5 V4 |  ?

* d8 U/ n# e! A* h+ NЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" w& _3 v; q5 |  Y0 h  x5 B0 p& q# u% J; S
Класс для начального состояния монстра:
* E8 F1 x6 a0 a" q# y) o' x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state- `* E0 z) v1 z8 E5 I
  2. package org.l2jmobius.gameserver.model.actor.state;5 @1 N  j. ^+ \! H! _$ p3 N$ H

  3. $ h+ r4 x# o; V# Y( i
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 n* x3 s. ~7 S# g1 |" ~
  5. 0 n/ r% ]" p+ j5 {3 a: T& S' Y
  6. public class InitialState implements MonsterState {+ A3 n6 `! c1 `, w8 R9 L! [
  7.     @Override5 @) x4 i! H5 O# @+ s
  8.     public void handleState(Monster monster) {! N. b4 ^) G% q" Y5 N6 O
  9.         // Начальная фаза боя$ h* z, `  \. |: k
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    . ?4 m" P1 K# Q. L: O4 a: z
  11.     }" o: ^" G; M! _0 t6 m/ M
  12. }
    - C9 u+ P6 P  y( {1 W' O  ^
Скопировать код
Класс для агрессивного состояния монстра:
3 u- [! M  I' C+ u* q. K
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 F& I0 r% R! L5 O3 Y$ k+ }
  2. package org.l2jmobius.gameserver.model.actor.state;2 c% E; v2 u" X! b/ f3 n
  3. + v) a( x8 `; {5 T) ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! U/ z* l3 i3 Y0 d4 ^+ ~8 J
  5. 0 r; W- |8 T: C3 c( m
  6. public class AggressiveState implements MonsterState {; F3 z& r5 G6 q
  7.     @Override! f" U7 s% }) ]. m' u! [' B4 B6 h
  8.     public void handleState(Monster monster) {1 Z! Z1 V" C! O9 h2 `( b/ D
  9.         // Агрессивная фаза боя; B, \$ h$ Z/ m5 g) J  f
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( ^5 Z) @- r! _. h. N/ g9 A# a* P
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    " H  J; ?( I+ L! d
  12.     }
    ' N3 N/ A: B* l4 ~3 ?) [$ _
  13. }; w/ W. L, g& S4 u
Скопировать код
Класс для финального состояния монстра:! }9 f1 k) \% A5 D, a
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 T3 n/ b; `7 p
  2. package org.l2jmobius.gameserver.model.actor.state;- B* o8 ]. A- g  h9 g- s$ k
  3. * \, k5 V, a& Z4 }; s. k5 v4 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ) C0 h# l2 I/ @# z5 |$ ]

  5. ) m9 c; }7 K1 n9 B. e/ y3 R
  6. public class FinalState implements MonsterState {* q/ c5 N! p- F- Y$ D3 H9 T
  7.     @Override+ m' m* E+ O  _
  8.     public void handleState(Monster monster) {; f9 c+ @4 ~+ ^0 w0 L4 _& w
  9.         // Финальная фаза боя% H& P7 V; Z- Z8 a) F% N
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");$ h7 X+ u* N% X3 p% w  R( Z1 {
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    1 _: i5 y# b& W) k7 r- C/ k
  12.     }
    ' P. N6 W7 D) Z: \
  13. }9 ?$ U3 L+ [. e- i; Z8 v2 q" H' ^
Скопировать код
" Z' A8 k' B( b6 V/ r6 K
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
# ~9 C* R5 {2 w
  1. // Пакет org.l2jmobius.gameserver.model.actor! D, o# a+ a8 M/ h* x. d
  2. package org.l2jmobius.gameserver.model.actor;' u; s) W, i/ D$ \4 f" s: g
  3. * u( [( K( o2 Q4 u8 j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;; `" e& i+ v! N2 E5 F' t; P
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; i0 q0 n! W# v) Y: i. _2 g
  6. 6 M% x( q4 ~2 L5 l
  7. public class Monster extends Creature {
      ~+ }6 \; `( Y0 T  g
  8.     private String name;
    3 c5 d& V/ o2 W7 g/ {1 ~" H
  9.     private double attackPower;
    : P  g% U3 }1 n8 J# y0 E8 J
  10.     private MonsterState state; // Текущее состояние монстра. m4 T6 v- N6 a) j
  11. ; h( t2 j4 F+ O. R
  12.     // Конструктор монстра8 O% x3 U' `% x; u% v
  13.     public Monster(String name, double attackPower) {
    $ X+ D4 ?% N/ U$ E/ ]5 t+ V- y
  14.         this.name = name;" B3 H+ G- y; a" L( D
  15.         this.attackPower = attackPower;
    2 c  h8 M% Y# Y4 [3 j
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние9 `; F1 P# A. Z8 Y
  17.     }1 N9 b5 `. `: i: |0 _
  18. / _% |! i0 k4 @- ]  x% }
  19.     // Метод для смены состояния
    # D3 a; \6 j9 Q# R5 Y" |8 {4 f; }
  20.     public void setState(MonsterState newState) {
    $ t* Q3 ?: o/ e% x  S" ?
  21.         this.state = newState;9 e" E) s7 }3 j0 y& w
  22.     }
    4 U( |' c! P1 G; t, ]- W# D
  23. $ e: r- f4 P; g8 p/ x+ f' K
  24.     // Выполнение действий на основе текущего состояния6 c* V; `  Z! h7 }( a4 F
  25.     public void executeState() {6 s3 _# ^0 a4 ~# w, L2 q
  26.         state.handleState(this);
    8 d; V' D! V# g6 _' l
  27.     }
    & F9 M9 S7 g  b% G$ A: w- h

  28. 1 M6 S; M. f6 u
  29.     // Геттеры и сеттеры! U/ D+ A# J/ i" D7 j
  30.     public String getName() {' `+ }; }: U( @
  31.         return name;( C3 N) V. y8 f' J
  32.     }
    3 G4 ]5 B+ ^6 y( Z6 i1 k( L5 w

  33. ) F8 V# v1 P9 j% r7 g! q! d* n
  34.     public double getAttackPower() {
    1 G4 ?) S; ?6 L" Y  g
  35.         return attackPower;" y" z. I4 [( D
  36.     }! x% I5 a$ x. w6 R4 S1 A' z% A- i
  37. 3 e  u7 y( R* }" t! w+ y! u# K
  38.     public void setAttackPower(double attackPower) {2 @7 O+ d: I! t8 }  @
  39.         this.attackPower = attackPower;4 Y1 R# w# V# x7 H4 b; b/ X  J: I
  40.     }& J: y& \7 [. z4 e% ?( Z
  41. }; B8 L/ q$ r1 }8 t8 G% J) I
Скопировать код

9 q2 ?" q* Q3 k8 @7 {Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 w" X4 z! K0 {) g- d( F" n0 e9 q" r" r
  K; t1 _' y  g2 A$ [1 D
  1. // Пакет org.l2jmobius.gameserver.model.battle5 f; f. ?; d: I9 {, @
  2. package org.l2jmobius.gameserver.model.battle;' _7 j1 s2 _$ Q! _9 ^( k$ V3 D

  3. # A  c$ M  I3 N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % t6 K3 S1 C5 x- D
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    1 g$ Y, s' {2 \$ O) V& W
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    * Z+ B) v7 ]$ i& s: t" I) R$ m$ E

  7. * K& ~8 O: ~9 l
  8. public class BattleSimulation {. @6 L8 e! S9 O# N# G# f
  9.     public static void main(String[] args) {
    / I' t2 ?" L( h% |* ?
  10.         // Создаем монстра с начальной атакой$ q1 O' j! w3 w* e+ I6 O! m
  11.         Monster monster = new Monster("Дракон", 100);
    . \" t2 M3 ]3 ]) Q0 K

  12. 1 ?+ @1 U0 a# r. P. W! M
  13.         // Начальная фаза8 m! r8 Y: P# Y; e# f" Z0 d% C. f
  14.         monster.executeState();$ p: L; G& ?4 P5 Q1 l# d+ Q

  15. 0 f1 N/ o; x- \$ w/ [
  16.         // Переход в агрессивную фазу$ d' y/ n4 F" E& s3 o9 C) C* v
  17.         monster.setState(new AggressiveState());
    2 L- D$ |: ~% T7 l2 [% K
  18.         monster.executeState();4 R- w$ i5 V! \2 }4 [# D7 Z( W

  19. % O) Y7 d. r$ i$ M! ^7 R& J
  20.         // Финальная фаза
    " T: {1 l- H7 U+ y- G1 B; V' ]
  21.         monster.setState(new FinalState());7 g/ e6 i2 _1 d
  22.         monster.executeState();
    ( |0 S, i" P" r/ k6 b4 y
  23.     }# ?, ^* u& Z, c4 ~6 c7 @
  24. }; E# g5 d6 F' {, y1 U* j
Скопировать код
0 ?! \* W2 O! |1 n
Комментарии по структуре пакетов и классов:
3 ?9 C, O! }6 N& C: u9 U+ c5 Y4 R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    , @) X( @- [* d9 b8 |5 W0 d
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.% L! B# g2 Q: y9 r8 |
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!, j5 V0 t" C1 W1 L

( i/ j) D, y- z* s" w1 Q5 v, @; C+ ~: g- t
, d% G7 g) E1 X. [7 L/ g% x

. F# U/ G" }/ `8 j& |
7 h1 J4 ~( D$ N2 [2 \# o- W- S. _" E/ D3 C: s+ O9 d9 o$ D
7 j: I* Q: A3 p6 g' V! Z6 f* p

/ p7 `2 e  q9 s6 k# ^- Y) l% v! ]; m" [! g6 F; d
6 R. ^' L# r) Y; a

6 @2 i& c/ B4 b5 @7 `9 k0 N% E, h; h' P$ F/ @$ s

$ q/ L& U9 v8 u/ J3 S3 T0 L& Q3 l7 O$ @; [& g8 H3 N- U
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04% {' \% {9 ~, e" s1 [: Z( C$ b
Для управления сложными взаимодействиями, такими как  ...

) m* p3 e2 \2 h4 ?8 @3 pОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21# V5 w: _1 ]' [0 \& ]& v
Отличный подход! Использование шаблона "Состояние" де ...

5 M2 K$ E# P! `) i2 |. p. L# _Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
+ F# i7 K' T" r. e9 x6 [0 n/ ~2 b4 G/ N2 k5 B" v
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
8 \3 L+ [) w. f. X; U+ s1 X( L! A' j, h
  1. // Пакет org.l2jmobius.gameserver.model.actor) q) k: @8 Q* \
  2. package org.l2jmobius.gameserver.model.actor;1 w7 m- i0 V, i
  3. - Z; R" J2 i' @) e6 G4 t
  4. // Перечисление для типов атак9 O4 I& t* D1 s2 }7 X: q. u! T
  5. public enum AttackType {! P( u" R& f" {
  6.     PHYSICAL, MAGICAL;
    6 `  w$ |/ g/ ?
  7. }
    5 ]) S. U2 P5 u0 B5 n& j6 F1 @
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.* Y5 t1 x/ [3 F
Обновленный класс для агрессивного состояния монстра:
1 \' V, |" j. f; L0 ]
5 g5 V+ o: P- z" T" r  n- P
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ v. O4 y5 o# j# R5 C( J
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; O0 o2 M, B  b& U' _4 l
  3. % O) ^( r# f: x- O
  4. import org.l2jmobius.gameserver.model.actor.Monster;' C$ T% U6 g5 D5 V& j
  5. import org.l2jmobius.gameserver.model.actor.AttackType;2 M! y! v1 l6 b) }
  6. % N$ [& v. c6 D6 \) t; U
  7. import java.util.Random;
    - n7 Y9 B# z3 T) t) j; f' ]

  8. 3 W' z! C3 _1 ]( D( ^) x$ d
  9. public class AggressiveState implements MonsterState {
    ; S1 v. K( U" ^! d" G( [  u
  10.     private Random random = new Random();
    - g4 [2 X4 _8 {% \. G' S- k
  11. & b7 }/ M% Y. \/ |
  12.     @Override
    # A# Y& O$ I8 h
  13.     public void handleState(Monster monster) {
      X) Q- f( r: p; A5 O: u* C
  14.         // Выбираем случайный тип атаки: физическая или магическая  Y1 V2 \& w1 `* a' a0 @  j
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    / b. R6 f$ `  o# M
  16. ; S8 }: E4 e% G
  17.         // Логика для агрессивной фазы боя
    8 W4 p: _. A) m9 b- c
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " # e% z' o: y, P$ @) X( O
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    - |! i  H" y" D' ]' k7 x
  20.         ; F' [0 s% u; M- V) C1 F2 ?
  21.         // Увеличиваем силу атаки в зависимости от типа атаки# @  y/ O) L% r0 `. `
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    * ]  q& n, [# G$ P  d
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);4 N0 y( d, J5 ~2 K. j
  24.     }
    + E9 [+ u$ e% u9 r- }/ |1 n5 m4 G/ b
  25. }: k5 [$ d7 n. T* f& t$ x( b
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки9 l* p* _# A) s! L+ Q) Q

- E( Y# ^% f& U: O
  1. // Пакет org.l2jmobius.gameserver.model.actor' T3 R6 n# S3 O- N1 f
  2. package org.l2jmobius.gameserver.model.actor;/ d% v' S* [; k, z
  3. 8 m) }, X) ]4 W  [
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 U- ]) t1 X; n% S! e2 l9 K" j" ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;5 `3 S8 k$ z6 W7 I4 ?5 p; H
  6. 0 b6 `+ g; v! F* K# k
  7. public class Monster extends Creature {1 n3 ~, k( P( G# {4 _
  8.     private String name;
    # ~" e+ I% q$ T8 z3 S
  9.     private double attackPower;
    - Q3 |% ?" U8 {# }
  10.     private MonsterState state; // Текущее состояние монстра: ]2 I1 _% K; f
  11. 2 E8 O! X- D: u  r. V
  12.     // Конструктор монстра
    5 B$ Q8 y8 n* K
  13.     public Monster(String name, double attackPower) {
    3 ~- \$ ]% h6 ?) c9 [
  14.         this.name = name;
    * L& H1 ]* G: T* }' K2 @4 y
  15.         this.attackPower = attackPower;
      \! \# R- }0 `! Z9 w: s
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию! `; B& V6 q8 S9 I4 \7 ~
  17.     }
    * G4 c% q# ?3 {% i
  18. ; M6 D' y) t. O9 z! D: F$ o, `2 o7 c4 P
  19.     // Метод для смены состояния
    # [9 d" r* ~" h
  20.     public void setState(MonsterState newState) {
    / H& S# c; ~* K
  21.         this.state = newState;
    % S' U2 |+ G+ J% J( \. ?% [6 o
  22.     }
    - p) h- |1 q$ [1 N
  23. / w5 J$ Q# s* B, q! v. E
  24.     // Выполнение действий на основе текущего состояния1 R* [0 |5 _3 H' O1 ^( x
  25.     public void executeState() {
    # K+ E9 r$ k' }: k  k; x% u
  26.         state.handleState(this);/ _/ H# B6 Z" T; n( m  V5 H
  27.     }9 [4 y! e8 Y! v/ }4 S4 o' n

  28. ! y: s1 v$ R, Y! i" b" q  ~
  29.     // Геттеры и сеттеры
    9 M# B( Y& ~( e9 ~3 G# j9 O
  30.     public String getName() {
    $ Z2 w( P# p& b% x9 J
  31.         return name;  W9 g/ t+ G" f/ v( K3 V6 K# {# |; X& S- x
  32.     }7 w8 i" Q0 R( k7 X5 \' m
  33. , I2 k! y/ J# q+ |8 x5 @
  34.     public double getAttackPower() {
    $ M, A6 a# n* S/ @6 N. e
  35.         return attackPower;+ O& q. W7 n2 f7 b
  36.     }
    + K1 V% w9 h7 c! \
  37. * F7 W# s! _" n$ `+ y
  38.     public void setAttackPower(double attackPower) {/ P- |* M/ l# ^
  39.         this.attackPower = attackPower;
    4 n9 z, r$ j) U+ C( c
  40.     }
    + Y0 r$ M4 X# Q$ y6 f
  41. }- Z. ?- S$ b; t8 v" q
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
9 D+ L& |5 c* \6 |0 h; k0 S' P& g2 t: A* f6 g7 ?. p! n4 G
  1. // Пакет org.l2jmobius.gameserver.model.battle/ F. D- t' G4 _1 _8 e
  2. package org.l2jmobius.gameserver.model.battle;
    9 n8 @. n# X: a8 s, {3 w

  3. - e+ s% M+ r5 B" ?0 [
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . H% X" h; G; [" t# X. |* y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;6 y) e/ P! Q* G* v  E& ]
  6. 1 B# @9 W0 M" w5 Y
  7. public class BattleSimulation {
    : v! u! f$ @" c  {4 q
  8.     public static void main(String[] args) {
    ( |8 W5 A1 V/ Y
  9.         // Создаем монстра
    % O* Q. ]) c2 U  r6 I
  10.         Monster monster = new Monster("Дракон", 100);
    $ {2 e$ `  J: l6 t5 p/ J

  11. / {1 o2 Q& O1 ~+ j: }
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак4 E' f; Z+ a; X
  13.         monster.setState(new AggressiveState());
    6 w/ g  u8 p# z9 ?( q; H& }
  14.         monster.executeState();
    5 G# x+ s, M# I4 d' j
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак7 B0 H5 s: e7 H3 d+ W; n$ m. a" r
  16.     }  h; U, F* d! j/ M
  17. }
    / R+ v( H3 Y) L1 _
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.- G# G0 D! A- {
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
. `  h1 Q7 Y8 N; W
5 I6 e7 |- X) l& k8 H% K# q- H* B8 j8 V# b* u
, |7 C6 X5 R5 P. z5 A6 p
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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