Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!  l# X4 M* w' a2 e
/ U& U8 Y+ j) E/ o

% w; ^, x, G1 A. u- E& }5 TЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
* i& D9 @, k; g5 {% F6 G# B+ |Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!8 e) f4 z! o3 E. }$ `9 C; {
Астралия 🌟4 B: u+ x6 [0 f  `( \' Q5 K/ o, q- z; a
2 H* k) e9 z/ L; a& u  W0 n2 ~

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!$ d+ O; i7 W2 A' Y$ c
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
$ @5 L5 ?: ]1 A2 z; d2 {" @. H6 P/ k3 C  ^7 S2 ]7 L/ B  ~
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 6 K: |1 L+ l! Z8 f4 d( k3 f
AlexCoder опубликовал в 2024-10-16 18:319 @8 }/ e7 t6 o4 X8 X3 T% ~9 j, O/ o
День добрый!9 W* ]" H5 S8 L' G/ T- y- m
В статье описано взаимодействие игрока с N ...
% I& m( M, V1 {
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).   }% E# t* a% K% v

, {( l0 f" w+ R# Q) w% ^Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
! i, {4 I' ~+ `' g% s8 d4 e) ~8 ?- o
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.  d0 p4 W9 v' y: V: u$ i: E1 U

, v6 d& {$ W. y4 V6 C$ p) ?# a
  1. <font color="Green">// Пакет для состояний монстра</font>
    # P8 U/ B% U0 e* k3 k! O
  2. package org.l2jmobius.gameserver.model.actor.state;/ n, Z0 A) `) k* S! `' i/ |- n- L
  3. <font color="Green">
    & ]" Y! U1 B& ?( M/ ~1 T2 f6 r8 D- {( A
  4. // Интерфейс, представляющий состояния монстра</font>
    . L# B' H5 k* \
  5. public interface MonsterState {
    2 v7 }! U0 B9 i
  6.     void handleState(Monster monster);$ \$ |9 Z5 n( b* H& O% g  }
  7. }
    + _& x7 w2 W: X) r9 t5 E/ @' @# r# Y
Скопировать код
3 V9 t+ c( o- L* m9 ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
' j9 K; g/ O; k1 ^& D
# T/ n( c' ?$ `Класс для начального состояния монстра:; S# F. t& L. J
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    & l3 P, T* ]4 Q# w" L2 q+ J' ^7 G
  2. package org.l2jmobius.gameserver.model.actor.state;
    7 W) M. k, u. p2 E, d' t

  3. 2 d7 U7 `2 f- @5 y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    & \% G" `% U" m# e
  5. 0 G& `! d7 X, W+ @6 }
  6. public class InitialState implements MonsterState {. k) f. T8 d( j$ B) r. `
  7.     @Override, @$ |0 Q+ E/ l& T- \4 N& y
  8.     public void handleState(Monster monster) {8 R3 O, M) m9 C
  9.         // Начальная фаза боя% B1 c/ N7 J5 F; u1 `
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    3 |' ]# |( s) u# S: I7 s1 `
  11.     }2 k# T: U* E" q5 E) c
  12. }) P; n" W) Q! }/ O7 w9 y
Скопировать код
+ F+ o; @" p1 |* A4 k. u

! a( `0 u6 i4 ?0 T& q& _
/ O: K6 [$ O6 x+ B: G) r) E$ }/ C. T1 B% s7 b" i; z6 F# R

! T; M5 t" B/ p# E) F6 N3 J' z+ y6 X4 m" [
( p, V- K7 T. ?( ]2 X8 b# b7 R( k0 P
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 ?9 M: W: P, }+ Q" N% k) y( i$ Y
% p4 @* O0 D+ R5 Q2 V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- {1 |( y6 ]4 j/ j# d; o8 k# f2 C* f5 m& Q% |; s" X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
- ^/ Q  j: k+ B7 l
; W  F, `- l0 c* I' \
  1. // Пакет для состояний монстра4 c% U# ?% e( X* C
  2. package org.l2jmobius.gameserver.model.actor.state;2 l% i! b% Y$ j! t% x) d

  3. . N3 a. X7 Y5 y" s
  4. // Интерфейс, представляющий состояния монстра
    " k% \  O' R5 l6 T# o
  5. public interface MonsterState {
    4 x) l! O2 _* F. E
  6.     void handleState(Monster monster);# T# w4 V, p" y9 U) }1 {8 G1 ?
  7. }
    ; q9 G% T0 x9 d9 G2 o# k4 t! ~
Скопировать код

7 f. @- }% [) s6 V% ZШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. , V( L7 k( ^7 U: k( `4 R

9 x: i9 F1 h8 F4 b5 H, |; TЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.+ f1 M( q& C$ u* C' z
$ \/ S: `/ R3 `3 C* K
Класс для начального состояния монстра:
0 t! e: g8 A8 n; `6 x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  _- s- T  _8 T9 A/ U* I' ?2 |
  2. package org.l2jmobius.gameserver.model.actor.state;1 ~/ c2 _" R9 i7 e
  3. ! n+ z+ N( |; C3 K# K: r' n! j9 ~
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 l- o" R: ^; m. E2 ^
  5. # U! t- C9 S  R' X: B) H6 X& }7 I
  6. public class InitialState implements MonsterState {
    " K2 e/ S# D6 q( J, ~
  7.     @Override
    , W1 Z6 G% q) B1 w
  8.     public void handleState(Monster monster) {
    ) j( t8 ?5 f6 R; b$ f
  9.         // Начальная фаза боя
    5 j: C5 u8 @+ Q0 ?" [1 R) _# `1 Z
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ( g$ U/ L, s% j0 z3 x* h( s, j
  11.     }; O! w6 o3 Y) ^( t1 o- c
  12. }
    ; a7 I" I/ {$ _4 `
Скопировать код
Класс для агрессивного состояния монстра:) K* q' K* ~6 L1 w, \# X
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    4 x7 m% E6 }0 ?7 y- m. \5 f
  2. package org.l2jmobius.gameserver.model.actor.state;3 A$ d. a, Q3 D7 j: l# {, c

  3. , q* U) n. B! l; O9 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . v5 s. l2 i& a7 l( @
  5. 8 G9 D9 ]+ Y- m: V8 q/ |
  6. public class AggressiveState implements MonsterState {3 J* e: i- z" s9 I$ F2 d1 Y4 ?
  7.     @Override# \" u) a) T) A  F3 l7 t
  8.     public void handleState(Monster monster) {
    1 o" z  a* N  L+ m' h/ I
  9.         // Агрессивная фаза боя6 z. c3 q, [3 t- v  w
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 C6 x9 N. F6 W9 W+ ~! D6 {
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    & y8 g; t6 ]3 ~& h& \
  12.     }
    ; j- f& z! D1 F& G# @  s
  13. }
    + b! V/ s) D0 J8 k# I
Скопировать код
Класс для финального состояния монстра:
! F3 Q) _/ Y$ [$ v* d" k$ K0 T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state7 Y4 _3 g) d& w0 G$ s
  2. package org.l2jmobius.gameserver.model.actor.state;
    $ T( Q7 A# D, {% Z: Q  o. D
  3. + P  x6 X5 ^! f! h# A: U' w* J9 U
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    % |( I. l/ }+ h, |) t/ P& m8 H
  5. * \" s2 i' k1 o  F1 Z8 C) [, _2 m
  6. public class FinalState implements MonsterState {+ M6 n) V- E+ n$ O
  7.     @Override3 e) i0 s: X1 W5 \6 A2 ]
  8.     public void handleState(Monster monster) {
    ! J8 O9 \5 M- |7 p4 r, q" W% W
  9.         // Финальная фаза боя
    6 r+ f3 r- Y& ~! B! C& ]
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ' J. t' R# a# n6 J$ `& F
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки/ k- M0 f0 V# L' ]
  12.     }
    ) I' f% R9 U9 |7 X/ Q6 C
  13. }
    / t1 F# v* ]6 X- ~+ }2 b5 F$ r9 D' p
Скопировать код
: t) K+ @8 t6 n) z% I+ p
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
/ O% v& K. `7 s) }
  1. // Пакет org.l2jmobius.gameserver.model.actor' V' K; d% {& c6 y
  2. package org.l2jmobius.gameserver.model.actor;5 Z1 P9 }/ t+ E$ [# t' o; ]' e  E( C9 H

  3. , Z$ a. C' M+ |6 G& L9 X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;  w3 F+ @7 `# }! U5 D) j
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;4 y. b0 u; |! ^# E9 k% V
  6. 8 q9 D- X$ o+ @; E, O+ w6 {9 y
  7. public class Monster extends Creature {
    ! \* F2 n  R: {" Q& L8 _5 H
  8.     private String name;
    1 f) A8 M, f+ B: r) d7 W
  9.     private double attackPower;  [4 p; B) n' E* A. g% V- b/ Y4 ]
  10.     private MonsterState state; // Текущее состояние монстра9 Y+ U6 \; Q' y* L, B

  11. 8 T/ [8 N5 m5 A9 u; n
  12.     // Конструктор монстра- S8 a' H: Y/ i" v. f
  13.     public Monster(String name, double attackPower) {
    1 s7 @5 S$ G6 u
  14.         this.name = name;
    ( R* s& F$ S  z. R8 f$ d, T6 _8 E/ F
  15.         this.attackPower = attackPower;
    % q3 i: E+ x5 m' |
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    - e( K9 P3 g" ~
  17.     }
    % y8 U& L# E5 _+ a+ c

  18. * _8 v+ T7 r6 w% T) q
  19.     // Метод для смены состояния/ K. p5 A4 @# P, l
  20.     public void setState(MonsterState newState) {
    $ d: C5 J9 p/ m8 o5 X9 n( P; P
  21.         this.state = newState;
    3 \; ?# ~, d! G/ d0 K6 }; |% {
  22.     }5 i2 e  U. H, S, p: h
  23. 4 c9 r$ r$ D. g7 V
  24.     // Выполнение действий на основе текущего состояния; J( x1 E9 I. Q& v2 d* J
  25.     public void executeState() {
    8 @& |9 j. B$ g$ R6 S/ z
  26.         state.handleState(this);% B  e9 L# v; `) k
  27.     }9 w, F, s2 b0 h2 F3 g* W8 z4 _
  28. # P8 J. E9 B; U! C9 G* Q# J, F9 ~
  29.     // Геттеры и сеттеры
    6 C2 h2 Z5 ?# G" L$ G
  30.     public String getName() {' m; v% d8 D1 a$ a* E( F# Z
  31.         return name;) F3 G) D" {! P( _% W  W
  32.     }
    8 C% c' }" g8 [; M# D
  33. - ^/ X# z  i$ l+ Y% B5 i, c# i* v
  34.     public double getAttackPower() {
      W, [9 L  d& X4 `  u4 I
  35.         return attackPower;
    8 w6 w+ v0 R9 ?
  36.     }2 E! [8 O! I. [, v. S/ r) S& r, g

  37. 9 X: u* ], a: ^5 v
  38.     public void setAttackPower(double attackPower) {: V7 ^" N$ h9 W; a& j6 w
  39.         this.attackPower = attackPower;; X# b1 v& p, b( S7 E
  40.     }8 F' [% s; y" s# ]+ Z' w9 `7 H( N# Q% D
  41. }* P% `  N, E8 _9 B: Z
Скопировать код

2 y$ ]3 ^3 r" @7 }Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
. y' Y4 b/ N3 L/ h! B, c! _6 g8 {$ f4 L& j4 Y
  1. // Пакет org.l2jmobius.gameserver.model.battle( s- g, e& O" h6 C' S" L3 G: t
  2. package org.l2jmobius.gameserver.model.battle;5 B  r" ?/ F' E+ t) Y0 v6 [+ S

  3. 3 b5 K5 s* [. v. E$ b, N
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    8 n! f" U% V0 ?& Z) S) L' u
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;9 T1 m) t6 @/ n8 [2 }# e
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;. U& Z0 j2 Q2 Y' T

  7. 4 `1 ~6 O& a) h* P
  8. public class BattleSimulation {% }% M& l5 V; P. l
  9.     public static void main(String[] args) {- _  G) u% j$ ?( o$ r5 f8 C  W+ i
  10.         // Создаем монстра с начальной атакой" r4 Q2 j9 t; C" Y0 a+ X. E
  11.         Monster monster = new Monster("Дракон", 100);' f/ Z) R, N: Q- }0 }

  12. 8 q" D: W' X( Q6 X
  13.         // Начальная фаза5 o/ R- k5 a2 n3 {
  14.         monster.executeState();2 ]& ?( A2 t) g( O6 B
  15. 6 ?7 \$ ^# d3 k  c$ @
  16.         // Переход в агрессивную фазу& _5 o0 @, z5 A4 C) O) ~' `1 a
  17.         monster.setState(new AggressiveState());
    * K0 i) |4 c+ y5 z. R+ p
  18.         monster.executeState();, b8 T. k* Y4 ~# V! Q2 [* ]

  19. 5 _; J5 L) k- \+ `: Q+ u& }/ q
  20.         // Финальная фаза
    . Z9 n9 \- O" H# U& O7 E1 J
  21.         monster.setState(new FinalState());
    ) ^+ O2 P3 L  o7 ~* S& l, d
  22.         monster.executeState();) y: f: a5 o1 _% p/ Q
  23.     }
    # r" V& v6 A2 e; r
  24. }
    7 U7 A4 Z, {! Q8 ~8 u
Скопировать код
5 `$ k6 Y' N, O
Комментарии по структуре пакетов и классов:
3 [: M/ B; x" n8 W1 C5 W/ F- R
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    5 o3 \8 A3 \2 X5 [4 t( S9 S8 U
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ H0 ^0 F$ n+ g% yЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
1 q! v6 S0 L6 r2 r* W/ |- C) r+ u
$ Z! x; {9 S- q9 t1 I4 m* c$ z0 b/ N6 ?" @3 j! X$ t

& x$ f3 j% I# y" e% w, o1 _! I. G. t  D" B
; E( L" K9 Y. d2 P

. w) {" i1 v& b6 Y* @! ~" ^
; p5 C2 a$ c- d! [+ u3 J: f' Q4 S8 D0 S
! m- V& Q" G( c( n, q7 H% {2 u0 u

+ O# g5 a) R. W/ {8 L
+ U6 d5 \) J7 C( w- K) S9 z4 }5 c/ N5 G) ^& S
/ z: @0 b# W0 _4 i: \: R
/ Y1 {8 s" f$ w+ t
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
+ S5 O( J% {; D# q7 h1 mДля управления сложными взаимодействиями, такими как  ...

1 A3 u( J* N3 @: K2 z/ k: a9 L# GОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21' a  t$ F; R: Q" }, [) n
Отличный подход! Использование шаблона "Состояние" де ...
4 P/ E- t; z, |- `% q; i  K
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
8 I8 b; |; r$ b/ T/ q. X- O
, h9 V' z0 g3 p" V4 B6 E5 d+ m/ m' bШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя." P: a5 d. |( a5 B" k6 y% h

* z* C5 Z+ {! O* X" W
  1. // Пакет org.l2jmobius.gameserver.model.actor
      W$ Z) t# R) ^6 N0 o' H, Y( T* ^
  2. package org.l2jmobius.gameserver.model.actor;7 C* }+ e4 {+ ^' Z: b, B
  3. . s2 L" @5 F6 B' S2 H( y5 J
  4. // Перечисление для типов атак
    ; t5 X0 `' w  y! _
  5. public enum AttackType {
    4 W2 V" W3 e9 ]) `/ H# X5 u8 q2 h! F
  6.     PHYSICAL, MAGICAL;
    1 u1 l1 ?. d2 \2 R. f9 M
  7. }
    ; t6 M7 ]' _' T! @7 X% Y' Q9 X; T
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
' U8 d- C7 L$ ]  U: d$ ?Обновленный класс для агрессивного состояния монстра:
# a: M1 u; b* Y4 v0 `
" x7 u( J  S  c$ f5 c; l8 T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    - Q/ a5 F9 n! Y6 l9 q# S4 ?
  2. package org.l2jmobius.gameserver.model.actor.state;8 Q! y3 B( R: x/ z6 g+ L" t2 s

  3.   q2 S5 J6 V" B3 @3 ^- g
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    * {) c  @# S( F# \8 y% K% I! P/ J
  5. import org.l2jmobius.gameserver.model.actor.AttackType;' q' e+ k7 Y" }) j- c. r

  6. 6 \' O7 N; H  E* c+ `0 A: N
  7. import java.util.Random;2 c# X8 d7 ]6 \1 |
  8. % O$ q& Z# g& H
  9. public class AggressiveState implements MonsterState {. h: R2 s: b3 A+ J
  10.     private Random random = new Random();
    ! q, Z9 A) W! o. }0 _# E( z
  11. , m; u7 P6 d8 R
  12.     @Override
    * m  K* V6 c. B) E
  13.     public void handleState(Monster monster) {/ ^2 ~" i: w3 T0 b* X& B# {
  14.         // Выбираем случайный тип атаки: физическая или магическая2 G" T. G3 n* B9 W- Y# b: H( H5 ]
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;/ _4 O- |/ S' x( B

  16. 0 [" \- K* E/ c# Z4 l" G6 i
  17.         // Логика для агрессивной фазы боя
    / I3 e+ N4 S. n7 k: V: }% \
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    0 L, J& v) O4 {) U8 v$ v4 t/ X
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");; g( Z/ ?3 Q, |0 r2 P4 {! G9 H. b
  20.         ' o3 B5 i6 C& E2 d0 |- t
  21.         // Увеличиваем силу атаки в зависимости от типа атаки- m- Q- |2 s" n2 P' b
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    7 A) S( G8 y- u, }
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);7 @' S* k) r$ R( n, u
  24.     }% T. U) |$ V( n1 L
  25. }' W1 j$ E' l- k4 }* h! O7 k
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
% _5 i1 x+ s6 p$ o5 q9 e: |+ P
% T7 g& l  Z& Y
  1. // Пакет org.l2jmobius.gameserver.model.actor
    % w9 o2 \* H9 W' t/ Q$ ]2 N
  2. package org.l2jmobius.gameserver.model.actor;
    7 S- V% a1 \4 ?8 e- i# |

  3. 8 V2 |9 T) R& s7 z% R( c6 C0 L
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    6 ^; {7 N+ j. E" P, F4 V8 `7 {
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ' i/ C/ ~5 m1 C% [3 }
  6. - p% S) N$ |. [) s0 N0 M6 P9 o
  7. public class Monster extends Creature {5 a' r" Q- E) k  M  J7 x
  8.     private String name;
    7 h/ m5 b1 e5 G* C5 N" Y* }
  9.     private double attackPower;
    # p* y! }1 ]4 ~& V
  10.     private MonsterState state; // Текущее состояние монстра. R  ^! W% g8 e% B0 Z7 [
  11. # f% u4 S2 ^$ g/ q4 G: b! k
  12.     // Конструктор монстра
    / H; J$ g6 d. {' S: T
  13.     public Monster(String name, double attackPower) {1 j$ y& C; H7 ?' h% y
  14.         this.name = name;, U0 @% t/ Z# L+ J
  15.         this.attackPower = attackPower;
    4 a# z# M! I% _+ y
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию3 M. i" F  `# m3 V8 f6 F
  17.     }2 {! K8 U% l' e' j7 T5 a, x

  18. " m& ~9 A5 g  ]  f! z
  19.     // Метод для смены состояния
    ! q; j3 t5 |% y- a% N/ n4 K
  20.     public void setState(MonsterState newState) {2 ]! C7 H$ v# T' T1 s) ~! Y
  21.         this.state = newState;
    + f% ?0 e9 J4 f
  22.     }/ K. Q9 P# l, |- b% i- y# x
  23. ! e( T! U# ]/ @1 U' m  t' T) |
  24.     // Выполнение действий на основе текущего состояния1 [0 M& Y9 j( ~; H
  25.     public void executeState() {" \1 e8 p( W' b% n! Z
  26.         state.handleState(this);! |& k1 X- J: X2 f& a  e
  27.     }. u  c- ]! B1 V+ V) }! o

  28. 7 C; v8 G6 a) S& K( @
  29.     // Геттеры и сеттеры# r; z+ x. H$ w1 X& f0 A  {
  30.     public String getName() {
    , P4 w+ {1 _! h( t) f' g5 g: ^
  31.         return name;; ]; @( l) G1 d* v5 F! Y' M
  32.     }6 S1 k# D9 }5 @) p) L4 C$ D& s

  33. # I  P2 u( ]2 I# S
  34.     public double getAttackPower() {
    8 X$ }! v3 G& \2 t
  35.         return attackPower;
    $ `$ ?! `/ u9 o5 B% [- r& }, _
  36.     }
    : X8 Y3 S% S: k% \: g
  37. : z8 u' H6 h9 b
  38.     public void setAttackPower(double attackPower) {
    : P) ^3 `. |4 V, D% W( M
  39.         this.attackPower = attackPower;( z& ~3 w, }0 g
  40.     }
    ! ~3 Z. d% d( U* J# d7 F- T, Z
  41. }7 q. Q+ n5 R. X
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
/ e- Q( \/ w4 _4 |6 A$ Q' E2 H+ K& S- T; C7 P9 a; e
  1. // Пакет org.l2jmobius.gameserver.model.battle
    # _+ @  M* h2 j) d% U9 Y% [
  2. package org.l2jmobius.gameserver.model.battle;
    / |+ C, l- C+ k; x% @

  3. 9 o8 S( a1 O! ]
  4. import org.l2jmobius.gameserver.model.actor.Monster;& L, f. q2 w  G/ e' n
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;) ?5 ^0 i0 ?* J7 g, L7 u- v7 S

  6. 6 @& ~9 `  R- }1 z
  7. public class BattleSimulation {
    ; q3 i( R& p4 r
  8.     public static void main(String[] args) {
    ; g& C, Y* s! u' k
  9.         // Создаем монстра
    4 Q+ v0 O6 _) [4 a, H& M6 @
  10.         Monster monster = new Monster("Дракон", 100);8 u2 ]3 l8 K( \% Z3 U# u& E

  11. 6 N/ {0 o/ r% N5 l" e
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак* W9 z0 `1 S5 L5 }
  13.         monster.setState(new AggressiveState());# b8 \; V8 B( u! p
  14.         monster.executeState();
    . [2 D: z% e7 v: Y4 I
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак0 b0 p5 a; D* Y2 h9 H
  16.     }& H9 |5 X4 \+ j
  17. }- V" O' V) V7 C- Y
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.: x, l, T/ z( t6 x/ `
Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
& P  R) f) I; `+ d& L, {4 y6 T5 u
0 h! J' E: K9 G

+ Y9 @; Q; [& C/ [# P4 B
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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