Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
. F7 P0 w0 B9 k) i! {. f% r5 m& ^

: m9 |2 A1 G0 B: kЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
* N( t4 J+ [1 v6 @4 m! k0 U  Z) c7 NЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
/ _; o) q1 X6 l# u$ w  s- \Астралия ?, y; F$ J6 \) o
' m. j8 V* ~' c. J; ?

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!2 u) y) V# S$ E" a" }
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ l* V  N/ Z6 l
  J, R& x/ a! c: C. o6 Z
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 . ]; R& e! V8 M0 b  J6 T
AlexCoder опубликовал в 2024-10-16 18:31! l  L7 M  r( v# ^5 ^. X
День добрый!' y) m7 U" Q5 S. W
В статье описано взаимодействие игрока с N ...

! N$ x" h! F) r) m' j0 ~$ F7 |Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
- d4 z* b0 G1 ~  R- U1 T- S. [
. S4 g- m8 m  q5 BЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 W/ J5 G- Y- x9 ^/ Y3 R! D& ^/ f
. D" k3 \3 d; Y' \& y* f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& L+ d7 y, Y. G' d) R$ a; l+ l  U2 w' R$ D
  1. <font color="Green">// Пакет для состояний монстра</font>6 {- n! b5 J6 e
  2. package org.l2jmobius.gameserver.model.actor.state;
      X& n# A7 @0 z4 z6 F& E
  3. <font color="Green">4 [  H& ~# c  X% e5 i0 i; O
  4. // Интерфейс, представляющий состояния монстра</font>: N9 a9 r9 u6 ^
  5. public interface MonsterState {/ f( }" I" t. q4 A$ x
  6.     void handleState(Monster monster);
    ! W' q9 }! R3 V# m, o0 A& H0 a' o
  7. }
      @- \1 `, @. E# e4 \/ V
Скопировать код
. w9 B- m8 |9 L% [
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 _6 W  m' \" M' S
/ `# g( g6 o; c4 b$ U9 rКласс для начального состояния монстра:0 `" r5 i; V# ]7 ?, A4 N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>: d$ t7 V' q0 Z# w- `) x. k
  2. package org.l2jmobius.gameserver.model.actor.state;6 F$ ^1 N4 _- ~' ]6 A
  3. 4 @2 h& z3 L/ _$ j# j
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; o1 m# Y! H" v9 S! Z* a, y# c' t
  5. ; R+ X: C- G0 t/ g, e$ f$ n
  6. public class InitialState implements MonsterState {
    9 Z1 ^5 @9 b5 o
  7.     @Override5 p1 T6 F8 W( c) S; i8 ]: ~
  8.     public void handleState(Monster monster) {* R$ w* O) G% R0 N
  9.         // Начальная фаза боя
    & Y$ T9 l- M/ g* x
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");: m, e7 @% P" }" [3 v
  11.     }: r9 l9 q# w6 C7 n. Z. B! s5 ~% ~% h
  12. }7 D) r: l3 _  g- t
Скопировать код
& v: f7 q" |9 ^& e8 g+ u) a# [( U

1 h1 k8 ^- k+ s+ M9 @0 h* b$ u! Z# l$ O- J  L# p( c

( ?' U% s: H& A. i0 K1 D
- }1 A4 @  T) ?8 U! p+ [) ?9 c  e' d% A' S/ {, u* x9 {( l

6 f+ O9 @4 H" J" H- f8 O
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' A- T$ S1 W7 x# a' t9 b
+ g; p5 E$ o  z% S4 Q' Z0 c9 m& R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  D2 @' Q' P0 m) ?. L9 N& z8 H5 I+ ?* W, w' F
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- ^0 R9 }0 I' {- X; m: ^) P

$ V( _. N9 E- a" p1 M
  1. // Пакет для состояний монстра6 P0 P8 D! W' Z# w. a5 ~( {
  2. package org.l2jmobius.gameserver.model.actor.state;
    6 s- N: ?) k1 K

  3.   g- m; ]& r6 \% X' \7 R" D! x
  4. // Интерфейс, представляющий состояния монстра
    7 V, ?4 `& C7 e7 m
  5. public interface MonsterState {" {( W1 R! Y3 N' ~
  6.     void handleState(Monster monster);" C8 T' q' Q/ |: I  N
  7. }* Z0 b  Q% D# d, k5 H7 C1 t/ L" ]
Скопировать код

0 o  i, X7 W4 x' `  m( H( n3 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 d7 i. q6 Y/ O; |& E  u! |% X
+ `6 U% A: M5 [9 r+ ]5 ^8 l7 jЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# ~' d1 ~  u) L. G+ m% u$ u
, k, S2 ^0 d4 p* C0 d$ fКласс для начального состояния монстра:
4 F" Y7 @2 l! M7 s) O: o( }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - J4 d8 M. l0 e% c6 i& u3 R
  2. package org.l2jmobius.gameserver.model.actor.state;
    - J8 {+ |2 T7 P; P

  3. . K+ o. C! x; p1 n% H- o( W
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * p' e; {* H; H$ @
  5. 9 F  Y9 s  K% G1 P  e4 o
  6. public class InitialState implements MonsterState {
    & D; p& q, Q" z
  7.     @Override; Z4 n6 y% o. x/ o% j
  8.     public void handleState(Monster monster) {( n3 }9 A$ k; N/ s
  9.         // Начальная фаза боя% L0 ^, `3 C! y+ [9 r! W
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 ^$ Y1 N( S0 A8 C. U
  11.     }' _. _7 i' H8 ]. k+ W: U3 _" M: H3 I
  12. }. k% h8 x% _2 ]
Скопировать код
Класс для агрессивного состояния монстра:
+ Q; A$ A( r0 X; i& |: r1 s  b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state1 E4 ]) b0 o" K; L* r% o
  2. package org.l2jmobius.gameserver.model.actor.state;
    & [; Y7 _: L/ h

  3. , B. @# V- ~3 w) }* n
  4. import org.l2jmobius.gameserver.model.actor.Monster;- B* [. }8 Y9 ~7 ^  i0 M' G: R

  5. $ q6 U; T; }: E1 s0 K+ N
  6. public class AggressiveState implements MonsterState {& G7 o1 }( d: S
  7.     @Override
    8 ~4 B( b: ~6 u- @/ c
  8.     public void handleState(Monster monster) {
    + L, [0 ^# Q; f& S3 G6 B! E. {- I
  9.         // Агрессивная фаза боя
    & A) Z: ^- Y7 Y8 A6 W
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");0 _3 Z" L$ Y& U9 v/ ]
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    - e; a. ]* y% p( T! n' T" p6 O
  12.     }; o. I; [: b% f1 ^& [# E
  13. }4 z4 E6 ]  d( M( g9 g) i
Скопировать код
Класс для финального состояния монстра:* v$ @5 r) y  G/ @$ O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 Z% q. L/ }& i) o- H
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) |$ {- a, d, w% E7 t
  3. 1 ~% K, [8 P6 d, M6 ?, z
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' Q# x: E9 u% i* e% v8 O7 {. D- m
  5. # {4 P- e& M) A0 |% J' Z& ]
  6. public class FinalState implements MonsterState {; ~  [7 X0 n+ B6 m
  7.     @Override
    ( u2 V& f5 P* ?) w6 p% D8 \
  8.     public void handleState(Monster monster) {3 ~  S3 L$ J" ^6 |5 R! n) X
  9.         // Финальная фаза боя
    3 X% ~+ `1 c  p- ?+ X
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");+ D/ {: [" ?* ^) v& r; `
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    : D- }" v3 P! _! \$ u1 \1 `
  12.     }6 i+ f3 b+ P  ]( s' n% |7 }1 F
  13. }  Z9 ]* f* m) z5 A$ R% ~
Скопировать код
$ p. ]0 Q" t9 ]
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- a, ]2 d) u* z& f: U) L1 S
  1. // Пакет org.l2jmobius.gameserver.model.actor
    # p3 |/ a' g6 |1 B9 S! n
  2. package org.l2jmobius.gameserver.model.actor;
    2 o: U# j$ K. g$ d! r. E
  3. 9 m  J- K3 x8 e9 I8 [7 d
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 D* w; t! X- P# m+ `; T6 X1 A
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    8 K# u' r( K* e6 R4 R

  6. 4 l0 j1 b8 {# j9 i' b
  7. public class Monster extends Creature {
    4 a6 i* N# f3 K* p5 A0 I2 ^
  8.     private String name;
    1 Y* V: H5 y; h* j
  9.     private double attackPower;
    5 a6 d: p1 x% |6 z# G6 N( _3 V
  10.     private MonsterState state; // Текущее состояние монстра! M1 S" C$ A0 _& m( g% @$ [

  11. ! {1 {& F8 ?& Q2 r' l
  12.     // Конструктор монстра
    / C9 q( q! M+ [" @3 ?
  13.     public Monster(String name, double attackPower) {
    : B9 P. c1 W' A, _/ _# M
  14.         this.name = name;  E/ @' ], s  k3 `; ?7 N' F
  15.         this.attackPower = attackPower;
    ( T! t/ D3 t2 U  D( q
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ( A. E  ?+ ~! ~, d, ?
  17.     }
    + h; x8 I  k: R

  18. ! f4 U- h$ x9 R# c% H
  19.     // Метод для смены состояния" Q8 D9 u( l4 Q! z
  20.     public void setState(MonsterState newState) {
    : y2 Z1 l" [" n# x7 z3 k& R
  21.         this.state = newState;
    6 i, g/ ]! D! O2 R- U/ n$ {' u
  22.     }/ x7 m% y7 Y- [: H/ j# J

  23. + o1 w/ f" @9 W$ G' k* R. p
  24.     // Выполнение действий на основе текущего состояния
    3 S# U9 N" Z' K) Z5 q6 K
  25.     public void executeState() {
    " [% q$ B- U1 k6 s8 I1 G% F" u' |( C6 `
  26.         state.handleState(this);
    * ^$ F* S) J; \# X% \2 [3 ?1 }6 ]
  27.     }
    2 T- ^' g0 ?; g( R

  28. / K8 `) ?$ `2 N$ v9 X
  29.     // Геттеры и сеттеры
    + }' R" s2 O8 Z8 V; q
  30.     public String getName() {) Z% G' S2 E& H1 K9 n/ ^
  31.         return name;4 c' K4 X' i- x' [+ c6 E2 {
  32.     }
    & j9 X' o+ n/ x5 @4 r4 p& M. }! t4 j
  33. / t$ \. }9 Y- g( ^6 _) |* x
  34.     public double getAttackPower() {
    2 s8 ]- o( u9 ]1 b
  35.         return attackPower;
    , \5 G& J! L" \3 u
  36.     }1 c  g: _; |0 X

  37. : m- V/ ~$ N1 w, ]: M% f1 p
  38.     public void setAttackPower(double attackPower) {
    " i) {* ]0 l/ x" f+ T: W
  39.         this.attackPower = attackPower;3 o5 q# A6 D& `; P+ U  @
  40.     }
    , a! N. f. h( w6 @
  41. }( T. y; o! G. M8 A3 I
Скопировать код
) }' y: `1 X1 L& e# A9 v
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 U: a- `6 g/ J( z
1 r1 I. {% L$ h3 |; G
  1. // Пакет org.l2jmobius.gameserver.model.battle. z% d. m% d3 N8 h
  2. package org.l2jmobius.gameserver.model.battle;
    ( p/ l4 T( R9 H! b
  3. ' g1 X1 [/ F9 I! v$ s) l( q! R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % ]5 D) V  g" r1 X' E8 C- X1 E
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: W) {3 ^' t0 u) u  {) M1 u" v& u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ) N2 D. `& r8 o, ?2 z

  7. 0 F4 f9 v" Q9 {' }' H
  8. public class BattleSimulation {
    ; ]7 O$ O) V/ P, X7 b# e
  9.     public static void main(String[] args) {; B; h; I" x9 W, E
  10.         // Создаем монстра с начальной атакой  d5 L) x1 e+ e- x& Z$ `) a" E$ S5 L' E/ R
  11.         Monster monster = new Monster("Дракон", 100);
    7 B* U1 J" L% c1 w- [- g

  12. & j2 R( a" ^. _# r
  13.         // Начальная фаза
    ( }% b! s0 {( C+ E& ~
  14.         monster.executeState();$ L0 u9 A! }4 i6 U& ~
  15. + z. Y( x# i# N7 H0 S
  16.         // Переход в агрессивную фазу. J3 w  n! b' X& y: n( N: u
  17.         monster.setState(new AggressiveState());
      L5 u" F* [% X0 ^2 b- s+ G6 \
  18.         monster.executeState();
    / ^  W- q7 o. B& f! I" ^6 x, [! J. d& s

  19. / X5 h+ ^' ?8 r5 K& d3 z# n+ P
  20.         // Финальная фаза
    ) \$ Y! i* |% g$ d4 F6 `" w
  21.         monster.setState(new FinalState());
    . e1 Z+ c/ o$ A$ Q
  22.         monster.executeState();6 N3 p4 W9 Z( @- W
  23.     }# ?7 N. u, b1 `
  24. }
      L  E7 F# L, F: u) i) `! z
Скопировать код

& f% R5 S& Y) s9 j9 aКомментарии по структуре пакетов и классов:' N* }& ?7 z" I2 j$ b9 A6 Y  e
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    8 F* J$ y, g& s  D8 N4 n
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.  A' ]4 X4 T2 M, u5 t) l+ r7 ~2 T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!* B4 I+ G  V* R: x
: \! r* v# n& j) y
  w; a2 M; B+ g( r! c; B
' k' s' C$ p/ b/ i. J6 t7 a' f
5 E7 }6 a5 S0 E- w9 M9 i* q

1 {8 C2 ^0 R* s; O+ a
& `5 q) B8 ?% f& h4 |* V: X/ ]) b3 W& o/ C8 q0 n
  E: u( }8 n. A  s9 O
" J+ g. g% V& n% V
- }1 ?; H: e+ i* |; w2 k
2 q- p! t8 y, D3 |/ h, O
! O9 g- E6 ?# t3 Y3 G( H

+ [5 y2 ^! J/ c' e
0 H( d4 s1 V  c3 B; Z) [$ P# F
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04. w1 N' c' J' L. f! r. ~. A. m2 ~
Для управления сложными взаимодействиями, такими как  ...
* W" ?$ \% f$ l9 z" |
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:218 o2 Q0 ]1 Q+ L' Q) X, Y1 ~) l1 r
Отличный подход! Использование шаблона "Состояние" де ...

2 {, V- [" ^: t+ A- m& WХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
& e! }  J$ p8 g8 ?, B8 g
# s' }$ ]1 e/ S  ?# rШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.1 ]1 S9 `* P* s" c; f4 H
4 v7 \/ h1 W, C  x
  1. // Пакет org.l2jmobius.gameserver.model.actor1 b  J$ s+ m. ]! J! h- h) i
  2. package org.l2jmobius.gameserver.model.actor;
    8 e4 l* `" T) w- L

  3. ( _8 E  L" G4 {
  4. // Перечисление для типов атак
    % k! v' @; e& i& I; W
  5. public enum AttackType {7 |7 J2 K* y) b1 m
  6.     PHYSICAL, MAGICAL;+ L; ]" F5 u: J' j% V" X" S
  7. }  a3 k* O8 n( ~- X! @
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
5 Z# q3 [( [* O9 U1 l9 B0 H# XОбновленный класс для агрессивного состояния монстра:
1 q( x1 j0 \1 H) t  a; I
+ w5 X: K1 a' z: H  K& _- V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      l# l" g8 h  Q' E
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 i+ X# z! {6 Y2 o- P5 M( @
  3. + v$ y; b" j0 e+ @6 V* d
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! {  z* e  k% q$ ^+ Q6 Y0 p
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    3 c3 |3 k5 F5 r$ Z8 h
  6. % y4 B$ p+ q+ J
  7. import java.util.Random;+ Q4 g8 P- q2 K: D  }

  8. $ i7 p1 {' R, E2 C; e) y8 h( `
  9. public class AggressiveState implements MonsterState {
    ; t' u2 z5 }$ P8 E+ Q
  10.     private Random random = new Random();' f8 A: {" N. z- q* r, l  I! D

  11. ) M0 E: B9 e7 b+ h& U5 }
  12.     @Override! B% _2 J" H0 N! C* F% [
  13.     public void handleState(Monster monster) {4 B  D2 L, P2 R5 r! i5 f( u
  14.         // Выбираем случайный тип атаки: физическая или магическая
    - p- J+ F. }9 U$ B. P# W
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ) Z4 q* B4 i7 r
  16. + P- `# g! f6 a" `
  17.         // Логика для агрессивной фазы боя  ]+ s( b/ B1 f. I0 z& p
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ; W8 ~0 n2 A1 I3 v3 i
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    : ~4 T- P& q1 H) f5 g) D1 l
  20.         
    ' h% A# }) c- }3 j$ H4 t1 W' y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки* }) n1 R  I: ], B, \
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;. X- m+ b( b% b) o4 G% V
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    0 `" x+ x9 b: H
  24.     }
    5 @- h, M( `5 J" Q, Y0 O8 O
  25. }" E5 P, R- j' B& f* @) o
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки" @- Y4 ^! B  f

2 Q1 R1 j, D7 y: u
  1. // Пакет org.l2jmobius.gameserver.model.actor4 W. R  b4 n. Y, O, ^. Z* v+ p! @. S
  2. package org.l2jmobius.gameserver.model.actor;
    : V1 D% k  F  J# e
  3. : v  {  f8 Q) i$ B& g; Q8 j
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    : m3 i% o9 c$ y) L2 J
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;1 A! X- {& ]$ X$ Y6 q4 W

  6. + U& j3 U1 g& E* P
  7. public class Monster extends Creature {
    9 {- ~+ C8 ]9 g! _5 L
  8.     private String name;, h; W& m/ l! S5 l
  9.     private double attackPower;
    + B6 B1 \, _2 D3 K3 g& _
  10.     private MonsterState state; // Текущее состояние монстра
    2 p  C: B9 U& `4 j9 P

  11. ) U: v6 t4 n' h
  12.     // Конструктор монстра
    # ]' k# C/ h6 m. z
  13.     public Monster(String name, double attackPower) {
    0 u3 f- w. i: C+ ~$ J
  14.         this.name = name;* d# K( b6 U$ F9 j
  15.         this.attackPower = attackPower;
    # n. Y9 g: O/ H' p
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию: l( i$ G. F. _+ e4 N
  17.     }8 x4 x' i/ t5 V1 d
  18. . S0 M8 }9 S9 n3 ]
  19.     // Метод для смены состояния- ~( L+ F) T8 O$ {" c
  20.     public void setState(MonsterState newState) {
    ! u9 O: B3 _/ `5 u% U
  21.         this.state = newState;
    ( ]) }# K2 b; L# v
  22.     }, b& I, Y' }$ W1 O& G5 w# K

  23. + V7 S) Q: L2 r9 l
  24.     // Выполнение действий на основе текущего состояния# u# J5 B+ q7 j+ ]6 y
  25.     public void executeState() {
    2 G8 w* ~7 |2 E- P
  26.         state.handleState(this);
    + |) M% o- Q; u, s; v) W
  27.     }
    " I9 r* H3 C3 m! O

  28. : [$ X% {4 V6 k
  29.     // Геттеры и сеттеры
    ( n6 s! h/ u, L) o7 S
  30.     public String getName() {
    ) x8 {( A$ C# K9 `' [% c# [
  31.         return name;1 K) ]( y! D! z
  32.     }" H5 ]7 D0 J  y5 N/ J9 L8 `

  33. 8 K& h% W  W# s+ P: K' l; ^6 z4 D
  34.     public double getAttackPower() {
    * s. a& i% ^* f& B3 H. x
  35.         return attackPower;
      h4 ~6 H+ @- A7 U' O
  36.     }
      I8 U' h' T% b1 M! U) i1 s+ }
  37. 1 Y9 t8 C! K& \# r: _6 B( a/ G
  38.     public void setAttackPower(double attackPower) {
    ' D. {7 q3 [  h: o0 I9 O; G& h7 i
  39.         this.attackPower = attackPower;
    4 k' b; i( @& o  A+ n* f
  40.     }& j$ a# i+ V5 R4 z
  41. }4 A7 \5 I5 r8 {8 g0 L. n
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе." g) S3 r' j' P
/ J; O- V; u1 N* |6 @  B
  1. // Пакет org.l2jmobius.gameserver.model.battle# B, ~+ j8 |7 j3 D, b5 `
  2. package org.l2jmobius.gameserver.model.battle;4 H$ R) r5 B0 [+ u

  3. # r" r8 }5 i" Y" v' f3 x
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " {: l0 K8 t- K- ~- `5 M
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, [, w, G! }) Y; x! s+ H
  6. % g1 a& p: v, `/ L- u( R5 T0 T
  7. public class BattleSimulation {/ L8 r% c) }; i5 Q( R* G- D. ]
  8.     public static void main(String[] args) {7 m! v$ W- {' F9 Y; o) P! q$ r
  9.         // Создаем монстра, b5 ~, M+ @! k* b: @4 _1 d3 H0 q
  10.         Monster monster = new Monster("Дракон", 100);3 U' X- ]5 L2 k
  11. 5 Q" E& t& B4 g# `# ]5 l9 l
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ( Q2 g" q) B4 h8 b8 ]$ g/ \$ M' U
  13.         monster.setState(new AggressiveState());
    1 a! i/ Z# [/ `: n; b. D* p
  14.         monster.executeState();
    4 F& U( X6 J0 v3 g8 x" y. Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак* \! a3 m4 c+ K( D% J8 b: z1 F
  16.     }% z0 j- \2 Z( q' p/ z6 Q
  17. }
    ' o2 w8 l8 ]8 F9 x0 A
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.! {  ~% z* g) _5 o
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!( v. r# ?3 ~6 B+ |/ d0 f) }

- J: T1 q) R5 c- r: T
/ g- p- H/ N- m1 Y9 O8 [! a4 h0 P2 Y/ ?1 N
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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