Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
" s- z3 Y& D0 H- i
) B% j9 `  z6 h! x  ]6 o

  {* b/ ?1 e) SЗдесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
2 ?8 ~- [/ S6 K* g( J5 @! x7 lЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
9 p! X5 V) p& P# _" [Астралия ?
) K( a9 k7 p1 v9 F) U
$ _9 b5 ^. C% F. O' S- \

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!1 b) A6 y% G6 {) L) R
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
6 F3 v9 D& E- m, A+ N) A: u8 W! Q. S
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
! A+ L; J- n9 I  R/ |
AlexCoder опубликовал в 2024-10-16 18:31
% u% o& S3 h% zДень добрый!
4 k' A6 J# f3 OВ статье описано взаимодействие игрока с N ...

! C" ]. B5 a: I5 xДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). * ?. h5 D" k. F2 s* I

% }! P; d+ L. L5 _# V; ]. M" zЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- W. X( S8 g8 e% m9 q0 M' W# R  U. v1 d$ B* B: N" B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
& J4 C' t' Q2 p* j' ^+ X+ Y8 M: p1 d* s/ G  R* E5 U
  1. <font color="Green">// Пакет для состояний монстра</font>
    8 d6 i8 j% O4 m5 m
  2. package org.l2jmobius.gameserver.model.actor.state;
    ; q$ D$ v% u3 z  z8 N  B; g3 X2 T
  3. <font color="Green"># e. i) k, B, c' t
  4. // Интерфейс, представляющий состояния монстра</font>
    " e1 q5 x; D* Z5 ]+ q4 b; T
  5. public interface MonsterState {' n* ]+ \; Q$ N) A' }% }5 d& x- c
  6.     void handleState(Monster monster);
    : T- O1 D$ h, r# l3 ^4 i: [
  7. }
    ) _! |6 p1 K3 H. s1 @) R6 h
Скопировать код

- y6 Z3 h+ I0 Y" \5 |Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.& ~1 ]" {( [1 L* R6 X
' n. N* p4 F5 {6 f+ C4 e2 Q+ n
Класс для начального состояния монстра:* ~' F. d1 e3 t6 Y
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>" e% A: u1 ?3 R/ {9 X6 _  m
  2. package org.l2jmobius.gameserver.model.actor.state;
    0 Z9 B, o& t: K& a, V/ n1 M( q
  3. 1 v( y" P* {9 @3 ~7 Y
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    , d5 r+ M1 k" Q7 y" Z
  5. - _) n7 F- n( e' T' N
  6. public class InitialState implements MonsterState {
    / T, [' O. B$ }' @6 V+ z) l
  7.     @Override
    8 U% E& [$ ?1 \$ |) O$ {$ R
  8.     public void handleState(Monster monster) {+ h2 F/ N+ c- F& m" M7 a2 w
  9.         // Начальная фаза боя
    # A! D* c! ?- _: t$ J: |
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ' W9 |) @1 R# w) [  h- z* G
  11.     }1 T8 f3 w/ {! b* L$ N$ O) K
  12. }" V3 `/ a' T' j/ r. C( k
Скопировать код
& [8 J* e) [$ W# x' h5 ]

' |, `/ m; n4 h% i4 X+ b! c' V6 b- M' \( e( \4 w8 q& q
0 d3 R6 r: q+ c) l8 Z& B5 U

8 s7 u; ^. d7 ]. a7 Z, k
. S8 ~8 O( u5 s) s% L' ?8 z& J% G% G( `0 \
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ( G% O  U6 v7 A% d2 u' h
& c( v0 C8 q; X& Y* z: b
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
2 `; B9 w8 ~8 H+ D! a& P8 q: z4 ^6 C7 l
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 F, F# a6 C  g$ n

$ G$ n! c: i! X
  1. // Пакет для состояний монстра7 \9 b7 I) m. S
  2. package org.l2jmobius.gameserver.model.actor.state;) x' \7 G7 d. q

  3. : C2 u, w* z3 T
  4. // Интерфейс, представляющий состояния монстра
    : c& T6 i3 A9 C- M2 g
  5. public interface MonsterState {" i- y  J  q# k: E4 X  i
  6.     void handleState(Monster monster);
    , u! t, [7 ]9 d! E' T; a
  7. }
    . p" Y+ c: o: E1 C. K
Скопировать код
0 K! \, ~, ?% {; E
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ S+ Y4 {4 f$ o1 w4 _- P! `
, ^2 P7 G& _( Z8 i1 w) V7 n- uЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
+ h5 l( V' g% }( N5 Q' ?/ L
6 E( a* B7 D6 ^7 v5 p2 m' lКласс для начального состояния монстра:5 Q4 _  w( ~6 Q' c: Y: O3 b
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    / ^" _- d; A8 O6 g6 R7 z
  2. package org.l2jmobius.gameserver.model.actor.state;; V0 C% l' H8 X0 X2 ], E0 l

  3. , L3 e; l; w. D/ C9 z; H. X
  4. import org.l2jmobius.gameserver.model.actor.Monster;3 n5 m# ~0 P) ^( y: E: H; p6 t

  5. , w; l4 w0 D% {! I
  6. public class InitialState implements MonsterState {* k" p# N, [# Z
  7.     @Override
    6 j: g# O. e2 w1 s* i" {
  8.     public void handleState(Monster monster) {
    1 h/ P- V+ z9 I
  9.         // Начальная фаза боя+ `4 L' ^* `' S. F' U( T
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");7 {- h' e) L. ?2 W) X4 }+ l# ]
  11.     }
    * v* k6 j# s6 ^
  12. }2 O1 S+ B  ~) K. g" j! h3 V
Скопировать код
Класс для агрессивного состояния монстра:$ O$ A% G+ b7 q
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    : J  e( C9 g, G. F( u, E
  2. package org.l2jmobius.gameserver.model.actor.state;
    3 w7 k% t* |2 R; t* f
  3. ' X; a9 [* N1 T+ S0 B
  4. import org.l2jmobius.gameserver.model.actor.Monster;  N- S, G- \5 O  h; n6 N
  5. 7 q+ Y3 B' B5 Q' T; u3 g! j7 ~
  6. public class AggressiveState implements MonsterState {- i( E) F( R, h! G* K7 I& t( @
  7.     @Override
    2 h/ i- `. T% C8 |; C" P
  8.     public void handleState(Monster monster) {
    ' @: c; H7 _* G5 W, o
  9.         // Агрессивная фаза боя) V5 ^  \% E7 `- w0 B$ R) f4 l) s
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
    , h, D5 Y7 z" \6 V) w5 T) Q# c
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    1 T" w/ G. d% R7 D
  12.     }
    1 Q1 g* r5 {% g, ]" T2 N3 W' s0 v
  13. }7 X1 @, b. ^7 h, D$ K
Скопировать код
Класс для финального состояния монстра:
. \( s* y4 Q' w
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( T+ i" s3 C, h: z3 I
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( h% h7 Q6 N$ ]5 @3 b

  3. % ]: r8 l7 S" ?  \* O
  4. import org.l2jmobius.gameserver.model.actor.Monster;( d) k- }& ]; [( }
  5. % x1 c- ?* I& l  U( L
  6. public class FinalState implements MonsterState {; ?  T  V6 z# a% K+ A7 y
  7.     @Override9 z7 Z0 B& l7 G! {! k8 p# c
  8.     public void handleState(Monster monster) {
    , K! `1 I% c# f7 Y3 n* U" h- S
  9.         // Финальная фаза боя
    ) A, _) g" ]  G  x: E6 @* t
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");; I3 r' `% q7 O$ ~( ]7 s
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    * s) I# J% F, m9 b3 R; @! a
  12.     }. U8 y; U7 F% z9 D) w
  13. }
    7 I5 k& k  c( |( L1 _. {* W
Скопировать код
% _& z9 ~0 l, J( I, E) E" I
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; ^) O# m4 o: ~4 N* R# T# c- w
  1. // Пакет org.l2jmobius.gameserver.model.actor
    8 V- U" `0 E5 s
  2. package org.l2jmobius.gameserver.model.actor;
    . L' M# \+ e. ]- \# \

  3. & T- ~% R- v  S- n% N9 p& G
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    9 ]- E1 B5 \! n5 M* G! W
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    9 q. s# g( _7 p1 k

  6. 2 K8 ^! T' `+ j
  7. public class Monster extends Creature {
    ' T3 J8 m# F" _0 H
  8.     private String name;
    7 @4 V  a$ p" k
  9.     private double attackPower;
    . b9 C* Q, V6 G0 [; ~/ k
  10.     private MonsterState state; // Текущее состояние монстра
    & a7 ?: D0 s3 X

  11. 3 t+ i/ y1 c. r/ _9 F8 v" p: T8 X3 l
  12.     // Конструктор монстра" H& `9 W, V5 N4 [
  13.     public Monster(String name, double attackPower) {
    & L# L% @* @, S  L8 k9 T
  14.         this.name = name;
    & ^" h6 Y5 `7 g1 h: g
  15.         this.attackPower = attackPower;
    * L/ ^4 ]9 Y) b" C1 W. a7 b
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    ' G) b4 R. ^5 s1 r- L, _
  17.     }
    ' a( i2 [8 [) o  y0 l: u8 Q' ^
  18. 7 d- K4 }, t) ~0 I7 G. x# V
  19.     // Метод для смены состояния
    2 z. E* g* C! c" f7 E1 j, C
  20.     public void setState(MonsterState newState) {
    ' O9 ?$ h! n" p. h& {9 M
  21.         this.state = newState;! b; I5 a" _- A! D) t' e- }8 d
  22.     }+ i2 `6 p! Y8 |0 C
  23. - |$ L* t  j, i$ s  ?# @: y0 ^
  24.     // Выполнение действий на основе текущего состояния" n5 b0 H# k; U% r
  25.     public void executeState() {
    ) ?- d# v* ?  I" [8 l
  26.         state.handleState(this);
    7 {" `6 A) X$ C7 R, b* W0 b
  27.     }' j# e. r) F* n

  28. 6 v/ y" a& h2 p# \4 a" m; Z1 y8 d
  29.     // Геттеры и сеттеры/ I0 Z/ q2 h' i* z* s0 W: A% Z) p
  30.     public String getName() {
    : Z  c9 e: \; y# t. B
  31.         return name;
    * |& \2 V, V5 e8 ?7 Z+ ?* l
  32.     }1 b# i/ B8 E2 d3 B2 |

  33. ; R0 v& p8 A# G* T# J  C$ r
  34.     public double getAttackPower() {
    6 X! `! u8 P. z8 v1 o5 d
  35.         return attackPower;
    & e! c$ M) _8 \: J' H& T1 ~2 C
  36.     }
    1 r* w- t+ {" y% ^9 h4 r( D  j

  37. 1 N0 H6 P" k# E8 j- Q' f: D
  38.     public void setAttackPower(double attackPower) {
    4 j4 q8 c4 j- {) t! C3 ~  B! ~4 F! x
  39.         this.attackPower = attackPower;
    % ~: j2 }4 w. O
  40.     }
    4 l* X5 y( ~; d6 f% v" v* h" T
  41. }+ a  Z0 |% Y  n3 W5 ^. Q
Скопировать код
. j8 J" X. ^1 }. u
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
8 s! S2 A' @1 l. f& T  l7 Z+ C) m- U4 U  d) e/ e4 h; @
  1. // Пакет org.l2jmobius.gameserver.model.battle
    % t  Q& T3 b; w: Y
  2. package org.l2jmobius.gameserver.model.battle;
    " T  F6 v1 o( j

  3. - [; A" {6 @- G* ^! R$ E
  4. import org.l2jmobius.gameserver.model.actor.Monster;  ^) T3 D6 q, B) q: n0 V
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    " L( V# i7 m8 {- D& ^
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;" N. {) N+ c6 T3 s5 n* e

  7. : {+ p7 V* x3 ~
  8. public class BattleSimulation {
    - p6 n$ N: x, l! v
  9.     public static void main(String[] args) {
    4 _, e% @0 A% o0 }, V+ A! V# I
  10.         // Создаем монстра с начальной атакой
    + B. q+ p' L6 h- Q- X
  11.         Monster monster = new Monster("Дракон", 100);+ q  Q! v8 ]. x) M8 Q; B: {
  12. % k5 ~' q. M' i; ^
  13.         // Начальная фаза! v1 @$ u( G- c7 f- M
  14.         monster.executeState();  N* O1 F" H$ P- ?

  15. 6 {+ I! h$ A  [$ X4 N
  16.         // Переход в агрессивную фазу/ g" E+ ~- h$ ~+ p* u* y' R
  17.         monster.setState(new AggressiveState());
    3 b+ d9 s" }' |
  18.         monster.executeState();+ Q$ m! O; N6 ?
  19. 2 L9 @6 M0 |8 E+ [
  20.         // Финальная фаза
    4 g8 l4 r; G# r8 g$ ]0 x
  21.         monster.setState(new FinalState());# U+ W7 C& S5 G, C8 k( w/ ]
  22.         monster.executeState();+ {) Z& D* z( [6 C! ~9 Q
  23.     }$ a/ V; n: u' W  ]) P7 C9 g' C! q
  24. }
    ; f/ I, h4 D2 k+ Z9 A; Y2 `
Скопировать код
* ?8 S. h; j, \' ]3 K
Комментарии по структуре пакетов и классов:
0 t7 [# Z+ F8 c2 V' S
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
    7 c2 B4 ?1 Z9 R1 y& T
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
2 P7 h$ H9 L* O7 N! f- ~- uЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) S$ p) x' ?: j6 }. o0 G$ ?
7 U3 a3 j4 H+ G5 I
4 o" B* C% D, d2 [

" J% |! ~3 f: Y2 S$ q
+ \8 ?  d: {! q7 Y$ E* p
- L. a8 ~& i0 Z7 f
, s: g) H2 `, n  Z+ y! l
) e3 ^) j: i2 ?7 A, J: b$ W& t
, E2 F4 @1 H3 _- x! ~4 H$ k0 D* a5 E  H7 c$ Y; N( M

' x  l$ e" I" s4 ~; p: h1 D+ F5 _
8 L4 Z. F! J* M7 c
4 d& }& {3 @5 K2 k9 {1 T8 o# f5 N: U9 @  Q

: k/ Y' Y) ^/ w3 m( T
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
+ z7 Q* f# D2 i8 x8 k9 y" N$ wДля управления сложными взаимодействиями, такими как  ...
3 ~; c3 z3 M, L; A" m: o
Отличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21, o0 d  J1 h8 ?5 r
Отличный подход! Использование шаблона "Состояние" де ...
3 ~0 S7 ~$ h9 \1 i6 I9 I
Хороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.5 M9 F, k9 v3 f7 t4 ^- a& [9 f& n

" J" y% q1 h+ Q* ]Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.7 h$ x* m5 E5 a: v: {$ A
* z! O$ H9 T; D" |$ t/ D. \3 V
  1. // Пакет org.l2jmobius.gameserver.model.actor
    , P- a; o* n! P  q1 b: c# K, z( T
  2. package org.l2jmobius.gameserver.model.actor;, [/ U+ n4 j1 f# a( `/ W( e
  3. & i5 G& f) n% i0 [
  4. // Перечисление для типов атак
    . m. j* a5 x, Q( p
  5. public enum AttackType {0 u. m" ~7 n! P
  6.     PHYSICAL, MAGICAL;
    / W1 Z% |, Y8 h2 w  l  w; f
  7. }
    . N# A! o8 |1 s6 b* Y( ]
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.' [  @% t5 a7 ?
Обновленный класс для агрессивного состояния монстра:
* t9 u  d- I( D1 f2 H5 f* a
) y, j( d( H' X# z2 E7 k
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    % E2 _- L; U4 R$ u
  2. package org.l2jmobius.gameserver.model.actor.state;
    * k  G6 t1 h" U# }( O2 ^; C. s

  3. ( V: R; M+ k0 `
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    $ ~3 B& p! q# M) ~, E
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    2 G' J) x, D" T/ B  e

  6. ! l4 n( w# y4 i! N: S; T# e
  7. import java.util.Random;
    9 {- y7 J' _9 Z, R
  8. 5 z% ~5 ~- F( @; [0 l+ C5 u
  9. public class AggressiveState implements MonsterState {5 }7 a4 l# B) J/ {
  10.     private Random random = new Random();
    . B4 X2 _# V( F0 \* [% u8 a( _

  11. / q5 C( p7 E6 R; h& `  {
  12.     @Override  F7 @$ ]8 u9 c, j1 f" [, t
  13.     public void handleState(Monster monster) {
    & c; y& z- \: p3 U- V
  14.         // Выбираем случайный тип атаки: физическая или магическая$ e% x; {# w5 z( Q8 O5 l" W
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;) Z* }( i/ p, _6 Y  b6 d# W* K

  16. ; o0 E- p! j9 g% h/ w% l
  17.         // Логика для агрессивной фазы боя
    . Y! K6 C2 B( ^# S; L! Q
  18.         System.out.println(monster.getName() + " становится агрессивным и использует " , d# r& T2 t0 ~2 h1 ]
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");
    & ~  `$ \' f. Y# d% c
  20.         
    ' }7 {( ?% d. H+ {
  21.         // Увеличиваем силу атаки в зависимости от типа атаки. C& r8 v9 T% W# S
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
    7 W3 ~% E7 [1 B' u
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    4 T1 {5 E9 Q9 y- x
  24.     }1 M2 e! s" [" W4 C& R: ^* F2 A
  25. }
    / I; r. |( Z) b% p# `8 r! P" d' c" R
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
2 V: _+ i6 O; _3 f/ q, f* I8 v! a$ }2 @; y5 `% P# |
  1. // Пакет org.l2jmobius.gameserver.model.actor
    " z9 \( k5 b1 ^9 y
  2. package org.l2jmobius.gameserver.model.actor;
    ; [' p. p, B) m2 W
  3. 1 N! R% Z  M( E+ W' X* a
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 i: q6 p7 {7 K# {8 |5 ], y
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ( w  d7 s  I' N9 T+ v5 X: p; f
  6. * G) ]: m) J# f, o7 K. M2 s7 y
  7. public class Monster extends Creature {# y$ \8 V& y: J4 g
  8.     private String name;+ B) {* L) q7 j9 ?& f
  9.     private double attackPower;
    ; O& O# A( {# D1 X0 t  o
  10.     private MonsterState state; // Текущее состояние монстра
    3 K+ A( M8 l- _; C
  11. 1 a' K) i) B" M. u1 t2 G
  12.     // Конструктор монстра5 \% X2 |! [6 M& W, s& R9 W2 ?
  13.     public Monster(String name, double attackPower) {, P2 H) T# R2 |3 x0 l9 ^; z& |0 ?- G
  14.         this.name = name;: Z* |( K* ]0 s# J: X4 ~, g
  15.         this.attackPower = attackPower;
    & `* n# V* u3 a; S3 W  O
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию. x4 }! J, u. G2 B" [
  17.     }$ L9 d. U- z7 x) M6 A; f6 U

  18. ' e8 s9 }5 _: z; G$ O7 }
  19.     // Метод для смены состояния% O4 y4 W. k2 p# d* o! b  B) G
  20.     public void setState(MonsterState newState) {
      `2 @1 \1 j  M1 a" _( Y
  21.         this.state = newState;
    1 t: H8 a5 i3 T7 H9 s; L/ \
  22.     }, I2 s7 f! W+ i+ z1 E

  23. 8 w* q6 }' Z, A0 @6 |5 P5 t+ z
  24.     // Выполнение действий на основе текущего состояния
    2 K* F9 ~! C( ~4 b2 y3 @& G! k1 S
  25.     public void executeState() {
    3 X6 {( |) c- }  m
  26.         state.handleState(this);
    + J, e; c' C; d2 z: U; Y9 {
  27.     }
    ) f+ i) [' V/ T" J0 _% d
  28. # R) j# i* y( l0 @) X2 ]0 y$ b
  29.     // Геттеры и сеттеры. o' j& A* D4 _. Z7 p7 N, z7 `
  30.     public String getName() {8 T6 q# d1 S) m' v1 {
  31.         return name;
    , C& f) K  W1 O9 Y1 g! [
  32.     }
    ; O& |7 r" Q: p$ W9 g" ^
  33. ( i8 k& O; G4 q
  34.     public double getAttackPower() {
    1 P8 L) B( C( g7 l* G
  35.         return attackPower;
    ' r& ?, C! y% _
  36.     }
    ' T+ J" D) V( w9 u% Y: H

  37. ; E* }: L7 }5 [
  38.     public void setAttackPower(double attackPower) {* `3 l: l* d9 O9 W
  39.         this.attackPower = attackPower;
    ( ?* ]: ], k/ L# ^1 v9 ]
  40.     }1 h, l$ O4 P/ z
  41. }
    0 t* N! K3 `0 Z
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.6 ]0 l, v- B2 j, b& y& e; N
/ R( {+ P' [2 T' n0 ?
  1. // Пакет org.l2jmobius.gameserver.model.battle- X6 O1 G1 }0 S8 D
  2. package org.l2jmobius.gameserver.model.battle;3 o% l: @# L7 T. r! o7 T

  3. , ?2 {$ k% J2 d  E4 M
  4. import org.l2jmobius.gameserver.model.actor.Monster;7 E; L- y7 n2 y: \, i0 K
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    7 C9 ]' Q3 r. T# @

  6. % x6 `- W; U1 ?$ C+ d6 U% g
  7. public class BattleSimulation {( U& h! G5 e2 T& r5 F' A! g
  8.     public static void main(String[] args) {- b7 U. a+ b3 F4 P( o! w. n
  9.         // Создаем монстра( u: U5 @  e1 T& }" s/ F2 T
  10.         Monster monster = new Monster("Дракон", 100);' H7 Z( V- n5 H, \

  11. . @( l9 f6 Q- f; G; `
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак  K' l& I. E* [1 y
  13.         monster.setState(new AggressiveState());
    : c" [6 i8 \: X2 t/ C
  14.         monster.executeState();5 }3 t  }6 _. @$ D' L: R* g
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак  g5 }: x% P9 ]; p
  16.     }
    & h% }# z; C2 }) b* _( v- C# d
  17. }
    7 k: \) G: _% |* @3 @  F& C
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
* `. T- T/ c, e) sЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
9 f/ y" O! h4 n
. {) g$ P9 Q6 \0 |: G$ A6 Q# k
5 N& y9 w0 m/ b% p9 N4 @9 B7 ], o0 J4 c' q8 J
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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