Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
4 x$ I$ j; N% m7 k7 F
5 H' {6 c* h+ W( h& E" N/ F

, k8 q2 T/ n; b: A+ o$ ZЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы., b" i8 w4 b' ?$ u- j! W
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
. L) o7 X, {  s: n2 VАстралия 🌟- {  Z" h# x( L
$ ~- a2 c0 E" ~  X

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!0 r5 R" c0 F" z4 U% z- r- F7 a
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
5 r- D1 |+ z: }; d
' O7 K6 ~  W2 o+ f) ^4 ]
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 . U3 q$ U  J* h& @& X+ P9 z
AlexCoder опубликовал в 2024-10-16 18:317 G$ O/ U& a# B( |' |6 o+ y
День добрый!) n$ J2 y) |+ Z4 \: Q- b
В статье описано взаимодействие игрока с N ...
8 A& P' R4 a2 f- w
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
/ C+ m6 [0 u: e$ W8 d6 |/ G- c1 s
9 t* U; ?1 D/ P4 T8 H2 d  h- x, I% ~( mЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
  G3 A! H. d0 K9 }/ Y( Z: ?0 d
8 g; W- F1 ?) ^4 b1 M+ I$ j8 zШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.5 c  q$ d: M% C2 p0 {

) q8 k% \% X3 Z9 U" C/ J
  1. <font color="Green">// Пакет для состояний монстра</font>' N  r9 t/ t% N# b
  2. package org.l2jmobius.gameserver.model.actor.state;$ L. ^5 p. Z$ b2 s! R% x
  3. <font color="Green">
    & ]7 M- O& Y) R5 j& o' w
  4. // Интерфейс, представляющий состояния монстра</font>7 `* D8 U$ g6 m9 e4 Y
  5. public interface MonsterState {3 H* V) s. h0 S$ t  f8 j6 \
  6.     void handleState(Monster monster);- P& r' {8 {( P- O8 S2 ~4 W" j
  7. }
    $ ?. c$ k4 v. f
Скопировать код

* f  Y! M! r9 F) k! W' ]4 n  eШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 E2 Y6 b7 e2 o7 n

" \( J9 P% T( Q1 @/ I& P0 uКласс для начального состояния монстра:
) ~9 ~' ?' |/ r/ o: j- g+ I
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>3 @' N9 n& q+ J! s% w
  2. package org.l2jmobius.gameserver.model.actor.state;
    2 b5 R" q" s' Q5 _  B: Y
  3. 9 E; |- e/ M% ~" N/ b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    9 R; H. w) g, w/ Z% B6 \! T$ c9 J. Q

  5. . a5 D# P$ _# K" D8 P: n9 x& z
  6. public class InitialState implements MonsterState {
    # G1 O/ w9 }# _* W3 X3 I- s
  7.     @Override! W& {, p' f/ a% p
  8.     public void handleState(Monster monster) {
    * j: r- m4 V6 s$ U
  9.         // Начальная фаза боя
    . F2 Q7 z4 s) [: z/ l
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # y7 q( d; e* R( d4 j
  11.     }
    ) s2 b7 g4 x; _8 t+ ]0 o
  12. }! v2 Q' r8 H# r/ v, D: K; e3 t/ ~
Скопировать код

" V; b7 C. j" C  s& e7 w; i3 ?' F" d
" A6 B: ]/ L1 J
$ U; z0 g7 U) W5 }
/ i& E2 u( s, v' Y8 i/ e3 v
/ n# O- s8 g3 r" x% I
9 F% D4 \$ t6 V% q, i" @  }: ?4 L3 D+ z4 m
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( w8 i2 o. [! t( ~
; b' Z+ m5 }  c4 q. g. E
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.' q& f, R. i& Z' f' A5 f2 B- `

- z7 T. K4 I! R# d* C2 n* UШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ F1 r; Y: p' q( ]: U0 n1 ?
3 {2 ]; _1 f* @8 z7 d; E
  1. // Пакет для состояний монстра
    6 i: c( o( L* ^' U
  2. package org.l2jmobius.gameserver.model.actor.state;% p& @- _3 ^! @! w
  3. 4 w. N' P* z+ s0 H) M& A% J, B, h" N+ O
  4. // Интерфейс, представляющий состояния монстра1 r# J; J, x! }3 ?4 J# s
  5. public interface MonsterState {
    # X8 z) i9 B* g
  6.     void handleState(Monster monster);
      H2 ]9 N/ C- k6 M6 t- m) s  G
  7. }' L1 a( g4 L, O, X( i
Скопировать код

: J# ?7 ^* ?8 D% `Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& s' F, A5 \5 t" I. s
0 k" N' f# k. R; g$ h5 X0 iЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ K! [5 F8 {' B$ B! a( F. b* O
Класс для начального состояния монстра:2 f+ G% e! n3 d/ R' ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    8 b/ `8 ~/ o% s1 D3 v
  2. package org.l2jmobius.gameserver.model.actor.state;, |; R1 z4 |6 \3 {' F! _# W
  3. 4 o. r+ _- l% R$ J3 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;  L: ^9 u" G" J9 y2 Z! s

  5. / {$ ]/ R& ~0 E5 z+ P6 r$ q. v
  6. public class InitialState implements MonsterState {# j" F# X4 k3 C* r6 o
  7.     @Override5 s2 o) _" M7 p" ?
  8.     public void handleState(Monster monster) {
    0 s3 x$ t1 C- J$ k
  9.         // Начальная фаза боя3 s$ n4 {. r3 ^! P0 j
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    5 i, g; N, H4 u2 s# P
  11.     }
    4 n# C: q: F6 {
  12. }, S7 `0 n" d0 v5 \3 T+ w
Скопировать код
Класс для агрессивного состояния монстра:
/ B/ X* R. C" M! N# |  j; A! V
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 e0 w! v2 T6 E7 C+ S9 H
  2. package org.l2jmobius.gameserver.model.actor.state;4 z& t: `$ {5 V
  3. 7 u0 A5 n3 |5 k. X& M# W  w
  4. import org.l2jmobius.gameserver.model.actor.Monster;) w4 B9 F& z7 A) z) Z8 h
  5. 9 N" ?! \+ Q2 M8 V
  6. public class AggressiveState implements MonsterState {; P9 a) J! o' J/ i7 v
  7.     @Override
    / Q0 z4 c+ S7 M8 ~+ p, m% J
  8.     public void handleState(Monster monster) {1 d4 L8 M# a) _" H: o% ^
  9.         // Агрессивная фаза боя
    " s6 A! g/ T/ Y& \' f- Z3 C
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    7 l6 S. A5 I- [8 L7 l+ [
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки# D# I* ^0 i3 g  z8 ?
  12.     }* S# q$ s! ]) p* r
  13. }
    ' Y2 b$ x4 [- h' ]8 g+ S
Скопировать код
Класс для финального состояния монстра:9 n& M, z+ S- I4 {- J0 g
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    + J7 f7 C( s2 T& r6 i! g: z
  2. package org.l2jmobius.gameserver.model.actor.state;
    : X1 V6 O4 v# h3 H2 L

  3. . q. Q! F" p7 z' `& `
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ! X5 I% M& Q; v5 s  H* ~: H

  5.   [5 u2 [" e# h8 R  f  `/ O$ _/ M
  6. public class FinalState implements MonsterState {
    ! T2 v) i# G, ^
  7.     @Override
      F. B! k1 ^2 F8 u% j7 Y( k
  8.     public void handleState(Monster monster) {
    0 F/ t2 e; w$ v4 B5 s+ k% F+ M. O
  9.         // Финальная фаза боя+ M" O" S+ W& }# E* J
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; I3 c2 Y% M+ {9 G- ^$ T
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' U6 d. u; N+ M# f% H2 B
  12.     }/ y  Q8 N8 p9 D, Y
  13. }/ e  q" t% y5 H, e% y- h
Скопировать код
% X& _8 Y( q7 v6 }, b( O
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( Y7 A* {" Z/ o, A: A+ q' p( P
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : x( E1 a. S) \4 e* f: W, O' R
  2. package org.l2jmobius.gameserver.model.actor;
    . R, f0 j1 q, A

  3. ; \) {; E( a- H5 e# f
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 M% o$ }# Q: V1 c! K1 Z
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    1 i3 ]# M/ @9 E4 D' _& k* H

  6. - R, Q4 l1 W/ d2 u; v
  7. public class Monster extends Creature {2 M/ z! C. C% }1 ~. o
  8.     private String name;. |. N8 ]6 M1 U* u7 Q1 V1 N
  9.     private double attackPower;: I: v8 I  h( j# f- G( T3 R# E8 P1 l
  10.     private MonsterState state; // Текущее состояние монстра
    3 z) A- i+ Z7 @

  11. 1 e! x3 o) y3 {: Y
  12.     // Конструктор монстра
    ) R$ M" E0 |& |
  13.     public Monster(String name, double attackPower) {
    7 w) i) z! g& J6 y, ?- j' `. }2 a9 C
  14.         this.name = name;
    ' n( `) ~+ v- Q' P- D# I
  15.         this.attackPower = attackPower;
    + l7 j5 x- m" c/ z4 C; S
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    & K2 q" V! l+ a
  17.     }9 Q7 u; _: G& r& W' R. v5 V6 B9 p
  18. 5 ]3 F8 ~$ y0 Q! i8 E
  19.     // Метод для смены состояния, F; N- y6 u1 M  ?3 d5 c
  20.     public void setState(MonsterState newState) {
    & J+ c, M1 a4 @, B
  21.         this.state = newState;
    + G, f% {: d! W4 Z# y
  22.     }7 p3 b: V; a$ n1 Y

  23. $ ?2 ]2 p/ ~! ?4 i
  24.     // Выполнение действий на основе текущего состояния* U& @: C2 a4 I1 O
  25.     public void executeState() {
    ( b7 `6 p# ?5 K; v8 D) i
  26.         state.handleState(this);: S8 Q$ w  h$ i- M
  27.     }
    & ^6 d2 h# \0 }  }6 @
  28. - ^( E! z6 U5 Q2 Q1 I
  29.     // Геттеры и сеттеры
    ; [  |' L( H2 B& P0 t2 e" R( H, s
  30.     public String getName() {
    , ]3 _4 _5 l$ `, B' |
  31.         return name;
    1 T5 L2 K7 M/ R5 l2 O$ d
  32.     }7 t3 |; \+ u' |, k  S
  33. & r% H+ [; p/ V
  34.     public double getAttackPower() {
    ! |( p# b. \" o3 W9 c' v4 F2 u' r
  35.         return attackPower;
    0 W8 b& w6 ^, |& Y
  36.     }
    6 |( q3 L0 `, u

  37. ' }- ^* \8 _* F
  38.     public void setAttackPower(double attackPower) {
    9 `& a- j- F- W& D* S8 P
  39.         this.attackPower = attackPower;0 \- \# f+ o5 d( v' X% w
  40.     }
    0 W6 @2 ?% C, y1 _
  41. }( p, p7 @) k! r) t  M
Скопировать код
( H4 @. o, j  J6 t. ?8 x
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
9 K- l( S7 ~; m5 c* p. F8 v! ^0 ]. E. ~2 G( z3 N# ^' Q' M
  1. // Пакет org.l2jmobius.gameserver.model.battle( o; h: b6 V( e' X+ M
  2. package org.l2jmobius.gameserver.model.battle;
    + b3 L6 I' J/ p( L0 J" U

  3.   \) a, B: w# B
  4. import org.l2jmobius.gameserver.model.actor.Monster;  v1 c( [4 N4 b- |8 \! m1 P
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    # C7 a2 X' U7 I- F7 U, Q
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    % n. |2 u: F$ R, c

  7. - v7 C, `- x9 @; u; x/ G- I
  8. public class BattleSimulation {
    5 g0 u9 h% @, c
  9.     public static void main(String[] args) {
    " L. L4 H3 m& \" M# m
  10.         // Создаем монстра с начальной атакой
    ( G+ R4 M4 m7 l0 x/ _0 ]3 a
  11.         Monster monster = new Monster("Дракон", 100);
    ' i  Y6 x# W; d9 m3 J

  12. / K+ ]4 R/ n$ t" e5 O9 L" R( C- v
  13.         // Начальная фаза
    ; D: c/ z. h' x, a! t) K; W
  14.         monster.executeState();8 G9 p" E% P9 _! q7 U
  15. . c% ^% z5 h7 u
  16.         // Переход в агрессивную фазу. k7 _; p3 @4 ~5 v! `& T
  17.         monster.setState(new AggressiveState());. [7 d, c4 S; j1 N' P, E+ t
  18.         monster.executeState();! q1 f& o. N5 x  [
  19. 9 T) S9 x8 A& S1 u9 L+ ?% x0 Q1 O; g
  20.         // Финальная фаза7 @. f, X; z/ D' b# a
  21.         monster.setState(new FinalState());9 `' b; T  a$ j, R+ C( Q
  22.         monster.executeState();/ y3 v7 ?5 m* N, D" T
  23.     }
    6 Z, d! L# l; F& f7 K
  24. }2 E3 ^& n$ v) Z4 i8 ?- L6 J
Скопировать код
8 F+ U' @6 j% b1 H. m1 }- ?" ]
Комментарии по структуре пакетов и классов:
1 q( {" ], ?  ]  P, M/ ]5 H' n7 \1 K, r
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    , P+ n- f, O" g) t* U% l+ D
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
/ k( a# o1 n- ]' y$ M- \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
; W1 `4 }( t/ J: ~. _8 ~0 A9 p3 d4 c( O6 h7 H: w

$ F0 {1 b# Y% H; ~  C7 A9 D( A( q" x* x  F4 n# k- r6 _
4 t( r/ a" o; I1 ?. p
! h* ~) j' N6 O- h
/ D& O# a5 h! p: m
  Q0 s$ L5 {7 q- _, v
3 R6 D, f* s; U2 a
5 ?  ?0 i! W5 Z
9 W8 T+ t9 Q5 n" m

! Y( A$ e2 x; h2 \! s8 i7 @
1 P. ^2 i' L# j+ `( l1 ]
" {) s  g" N; U$ _2 `# _0 H: `! K( K
/ ?( e$ U( v  a# v7 }4 ]
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
' E5 q! j0 l7 K( B+ jДля управления сложными взаимодействиями, такими как  ...
: A  m  g- D. L6 D" t$ h
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:219 `" H; ?% `+ [" {! p. G
Отличный подход! Использование шаблона "Состояние" де ...
- e4 @% U) V7 N* ~# @
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии., K/ I2 G" t( a& O2 V8 ^$ W4 B0 l

( @1 M" Z' g6 D% J, bШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 {5 F/ d% E+ h; N- e0 [
' I) x/ f' w/ G" q0 O* r3 _
  1. // Пакет org.l2jmobius.gameserver.model.actor+ Q* Y7 U; X; M+ l  m9 a7 r
  2. package org.l2jmobius.gameserver.model.actor;2 Y7 d2 ?6 l, Z4 z: a

  3. 9 ~7 g$ K2 S1 ?. N( B
  4. // Перечисление для типов атак
    , J) R! N8 k/ ?9 X3 k: M6 V
  5. public enum AttackType {
    $ B! h- l& I2 B. a9 X
  6.     PHYSICAL, MAGICAL;( P4 a  k! \2 T: x, q+ u
  7. }
    6 a4 ~3 B( Z& h% r
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
( N1 B9 D; b0 M# r2 k8 r! h& l2 HОбновленный класс для агрессивного состояния монстра:% c2 q8 [& c) y1 T, [8 i
! h: T1 O& l- H0 l+ m1 X! o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    2 h  [, p6 M5 A0 I: F& V) p
  2. package org.l2jmobius.gameserver.model.actor.state;) \! L* p/ N( U* P/ F' x' {$ j

  3. / Q5 O! f) u6 K: V- O8 a: S5 \; R
  4. import org.l2jmobius.gameserver.model.actor.Monster;& m7 {8 z7 {) O- ]( \6 ?  C
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    " N: a- ^" E+ ]2 U( L) V, I! K

  6. 5 z7 `7 U2 S  [' [# G- C! f9 j% u
  7. import java.util.Random;
    ( \8 }4 L, O$ z. Z1 t7 a' }
  8. 4 B4 q. F! y* X) g
  9. public class AggressiveState implements MonsterState {. v$ L4 O: y  P% P* O' D
  10.     private Random random = new Random();$ X. p* ?! U; o/ S9 O/ \' A* {0 `
  11. . B2 O9 w. ^) v2 o/ L6 h
  12.     @Override4 K/ R% D! I; k
  13.     public void handleState(Monster monster) {3 \+ T: S8 u5 U6 B9 T0 h2 u& O
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ) t; s$ l7 F* a- O2 ^9 z: m
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;1 w3 t( [% B6 @( M3 D% `. U: ]1 o
  16. : F, g( u* L$ Z% U* D, h" J
  17.         // Логика для агрессивной фазы боя
    2 G+ }0 n& [6 D9 a: n. j) R
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ( k$ X7 @7 Z- k: x: Q
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    5 b& t/ X7 {. Q8 d& ?+ {
  20.         
    % z/ }; N4 U) y% X; n" o
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    3 a% j0 e/ y# |
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    ) L1 o+ L, g( C+ q$ a
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    % [- _+ f0 P9 f8 E
  24.     }8 j/ q) i# |6 C! r
  25. }& i9 R; ^& A9 q* K
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки# H, `& N: A6 N
: g- y& N' X' p
  1. // Пакет org.l2jmobius.gameserver.model.actor) g4 t2 O5 T0 W& L: ]6 w
  2. package org.l2jmobius.gameserver.model.actor;2 `: a( ~  s$ R- v4 w  t" v( m! E

  3. ) X/ ?- ?  i! S( f  X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;# x2 I2 v: v# J/ O' P) _: ?! I' m
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    % E! g* `) K; Q$ M) B) v) B
  6. 0 ~$ e) x" ^3 ]$ n: y" w
  7. public class Monster extends Creature {
    : x3 f1 Y4 X0 u& _+ ?7 [
  8.     private String name;: n4 _2 E8 X, G& `9 E6 z
  9.     private double attackPower;
    ; ~" z; x' I/ l# c/ x$ p; N9 b. P' U
  10.     private MonsterState state; // Текущее состояние монстра
    + S7 n0 j5 G8 v$ ~, w

  11. # T. l" b0 K: S* U; R! y! V
  12.     // Конструктор монстра7 g* u  S5 q. D3 y) z4 P* }2 d6 w1 n6 q6 P
  13.     public Monster(String name, double attackPower) {/ }& y8 S: d& d( f5 E
  14.         this.name = name;5 J) [* Q7 h  }9 W/ e3 Z6 R
  15.         this.attackPower = attackPower;' k: C, Q7 x6 x9 S/ }2 M
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию$ Z  G1 Z5 H+ U+ I6 m
  17.     }) {8 q) ^' j6 c- J4 z1 s0 O
  18. 5 _0 }/ C8 P" \
  19.     // Метод для смены состояния/ R; ]+ z7 e+ B* G
  20.     public void setState(MonsterState newState) {
    : J! X/ _3 s! S% K; \
  21.         this.state = newState;
    5 ?" n+ \$ S# v; \
  22.     }/ B+ i9 n3 t( Q6 ]0 Q3 |
  23. 6 q" D, V5 X4 q
  24.     // Выполнение действий на основе текущего состояния, d* B) r5 L1 S5 R1 E. J4 r
  25.     public void executeState() {. e. m: o7 W/ E0 f
  26.         state.handleState(this);
    9 s  T4 k& Q8 W. L- o* H8 P
  27.     }/ b- K8 g, _6 n) H  u8 R4 O) }- G

  28. & I9 p3 b& o" t: X. I9 u* P
  29.     // Геттеры и сеттеры
    2 y' G) O- @8 y" M5 Y. E6 h
  30.     public String getName() {# X7 A+ ^8 z6 C+ j+ T: t
  31.         return name;
    * e; J/ H4 I$ u! v# @- W
  32.     }. x) _' m. I8 t6 X& ^( y, _9 W  H( S5 d
  33. , E! }4 m$ _2 q
  34.     public double getAttackPower() {( ^' K5 v6 p& `  i
  35.         return attackPower;$ N. e) u+ H+ S; X1 I/ V
  36.     }
    6 d1 I* G( X- d* @$ e( r! D( k% Y9 `

  37. ( U  `9 p% E5 f$ p
  38.     public void setAttackPower(double attackPower) {+ C, l+ K0 ~5 j
  39.         this.attackPower = attackPower;( W. l# o3 m3 Y# }/ T4 ?
  40.     }9 t& b' t1 B5 B0 ^( @
  41. }
    2 F" B+ V! d& R0 Q# w& \
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.$ x+ _7 M" j% A6 O/ J: H
! S, [' ^# ~- Z0 E9 D6 ?( c4 A9 n
  1. // Пакет org.l2jmobius.gameserver.model.battle- H8 l& x& G; @: O9 D
  2. package org.l2jmobius.gameserver.model.battle;
    2 u2 G: M% y2 X# _+ t! h" V

  3. % ?8 h/ y; @" Y, S' E
  4. import org.l2jmobius.gameserver.model.actor.Monster;- f/ O( U# s8 n( e* Z$ E' G7 Y# k5 `8 A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    # C0 m+ w% Y! E) }: m

  6. 7 Y( K% M) S* r/ @% V+ E
  7. public class BattleSimulation {
    # ~, v5 e3 b9 b1 V, r1 ~
  8.     public static void main(String[] args) {+ v: a. c* z" T
  9.         // Создаем монстра  k4 i3 w( l; ~" H( L& P
  10.         Monster monster = new Monster("Дракон", 100);
    # F7 ], W4 N6 }) F

  11. ( N# G- R: U0 [0 J. L6 ^' U9 Z
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак& r) ?  x5 B7 S# D
  13.         monster.setState(new AggressiveState());* U, Y& g1 i$ d& u* y; z5 l
  14.         monster.executeState();3 K. ?; s; r  Z' P
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & X& S, r1 I( S- v
  16.     }
    ' b( i7 R: `& q* Z7 M" t" z# t4 x
  17. }
    3 g/ O7 K% I* a+ _3 H* J8 N4 N
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
: O2 c$ @- c; ~# R8 @0 @Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!+ d/ J) ?9 p+ H

2 H2 p% T' R8 C& Y7 C7 b1 ~4 D5 p, Y$ h& u+ u! D, D

$ s, I: [2 V( T$ [: z3 v
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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