Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!& A7 B8 ?$ Z. Y6 l
# t" ?& i$ W# u  {+ J
. }2 q7 i; o- \" J+ f0 i
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
& T6 Q% s$ c! l- K, S# nЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!: `! M' Y; l8 X5 Q# t$ G
Астралия ?
" F3 R6 P" P/ L+ F8 v" i5 D9 x- Y* T, T+ S# g  X# p/ ^" l

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!3 Y6 h% R5 q9 k7 w8 ]5 K3 x
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?% `  @/ Q* E& O* x# y* I( \

# @$ U$ }9 I4 r+ ~6 G4 j9 S
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 % k, d+ o7 }! x# a  ]
AlexCoder опубликовал в 2024-10-16 18:312 t1 r7 C8 i4 Y- D9 ?/ f- y8 I' Q
День добрый!& O# T# t* S. O- s" E9 ~5 ]8 n
В статье описано взаимодействие игрока с N ...

; |' w8 x1 `* s9 E' e( M5 A) T  a  RДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
; T* b# l, O) |; l- l& I5 A/ D5 Y: V- L# p& t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.- j1 v/ Q! `6 Y1 c0 i5 x% x

: W. x# ]( w6 _Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.9 X8 g  |, O7 b8 j6 {* @3 i6 s
+ G; ^/ ~  S+ p' s; {3 Z
  1. <font color="Green">// Пакет для состояний монстра</font>
    7 G0 b# w' E" n6 M
  2. package org.l2jmobius.gameserver.model.actor.state;+ V" J# B* I% s* b  w: c" {
  3. <font color="Green">" n! k; p0 I1 f5 r$ G
  4. // Интерфейс, представляющий состояния монстра</font>% l! k/ z( `/ S0 V+ t% ^' g
  5. public interface MonsterState {
    / u" g! B  G' k* ~% R; m. Q1 e
  6.     void handleState(Monster monster);% T9 k$ G; a& B1 B, X5 v( f
  7. }) P5 O: x+ U5 x1 \. E/ H2 M7 l
Скопировать код

0 e+ S) ]! `! b: I9 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя." {# u$ a& s& Q! A' \
, q/ k* s) b6 J9 i
Класс для начального состояния монстра:* n7 ^! g; p( f- t' Z& ]. E
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    2 d1 [, i* Q/ i- y: _
  2. package org.l2jmobius.gameserver.model.actor.state;1 M9 S7 {5 S  G/ Z, x, U
  3. ) Z  g. ]6 N& k5 P, [" t5 ]6 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 q( c9 E! U$ A3 x& @- }
  5. $ D* i! ~! v' M. y% ?; b. ]. _
  6. public class InitialState implements MonsterState {
    ) ?/ w" b' v$ H' s; W$ K
  7.     @Override
    # H1 K* o' K! W" s1 ?( G4 ]
  8.     public void handleState(Monster monster) {
    3 z' v+ t% _: |1 c9 a2 N8 {# K
  9.         // Начальная фаза боя
    - C( ~+ t  C7 [  @' T  P. t
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");$ }9 O+ V# B4 Z* A6 @3 S+ {$ f
  11.     }5 k; V) ?' I2 `* B. c6 u# S% X
  12. }
    $ O5 E4 V, n3 `9 X4 P
Скопировать код
& g0 {  `% Z( r! I
6 R6 r0 p5 Y7 ~+ W( ]' G# S" x/ s$ y+ c
/ x. T" U4 E1 Z
! x  E- @3 _8 Y! r2 {6 {& \6 }

" J3 S1 |" m2 z8 O/ x# e
! a" \& }9 c" h" d( w* G+ \1 r7 X: O! A, ^
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
& \( Y5 N0 f- h& J( b. r: z  A9 {% t/ V  T3 f1 {" G
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ [! g3 V5 Y' |7 ^$ x: A+ I
1 q" L4 e( n. N, X! Q
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
) L- H+ N6 I+ s
4 _2 `2 u# V. u' G3 v! Z4 e/ R5 L- R
  1. // Пакет для состояний монстра) e2 b* }8 Y$ i' Z2 N/ E
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; G! L* M. u2 S7 M9 {

  3. ! b8 ?2 |# q5 o# z+ h3 r
  4. // Интерфейс, представляющий состояния монстра3 h5 B1 ]5 s+ K
  5. public interface MonsterState {: y  ?" Z( X0 f; g
  6.     void handleState(Monster monster);4 h3 u- \( m: {5 K7 N1 X* W: K
  7. }- @  r6 \3 Q2 [
Скопировать код

' v- S; J* {1 Y) [. UШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. % T3 E+ v) j  J. i$ [; P5 W

5 d7 R* R: ~) d8 pЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
" x  z9 w$ _; P2 c5 `% {# m- z) }0 g2 x8 @* u8 [' z
Класс для начального состояния монстра:2 T' D& V% L* h! Y7 E$ a0 W
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , G8 e* D- n2 R2 V; @: H
  2. package org.l2jmobius.gameserver.model.actor.state;+ A% F/ u# ]3 R4 J: v
  3. , X% l8 z  ]$ L' S9 n
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 V8 _5 o4 Z, r( Y: W" V
  5. ' Q$ m$ f1 T: i# E$ }+ J. R
  6. public class InitialState implements MonsterState {
    6 W: |0 g; ^/ }, R0 q
  7.     @Override3 u5 a1 p! U# t( m6 I
  8.     public void handleState(Monster monster) {( K) M0 k; i* x- A
  9.         // Начальная фаза боя7 \, F, b0 C+ |7 G/ P. ]2 F* {
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 J- b5 _* y( |+ O8 a
  11.     }* Q5 }3 x) [5 Y3 n/ V8 U" h
  12. }
    # }' s0 r# C5 X
Скопировать код
Класс для агрессивного состояния монстра:5 H: s4 I* g1 T6 y! O
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    9 Z" w/ d3 z& ?
  2. package org.l2jmobius.gameserver.model.actor.state;
    & Z, [* x* W2 g& ]/ R# ~
  3. / S2 X8 U+ O2 p7 j$ }
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    0 ?3 ~  Z3 _! F+ R2 A9 |% B$ ]1 G' |

  5. . r' p. e+ u* r0 V
  6. public class AggressiveState implements MonsterState {
    0 `4 P6 c8 }# u: L# r
  7.     @Override
    : q: _% k( [- ~7 S
  8.     public void handleState(Monster monster) {. a* M3 E7 y8 |  J# |& q; F
  9.         // Агрессивная фаза боя; P( Q  t# W& l1 K+ s
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");: {0 R  k, v" o+ @9 u
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    % l/ C- {+ n4 M  S* S* _4 c0 }
  12.     }6 S5 d$ f- K$ W; p5 _5 z0 ^
  13. }
    9 u, l5 |5 g- I  q, }5 D' j  H
Скопировать код
Класс для финального состояния монстра:
, E7 Q) c% g* l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) f; \: o8 S' n$ C/ t
  2. package org.l2jmobius.gameserver.model.actor.state;8 T% H( e4 c/ a
  3. 3 d2 s! v3 q$ @) F) j0 D
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - n1 x$ H4 |; n" m9 b
  5. ' @9 o: _; Y1 L) h1 k
  6. public class FinalState implements MonsterState {8 R. a( k! g7 D2 P
  7.     @Override
    # ~) l) [( I" j3 ^' l" c9 h9 G
  8.     public void handleState(Monster monster) {( {3 t& m& j. U  {" w
  9.         // Финальная фаза боя
    * B* o% g- V! O6 I# X2 Q& Z
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");, c9 f' n6 p4 Q) \/ Y8 E* M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    " N* N9 s8 |) w2 s  g. T" ]
  12.     }
    ' Q# G: @: ~9 o+ m
  13. }
    ! s- }# C0 n0 |, M5 y
Скопировать код

" U9 P9 T" A5 X5 }Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.- E8 c' P5 `4 X0 _3 A& D
  1. // Пакет org.l2jmobius.gameserver.model.actor+ Z  D2 n6 v( M
  2. package org.l2jmobius.gameserver.model.actor;
    / l! l' l6 K3 `. @7 Q- @/ q

  3. % R2 x/ a9 [6 w
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;" H& r% J2 R) B$ b. @0 B4 U
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;" w1 {5 D3 z9 U4 i) m. k

  6. ' X! Q) |  p- h3 A5 h$ o: [" S, L
  7. public class Monster extends Creature {2 r! ?. K+ i& ?7 b/ n8 Q" L
  8.     private String name;1 a3 W, W* d+ i
  9.     private double attackPower;
    " M0 Z7 l) I$ b, a( [& o# u
  10.     private MonsterState state; // Текущее состояние монстра
    # k! a0 h( k4 R, g* s

  11. ; G+ t8 |' s* |* d
  12.     // Конструктор монстра
    " s+ B  _  X' G3 T6 \4 b( l
  13.     public Monster(String name, double attackPower) {8 K6 V# ^( k* v5 @$ z4 v1 z
  14.         this.name = name;
    ' T% B0 i/ g- e) S5 D
  15.         this.attackPower = attackPower;1 W+ M9 b, d% S/ h6 ]8 F
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние+ l5 G6 j( H. q( q2 J( w
  17.     }8 u2 q+ J) n1 m1 |4 }
  18. ( S' l0 F& p( v" W3 O6 {, ^: c
  19.     // Метод для смены состояния4 P  x3 v6 g+ X) q; d/ ]2 Q, b
  20.     public void setState(MonsterState newState) {
    1 g  S9 c: t: ]2 L8 v. s. i
  21.         this.state = newState;; B3 L7 W  C" E: Z2 ^# C
  22.     }) ?: b, t( M$ D% ^# h$ X. ~. n# I
  23. . K4 {1 F; C' ]1 Y8 z* X
  24.     // Выполнение действий на основе текущего состояния
    ! }9 ?" x! Q! M" z: ^
  25.     public void executeState() {& d) R  a1 P9 K
  26.         state.handleState(this);( x3 Q0 `! Q0 `4 ^3 n  R+ ]. E
  27.     }
    : A: l  v1 b! s2 m  T
  28. " B( C% `# A$ @: X, X( Q
  29.     // Геттеры и сеттеры
    0 z9 g! e% Z5 t( K2 T  B
  30.     public String getName() {
    9 j. O) H" x# i# \
  31.         return name;: [7 a5 p8 Y7 [* e8 K: d: q4 q
  32.     }
    5 P% l+ L2 W5 O0 B& l

  33. 7 v$ C  l9 O8 s
  34.     public double getAttackPower() {; K  H$ H) ~3 L4 E
  35.         return attackPower;
    7 ~- G+ y2 [0 ]/ c2 P9 d
  36.     }
    ' D  |$ N) ?0 C0 Z  J( |4 F& E

  37. ; {  E; l2 ?" v* l& v
  38.     public void setAttackPower(double attackPower) {' g$ r, O: E" J( x
  39.         this.attackPower = attackPower;
      [7 m, e, M+ y7 W  W& S! N
  40.     }  P7 D2 P- @! X' {, _  d" @
  41. }
    7 ]- v4 ~/ Y" B; V
Скопировать код

+ K! B+ }  E- [/ c# C- YШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 o: r* Z2 p4 p0 m& T4 E
8 V/ L" ]$ }& I! `, X% `
  1. // Пакет org.l2jmobius.gameserver.model.battle# F. W& o3 `, ?9 s
  2. package org.l2jmobius.gameserver.model.battle;
    5 y; v4 [" s; g; v

  3. 8 a: \( I8 y; K; l/ b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
      @1 a/ a; v! J/ ]! K: {
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& C; P8 U$ C9 f' J& }+ D
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;1 S0 v& C$ Y2 B8 ~
  7. " s2 x& E5 @. [% @
  8. public class BattleSimulation {: k. G; W! i  S* a4 ?/ B  \
  9.     public static void main(String[] args) {0 S6 c- {% q3 \4 a4 [
  10.         // Создаем монстра с начальной атакой* a) O# O+ H1 X$ o4 G3 I
  11.         Monster monster = new Monster("Дракон", 100);
      Q& n1 N) i0 T" i9 E7 {" Z
  12. 3 ~4 a1 [* A& _7 C0 {8 d
  13.         // Начальная фаза
    $ _$ Y- B5 @( a  V$ j2 `7 m
  14.         monster.executeState();: q& u: V- \* S& E
  15. " g7 B6 J7 e/ W2 L
  16.         // Переход в агрессивную фазу5 `2 J6 ]2 h- U) F4 i- F, O2 L
  17.         monster.setState(new AggressiveState());
    $ P- p& K" h7 @+ M6 n3 p. ]4 k
  18.         monster.executeState();/ Q8 S7 Q( t5 v3 h+ i5 ^% ]
  19. 1 c0 y8 N6 X0 `% F, n5 \; ~
  20.         // Финальная фаза  A7 ]# U3 ?( ]7 W; I
  21.         monster.setState(new FinalState());
    4 {& m1 S0 o" w
  22.         monster.executeState();) q0 N# ^# z3 @9 F' z7 g* c" W
  23.     }
    5 F! M+ z% p; q& E% X7 ]
  24. }
    ; Q8 K! `5 t) K: A9 E' M
Скопировать код

3 i) H- c# Y; b8 }8 S: ?7 G6 T8 s% @0 LКомментарии по структуре пакетов и классов:: r* o# m6 _! ~2 ~- ~
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.+ n8 }! e/ e+ w$ p+ L9 H+ f% s
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 `/ ]! X' y& Z  {' I# rЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# d6 m$ P! E( F" N9 S5 P
9 |* S* b" N8 a+ X' o, w. z- D8 J9 \* h9 h. v/ P# s

: X! X% _+ W1 ]% U  F: ?
1 G) `/ }+ k2 M% c. o3 i" ]8 }
( @* J7 z: D' Z' t5 `7 V
" k  t- c  r# v, O
  w5 }! U( b0 y0 W4 V+ `# B; r* S2 S6 g- s1 I- d+ D
3 ^/ j( ~9 {' K, n5 Q6 v* C# S& |5 f: X
$ T; d; m& \  z

7 F+ w/ z% y  d* T+ E1 h" S; D
. D6 N* k4 {) R) z9 c; |' A4 E3 T

& d% b5 j) L1 A7 d' ]; n: ~0 ?( k. t
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
) p; B  i  F9 n( Z2 D$ m/ YДля управления сложными взаимодействиями, такими как  ...
5 F+ t* b8 V( D( ^# ]  O
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21+ _# A9 s7 V' n0 g: T5 ~$ V
Отличный подход! Использование шаблона "Состояние" де ...
( I- Y- n/ j, n* f: w0 }8 ?
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
* d5 C2 _5 _) p; n/ c1 [/ y8 E; j. Q, D! z% L
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.( ^" q- R( r7 P/ v* k+ o7 `" E9 C
' R3 g* n9 ?& O4 ^7 Y' D" s
  1. // Пакет org.l2jmobius.gameserver.model.actor# f) Y, N2 R5 x2 p
  2. package org.l2jmobius.gameserver.model.actor;+ G) X( I6 C  P$ q

  3. 4 e$ A$ E3 _7 T( t
  4. // Перечисление для типов атак% j: V: U' `% \1 S% ~+ h
  5. public enum AttackType {" S5 Y1 r- w. i* {' [7 `
  6.     PHYSICAL, MAGICAL;
    ( v1 g/ B& ~7 D8 _9 O
  7. }; U2 f/ J0 d4 f
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак." h7 O. P4 r3 z2 Q& x! Z/ c$ W1 `
Обновленный класс для агрессивного состояния монстра:, `5 p/ v- E- S# |% O0 @

+ T0 I& o' \: c9 N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 _. F% ^) d; ]$ ^9 Y0 g2 P
  2. package org.l2jmobius.gameserver.model.actor.state;' \9 l) X5 K. a' W' n* K0 }8 b

  3. + L8 c6 d/ s( p! U8 i  ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;! k1 Y2 [/ C0 {% o
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    " _, Y7 Q' m( T$ i$ B" w' U8 a

  6. 6 I& {# @, C' y7 H7 g5 Q# Z8 O6 N
  7. import java.util.Random;
    + H( V5 }3 C9 ~* C
  8. 0 H; o% O% @" Q; h8 V+ e
  9. public class AggressiveState implements MonsterState {7 o: V/ H+ }9 G
  10.     private Random random = new Random();
    / H5 V7 I  ~" q! M/ U

  11. 2 G+ _+ c: `0 j' E+ n$ b9 t( }
  12.     @Override( o- W$ P9 ?  t9 _* n7 p9 M1 P
  13.     public void handleState(Monster monster) {
    - k2 A2 o4 p9 Q  D
  14.         // Выбираем случайный тип атаки: физическая или магическая0 _% o* p6 P* S; B0 `2 d
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    " q* [. t: a. W# g; E; s& D7 y
  16. + b1 t2 i+ G0 d4 D5 I" c
  17.         // Логика для агрессивной фазы боя* A1 {; h$ g2 K/ g6 _' ~0 ?
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    3 _' A" E4 T7 V3 S. M# {
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");0 A- J# c  X8 h0 {- p
  20.         ) G1 o! f  B. ?0 U2 Y
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    - D, @# ^1 j0 M0 A, [
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;& |: x" C. P3 r2 k% C' R
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);2 X, O( k; T  n3 J7 z- P
  24.     }/ B) s" T+ |* S
  25. }0 X" w3 ~' h3 A  H6 U' r$ N
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
" U! i. ]% }7 o( `6 d. n$ Y) {6 A
  1. // Пакет org.l2jmobius.gameserver.model.actor, a- O7 F0 e, s# ?0 h
  2. package org.l2jmobius.gameserver.model.actor;
    : G) p$ J0 @5 ]8 b0 W! [
  3. . v/ c. g" p8 A& S$ A: v5 y' V% U2 U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    / i/ e2 P0 V* I% o! l1 a& B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! L& T8 m7 H4 m; a; \2 R# c3 p

  6. $ w- R. |% @9 U3 F
  7. public class Monster extends Creature {
    3 {6 G* N* D2 ?" h% D$ [5 v( \
  8.     private String name;
    + O. J' S$ V* W1 F8 A/ Z
  9.     private double attackPower;
    ; E5 f# ^, t& l& m; f
  10.     private MonsterState state; // Текущее состояние монстра
    ; n; E' T, g0 b, C
  11. 0 K+ B. L" |. G4 r
  12.     // Конструктор монстра% P0 v- U9 Q6 X2 S
  13.     public Monster(String name, double attackPower) {+ N8 h6 a" \! P2 m, _
  14.         this.name = name;
    # [5 }7 Q7 B; c
  15.         this.attackPower = attackPower;# p9 j4 H: x, j5 r
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию& y1 ]+ x5 B( Y5 @5 u; s
  17.     }+ X+ q( M; C' H/ m" `! b8 n

  18. ' J# P, q, {+ g  L4 \0 P' I( |) w
  19.     // Метод для смены состояния, q( ~& N" d( _2 D6 N4 }2 J* Q
  20.     public void setState(MonsterState newState) {
    4 M, Z5 G7 U3 \3 w
  21.         this.state = newState;' n' R/ u3 e2 I( k/ [4 W: }: T. E
  22.     }
    9 l& U' Q+ N9 K/ G
  23. ' H0 N% M* P9 X, j! S! N, \$ m5 D  a
  24.     // Выполнение действий на основе текущего состояния. E9 H: w0 E& a0 O
  25.     public void executeState() {
    5 {( p+ h' ?$ Q% j  q3 I
  26.         state.handleState(this);
    6 ]: Z( m. I! |# K& ?
  27.     }
    5 P5 d& |$ G, ~2 N

  28. ( A: `* x8 S' @; \/ m7 b+ g
  29.     // Геттеры и сеттеры  \6 e/ Q7 t2 _! m
  30.     public String getName() {9 R! e* f& c- ?+ t4 k& |. i
  31.         return name;
    # T: d2 A. u$ n# B5 c! s) y
  32.     }
    4 z- `$ c& e* x3 j2 d/ v! g3 i

  33. 9 W) h5 C; A+ p6 w, H
  34.     public double getAttackPower() {
    ( a) \4 e' l& h0 Z
  35.         return attackPower;
    9 b# i0 j* E6 p! a% b% i
  36.     }
    - p- E( a( _# e- [( M+ g4 f
  37. + b8 d- b# z* ?* b3 \+ X+ V
  38.     public void setAttackPower(double attackPower) {; u1 v) ~+ G( z
  39.         this.attackPower = attackPower;
    . o8 Q  D7 C2 X3 b2 O
  40.     }
    % q# Y* t* c4 r: d6 y
  41. }
    ' _; d  H" A& n6 H, O  {' |; v3 |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.1 c4 ^; A% g; Q' L' i: v0 @

# B6 e; t$ D/ i: ?
  1. // Пакет org.l2jmobius.gameserver.model.battle5 ]9 O5 z* R! v1 e" K7 Y! G, g
  2. package org.l2jmobius.gameserver.model.battle;
    # V* B, F2 G# j: c, E1 S
  3. % b8 P2 y: \9 Y, m
  4. import org.l2jmobius.gameserver.model.actor.Monster;% ^9 y: }/ G  h! n  _% W* W
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;$ {) E0 |6 y# `- S
  6. 1 R; @, M, ?( q, L# d9 r# M
  7. public class BattleSimulation {
      ?2 T6 a& b$ U+ T% [5 U1 z
  8.     public static void main(String[] args) {
    0 i: q& z+ m4 W0 X% i# L) ]; }
  9.         // Создаем монстра
    ; {' V( c3 E( w5 |; N4 T; B
  10.         Monster monster = new Monster("Дракон", 100);
    ! h3 o: g1 ~$ L
  11. . R! Y8 R6 }/ q" J5 c$ B  p
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    & D3 T9 }) J1 W, L( i, L
  13.         monster.setState(new AggressiveState());; B2 }$ y6 i) ?
  14.         monster.executeState();
    - O# ^+ U! s  Y% H. {( D( C
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    , p) \  E6 L+ B) P8 x- o
  16.     }
    : r. p4 _' J' }# c
  17. }$ X& g8 ]( a9 u3 _, g
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
' Z; w+ S  S4 t  V) u$ bЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
* m: A, O/ k" W1 S5 A
# h( j9 `) I- K) V( c- m% P4 Z$ c6 A3 A7 ^8 o1 d

2 _9 o$ ]% ?: |& V1 h0 @
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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