Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!/ k$ t2 I" n- |" M6 I

; \& D, F& X; |6 q

3 u! H& e! c3 V) ~Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.# ^5 \# t6 ^1 f9 j- ~  t8 y
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 V, S5 e, y( c" A) f* Z
Астралия ?
3 N8 v! u! X' F
  ]4 N# Q4 w( a; `& L5 Y& n

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
7 r" j9 O2 S* \' eВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
" ^, N1 B& ^# Y# n  g/ c4 _6 r
7 V- o% e# F# ]) P) c& }! h$ C6 @
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ y  g$ q8 ~6 x  ?/ T' \! t
AlexCoder опубликовал в 2024-10-16 18:311 y. f6 Z8 D& R
День добрый!: b. w& ]2 Y2 |3 m' c
В статье описано взаимодействие игрока с N ...
" r. n7 i5 @9 b7 v2 I2 K
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 2 X; N9 e4 [; v1 f% _4 Z

! F( t! n2 Q' |4 m& NЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# X  O' n& h6 Q4 e$ p7 G

1 Z" G6 ~/ g  _Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
( M# w, b7 w1 _: j# c; v; X" w2 a9 O* P; r- P9 E
  1. <font color="Green">// Пакет для состояний монстра</font>" T3 Z8 {; }# r
  2. package org.l2jmobius.gameserver.model.actor.state;* v% S& S# y; I, D
  3. <font color="Green">
    # J' a! \" @) `* J3 j3 A9 q
  4. // Интерфейс, представляющий состояния монстра</font>) N1 V3 C) {0 I6 p9 o# r
  5. public interface MonsterState {0 f3 D- Q9 G, E) @4 D) E
  6.     void handleState(Monster monster);0 C$ w7 x( l, G* Q  W* U/ a3 L
  7. }
    5 c' o9 d! p* p; o
Скопировать код

2 ?+ K- j0 X& d  tШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
1 J" K1 z# M: B; s" ]% d! ^" Q5 Q# o0 P9 `  h
Класс для начального состояния монстра:+ a. d# i5 N; a( O; O2 C9 ]0 x
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    9 \9 B- T% Z% i( f
  2. package org.l2jmobius.gameserver.model.actor.state;
    ) B, e+ T; ^# Y( V% E1 h9 W' U7 P
  3. % m5 [1 V# g# }0 X. M% q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , p5 Z( f% c9 \# {, S4 K) f8 S
  5. 0 M9 a6 S0 ^% k$ q8 k) s
  6. public class InitialState implements MonsterState {. i8 h3 G3 [2 C+ _1 A7 r
  7.     @Override3 \& L; G( e) A) J
  8.     public void handleState(Monster monster) {% I; q- {) y$ s7 B; K
  9.         // Начальная фаза боя* D- f) K! n9 ]4 ?! t( i1 E
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 o; B  B2 t+ Z+ A8 H
  11.     }' {* o; {7 x% N# u' v+ ?8 d5 c& m
  12. }% G/ Y4 p& t: q4 k  G' A. Y
Скопировать код

0 @1 H1 h+ E# M3 W/ f; T6 Q! }5 E3 i( p8 i# z) B( a
2 r3 z% f7 B( c' r2 [( q
; R/ m9 O6 p6 b, c9 A* a  w9 F! y' n9 V

1 q7 i. N# c0 ]& F
, m" W2 [  H& Q0 \& ]9 T% F/ X: D: G3 ^* p% Y, U; O
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 A3 v/ {/ w$ R4 s. Z* M" J# a+ f( F/ f
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
" D. G1 s" r7 m6 Y5 U, o  r$ K! V2 D- g
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
7 n1 i3 X, N* T- W# z5 u. H+ I0 s2 Y; _4 D2 C
  1. // Пакет для состояний монстра; T( B8 c: D5 m3 p" \
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 M$ d6 f) ?$ x
  3. $ u3 i3 H2 `& k+ x4 p9 x) |2 c+ E
  4. // Интерфейс, представляющий состояния монстра$ @$ M3 `! |, m, ?9 b! J/ d
  5. public interface MonsterState {4 Z3 M0 h+ W- i3 p4 X
  6.     void handleState(Monster monster);- T4 D  x# l/ |1 I1 @
  7. }
    5 \& y+ b$ p8 U2 B5 V2 h: I! F4 o" w
Скопировать код

  g% D& d: x# `/ h; O8 U! {Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
" \. z( S" G* d% c+ \6 D
- l. o: O1 h0 f: V' EЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
2 R5 b7 o: c/ J, A# }& x  m3 z9 q# U( [7 ?. k
Класс для начального состояния монстра:3 M' R3 c( r: {$ h% R
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / o% j; C5 d) w. Q! I  N+ l7 i
  2. package org.l2jmobius.gameserver.model.actor.state;1 o4 z& B% Z& l5 S/ @' Y
  3. 8 q6 Z8 b6 @% d* \6 g6 ]4 d. X6 l% \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + Q2 N- L3 Z& \, ^. N! M3 ?* i
  5. 2 {3 i. ~& ]+ x% t" v2 J
  6. public class InitialState implements MonsterState {
    + T  L2 ?" z" [! s& u4 W; L& k
  7.     @Override% t- z( R, M3 y& y
  8.     public void handleState(Monster monster) {. I5 P! Y( c7 H. Z7 z" a
  9.         // Начальная фаза боя( r2 f8 i5 U: Y+ r7 a- y) c
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    7 w4 B+ A& h1 k& V. f
  11.     }# n  R/ Z! L7 b
  12. }
    1 l, s& N" x: G' ]5 w$ F, l
Скопировать код
Класс для агрессивного состояния монстра:
# \3 }# ~- `) c, O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % a& F8 M8 v: Z
  2. package org.l2jmobius.gameserver.model.actor.state;. v5 O( T& M2 e. q8 N
  3. - s3 d! L9 b! P% I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ' X* N9 ?5 h% y4 _

  5. ( k+ K( v5 a0 Q8 J) R. }# Z6 {8 v5 `
  6. public class AggressiveState implements MonsterState {- A- u' k" u3 t
  7.     @Override3 y; X6 ?$ d+ J; @- M9 S& t
  8.     public void handleState(Monster monster) {4 u7 A! h( R+ N- o: M. Z
  9.         // Агрессивная фаза боя
    9 g# ?% b, }' [- |& V' q" M
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    + ^1 F9 n  y/ g' p
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки, b2 [6 j3 f0 x8 ~( b  Z
  12.     }3 C4 @* O" ]0 w/ f0 U
  13. }
    * I! u# H$ T9 M8 G, V% I
Скопировать код
Класс для финального состояния монстра:
( N! j) O; m4 e9 h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state& b8 Z1 K" g. W" }4 q! X# g
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; @( @6 V9 @1 I' w7 r- H' ?" E
  3. 7 g5 K7 q% r) H# W
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ p4 u$ v9 I# @  E

  5. 5 Y# m6 z! b. p  N
  6. public class FinalState implements MonsterState {& i. m1 T, v' n8 P5 i& T" y
  7.     @Override
    3 S# D+ u* p$ f: Y7 P& j
  8.     public void handleState(Monster monster) {$ v( X% ?. h5 h# H
  9.         // Финальная фаза боя. Y# y" B8 C4 U% O8 }+ E# h  C
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    8 R3 h! l- ]) J& o; p/ e3 _0 K4 a
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки# l$ m: y# O+ I8 N
  12.     }
    / ?7 y+ A5 C' E) Q2 |
  13. }9 J9 \3 Y* s  }; r
Скопировать код

, w9 D/ B5 S' |3 g" WШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
' J3 H% s% u% S
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' _: f. u& y. V# ^' y. z
  2. package org.l2jmobius.gameserver.model.actor;
    6 I2 {' ]7 t% x" S% x

  3. & M" }/ q/ O2 \& p" f
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 N; N! J$ q" A/ b% n* \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 t5 ]* ^# L4 ?. L' l

  6. . R) `4 @  |+ I0 p
  7. public class Monster extends Creature {
    . s3 T. m" V2 L. O
  8.     private String name;
    & F) u4 l0 |9 h/ q: n
  9.     private double attackPower;9 v: m2 I) `/ Q/ k( w" Z
  10.     private MonsterState state; // Текущее состояние монстра
    3 E1 H' e4 v" l" M2 B

  11. % T5 c+ m& |* }. ^- K5 g) V1 K
  12.     // Конструктор монстра$ w# y2 U' Y5 K! ~  v4 k( k* ~
  13.     public Monster(String name, double attackPower) {
    * y0 O+ ]- {/ ^2 f4 O8 i( b5 B
  14.         this.name = name;4 m+ v6 A- j' ^6 Q0 p
  15.         this.attackPower = attackPower;
    . L6 m( U7 z+ H) }
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    3 Z, a& o) E3 z: b5 ~+ c
  17.     }& }  \1 h* g' K/ f& e9 n# k4 a$ s
  18. 6 r" h4 l4 S( i3 m- Y$ }
  19.     // Метод для смены состояния
      b& ~* g, [) d: e# _. V. r5 u3 |+ h
  20.     public void setState(MonsterState newState) {
    " T& m4 f  s6 U9 H
  21.         this.state = newState;/ N( J/ _5 z3 g- M- ^
  22.     }3 a0 {8 B- F* I' ?

  23. 1 O1 n' _9 X9 V- t/ j
  24.     // Выполнение действий на основе текущего состояния$ N8 {: P, @- @  w. ?; `6 ^6 o
  25.     public void executeState() {
    / B- I1 {% Q7 h; d" z7 Q
  26.         state.handleState(this);
    % x- h$ _, \; Z. l+ s& [4 ]2 T; m: {
  27.     }% P, o5 p4 n3 s0 [6 h3 @; ~
  28. 6 b% w6 m; P2 u# O" s& g" x9 m
  29.     // Геттеры и сеттеры5 _  o6 H% I$ N5 [, R9 p  _; I
  30.     public String getName() {! p/ r5 S' @5 G4 e
  31.         return name;
    7 M* z) Z! M' X! [
  32.     }
    & u3 s6 n& c) `& C: Z- ^1 S4 K, y
  33. / E1 l* f7 L5 [
  34.     public double getAttackPower() {0 o) P8 w: f; W" G
  35.         return attackPower;
    & P9 p2 a6 G2 j7 F
  36.     }0 J/ {. U3 Q/ ?
  37. 7 f0 [3 }2 v0 k
  38.     public void setAttackPower(double attackPower) {- M# y$ X/ c9 I0 t
  39.         this.attackPower = attackPower;
    6 T( T4 W/ o) W* F
  40.     }" a( @7 y' `4 z' q2 I  G3 J* V0 H4 k
  41. }: s3 L* G3 b9 B/ ~: Z' Z! i; A& z
Скопировать код

8 c' L2 C6 D! Q# m% `  B  H, XШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& O8 J! C1 [0 h5 v
+ d5 @" E( t% I
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # q  a6 G6 L' P6 c- T; K
  2. package org.l2jmobius.gameserver.model.battle;
    7 I/ h. w1 y0 O. k9 {& V. w# F

  3. 9 N+ w3 T. @; H( Q
  4. import org.l2jmobius.gameserver.model.actor.Monster;" ?" l6 h7 J" ]; F- B6 W5 G
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ' e) e3 W) q5 M  u
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;1 J+ b5 H* R! \. o  b* M

  7. . {* K/ U; H3 V
  8. public class BattleSimulation {6 ^) E; D' b- k1 A+ u* E
  9.     public static void main(String[] args) {
    1 Z6 o, e8 R/ G8 j1 Y3 I
  10.         // Создаем монстра с начальной атакой
    9 w8 [3 W, v* H
  11.         Monster monster = new Monster("Дракон", 100);
    1 q+ X+ o9 f; i, ~4 S/ K* b

  12. . F5 k  V5 ?. L2 ~  _
  13.         // Начальная фаза* h, f/ }4 _( B1 |9 \
  14.         monster.executeState();
    3 [9 ]. m0 T; l9 u* N! z

  15. 9 W: S. d7 o4 E
  16.         // Переход в агрессивную фазу+ d  E8 B$ _0 Y" |+ y3 c1 B
  17.         monster.setState(new AggressiveState());
    ; Y# Z; @4 h) d" a2 \' i+ g" t/ [
  18.         monster.executeState();" H$ [" v" K& B* x" ?) n# A; K
  19. 9 H& L+ z$ h& O# ~. @
  20.         // Финальная фаза) i4 t- g9 z9 W/ x2 ^' y" D
  21.         monster.setState(new FinalState());) X' M; ~% k' O" B0 d( A
  22.         monster.executeState();
    3 A! k" D9 I; R( E3 o6 E
  23.     }
    # D) v+ ~  ]0 i$ f
  24. }
    9 H% u- q, ~$ c9 z' R
Скопировать код
. k! R9 A9 N$ M0 T2 e( M5 [; }
Комментарии по структуре пакетов и классов:
/ F5 ^$ C* a8 [) M  n
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    4 G# D4 _# X* e: w3 n# J
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
  R( |) B" v$ c  c( p$ I$ MЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
8 Q$ Y8 [" k1 t3 Y- L5 s5 f2 \+ P3 [- X) h( ]! K
' ^: T8 R6 b# o' i; R8 k9 Y7 q
6 b& K" p$ H  \9 R3 `  Z! W! o

% }7 k1 Y3 b* O/ ~, u4 y( x- B* _* [" |/ \: m: R
3 |' q, [8 K  E8 M
  P5 m) @5 V' D. z6 e1 G
2 n" X4 j' d' r9 i" u  B

' A0 g: b6 ]7 `7 Y* v. d2 i  w) ^$ [- a+ P2 ^; H( _  U! X- f0 H+ m6 x

1 z8 S  y" b- e, W7 N- i+ K8 b4 V- Z- b3 o- f+ G/ y

; B' @( e3 Z, R5 v" {7 b4 q7 p% v4 ]+ \( B8 U6 O6 E7 t( S" I
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:047 O. d2 d7 |2 V- ^" ]  {$ x
Для управления сложными взаимодействиями, такими как  ...
- O5 \$ p* f$ v0 V
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
( l4 P5 |% W6 r( f0 A0 }- t( DОтличный подход! Использование шаблона "Состояние" де ...
: |( q; l% G+ B+ X5 t- N( }
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" a, v" t- @1 n/ k; {; H
8 d- Z. b5 P3 t/ x* lШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
9 _+ q0 g# `4 O) c9 v9 t2 \+ \. |% ~* [8 |! q, v6 r4 s
  1. // Пакет org.l2jmobius.gameserver.model.actor) F; o+ y/ x+ y  X6 d1 Y. L1 d
  2. package org.l2jmobius.gameserver.model.actor;3 X. ?3 r. K/ k. z8 l3 I

  3. 3 n$ L" ?$ L+ z6 ?
  4. // Перечисление для типов атак
    0 A& k' P7 p6 {% ^. b7 J! T
  5. public enum AttackType {
    ; W8 |- Q4 ~. V( W! F: P
  6.     PHYSICAL, MAGICAL;) h9 J# `* M8 ^+ k( n! N3 ~
  7. }
    , b! @& A/ j( d, _+ T: D
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.: `5 ?/ i1 f' m* E1 [; F
Обновленный класс для агрессивного состояния монстра:1 S' y, @1 F- K

. y! i+ q+ R& K# p1 |. Y
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    3 G" _: t0 C5 Y: j/ I3 Q
  2. package org.l2jmobius.gameserver.model.actor.state;& R$ B' G8 u3 m
  3. ; @$ i  \( k" j5 @( T( Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 ]4 \5 [  U/ p, C6 }' s( O& M
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    7 S4 d$ `' B7 L' J* J* u

  6. # h7 Y/ E* h0 `
  7. import java.util.Random;
    . |8 M/ {/ V- }1 m4 K( v: Q

  8. 8 u9 A3 }1 V& a/ Z, `9 z' I
  9. public class AggressiveState implements MonsterState {+ W# r+ b8 l+ j2 }2 O* z
  10.     private Random random = new Random();
    # \% _# v: y' G: c
  11. 3 C6 Z+ b, y3 N( n2 k6 O
  12.     @Override8 Y% u$ g- }! t7 N$ C
  13.     public void handleState(Monster monster) {+ B' M8 W: \" y3 }8 H
  14.         // Выбираем случайный тип атаки: физическая или магическая
    2 D8 E% U8 U, X) |, }4 `% p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;9 k5 ]& S& @3 Q

  16. / m# u1 H. F% ]6 t
  17.         // Логика для агрессивной фазы боя. m4 ^- w( ~) G" M
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ; n: `) A2 m  w1 X( e. c5 N
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");: q7 G% P& ~- u* T# `
  20.         & R. `. N' w; R3 ]3 }
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    & C: z, C+ Z8 S# Q. w' Y. R: G& c
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;. u$ `+ r& ?$ G7 k, t' E3 s4 K, l
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);, L. T1 J# S8 J( c
  24.     }( k1 M9 ?4 v2 {+ w! R! E% {  ?4 ^  R8 m
  25. }9 n. c9 D  @6 }
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
" p5 s. g$ x! |- ^" I! ~
9 Z- M3 d# b! L7 G- b% J
  1. // Пакет org.l2jmobius.gameserver.model.actor
    ' v0 j, I: V( U
  2. package org.l2jmobius.gameserver.model.actor;# a2 Q; `7 [+ n9 D! g
  3. & [; }# A: _8 f  |; n) j; O
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 M3 x1 l1 l- D2 v7 [; b
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 F2 A4 M$ X3 x1 R1 k0 ~
  6. / ]9 y0 d" ~. K* b6 V$ c
  7. public class Monster extends Creature {
    ! R7 W; J9 e4 Y* ?' L9 ^( [
  8.     private String name;
    ! P, F; y- d* O2 C4 a
  9.     private double attackPower;
    + ?' i3 h3 [2 E
  10.     private MonsterState state; // Текущее состояние монстра" R0 e- d) x# a

  11. % k7 e+ l6 P1 t0 _
  12.     // Конструктор монстра; `- @& X) Y, u; S. G2 U* n
  13.     public Monster(String name, double attackPower) {
    . [4 }: d+ ~" ~8 y) x& r) D1 ^: c
  14.         this.name = name;9 b1 L4 F) B3 M5 z
  15.         this.attackPower = attackPower;# v# w6 D0 S; `, W  |) m/ z; v
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    9 h$ o7 j# U7 B  C- o; X
  17.     }
    : u  j! g5 n$ U8 Z1 ^
  18. - J9 W# y$ l/ l- h1 I" ]) r
  19.     // Метод для смены состояния1 r' Y0 X; x- _" k1 z
  20.     public void setState(MonsterState newState) {
    / i2 l4 E5 d# a3 |7 n: v
  21.         this.state = newState;
    2 O  h  T  v; q. `
  22.     }  J3 w5 z0 m8 H3 B. u. [

  23. % ~+ M3 `* i6 ]: Q% c' B
  24.     // Выполнение действий на основе текущего состояния
    & [& Q! q. I' t; }
  25.     public void executeState() {1 W; [/ K; k. f" s9 f( E2 C
  26.         state.handleState(this);
    # t# }$ `9 W# R( p
  27.     }
    + j  `+ f3 u- K$ a

  28. & n  [1 Y7 h( R! n
  29.     // Геттеры и сеттеры( [5 g& x+ C; s' _6 E
  30.     public String getName() {
    8 r# J9 ~- f, c& j
  31.         return name;
    9 z1 E" W: D' W2 H5 `$ y
  32.     }: ]9 Y' Q) H' T& T

  33. ( c" Y) C. C" S
  34.     public double getAttackPower() {  o+ [: ^: P6 S' j0 e
  35.         return attackPower;* A; e" _3 e. U4 j) ^) u+ q
  36.     }
    $ ?( O3 Q# s! h5 E' t4 m; d! K

  37. # ~. ]; L9 J. V; H* k, K" J" }( s
  38.     public void setAttackPower(double attackPower) {5 j# O/ n6 j/ y% o  s1 ?% X7 P
  39.         this.attackPower = attackPower;  i& S2 g6 X+ q; r0 h: W2 ]
  40.     }, l5 C" [$ w; {; T# q" i
  41. }
    ( L  w6 p* J( m
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
$ Z1 U3 d/ H7 u
* n0 E/ Z) i. E1 ]; M4 b) k
  1. // Пакет org.l2jmobius.gameserver.model.battle4 G( C6 O& J: h6 w! R. F6 x
  2. package org.l2jmobius.gameserver.model.battle;0 p3 Z2 Q  k- r' s

  3. 4 r' o. m0 y/ j% i3 a" \
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    # Z! f3 \: W' \8 H) V( K
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;, k/ K( G: e2 i5 T3 ~* F

  6. 6 `* j( l, W1 Q5 I5 B
  7. public class BattleSimulation {8 x9 w& d* h* N. f' c- p
  8.     public static void main(String[] args) {
    # b  o- Q1 \  t$ S
  9.         // Создаем монстра( p0 i( \* W# V5 E  {
  10.         Monster monster = new Monster("Дракон", 100);
    0 Q  b: D. t- d& G8 H% u
  11. & H! ]6 s" F& p1 d( c6 |* z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак: {2 u3 m2 N# {/ \
  13.         monster.setState(new AggressiveState());
    ; ]6 y1 _4 ?8 Z
  14.         monster.executeState();: G! }8 @: ^6 x  n8 M+ X4 C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    $ k  h) g! J! ?
  16.     }; W. I4 l* W& U' k) T# G
  17. }
    # J# \! d9 d6 D4 \' y4 l
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
# b- {, P, x) a3 x7 K" g0 OЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
6 ^2 s( D; N& ]5 U
1 ]* Z4 Y" S0 A" e4 u& x4 m7 W9 H, P/ O" }/ }6 [
4 W' f' ~6 U2 d9 k
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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