Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
$ b1 ^. U/ s+ `0 V8 p
; [0 j  Q% j! Y3 j: V: T

" J/ N5 {3 S/ L( h: f0 D4 fЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
6 y+ p4 |' S1 N+ X! t9 lЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!3 K0 ]/ F* @- G- Y0 _+ }/ E
Астралия ?% j; i8 d3 S) O
5 q! g9 I6 v3 N- s* W* }6 `. r

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
/ x: K/ R3 [& X' ?' xВ статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?9 G1 K' T( U( a8 ?3 C, Z; x

+ O) F) V- e* o7 ~, V. w% x- k
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
: P( Y+ [0 S7 M% u
AlexCoder опубликовал в 2024-10-16 18:31: ?' o- A% Q( f5 D6 D8 ^
День добрый!/ R5 X& X0 Z  u( }0 L$ r( {* n2 _
В статье описано взаимодействие игрока с N ...
" l6 }# o9 t/ v! l
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 g6 z+ w3 [. |0 @. Y3 o( \' x6 s1 O3 m/ P0 W" p
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 h% N8 i3 t8 e! Y9 C1 l2 P

* h5 W% f7 {1 E' OШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., e7 v) H# n5 R% I( e- b( C9 K
' b( h" U; Y- Y' `
  1. <font color="Green">// Пакет для состояний монстра</font>
    3 @5 d$ I/ E4 O* F4 V4 ?% _; J
  2. package org.l2jmobius.gameserver.model.actor.state;
    & K7 ~3 ~2 a2 ~: \
  3. <font color="Green"># K9 m7 v2 g4 p
  4. // Интерфейс, представляющий состояния монстра</font>
      A" S5 h5 U% D7 S8 s: T( P
  5. public interface MonsterState {# t  h' }1 s7 a0 |
  6.     void handleState(Monster monster);
    , n( P8 z8 t! C1 F/ ]3 ]/ i
  7. }
    ! c8 H! z; ^- L1 [3 _6 i
Скопировать код

" X1 F* n+ s0 o. A. F* ^Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.  v3 H; t0 T" i  w. z3 O8 a

% X, M. c4 c6 {# |/ D& yКласс для начального состояния монстра:/ S! N" b6 |% Q  M0 {$ u  h
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>, b& \' Z8 R6 P* _* |6 Y
  2. package org.l2jmobius.gameserver.model.actor.state;
    1 x3 I' q+ R- i2 ]. P: q- h7 ~

  3. / V$ d% j# {4 x8 ~: t# y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , a# ~8 r7 n- W) U7 d1 I; p* l' j
  5. ( ]' n% @: u* m- |3 U
  6. public class InitialState implements MonsterState {
      E4 F% u# Y) O
  7.     @Override
    : t& J6 ]+ ]3 s: N7 d$ Q) b' Z
  8.     public void handleState(Monster monster) {
    7 L5 j2 L/ ~  a* G0 t# I; b
  9.         // Начальная фаза боя) K6 H9 V0 M0 w8 S6 ?* K9 Q
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( m$ E$ n) `, s, w
  11.     }8 o% O* a- _9 \
  12. }
    + q! w/ {: _( |
Скопировать код
8 `2 l* J5 y6 z# U/ F" Y$ z+ o

0 l2 |- \* j0 X2 s# W) ]* p& g4 ^( l5 D- e. T0 ?

+ p2 n# {& H' r( F1 V9 u3 J
' o, c( n3 L( q2 A5 n0 o) f' o" y. k/ A3 D0 D

- ?( ^- |+ o- I+ {" [
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). % y) g* ^( w7 i5 }: r

0 r6 ?' u" I$ b$ W5 M" ?4 F0 j$ fЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 y- X% k: @4 x0 g" {; u4 o3 g; S+ U4 {
0 {$ }6 c; t) r1 C1 gШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.2 B; K! B% T4 E: o! [! H+ t* S

7 A7 K: p7 {, a. c  k" J* k
  1. // Пакет для состояний монстра
    # x% X6 Y/ Z+ D7 `5 n
  2. package org.l2jmobius.gameserver.model.actor.state;
    9 @; ^" U1 K3 E* {: W; V1 N% |
  3. 2 n! j* i/ ^) N0 h  F+ I
  4. // Интерфейс, представляющий состояния монстра6 }- X& i+ K- v( B7 f/ y
  5. public interface MonsterState {% e! \3 ]$ r/ C; p
  6.     void handleState(Monster monster);
      h& D2 P# [; Z9 J8 F
  7. }
    - l; l; x& I9 ]# [/ p1 J4 l
Скопировать код
0 m6 r( W: I: W4 X
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. # D. o- ]9 ]( L4 h. Q" S8 }

7 Y4 t: o1 Y, x& a9 d  fЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
) ^; u$ r8 H4 x% W! M/ A+ a
* G& J! R. r/ Q& v9 [Класс для начального состояния монстра:
$ d# [$ Y3 x# W2 o
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / U" M0 V- X) l6 Y# d2 Q
  2. package org.l2jmobius.gameserver.model.actor.state;: c% {* v! p' |( K- g0 K

  3. 6 s) O/ ^. ~3 m# Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;% e  a5 R# T0 n- g$ v. H4 \! [6 ?

  5. 3 ~, M( Q, R; z- n
  6. public class InitialState implements MonsterState {' L( i$ N/ _" ?9 R# v" G
  7.     @Override/ F% m5 n4 }  b2 f3 m, [% k
  8.     public void handleState(Monster monster) {6 \* O( M! L6 ~* n. B4 a; Y
  9.         // Начальная фаза боя5 A* `+ Z: C) L& v# G7 F
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 f# m& j" T. X, r
  11.     }0 m) K# k  k9 |7 Q
  12. }
    $ f- @3 H' I" v
Скопировать код
Класс для агрессивного состояния монстра:2 A& X# B, M6 l8 Z1 T! i0 ?5 n. h
  1. // Пакет org.l2jmobius.gameserver.model.actor.state0 m" W6 I. ]9 b, ~7 T
  2. package org.l2jmobius.gameserver.model.actor.state;) Z* |5 Y. k. v/ m5 P2 z
  3. ; h7 g! Y: K% ~  g3 }8 ?* R
  4. import org.l2jmobius.gameserver.model.actor.Monster;! A% M8 M$ F. n5 T0 j8 y7 O

  5. & H5 L; c. L. b2 w
  6. public class AggressiveState implements MonsterState {5 J) N) _/ o; i/ z+ @0 }% O
  7.     @Override
    + S& d) y+ ~% D) `6 N+ K# Y+ U0 r' T
  8.     public void handleState(Monster monster) {
    + `9 W1 S1 C% v1 D* R. H2 m
  9.         // Агрессивная фаза боя5 R$ w& a0 c, O1 ^" s* B+ V
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    3 r' f1 w  \  _% u4 t5 \
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки" B% O" P3 K( `2 j4 V2 w
  12.     }
    ' I+ p) @/ a" L5 M+ _' {
  13. }
    - z+ F5 p" I; r% c0 g% N) V. c9 F
Скопировать код
Класс для финального состояния монстра:# x5 p$ L8 P; Z5 I
  1. // Пакет org.l2jmobius.gameserver.model.actor.state4 U8 O7 M6 j8 R0 i! O. A
  2. package org.l2jmobius.gameserver.model.actor.state;
    - ^$ X% @  X, r8 ^" s
  3. 8 ], R7 b+ T* L, S1 O# h
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % _3 y* P& A* n2 U$ G1 S+ [3 g
  5. ! e& |' M0 E, }, c" H5 J1 `, d
  6. public class FinalState implements MonsterState {
    2 }4 ^4 _4 G  z/ W
  7.     @Override& k, {2 x# N4 b' ]4 H
  8.     public void handleState(Monster monster) {
    * g; C  t5 N8 k+ S( s
  9.         // Финальная фаза боя7 n: r: \3 `. ?9 k/ \$ P1 P
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    5 [, t* }6 N  p/ N* a! c$ l
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ; O8 ~1 p5 v5 k
  12.     }: w: `  `7 M3 u# H! W
  13. }. _5 ?* Y2 b  g1 q% P
Скопировать код

* I/ \1 E  T$ I/ Y4 {Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
7 {5 j6 a) s" ]5 S$ s/ n
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 c/ o* _2 Q; l( g$ e* {; Q& `0 V7 h
  2. package org.l2jmobius.gameserver.model.actor;
    / V/ A9 s( n- E. t& w

  3. 6 |3 N% c) p3 n$ r
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 k8 r, _1 R1 y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! |/ u* z) x2 q( v7 g
  6. , o0 _1 t1 \- L% [8 |
  7. public class Monster extends Creature {4 u: Q* p2 Y# |
  8.     private String name;
    - X) p/ z. U+ o1 s) J# h6 ^9 [* x8 s
  9.     private double attackPower;1 l4 q; O# `- l- Z2 q# S8 N
  10.     private MonsterState state; // Текущее состояние монстра7 h+ h! @7 `! x& `+ h1 ^) K

  11.   S0 Q; l3 b/ e6 |; S
  12.     // Конструктор монстра' x( i' q2 Y% t; K* w
  13.     public Monster(String name, double attackPower) {: N  S1 l. P- I8 h$ [+ y! V: O
  14.         this.name = name;. ~7 X, W0 T# v
  15.         this.attackPower = attackPower;# x$ ]' R' \3 W& W6 i1 F5 p6 [
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ) P( b2 J3 M1 q
  17.     }
    $ s: n4 [; k/ q  M# y
  18.   H/ H; Z* V1 t9 ^9 i+ J8 m
  19.     // Метод для смены состояния+ K" Q7 |; N( F* p) E
  20.     public void setState(MonsterState newState) {
      \9 Z5 a9 m/ X% z( _0 u2 C
  21.         this.state = newState;
    8 v, }. R4 b! t' C
  22.     }/ x' }; A9 e+ n! o8 I5 `
  23. 2 e1 N# L$ Q6 b" P" z. F. `( g
  24.     // Выполнение действий на основе текущего состояния! q9 X+ i3 i) S$ V
  25.     public void executeState() {
    & C9 s0 x+ D2 e, ?
  26.         state.handleState(this);
      ]( r3 }8 i( B! A) r/ J
  27.     }. g6 R. G2 p$ j6 D4 b4 Q9 M

  28. 5 s) \. x: m2 I4 L" W
  29.     // Геттеры и сеттеры) Z. c! c0 Y$ j
  30.     public String getName() {
    1 C* I6 q  D* N. q. I( B% T& \' V
  31.         return name;
    * p1 p8 w+ ?" f
  32.     }
    ; r( x8 x( B% Z1 s4 I  T1 }: ^. \
  33. & |  i( F; g9 K" I) H+ q
  34.     public double getAttackPower() {
    ) z, c, J9 w$ J5 H' D' g
  35.         return attackPower;
    $ z5 `1 C. t7 T2 T2 O5 p7 o+ m
  36.     }7 I6 r' t* j; [

  37. , R( G( l4 K$ o- U+ b  ^, }4 `6 e
  38.     public void setAttackPower(double attackPower) {0 p- \3 y. h0 b8 M$ w
  39.         this.attackPower = attackPower;$ N  b8 X, M+ U5 l
  40.     }) U; v/ E) ~" e& b7 [$ }
  41. }
    - b8 Y6 l1 o! V
Скопировать код

' z& D! I; ~3 P6 q5 E* D+ O; B" aШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.  C6 p1 z1 ?) l  x: \# k7 d

; p! e# e% P/ n! P! ]$ a
  1. // Пакет org.l2jmobius.gameserver.model.battle
    2 X9 Q9 f0 M* _
  2. package org.l2jmobius.gameserver.model.battle;
    1 K0 S; [3 u5 }  y- x6 O/ a
  3. 7 B( ]% F9 H3 _4 a5 q6 ~9 q
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( \; F" E; Z7 x. X5 Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    % W( R% H8 o% N) M
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;, ?7 s; a3 G2 H9 U) S3 [
  7. / E& S; m# y9 o9 P+ e: E* N3 d, o
  8. public class BattleSimulation {
    . ~& ^$ M! e4 D3 {
  9.     public static void main(String[] args) {
    4 B4 b; _* Q) @6 \/ S
  10.         // Создаем монстра с начальной атакой& F- E8 @' @8 B8 u: T- J% l0 Q7 }# r9 ?
  11.         Monster monster = new Monster("Дракон", 100);
    4 ]0 ~) H! m' r" ]" d' O- @
  12. 0 M7 W! n' {/ \) n& T7 Z
  13.         // Начальная фаза
    ! z5 ~) h' }( d4 ^! E: l" W
  14.         monster.executeState();
    + |/ C7 f: d0 Q$ n2 t, i( v! q# i2 ~$ o+ Z# g

  15. 8 g; @+ n/ X: b+ r
  16.         // Переход в агрессивную фазу
    ; k1 a, m0 ?7 T9 E
  17.         monster.setState(new AggressiveState());
    ( j) D- ~+ ^- i
  18.         monster.executeState();6 y5 H* B6 W3 D8 S! h
  19. 4 Z0 M$ }' ]; {2 ~9 x
  20.         // Финальная фаза
    ) I) Q4 h+ n3 a; ?9 Q; G' n7 ^
  21.         monster.setState(new FinalState());
    ! h2 x- A9 r0 x- O  K/ ^  v  D' t
  22.         monster.executeState();3 s3 S0 R. ?- w! D# f$ O, T3 q0 Y
  23.     }* t  p0 o3 ~. D' c% k( e+ H# e: y
  24. }
    : Y1 g. W9 B' J
Скопировать код
5 y0 S! V- X8 O& o
Комментарии по структуре пакетов и классов:
1 W. P7 a  T7 o
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    % T' y" I4 x; F% b6 v* A
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.; a; l: S8 b2 l% D* V5 [, U$ Y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
+ F/ j4 z: B* [) f6 U7 B8 }8 x" O( }" M( T3 }/ _, ^3 |
5 E- m9 p: ?  K- f2 j- e2 g
& j3 g2 U  M  n/ n- i

" b4 e6 m9 q* m/ b" F+ t0 r4 l  t
% y. v+ P/ H7 s* R! o( ]# J1 S1 {
9 g& a# _7 r+ n! p; [
9 V' G7 G8 I) i4 w. U. L3 Y

/ W1 h* U  o4 s8 U4 p" c) r
$ R+ C# y' |$ w& K1 v* I
: I; p7 t& y& H( M; |+ d# f7 U3 v3 i$ i
# M+ l2 I5 \6 c/ W% m& e/ L

" Z3 ]4 @$ o: X7 |1 N$ E1 x
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04! o, H3 p! P) G0 P% G5 \( ^
Для управления сложными взаимодействиями, такими как  ...

+ R) N* J) Y  Z( t- L4 c) m; hОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:210 k* O9 X6 P* r1 E7 ~) k
Отличный подход! Использование шаблона "Состояние" де ...

8 _9 ~) U6 W" s% W6 \Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" a6 g  V! n0 G  g; W$ M
- H  z; E( ?* s  t+ p6 o  F! ]Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.8 l! T: _6 a( h
5 r) x4 |  g, x( f# s0 w0 p
  1. // Пакет org.l2jmobius.gameserver.model.actor8 ^  j* X+ F5 O- O# W4 Y, j: [. a
  2. package org.l2jmobius.gameserver.model.actor;! [- m0 k( n) S7 S  y+ F% N; R" a

  3. + I$ ~( B' ~( a! ^/ y6 d; O
  4. // Перечисление для типов атак* x2 A+ @/ C; M' _. Z& S
  5. public enum AttackType {
    5 F/ Z1 n: a9 {3 u9 L
  6.     PHYSICAL, MAGICAL;
    ! R6 f. P8 [: [8 q! n8 {( f0 ]8 |
  7. }' I6 X& X8 O, c& P" m: K, G
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.$ B+ I8 F( I" `
Обновленный класс для агрессивного состояния монстра:
# H5 [2 f1 Y) p1 m, p8 s( X. U: ]4 I3 r2 ~# Y% J
  1. // Пакет org.l2jmobius.gameserver.model.actor.state; R) K; z8 |/ d$ X2 Q0 r& n0 {
  2. package org.l2jmobius.gameserver.model.actor.state;% N0 V2 Z( ^) g  q( e/ ^3 r

  3. / {4 v/ u! Z  ?; ^( h1 L
  4. import org.l2jmobius.gameserver.model.actor.Monster;/ S* c4 x  \- Z8 R: m
  5. import org.l2jmobius.gameserver.model.actor.AttackType;2 g% t" Z/ h# T" y% p: b5 F
  6. % k' O8 Q; Q1 I  D! F% A3 V  {! H
  7. import java.util.Random;0 |- I& [0 a" [6 r

  8. 4 W* B& \. a: D0 h# _, U
  9. public class AggressiveState implements MonsterState {
    ; V5 u/ l6 @  @3 F' m
  10.     private Random random = new Random();
    + ~7 L0 B! h1 H) J; F

  11. , R3 K% H9 Q- h, i) J/ ]0 C4 v: l
  12.     @Override
    ' E. R) r/ ~) i
  13.     public void handleState(Monster monster) {6 t& g# Z; C* Y$ G; k! l
  14.         // Выбираем случайный тип атаки: физическая или магическая8 `* R. U( u& Q! t
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    9 d# n" m) s7 ~5 F( g  G' ~
  16. 8 d5 R  G: v. t4 p
  17.         // Логика для агрессивной фазы боя% B1 G* A- y7 m; y. D
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ; B' l' Z5 w) e8 S! B( K/ S
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    . |+ I9 d  y3 e4 x$ `" G9 a
  20.         
    ' E' J* y  u' k
  21.         // Увеличиваем силу атаки в зависимости от типа атаки; U, B: W: c3 ^% D# J' n
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;" t( ?/ E6 A4 ]
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    + |/ H% F2 U! F! L4 z
  24.     }
    8 h, Z  Y+ z6 p
  25. }
    8 P* O6 R' b6 d5 D
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
7 }3 u; {* e0 f; ]3 G6 ]  Q! N( E$ M# U% V* o: s2 i
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % E8 H% c- y% s5 R# s
  2. package org.l2jmobius.gameserver.model.actor;
    0 v* \" D+ Z& |
  3. 9 S: j2 F+ G; B8 S0 C( I
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ( G* u1 O# ?- W# u& ]
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ) V. u; u/ T# I; `! v# g: I* b0 K
  6. / b: m; f# p) L1 U7 C+ d
  7. public class Monster extends Creature {
    / h& y0 ?( H' b9 H4 o$ Y1 P
  8.     private String name;) g: j) I" E' s3 r* m% ]
  9.     private double attackPower;
    9 ]% i/ p3 s: J8 w2 v* T
  10.     private MonsterState state; // Текущее состояние монстра
    5 }7 Y* c8 ~) A# u, y
  11. 4 f7 Y% |, g" p" ?. d
  12.     // Конструктор монстра
    * R, o* q  l. ?" e! r- \
  13.     public Monster(String name, double attackPower) {1 u' r$ I1 X$ j2 z# R( i
  14.         this.name = name;
    5 H! F4 B9 q( X% ^6 O' g
  15.         this.attackPower = attackPower;2 {- O4 x7 I! \# A* Z: |, I
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    / p3 U" g: R! V! S
  17.     }
    9 R; P" W' f; M3 L2 o1 A. v4 p
  18. + d2 M/ E3 J) ?- Y. g/ o8 ~5 w
  19.     // Метод для смены состояния
    1 Y# R7 Q/ w  Y& {
  20.     public void setState(MonsterState newState) {
    4 G5 G& |/ ^* J
  21.         this.state = newState;
      C5 ?; ~/ d' [7 H3 F7 W" ~/ t: q8 V
  22.     }6 L) A% a( a; c! h
  23. & g' o& L" l' X; w4 h
  24.     // Выполнение действий на основе текущего состояния" h8 T7 p/ h5 x+ V! c! |
  25.     public void executeState() {* O/ N( B# u0 L" O2 u! u
  26.         state.handleState(this);
    , u4 Y0 u( _- `2 \
  27.     }
    - M* r( F* C, w5 C7 u1 @" U
  28. 8 o+ N8 I; C5 ]) C
  29.     // Геттеры и сеттеры
    # B  n* Z& @3 @
  30.     public String getName() {4 F7 [0 K. T. I( E0 @3 r. Z: p
  31.         return name;2 m# ^+ ~4 W( w7 u% z3 O& D3 O1 |
  32.     }
    ) [1 I  J3 G4 F( ]! X
  33. 4 N- m% d9 L" N: b( i
  34.     public double getAttackPower() {; u8 Q2 l5 ?3 z8 ?6 _
  35.         return attackPower;
    / U+ Q0 r- j* H7 U
  36.     }1 J9 N! W5 I7 a1 b. `

  37. $ R3 m% n+ _: t5 ~: J) u
  38.     public void setAttackPower(double attackPower) {3 s( e' Y+ ^3 ^. K5 w5 S4 k
  39.         this.attackPower = attackPower;/ M1 T. v  y4 N9 [% _3 T- P7 t
  40.     }
    ! \" [/ ?, q( A0 ~1 J
  41. }
    1 z% \2 s" K  y: u, |
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
* Z8 x1 m1 V- a  E' p. [2 z! h8 G* u5 c/ r9 \& A% [8 T. j
  1. // Пакет org.l2jmobius.gameserver.model.battle
    0 _( e5 F7 l9 Q8 ?* G: y0 r( J
  2. package org.l2jmobius.gameserver.model.battle;
    ; Q3 S, C2 i- U4 h$ F3 s& l+ n1 M

  3. " d2 h6 A. c! j9 R
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( \  C5 i* S3 A! ?3 m0 O
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;! T7 E$ ?: j/ \) R

  6. " E5 u9 X! \' D- X! e
  7. public class BattleSimulation {
    5 a4 E8 l1 C0 f6 q
  8.     public static void main(String[] args) {( ?1 W1 O, g, F2 `, K
  9.         // Создаем монстра# ^# ?2 ~, C/ x9 m5 k* a
  10.         Monster monster = new Monster("Дракон", 100);
    : u; Y" ]3 T9 u, Q& i4 k$ I
  11. ! [( {) x  c$ w
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак2 C! U& @* \* l9 U8 v
  13.         monster.setState(new AggressiveState());
    4 {/ Z) z" `, J$ B1 D( t) j
  14.         monster.executeState();) u  V! |5 t( [9 T
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    ; y" j; x- H7 H# B" b
  16.     }3 _9 P3 _1 P8 S8 F2 k
  17. }3 q. E$ [. Y. j, E  r
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.. t  b6 S5 _: J0 `: L: f) U
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!# ^, E& u) Y, y
4 b# d% u' {: ~* m. W( H! g

! C1 {1 E. u  j2 M3 J! s  w% i$ [" `  \  u1 o" U
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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