Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!5 i' N( L/ Z" A

0 j: ~# f1 G! ]( D) H  J* ?! j
1 J( g0 T' t3 u* K
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы./ `. Q. h" I) M
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!+ I, \$ O5 t' r7 I7 d
Астралия ?" y( u; I. d3 `3 V. P8 R2 m
2 b7 S+ B8 T8 j+ C2 f+ r$ U

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
" i( N. C. U% w  \/ H5 f) OВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?7 Y7 m' s8 d+ @
9 G2 A4 |7 n0 [/ k+ O$ _) f0 ^0 ?' ]
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 6 X$ [# B" c) v& \- x1 ^
AlexCoder опубликовал в 2024-10-16 18:311 B1 |# r0 ~" _" M
День добрый!
3 j( k/ F4 S* w0 r! k( T5 QВ статье описано взаимодействие игрока с N ...
2 x9 @- t- [' b7 Z: J* A9 o. P
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
: m7 L" U7 O( M
6 D9 j6 ]7 R$ g* ]; g( y3 x+ r8 \Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
, d( J0 A5 Z) m8 q& Y6 I0 V  D8 p6 y. r' `; @
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 O. \8 J1 b/ H5 A$ {
* j$ m+ ^# h4 E7 t+ @+ T
  1. <font color="Green">// Пакет для состояний монстра</font>
    ) p1 U% @9 q0 D7 i7 y
  2. package org.l2jmobius.gameserver.model.actor.state;
    + o: g% W- [2 o% v% F- u
  3. <font color="Green">! a1 }  }: {! Y0 @" P4 o: |  k. p
  4. // Интерфейс, представляющий состояния монстра</font>+ K5 g3 t2 q' M2 J* N4 m2 M
  5. public interface MonsterState {* e  S! v: n/ I0 j
  6.     void handleState(Monster monster);
    & l: K9 f; G- n4 Y% F7 k" n. B! N
  7. }4 i( |4 t) u- O/ Z2 u
Скопировать код
" w8 U. T+ C' {( {, s3 t$ B8 Y
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.3 B8 [, K: d- O) U& V4 u

) }/ r9 B  D( T- p$ I6 h$ P" LКласс для начального состояния монстра:8 m6 s" T' G4 N  H
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>& u7 e, c5 C! f+ w+ r% P
  2. package org.l2jmobius.gameserver.model.actor.state;
    5 G  S. v4 P5 Z% c
  3. . C7 v: X2 J+ o1 Q  j
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 }1 t  j) M$ b* c$ A& _) r
  5. ( A. {. {: z, b3 c
  6. public class InitialState implements MonsterState {! H, a: E! L& v& M# L8 u& D
  7.     @Override) Z# Y3 N4 [! B8 G, P6 k
  8.     public void handleState(Monster monster) {, v7 a9 P& I/ J  v
  9.         // Начальная фаза боя
    ; V4 K' r7 ?$ e( W/ @+ }+ }. h3 O
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");# C* I0 ?0 M8 a' d# H/ y
  11.     }9 a# k( c* F! ~3 q8 e; b( l- B
  12. }
    2 D0 g. t, Z, F! C
Скопировать код

/ w  T; ?/ A2 E- o% x, B9 x% s
! H6 `) V& m. f& o
" c/ o3 s% U5 N* R
& E& ]. N2 L2 o- z3 X) c3 I
2 Y2 @5 N- r; `0 @
: |* v* b- Z6 }9 z: a5 Y/ ]! `1 V/ b+ l$ H7 `
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
3 M  j2 F, q: X# K4 U, x
. n, s( V2 x  r& ]9 EЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% b7 B; Z0 z8 T# E; L* [. s

0 h: M! s5 k0 p, QШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
: t6 {0 H+ r2 q$ `7 N& X  M
* _  u4 A+ @" ~0 x# \
  1. // Пакет для состояний монстра
    ( B- x; I; m; g: j; n! J8 G% O
  2. package org.l2jmobius.gameserver.model.actor.state;& [8 n' _) l. ?$ E- l8 _0 o# t7 l& t
  3. 9 R7 R7 |& Z7 Y2 d" N* M
  4. // Интерфейс, представляющий состояния монстра
    / \! J& q$ t2 B, U
  5. public interface MonsterState {# N* s0 z  A5 g8 K+ W, ]
  6.     void handleState(Monster monster);* y# c7 g  A; h# ?! v3 \
  7. }
    $ X  Y  x4 q& X. o% h0 V( `, L
Скопировать код
" i& Y$ U' T- [4 F5 A* r
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , A- W0 v7 B! {5 i5 {
8 O$ ?) A2 \7 v7 v1 N) R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ B+ R) v& M  B" b  g
. _# R) J" f2 r+ R
Класс для начального состояния монстра:6 |2 T! Q% J; r
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    * h8 m% P& H/ x
  2. package org.l2jmobius.gameserver.model.actor.state;
    " D9 y1 o. i+ W
  3. & q2 X8 g$ T- Z" X5 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;4 j9 [, c: R3 @* z1 m

  5. * ^2 Z7 r2 F- G8 s) ^, m9 t
  6. public class InitialState implements MonsterState {; X$ [4 K1 {, h
  7.     @Override
    7 o. v4 ?1 p3 t$ x" T% h5 ?
  8.     public void handleState(Monster monster) {
    + O6 c% H3 ?; E# L3 d
  9.         // Начальная фаза боя* r- V5 j; x% R4 K- }; [
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( A+ a2 b* `. x2 e% l( a1 Q- V4 D
  11.     }4 N- z0 D1 X) d% \* \0 p7 Q1 }/ u
  12. }
    * I5 l% A( W) M% d  w0 h" w
Скопировать код
Класс для агрессивного состояния монстра:' A/ Z( S0 }% E$ ?
  1. // Пакет org.l2jmobius.gameserver.model.actor.state3 @1 E% h6 Z* O: o  g
  2. package org.l2jmobius.gameserver.model.actor.state;5 t6 X) v1 W2 j

  3. 0 P, P- X' S7 M
  4. import org.l2jmobius.gameserver.model.actor.Monster;! ~) {" W, n) p; Y" W( A/ G% _

  5. 0 V. \/ O8 G& n3 I
  6. public class AggressiveState implements MonsterState {
    $ m/ f9 c; w/ a- m/ F. ^
  7.     @Override
    4 _1 h  V; q. I! b' g7 z
  8.     public void handleState(Monster monster) {( ?, I1 P. y* v
  9.         // Агрессивная фаза боя
    ! ~& v; n# T8 a& P
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 D; _+ Y: p4 Z7 T: @' f* H8 }
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки9 L1 D1 z3 A4 g6 @7 [
  12.     }; z1 W$ I" t7 Y8 M
  13. }2 F1 u# t2 ^& P* O. V
Скопировать код
Класс для финального состояния монстра:0 \6 T. w$ W) b  K2 U$ }
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : z5 h5 f  ~/ E
  2. package org.l2jmobius.gameserver.model.actor.state;
    # b8 q) E1 `, c4 x, K, ?+ U  d& B
  3. 7 j. V* X4 C( T/ M7 J0 \; o' |
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 Z7 P+ r9 n6 i" k" @+ ^8 e
  5. & k  j# E- K2 @: N" r) \
  6. public class FinalState implements MonsterState {
    $ G! k& h+ ?5 _: L
  7.     @Override8 t: a6 i$ o  g
  8.     public void handleState(Monster monster) {
    0 @: {5 z7 \$ Q4 P
  9.         // Финальная фаза боя
    1 i) a2 a) o$ _& v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");" `# N) k- w2 y/ z% \
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ F4 G+ j/ \- R0 U
  12.     }# w  e, c1 w) ?8 W3 @: u" p5 O5 y
  13. }
    + r  F5 \- B0 I  r. z; q
Скопировать код

8 u$ z6 h3 Z& m, Y* zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.. h: S6 @8 i' g2 I1 |
  1. // Пакет org.l2jmobius.gameserver.model.actor
    : R' w3 o9 h* {* G* `* i
  2. package org.l2jmobius.gameserver.model.actor;& F# k* x5 i) }: ^/ u
  3. 3 |1 p6 @1 p$ V
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    , K* R; ]8 }8 a$ v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;; }% w$ f, b$ C% J9 S% @9 T

  6. 1 o, Z+ q$ f" e; L. w! S& g0 M
  7. public class Monster extends Creature {
    ) K1 _1 E% U1 t9 P, h) k( ]6 m
  8.     private String name;
    - y9 s3 t3 k. v0 o+ c) _
  9.     private double attackPower;
    " }& |. r- ]' ?, c3 S0 E
  10.     private MonsterState state; // Текущее состояние монстра% G: d: m2 v/ D; Z7 |5 t( t

  11. 1 @% Y+ O! O0 f, H
  12.     // Конструктор монстра; F6 \6 s9 a- a1 w
  13.     public Monster(String name, double attackPower) {# c% J1 C" A9 n& z7 B/ J
  14.         this.name = name;" g1 w  z/ K* y) d7 s/ Q
  15.         this.attackPower = attackPower;
    2 \8 B9 X3 S2 N# L
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    , X9 x; `  K$ y; @0 Y  h: s3 @
  17.     }
      K- o) S2 a( I9 \' X/ O) p

  18. + C, D2 e3 S* x. c6 J4 D$ Y
  19.     // Метод для смены состояния: h' Y) O; l! d5 }" p5 l3 S0 W
  20.     public void setState(MonsterState newState) {- [- r! ^  m" A& t. v7 \: ]1 j, h
  21.         this.state = newState;4 _6 F4 ^2 P& @; e& I$ [; R& S6 k
  22.     }
    ; X$ a  L6 }1 ?# L: T) C4 g
  23. " [% A  `" H8 k- Z/ D
  24.     // Выполнение действий на основе текущего состояния/ N& Q( o( S0 |, W3 ?6 R
  25.     public void executeState() {9 y& R$ M' x" ]3 b. U' X( i, g
  26.         state.handleState(this);* }2 p2 Z( p( N
  27.     }
    " ~8 O9 b! v$ {, H, r
  28. % ^* K; Z2 B) y5 j0 Y. V5 D
  29.     // Геттеры и сеттеры
    : r" w: \5 p, z' D2 Y8 B. I$ u/ o
  30.     public String getName() {2 k3 _9 o  e( p1 t9 P, v% z
  31.         return name;! z1 t8 r% r4 e6 ]/ C
  32.     }3 @8 ?0 m) s! U; k! G
  33.   @6 M1 y7 c0 z5 i3 E
  34.     public double getAttackPower() {
    6 f2 U9 v: o. Y( `. v2 P/ p3 l; m
  35.         return attackPower;
    9 F! c1 M+ s2 @, B2 Z& K/ B
  36.     }3 B* _5 d0 {$ s, F3 \

  37. 8 {  f1 V% b  s% V: X  T/ k
  38.     public void setAttackPower(double attackPower) {2 {5 V. q# _* F. A5 F# U2 R1 p
  39.         this.attackPower = attackPower;
    % m* {% d# B9 X$ y) z  Q
  40.     }
    & h- }* V+ A1 \3 j+ }/ z$ c  l
  41. }
    ( s$ Z5 h4 L) t' l
Скопировать код
9 R! r- K) C/ Q7 R. p
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.# B/ M( F- Y  ]
2 X' N/ I. N& o4 ]
  1. // Пакет org.l2jmobius.gameserver.model.battle  N+ ~4 g& E6 T$ \' N9 i
  2. package org.l2jmobius.gameserver.model.battle;
    * n; F4 T* m( W' ?8 W  k
  3. ! v5 e1 V0 \5 z- b3 |. }* z, I
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 ?7 J3 w( ~& c4 K. B- _
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;7 a+ j6 y- {7 j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;2 U9 j! U+ v) _. g, R$ L; H$ U5 B

  7. ; V! J: D8 n. o- e2 n
  8. public class BattleSimulation {& |! o$ z: r5 k( |
  9.     public static void main(String[] args) {0 w6 r7 }0 x) }3 Y7 ?
  10.         // Создаем монстра с начальной атакой# W! H/ x) [; U, z: z3 b6 p7 a
  11.         Monster monster = new Monster("Дракон", 100);
    : v  u6 e, e# p) Y2 v& I2 m
  12. ( Q9 `* R. R/ E* ?+ g
  13.         // Начальная фаза
    8 ]: m0 X, D- @9 [+ F# q
  14.         monster.executeState();9 P( d: U; V' X# o

  15. ( w+ I. u, V7 y* B. J1 q9 G1 q0 \
  16.         // Переход в агрессивную фазу
    7 j3 N" {. U" G+ `( H2 F1 Q$ n
  17.         monster.setState(new AggressiveState());/ \. ]3 J% A3 r  g/ I
  18.         monster.executeState();
    . K* ]" U8 p+ B7 y3 d

  19. 4 ?" r5 t" {" i4 l4 I
  20.         // Финальная фаза
    * Q  A/ b! \" f; F( u1 H9 R
  21.         monster.setState(new FinalState());
    5 I: }) x; b0 ]  x
  22.         monster.executeState();5 r% v! l  Y4 Z8 j- m9 n8 k
  23.     }4 g# L1 n5 K3 C* _, }
  24. }
    3 Z6 f- p6 `: N0 J
Скопировать код
0 K4 h1 p* T/ F  x- |0 o- p" R9 A
Комментарии по структуре пакетов и классов:
8 r" }! D. M# l# k5 n
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    9 p, B8 _2 A; O) p" e; P
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
% S6 O9 [+ w+ ~+ `+ C" {: G. a6 eЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# x3 A- D( a' ^! o2 F7 V  u* R2 Y4 g. @8 _( _5 R
3 @# K: A; P% Q. f% t5 E
" [$ N$ I/ F# t6 c

) A: P8 P" c3 _. X& F! m! ?& ]7 [
- W: v# z; w) L) J) [
( N% L0 d0 }/ J7 r3 W+ W4 _. C" p' ~

8 \7 j( |/ e4 j8 w/ B, o' t, o& J8 @1 n

6 H4 _' L; X" i; i4 R% C' r6 i) J- M! X

4 p7 C2 N+ h+ |9 h3 O) ^3 R  {3 }; V& e% Y

: R  z8 L9 K, g  C8 Z  {
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
" M+ W' e$ L0 R1 T7 oДля управления сложными взаимодействиями, такими как  ...

' Q" N( Z1 D2 p+ KОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
! G4 w1 O) {  y9 l7 WОтличный подход! Использование шаблона "Состояние" де ...
2 |9 E# q' J3 c
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
8 J  U+ N6 Q& s* E( `
3 G$ t0 v+ T+ A" e5 i4 L1 p8 B) bШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
7 M" c4 X7 ^- R
; g. R% p1 j3 c
  1. // Пакет org.l2jmobius.gameserver.model.actor2 e: |# X, R; _' S  q' O8 n' q
  2. package org.l2jmobius.gameserver.model.actor;
    ! ]6 k) j( v- l! z
  3. * k1 ^2 o5 n: m! e
  4. // Перечисление для типов атак# z9 E# y0 L. ?
  5. public enum AttackType {
    6 v8 n8 D4 k9 x6 N( E
  6.     PHYSICAL, MAGICAL;! q+ t- T$ [8 T8 n- B
  7. }, Q8 ?1 k! D: B( Q' j/ U, f
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
* ^! B; A" }" Z" ^9 ^+ B9 [4 Y, o; ?Обновленный класс для агрессивного состояния монстра:4 O" t7 G3 ^7 R0 P

% Q6 o; S! [7 |$ N7 G
  1. // Пакет org.l2jmobius.gameserver.model.actor.state8 ~3 Y; L) I2 x9 }- R' c
  2. package org.l2jmobius.gameserver.model.actor.state;
    8 ~7 n4 h, Q% e& _* d1 F+ E
  3. 6 r* S/ L! K5 F" p! s" j6 ?) ^
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    7 F( A4 }9 R: h6 \, e
  5. import org.l2jmobius.gameserver.model.actor.AttackType;% n/ R4 B: d1 o
  6. ( {7 ~& {& ]" z, K
  7. import java.util.Random;
    " Y# }2 H* c1 H1 o) {5 V0 p; i# |

  8. ) m0 m- Y9 D% C# B
  9. public class AggressiveState implements MonsterState {2 Q4 h5 t& d* o1 p3 R
  10.     private Random random = new Random();9 Y& C3 p" _# T
  11. + l. Q  ?8 S, L: B! Y, [
  12.     @Override
    ( G4 k2 j7 Q% n4 u+ g, R8 P
  13.     public void handleState(Monster monster) {
    % S% ]8 Y; x3 L2 S: I0 V
  14.         // Выбираем случайный тип атаки: физическая или магическая
    * ]  F4 H/ {2 I1 p
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;* @# J8 p- y/ ^' ~( f; Z1 m
  16. 7 I$ F, N+ L; b, T. Z' R% {' n' l
  17.         // Логика для агрессивной фазы боя# j: i2 H) F8 ~6 g9 [+ w: C
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    + D4 `3 x& m# u* y2 l* Y. ^
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    ) Y- G" z5 W/ i. D6 Z5 i- `* [$ G
  20.         
    4 J) |5 v: q, I) U
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    , Z, n4 e1 R( _8 z7 m4 Y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;3 L1 L6 I! [- H: E$ I6 E
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);) }8 @4 O# L$ z
  24.     }
    & w5 g3 U) u' Y7 ?0 E& N
  25. }. k1 B* G$ m0 B8 @9 K" C
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
. ~8 B5 i' a' z- G4 v/ M
& M% ^( _, u; T  i
  1. // Пакет org.l2jmobius.gameserver.model.actor
    6 @5 \% B) C1 K  X, G
  2. package org.l2jmobius.gameserver.model.actor;5 |2 L+ K* d7 z
  3. 6 c9 u: |. c4 u; U8 t
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 ?! m- D' m- l
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;6 d! Z' l, C! |1 Q, N
  6. ! N, ]* m8 b9 L# `
  7. public class Monster extends Creature {
    6 y2 L0 ?" q, L
  8.     private String name;+ I! d# G# a# s7 d0 R# Y8 N
  9.     private double attackPower;
    ! T- |$ u6 r8 f
  10.     private MonsterState state; // Текущее состояние монстра. \; ?& i0 i4 {. ^( A+ O' e( e* C

  11. 8 R9 R7 J8 p: ]9 G6 S3 _
  12.     // Конструктор монстра& |9 f- l* p9 f4 i8 K& Y% x
  13.     public Monster(String name, double attackPower) {8 N  w, R! a) F3 ^
  14.         this.name = name;3 B7 k; O- c7 `- y$ h8 u% T, e/ [5 x
  15.         this.attackPower = attackPower;& A) A4 d- I, a9 P- `
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    7 ?0 `. e$ Y2 E9 G: ]2 G
  17.     }
    ) Z$ B0 a' [# \2 T5 ]# n/ M

  18. ! ^) A; t2 |- {9 Q1 {! V
  19.     // Метод для смены состояния/ j  v$ w# U# _# {9 f5 W
  20.     public void setState(MonsterState newState) {3 g" U6 A& i4 e! \
  21.         this.state = newState;) K, L0 I9 N5 U3 ~% t
  22.     }2 ^9 E( \" R/ O. b0 y) t& D0 S; N
  23. # d. Y$ v5 F3 O. w3 i& h, W
  24.     // Выполнение действий на основе текущего состояния
    , ]( A/ `0 I+ D  |% w4 |
  25.     public void executeState() {
    , u5 Y5 q6 n  y2 N, s6 v) U
  26.         state.handleState(this);2 y- f$ k1 n* h+ D0 d' Y
  27.     }' Q& a/ M$ K4 `; }4 j2 r( j! O% ^8 ^

  28. - ], m2 F. p/ S7 r( e% m- I9 p( Y
  29.     // Геттеры и сеттеры
    7 {4 Z% C" V1 \% m0 S
  30.     public String getName() {8 b5 B8 F& @' c0 h  I" K
  31.         return name;5 ~& @, C$ R( D$ x" {! U% J
  32.     }* M8 L' h1 {  E8 F! S) V
  33. , j; E  F) T. N7 ]. _% f1 w1 y
  34.     public double getAttackPower() {
    1 C% j. w8 s) N# }/ f
  35.         return attackPower;
    ( O0 M+ q1 k& \, j( y
  36.     }
    : d9 F4 ]3 `/ V1 h4 |( A

  37. 7 A+ c- R2 c! j2 C
  38.     public void setAttackPower(double attackPower) {* k8 D3 a% M8 u
  39.         this.attackPower = attackPower;% O5 o: n! r8 z
  40.     }# B! N" U7 y3 Q' b- @* \
  41. }
    - j% ]) l2 q# w7 {/ t
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
1 O$ {0 U1 |% d2 H2 E7 ?, f" s. C3 A- n/ m9 r# z7 G
  1. // Пакет org.l2jmobius.gameserver.model.battle7 c: R6 S& A9 Z: ?0 [5 s$ j
  2. package org.l2jmobius.gameserver.model.battle;
    4 t; V" a; P) n2 c  D
  3. ) O+ d3 S  Y* \, G% m" h
  4. import org.l2jmobius.gameserver.model.actor.Monster;, `& I" g) K: L- _0 q
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& \- @, }! o3 L  R0 }
  6. 7 l. @9 g  o" _6 I3 k
  7. public class BattleSimulation {
    4 l+ s: n% x7 ^" W0 V3 F
  8.     public static void main(String[] args) {/ E. K$ X- q# J/ w& Q
  9.         // Создаем монстра) m- B5 E* Q& T( X% `  s* R0 J& W( y
  10.         Monster monster = new Monster("Дракон", 100);$ f# P; d. @( W$ Q  n2 q

  11. 8 _( E+ Q9 @& {3 P& e2 R1 A- a7 H( ?
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    ; Q/ e, l! k% S
  13.         monster.setState(new AggressiveState());& q0 M6 \- D* M- O# O8 x+ c
  14.         monster.executeState();
    8 h" _; T, v" W; V
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    , m# \2 r* v( @5 f  W
  16.     }
    8 I/ U+ R  {. `4 [  [2 y
  17. }
    8 f0 D4 H) D9 U% T  Z
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
0 U6 i; W% I- G8 A  L" v$ ~: cЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!( B0 K8 o8 ~9 z, j

6 z: h  ]# f& c& b1 Z' @- w+ H/ J, g

+ o- q; q* u' Y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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