Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
% m" a0 v! C; M; V7 P9 t# C- S3 |$ _3 W
0 k5 d, D# D% q  F- I& \! p. [
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
$ E& u$ v1 }6 GЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!+ Y' z3 h% n& d
Астралия ?8 x) Y/ H7 o- h0 r, r

% s- k: l# L& p, ^0 r8 t! Q( I

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
4 Y9 x) W% P  Z: o! P6 KВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?/ ?9 o& F; W+ r  x  X
/ a. ]  |) _6 F$ t) b
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
" i( D& I1 I; s# y. y
AlexCoder опубликовал в 2024-10-16 18:312 S6 C9 E* g  l) D5 [  o
День добрый!
0 [1 I2 H) G1 y0 E% p& rВ статье описано взаимодействие игрока с N ...
' ^. V+ [3 O2 b. k9 e' ?! A5 A
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). % }% V/ X  N1 R6 N( `  S

# n. e% p" B4 I( _5 fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; {( b1 X% `  R# T: a8 S  ]7 X, Q( t' S  U0 v
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
  M% E' E8 B2 Z8 r% O$ c* Y! F, I
7 z/ q2 C: u+ Z$ A" Y" l
  1. <font color="Green">// Пакет для состояний монстра</font>
    + ^1 `4 l3 @0 H' P* e
  2. package org.l2jmobius.gameserver.model.actor.state;7 _' x/ z1 }7 y8 N: n" L3 B
  3. <font color="Green">( u/ m6 P6 T, R! V
  4. // Интерфейс, представляющий состояния монстра</font>8 ]! L* Y6 `: T* f9 P- }7 T0 C1 S2 |
  5. public interface MonsterState {0 s# p, U4 P0 Y8 r: u
  6.     void handleState(Monster monster);
    ! v- D6 }% b+ ~
  7. }
    ' n( V4 Q( N8 {
Скопировать код
4 L7 }. u) Q, f0 X& j) D. m6 H  O
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  r& |% ]$ q* ^8 n: B; l. q, @% y: V' J( e4 a+ X& ^: @( I$ T! l
Класс для начального состояния монстра:
# K) W6 b0 y6 G6 T5 T  y$ u
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>4 @5 }/ D) f" u. l  w2 s
  2. package org.l2jmobius.gameserver.model.actor.state;
    / K; A& V. W/ d! h
  3. 2 M$ f% n7 J% t1 |: X4 V6 M" E5 {8 ?
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    - M. z" |  w' ?2 R, G
  5. + i3 ]) G  f: ?$ }0 a' e0 r  r7 E( t
  6. public class InitialState implements MonsterState {- k* I( \4 b( o
  7.     @Override
    8 O* k# t+ H7 X' e% e
  8.     public void handleState(Monster monster) {
    1 q) c" z+ ~1 E4 ?- h6 H* M. j0 F
  9.         // Начальная фаза боя- L& W+ [$ W% Q6 R% M$ z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 f5 v5 V- i: D  E8 b( U
  11.     }
    6 u8 z4 b. [7 H/ D0 E* x6 B
  12. }# s5 ?+ K  h* P7 l
Скопировать код

6 r4 @, v& U' m" t2 D, Z
: h. u& M) N; i9 S! v
% M$ @1 g; x- ]8 I+ X% P
& k; b/ L/ p$ `* v& y* S9 L* A, \" q2 u2 W* p; T: ?
* \4 A. L" _& b  M0 ~: q
7 R$ h" e! b) R
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
. {' q* j3 u- F2 Z
1 \' `0 m( S$ w6 JЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.+ s& M/ i; b& e
4 A3 @; A3 O9 j* j8 w+ f
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- V" x( t: q4 u/ {( \" E
% ~% L, U9 s- P* f
  1. // Пакет для состояний монстра4 L* `, B' F' X. Z+ B' }  i
  2. package org.l2jmobius.gameserver.model.actor.state;3 ~) @( V+ |! Y& b$ {" |
  3. + a- H. r- \8 E* r# A
  4. // Интерфейс, представляющий состояния монстра1 m5 B, B! Z, t$ a# v* j2 @
  5. public interface MonsterState {
    0 p8 _7 S, R5 H! z3 W7 V
  6.     void handleState(Monster monster);
    4 p  J  ^4 ]- J
  7. }
    ! b9 Y/ j+ g" T8 r; Z
Скопировать код

5 y! W* T0 Q' mШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# g/ s2 R7 P. _4 Q+ D4 P4 @2 O3 b  H7 P4 `% Q* S5 l# R
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
& n4 W5 G1 D' F2 V9 Q: ]+ M0 V$ G- X6 R$ C) Z
Класс для начального состояния монстра:
. M4 c) D: Y8 Q% D9 s
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ' `6 s; A3 [. }; ^; S
  2. package org.l2jmobius.gameserver.model.actor.state;* S. Z8 H1 N- @, j% h- |
  3. ( Y! K! h% v( F& G
  4. import org.l2jmobius.gameserver.model.actor.Monster;; c3 F3 P! V* F# }, J
  5.   [* w9 @1 a( U0 ~1 O
  6. public class InitialState implements MonsterState {
    6 j/ Q  c. g* S6 ^
  7.     @Override8 I, k7 }. q( k5 g
  8.     public void handleState(Monster monster) {, @% g& ^8 H% T; [. b6 Z  ^
  9.         // Начальная фаза боя
    ( N" e" v3 U5 G$ H; a$ a1 Q, g1 z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : b) l/ m2 q. H( C
  11.     }8 c! L" q7 {9 r& F% F  ~. {* L1 H
  12. }! D; P: G8 x( e
Скопировать код
Класс для агрессивного состояния монстра:
0 J$ L' ^' H1 U! x1 S/ {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    . K& P3 K% h% f4 x9 D4 F4 c
  2. package org.l2jmobius.gameserver.model.actor.state;+ J+ i/ w' D7 ?: s

  3. % {/ F; p" v2 b7 Q& h
  4. import org.l2jmobius.gameserver.model.actor.Monster;! Y/ _" u7 j# J2 a' b- G

  5. ' j. ~; l0 r4 O# u" A$ v' S
  6. public class AggressiveState implements MonsterState {
    * q$ S, ?" w  z* E
  7.     @Override/ [0 W8 O% \1 H4 q  Q4 q# X
  8.     public void handleState(Monster monster) {
    " _! @  r+ ^& `7 _. O3 F
  9.         // Агрессивная фаза боя
    $ h# `/ e; O5 h
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    ' I- |9 q% T- h  i- B
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    ; i7 w) L1 p1 J4 _
  12.     }+ H* a8 i. B8 @, W6 ~
  13. }
    0 y0 @! u" l/ C* Q
Скопировать код
Класс для финального состояния монстра:" A5 `; O- t0 g+ n" N
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    , g4 [' s. U$ E+ M' E7 ]& c8 j' O
  2. package org.l2jmobius.gameserver.model.actor.state;' E. a9 |- s4 m

  3. 1 t$ \' m1 z& n. ?5 Q0 {" Q. [
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 L2 [3 N5 f2 a: o& |6 `* E4 n( K
  5. 5 {# S, I1 ~( k, N9 T) U# _
  6. public class FinalState implements MonsterState {
    ) G: ^/ a5 g' G2 s* I) S5 V% n; A
  7.     @Override* w! N* s$ m! l
  8.     public void handleState(Monster monster) {( N3 W* G& |# x# w7 l" |" y
  9.         // Финальная фаза боя
    / c6 j  t6 y/ C3 Z- M" f9 J# ?4 v
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");, \, q( ~6 R- Q% F9 K+ n
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки9 O+ T, M* w: _' g* Z0 @* X
  12.     }
    ' i) A6 b8 n- @3 X4 `( K* W
  13. }5 T$ j. w5 I2 y  G0 M& [
Скопировать код

$ ?9 P+ L* p& h6 e7 Q* nШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
; a" v9 N4 E5 z
  1. // Пакет org.l2jmobius.gameserver.model.actor; B' V0 o0 Q+ H; b8 ^
  2. package org.l2jmobius.gameserver.model.actor;
    ( \3 @! v0 b, U/ Y: c

  3. 1 T- y) q! g4 J
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 A& N2 G) h5 N/ t  J- v
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    & a( l2 r& u3 D' A3 p! t0 e$ m' s
  6. , Z4 @& {/ d8 L  g
  7. public class Monster extends Creature {
    + _/ g9 w$ n1 H' ?9 R5 H
  8.     private String name;
    - z  `) o0 T$ v( a! T
  9.     private double attackPower;, q% q# {4 ^: q$ U2 _; C
  10.     private MonsterState state; // Текущее состояние монстра
    8 V$ a8 g2 n  R+ R! v

  11. ) T7 t& b/ o  F' Q# s
  12.     // Конструктор монстра
    7 m2 `) H7 ?2 x3 V! V7 m
  13.     public Monster(String name, double attackPower) {  G5 d! W5 w# P) l- T- B8 n
  14.         this.name = name;# s/ I1 a& I: y/ [  u; F8 T
  15.         this.attackPower = attackPower;
    0 O4 ]7 U( i, a7 L% z
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние; O: B5 h9 Z) A
  17.     }
    : V" Y, E  o% u
  18. + T8 i0 ]  N0 M" M
  19.     // Метод для смены состояния
    " o: C6 p& R! ^" J' y: d3 F5 [5 F/ d
  20.     public void setState(MonsterState newState) {
    & M! i  u* G% X; s, B
  21.         this.state = newState;
    1 i/ k' M( N* m  L" v; _
  22.     }+ P! l6 V( }3 }2 p+ C7 D- b( |
  23. ) A" N4 `: r. k8 a* @
  24.     // Выполнение действий на основе текущего состояния6 u7 ^) _. h5 z5 k7 r3 _! q
  25.     public void executeState() {
    + G3 G4 t# q2 I1 w: U! L
  26.         state.handleState(this);$ I, K' S2 W4 V0 Z' u
  27.     }5 Q) }: j6 U+ P. i. L1 z

  28. 1 v2 e: c5 D+ G+ g( {" m. l
  29.     // Геттеры и сеттеры4 j! c/ w  z, O! l; k* o5 h  p
  30.     public String getName() {' Z# j. ]9 p- w- {1 k
  31.         return name;7 r$ H9 Q1 j) P/ X# F' X  N: w
  32.     }
    . K! f: c' l! S; s, P+ E( }
  33. & ~# O. x  O2 `. T+ x
  34.     public double getAttackPower() {; P" p% _1 J8 E3 z* c
  35.         return attackPower;
    4 [9 \; |6 E& R/ J+ V
  36.     }
    ( p+ ~$ T; P! L& n' G

  37. 0 g0 v" H& m$ a8 h$ i+ o
  38.     public void setAttackPower(double attackPower) {$ k) s- T* D" r' s+ c
  39.         this.attackPower = attackPower;# @1 K& ^# D( `  G; X5 o
  40.     }
    6 B8 w$ X% e9 [6 u1 j8 j9 U
  41. }
    % J7 ?5 I% Q" e1 G
Скопировать код

1 X4 Z. x* c$ G: o' {5 H8 }Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
, I9 z8 v: l9 t4 S* o! o6 P. h  z# n" _- q% V$ q( b, u
  1. // Пакет org.l2jmobius.gameserver.model.battle
    ( a+ [* a$ d2 ~+ ]
  2. package org.l2jmobius.gameserver.model.battle;; g2 H3 G8 y8 Q; [, S" J7 C3 m

  3. 0 }5 J+ q: j& `5 y* z# R; y3 w
  4. import org.l2jmobius.gameserver.model.actor.Monster;) p3 P& B8 k, F' d: C* e, t. v
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    6 b. d7 n4 f) L- s
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;. q% S4 C, n; v6 G

  7. - D. R& N, K0 F2 Q6 R* `# a2 _& l
  8. public class BattleSimulation {) Q/ v$ \3 P7 u* H
  9.     public static void main(String[] args) {
    - L# F0 p; G0 O" x
  10.         // Создаем монстра с начальной атакой
    4 q5 m- l7 E1 K. a( v
  11.         Monster monster = new Monster("Дракон", 100);2 w1 A4 r  X7 X4 F/ S) ~

  12. % k. W) _& @, |4 C- ~
  13.         // Начальная фаза
    + T& u4 ^8 i3 w8 p# U& D; k
  14.         monster.executeState();
    4 T, z2 C( p# W6 F/ o* ]! w

  15. ; ^( n4 {; B: U0 j7 S6 ^9 y$ o
  16.         // Переход в агрессивную фазу
    " H6 J% ~/ H8 g8 X7 u
  17.         monster.setState(new AggressiveState());
    1 H0 g0 D  z- {5 D; k
  18.         monster.executeState();
    1 F& e2 N6 W, K/ c/ F/ v8 h
  19. ! y4 T$ d- g# y0 c: M
  20.         // Финальная фаза
    4 A% W9 T( y1 S+ K
  21.         monster.setState(new FinalState());8 k1 }( G7 u0 }
  22.         monster.executeState();
    5 {# A5 j( ?5 Z/ E# I+ g0 ]
  23.     }4 j. I" N! k2 _7 d, g& S0 F
  24. }8 C/ H) X1 ?0 e% ?
Скопировать код
# z8 \# j' Y1 ~
Комментарии по структуре пакетов и классов:
! J- u( G3 q2 g- w3 V
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    % t! x+ g0 {2 Y" |" r
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! W$ P! R5 [+ Y+ ~% B5 ^* H# a' A, f  K
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!" d3 q) G, \& d) o  x% l; b' J  P

' `2 F4 v% x; A2 J( i$ [
* g# c; G- A8 b. O6 s
* S# g8 \3 m: g% p/ I( |
& m' c: ?, `, @
2 |9 X# o( t5 j' Q9 T9 v! e- w6 Y! `4 S1 b+ ~7 i. a$ w+ \4 Z5 I) ^
# @1 p+ A4 n- ^! I

  d9 s# ^* q% |8 M5 E: v" f; G9 @$ m0 {. a. @! e
- c  o3 d2 }# x
8 v% c2 q2 J; ~: y$ \. F" A) h
; k  x- V( K% b3 Y5 y) N

+ T$ X7 h( k* W  i. N! l7 n6 n- k6 b6 h8 c- J/ _
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
- B* L" Y7 ]" AДля управления сложными взаимодействиями, такими как  ...
8 W4 ^" \, |' A! t
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
* e  O) e% E9 }4 G" fОтличный подход! Использование шаблона "Состояние" де ...

- m4 l9 c( C& ]* M1 \Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. x; R# U8 j+ w  B; x, b- _5 Y

- f  {8 p- P% b9 K3 }Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
% }( ^$ B  g/ S9 s7 b4 z; \4 t- I$ }7 W+ @5 p+ e5 Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    0 m+ b- H1 B' {7 p1 y) ?
  2. package org.l2jmobius.gameserver.model.actor;
    4 V4 [# @. y2 e
  3. 3 f' a  f" m8 S/ [. w/ S
  4. // Перечисление для типов атак
    ! x( P  e; l6 L! u, j
  5. public enum AttackType {
    * `' K5 @7 V$ z1 d" K
  6.     PHYSICAL, MAGICAL;! i% k7 P3 F# ^! G6 L3 o
  7. }
    * [3 A2 t' }( Y6 R% f  \9 M9 l; g
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
- Q: h; b! F  IОбновленный класс для агрессивного состояния монстра:3 T, F! M* z# V
& y. m, Q- `! ^" m. j/ J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; W7 }2 d, W3 A8 N3 V- S4 T
  2. package org.l2jmobius.gameserver.model.actor.state;
    * F! {& B1 y1 e1 i- e: K8 l# O* I
  3. % G! M& j: H. j4 `/ ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ B& ?: e0 E9 X3 z: F+ g
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    1 N, b6 x- P8 d! Q1 w% y# r1 B

  6. 2 }: o8 N/ o) t3 V6 k
  7. import java.util.Random;5 u: P3 E. n  b* M8 D% l

  8. 7 b2 |6 T* }2 S( Z5 I- b
  9. public class AggressiveState implements MonsterState {0 p2 z1 f; z' w( Y2 H4 ?; L
  10.     private Random random = new Random();: E0 ~& v9 J, i4 s+ r, \" t  O7 r

  11. 2 g: E! S) w! Q& N% S7 P
  12.     @Override, J% J( _. n* J+ f( T6 q+ W6 `
  13.     public void handleState(Monster monster) {
    9 n' _+ L: K1 y2 X
  14.         // Выбираем случайный тип атаки: физическая или магическая+ Q3 f2 u% f1 c5 T
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    ! n" M& L9 X/ ]7 y2 k1 ]
  16. 3 w7 v+ v" j  Y5 j0 Q
  17.         // Логика для агрессивной фазы боя' M! }3 B% \  d+ @6 t
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " ' S8 Z$ Y- a; l; i5 j( d$ ^
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    7 X5 E: X7 W  o. w9 f* v% l( U0 k
  20.         / Q9 i8 o! V- d0 J1 h0 k4 H
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    / w/ E7 |! F7 {# Q4 }+ P6 j
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    - j/ J% x& \9 ^! X3 t, K
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);7 N4 ?* J% B) F! o
  24.     }
    ; u3 U/ p/ \3 H8 j( X4 y- d4 g
  25. }; s; Z1 }; W9 y" }9 S8 h
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки% Z0 z: P. B9 }5 o$ Q
% r( i( P3 S" E2 `$ A
  1. // Пакет org.l2jmobius.gameserver.model.actor" P1 M, o3 R  C
  2. package org.l2jmobius.gameserver.model.actor;! j) I7 @* g' g5 }- I. O
  3. 5 B6 g$ }0 `2 ?8 j( ~
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;. l$ A: f' U" @4 _" y! f4 S
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;+ E) x; t6 a7 C: L5 T. p
  6. $ I6 `  |3 D7 f" w9 f0 F; }
  7. public class Monster extends Creature {9 _. J+ V6 s5 Q) f. I
  8.     private String name;
    / p$ P7 I( i1 T% B: q6 `
  9.     private double attackPower;
    7 }$ [' q1 t. n6 `( I4 k
  10.     private MonsterState state; // Текущее состояние монстра  ^+ G& d' C7 q- _) c& A) {

  11. - R, q/ ~" i/ N# p1 f
  12.     // Конструктор монстра
    5 ]. A4 ]/ n/ x$ P
  13.     public Monster(String name, double attackPower) {5 D9 G5 z/ @0 N% a+ M! o
  14.         this.name = name;
    ' K9 ?3 X! i9 W# |3 n# y* k
  15.         this.attackPower = attackPower;
    / ]" |; J, S! c4 R% }7 k
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    6 S( {( Q4 `, T9 R( s
  17.     }% ~3 A* g, T' I) `1 P  K

  18. ' M: K( x4 P: p* z* e8 C
  19.     // Метод для смены состояния! s6 [; Q- g- t3 l& h* p/ h: _
  20.     public void setState(MonsterState newState) {
    7 d# s/ f- G# ~" P- e) A1 ~
  21.         this.state = newState;
    ) w4 ^+ f. S5 ^: F5 ^
  22.     }
    9 v; k6 U& j) c3 c

  23. 5 e0 B. N; }1 L3 v/ i
  24.     // Выполнение действий на основе текущего состояния
    # D; t& N6 J7 S, U4 N
  25.     public void executeState() {5 x7 S$ s6 Y7 N9 D" W/ ^
  26.         state.handleState(this);, \: w+ Y! u3 H1 a  E4 q/ d* G! s
  27.     }
    ! h! D, v* N: v  T1 W1 i: _
  28. & x; e9 |+ t* c9 t, A2 e
  29.     // Геттеры и сеттеры- s/ Q" r" I7 Y4 b; l" ^# P, ?
  30.     public String getName() {
    8 T7 o, W- m& y! G5 z
  31.         return name;  M/ u5 c1 m4 a+ e
  32.     }
    6 C* O5 X; X' D% s( B# p) z# ?
  33. 2 I6 i4 `! q/ F5 [. p2 ?- R
  34.     public double getAttackPower() {
    0 L% P. F$ j# k4 O8 K7 I0 Z
  35.         return attackPower;
    6 M/ U. ]+ b; J" O0 p+ H
  36.     }5 {6 ]! a0 ^6 g9 ^$ Z  i

  37. 4 S& P1 g- H# D) T6 F) l# q* a
  38.     public void setAttackPower(double attackPower) {$ C3 [) X' B+ O7 N6 i3 b1 F& Q- [
  39.         this.attackPower = attackPower;
    1 U0 ]3 I$ v2 p( v4 z" N
  40.     }
    6 X. m* [& v( V, {
  41. }
    8 F, g/ }. D, k. c6 V) v
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
  L; G5 x- ^& I; m
8 Q/ i" s8 q  p# f1 G( Z0 w; W
  1. // Пакет org.l2jmobius.gameserver.model.battle( J& V5 w- _% ^
  2. package org.l2jmobius.gameserver.model.battle;
    4 \+ |% H, C, N9 v
  3. 3 X+ k9 ^; e8 Y8 I. k- Z' U
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 t2 a5 }% M0 {# [2 A
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;  |+ i1 P% y/ i6 X; E  C

  6. * E! p3 W) x6 Y+ B. _& z
  7. public class BattleSimulation {
    , q" ~! a7 @1 X* V  x* E
  8.     public static void main(String[] args) {
    , T  _- c9 R0 S4 ]. A6 t' ?. ~
  9.         // Создаем монстра
    . P+ U6 o9 j6 D4 b: w/ e2 N1 m, c
  10.         Monster monster = new Monster("Дракон", 100);
    6 }& B: u: a% V3 N4 ^' r
  11. . Y5 j0 |3 e8 a' U, R4 k' d
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    % K6 d8 E0 A$ R' a
  13.         monster.setState(new AggressiveState());
      k6 z% f" Q( p2 ^
  14.         monster.executeState();
    $ P& v  Q4 u/ E5 H5 ^. W- l
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак( h" d8 u- w" G* z+ J; J5 w& s
  16.     }
    - p" T' y) ^% [7 i8 l; d
  17. }$ \2 W  _4 `$ Y- t: j2 N9 G7 C
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.# {" J! q$ Y! ^( `' o/ Y9 X% w
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
! z0 U8 Q0 }. g! n+ D% b. m/ y. \* o9 s6 g6 N/ n3 ]. X

% b* T! {  \$ |2 {2 Q8 `6 |6 K7 \6 V# x0 P
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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