Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!
% B& j( ]2 P; y8 O
1 r2 i; E0 f2 w1 a- \% _5 b
- p( c+ [* N) h
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.* ]3 ^$ ~0 t, s/ D" L. r
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!' ]2 |- {4 s( V3 l* D9 A: V
Астралия ?, _9 E) @; m4 M' n( J0 _
8 b& @  s; \2 L) a! R

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!
% V, _) N/ @3 ]3 r: x7 @В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?
* R4 w3 d) T3 Z1 ?
. o7 ^- c* e; L4 r2 M+ c+ ]/ d' D
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 # _* V+ ~. t; Y3 N4 u. \/ g
AlexCoder опубликовал в 2024-10-16 18:31) w  }0 S5 q9 W1 [
День добрый!
. J& n' }' W% v3 WВ статье описано взаимодействие игрока с N ...
! c) B  B  n% ~, `4 E
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). % k3 x3 B& a4 d: N
9 i' j3 b4 K! x7 w' c
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
* T1 \2 a& r- Q: r
; n- O. q) M2 x5 c' gШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния." ?' V) v- w0 p6 L1 f8 `, y3 M
) y" s5 ]7 W' N
  1. <font color="Green">// Пакет для состояний монстра</font>
    $ t" ^0 |4 u7 h, Z& \; _: f2 w
  2. package org.l2jmobius.gameserver.model.actor.state;5 N, R. y! A  s+ V4 ?, f. W( `8 l
  3. <font color="Green">$ w" Z% I. |% w
  4. // Интерфейс, представляющий состояния монстра</font>
    ( d( |7 F+ a" |5 p
  5. public interface MonsterState {
    , X- Y0 _. m) g) n. K- u" ^, r
  6.     void handleState(Monster monster);
      O9 A. n# ^1 l8 a& b" g) B# R
  7. }9 L" r8 {. ~& _! _; I! u4 Y
Скопировать код

3 I9 b$ v& P" v* w# W0 [Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
! r* y" M) m6 }+ N' ^* [4 E. w- |& t$ {) Y* E, H
Класс для начального состояния монстра:8 h$ z# o8 H* v4 J2 M' O! l- N
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>' D3 P- t, F+ ~! v
  2. package org.l2jmobius.gameserver.model.actor.state;; f/ `" R8 G9 N6 J/ F
  3. 7 }& Z, ^$ |. L9 E4 q
  4. import org.l2jmobius.gameserver.model.actor.Monster;! u, m; y' I4 j$ r5 b
  5. 6 @. ^2 R8 Q3 T: J# e5 \0 U/ y! g8 g
  6. public class InitialState implements MonsterState {+ W  n/ E* ~* Y" @  g( q
  7.     @Override
    6 R1 \) M" v/ x( |4 a: {+ M
  8.     public void handleState(Monster monster) {& w0 C# K% O! f* H8 G, s4 G# S3 ?
  9.         // Начальная фаза боя
    ! y8 `# s, z' `7 _: s; r
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");" ^/ V6 b% d% y; W3 Z5 O. E, D
  11.     }( J. p. w$ E( {; K1 G
  12. }, f4 O4 f3 r: `% L2 f( B+ M3 O
Скопировать код
$ P+ L) `% l' j" [

" r3 c2 |2 _1 Q! }6 t
; k2 o4 S5 s9 [3 M+ e- s4 G) ~' t

& j1 F# W: k* R- ?1 x' c. w" c% s; V7 W9 _

/ n& w$ J/ T4 }+ D# F" ?6 Q! G2 d
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
2 i8 ?2 m4 X* K* i. s( ~- g
6 t& H% o6 e4 s" P8 A7 @1 P0 ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
( f3 o8 d: f$ G$ W& e' w' F% A  E, v5 g; T# n3 H1 q- L5 z4 @; H0 H
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.( p0 R1 ]1 m5 s1 \1 C* ]
8 l# x3 w: g- t  @7 S
  1. // Пакет для состояний монстра* `- ?" |& F8 o0 V
  2. package org.l2jmobius.gameserver.model.actor.state;$ v  f) @. b# Q9 N+ m0 _
  3. ' F# @9 y9 B1 ]
  4. // Интерфейс, представляющий состояния монстра
    / n! f; h8 ]& O. [- ?
  5. public interface MonsterState {; i8 \2 a! H- k& x/ i# u* z
  6.     void handleState(Monster monster);5 J$ c1 i& ~9 _. e' a2 g* X( k
  7. }) E/ e0 S4 J1 C$ @/ I
Скопировать код
2 T4 z4 S8 s+ E) q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. * }* g" y' m9 V( W: E) u0 {+ R2 Q

" G' B& y& t( X- H( Z3 oЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя./ R6 V  |" @) |& Z6 z- V
4 i) @) ?2 A, Z+ E+ ~) c% ^
Класс для начального состояния монстра:5 d1 C0 E: M/ u9 U
  1. // Пакет org.l2jmobius.gameserver.model.actor.state' Q7 q0 Y( e2 N& R0 F& E' S, H
  2. package org.l2jmobius.gameserver.model.actor.state;% V+ v# P0 B% j) p3 z( H% L3 Z" ]

  3. & s" i# Q1 X: Y& C( n
  4. import org.l2jmobius.gameserver.model.actor.Monster;& Y8 @/ {! T# {+ U+ Q

  5. % S+ n2 X7 ^! W- V6 R
  6. public class InitialState implements MonsterState {: ]( R% \: N9 R, ~* @7 w
  7.     @Override
    * A- g6 f! c5 a. _7 |+ |
  8.     public void handleState(Monster monster) {
    , q2 Y  O5 o7 D& a
  9.         // Начальная фаза боя" Q  L! F7 s$ I$ ?
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    : ]/ T0 z8 v0 I8 k: _: w! R5 q
  11.     }4 N8 a, B0 l1 V7 ^! u! i# u3 [
  12. }
    & B# K1 K2 ~- e: |* |2 c, d7 ~
Скопировать код
Класс для агрессивного состояния монстра:
8 Y$ y  T) S1 x: C, m
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  E9 {5 M. a5 o3 H
  2. package org.l2jmobius.gameserver.model.actor.state;
    " X  _9 f# K8 D

  3. $ Y3 f5 U. q0 _5 }1 x
  4. import org.l2jmobius.gameserver.model.actor.Monster;% _+ i6 t# a( o( @9 v: d

  5. / [$ Q" i9 l2 F& m) s( d5 H# F6 h( u
  6. public class AggressiveState implements MonsterState {
    * W1 ?% ^3 n/ s( v2 a
  7.     @Override. n  J/ a! P0 \- `4 {, t
  8.     public void handleState(Monster monster) {% z& M4 d/ e) e+ k+ z' D
  9.         // Агрессивная фаза боя: q. ?, p! {/ B! W& o; {8 V# Z
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");2 ^. R# t; P' H& s+ J9 r
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
    % O' S1 m2 K3 O# C, E/ h
  12.     }
    / t. ^$ h$ E; }; P. |) r5 \
  13. }
    ( D! K4 ]' N" y0 }7 i
Скопировать код
Класс для финального состояния монстра:
/ E+ m/ E3 o* {- R7 {
  1. // Пакет org.l2jmobius.gameserver.model.actor.state2 Q; o' K( q& m7 K
  2. package org.l2jmobius.gameserver.model.actor.state;- L, f/ A6 B  B- ~+ Z; c

  3. ) G1 y2 J+ T# R" p; Y3 f$ |
  4. import org.l2jmobius.gameserver.model.actor.Monster;9 W& d: t  F# r0 ]

  5. " ~6 X9 `, f# O' u/ C" d
  6. public class FinalState implements MonsterState {* U5 ^5 m  C. r* O
  7.     @Override
    . ^8 M$ T  I8 ]0 Z4 C' S
  8.     public void handleState(Monster monster) {  w$ O$ N' W; z1 @: S+ Q
  9.         // Финальная фаза боя
    / W2 ]& y( K- r& {5 y
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    ' a7 Y# c! R7 y: g  N4 N
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    ! k! ?6 J. L' P2 X6 f. x
  12.     }8 t7 N7 O: {' [) \# H0 m9 a
  13. }- J, r: E; I) e: z
Скопировать код
4 N& p5 Q  w- ?. Z
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
: Q4 S! ^4 X* ?0 o3 a# N
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 V+ C; f# E! e$ `
  2. package org.l2jmobius.gameserver.model.actor;$ Z2 ?2 j: @" P, Z  R0 f
  3. 4 O  u& H; R& \3 @: n! c5 _
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    0 o/ c* U5 P9 j. J( n" u: {, C
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    6 p) s! s% z) b2 i" e4 H
  6. - \6 S: F6 i4 ]8 S4 p
  7. public class Monster extends Creature {7 ~8 A, w' S; T0 q2 M6 y) E7 t5 k6 J
  8.     private String name;: ?: `- g- S& _$ K
  9.     private double attackPower;3 p6 J4 X& ^2 l
  10.     private MonsterState state; // Текущее состояние монстра
    ! b; N- ]# K2 G  A0 h

  11. , B. G. |- V6 V. s* R
  12.     // Конструктор монстра
    ! o6 c* q- N/ l- }8 e
  13.     public Monster(String name, double attackPower) {  b# S1 |1 f& z' l  \5 D
  14.         this.name = name;& u" B' [8 S& O" w/ Z
  15.         this.attackPower = attackPower;
    " i2 B; l# V6 N' B
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние$ d. Z& _' u: e9 O$ Q
  17.     }% j% d4 X/ S. f% G2 T

  18. ' C: K$ C& C1 y
  19.     // Метод для смены состояния  n9 C- v- q5 W1 Y6 c! t: R2 I8 s
  20.     public void setState(MonsterState newState) {& f# {$ x3 I$ J- x
  21.         this.state = newState;$ q. D+ f9 Q3 E( y
  22.     }. N5 T" f' R# S- ^
  23. ' _& C$ d/ k4 k: f& m* Y
  24.     // Выполнение действий на основе текущего состояния) N! x/ Q+ q; k8 d, T2 ^8 B
  25.     public void executeState() {
    / p& [# U8 _' E8 ^5 R
  26.         state.handleState(this);: n9 `% P; |3 @% F, U
  27.     }; _' p' M0 q# @2 A

  28. - z1 F6 R/ a0 I$ f  V/ A. C! h
  29.     // Геттеры и сеттеры
    7 k& `8 X3 U' L. o" f9 S8 y- m
  30.     public String getName() {
    8 M) a8 I! Q# B, q7 T
  31.         return name;0 Y$ u0 m; A: R+ M6 i" \% _- V( n; O
  32.     }, E( r$ [( }% ]# ~, ~$ ^3 _9 G

  33. 1 B% ~" J' T  F7 w7 t
  34.     public double getAttackPower() {0 P* L0 u/ I( U* W9 U" W& e+ R
  35.         return attackPower;8 F- W0 ]& G3 Y' K: A
  36.     }
    4 x& C* c' v# L/ x/ \

  37. 0 }& f2 ^& }# W: Y* }) V. b
  38.     public void setAttackPower(double attackPower) {
    6 Z& g3 H- f8 c6 ?8 m; o; u: |& Y
  39.         this.attackPower = attackPower;& _/ |% q! k4 P
  40.     }, g# e2 l% i# a. b# S" Z
  41. }) ?9 k$ Y- z" b+ y; W" s. b
Скопировать код
+ l6 q- g2 J/ n' g/ _% n+ {
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.4 v9 h' c, a' h# Z
0 }) o7 X' v+ ~6 w- d3 M
  1. // Пакет org.l2jmobius.gameserver.model.battle
    : f* Q4 [5 }1 q% |% W
  2. package org.l2jmobius.gameserver.model.battle;; w0 ~* l0 m) e+ f. a: X1 I  m
  3. 6 A, m& {% f- a/ o$ n0 O3 l/ V
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    " Y/ u( R- `& t* B5 ~
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;5 {+ ^' o  b# k$ ~. o- X! R! J5 b
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;8 z$ |$ a+ S1 n

  7. ! _5 _% a7 P1 V! o8 M
  8. public class BattleSimulation {+ x8 Y$ q! \: P% l* ]
  9.     public static void main(String[] args) {
    & N2 J4 o, ^3 R! J2 c; J5 e
  10.         // Создаем монстра с начальной атакой
    + Q$ V, R& I( k+ F" h5 P) Y7 y
  11.         Monster monster = new Monster("Дракон", 100);2 j. R" U) O0 k0 e. M7 ]

  12. ) y, o: r  _4 _
  13.         // Начальная фаза* B: {3 Z# v8 B, ~! r8 s* n
  14.         monster.executeState();& b2 _! q: V, L4 Y" q% }) Y2 B

  15. * ]7 ~# H5 K# L0 ~  P$ `5 A' d
  16.         // Переход в агрессивную фазу
    ( ?3 [. d6 q2 B/ t" m; ~
  17.         monster.setState(new AggressiveState());  x) V* C/ |9 q4 O7 H/ q
  18.         monster.executeState();% v+ I4 z3 Z0 n
  19. & K: d# R& `+ @! c6 z; [9 J
  20.         // Финальная фаза! a+ V+ G0 a# ]  R5 K
  21.         monster.setState(new FinalState());. A! y+ x/ f; o0 q
  22.         monster.executeState();
    5 b3 p8 c$ d4 _
  23.     }
    " o. L7 ]! r4 K' b! M# A
  24. }
    5 E- j2 \+ N* d6 @, }  z; C) [1 W
Скопировать код

; i5 g  H: m# r0 |: A' ~9 B" g% CКомментарии по структуре пакетов и классов:6 @* s' g/ C2 r& @1 ~
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.  G2 F! @) s$ C' Y3 c. Y7 V5 a3 m6 E1 x
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.: }$ z$ U2 _! a- w! z: |, P) z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!. U# x6 j0 r7 M8 Q% g
; D9 ^5 C7 T& q3 \7 m" C4 R
7 ?% `$ ^  w& D7 R5 H# {3 S

9 }* ]' j/ N+ E5 P5 [; Z' u; {7 M- c) F: f5 H9 O4 Z' H4 z- d

& \. {5 n- ]4 F$ F8 d9 D/ K, p  B/ f, ?

6 K1 d. j+ w9 P+ Y* l
1 x5 N5 b1 c2 }! L
* B, B" t- }4 [) u' a
! S. k8 M1 j' |3 C/ u' A) N" y* Q9 s: _1 w5 i

1 H5 n1 x% ~, Z6 o+ B1 o# @: x9 P( A( b" b  X& O. }! n7 b! P" v
% `8 H% P4 s& C2 ?
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04  H, J: w$ h) t4 v9 B( y( K
Для управления сложными взаимодействиями, такими как  ...

* ]& q+ m2 o- m& e" K! l+ JОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21" G3 T. i  [9 I5 Y7 u3 ~6 X
Отличный подход! Использование шаблона "Состояние" де ...

) B) T  ^0 X6 i7 vХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.
" p4 s# b: Q$ F/ U0 w8 o) ^+ t- E: S- g3 Q& @$ k" L4 H
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.+ d* G/ N7 K& ^. Z# h
  {1 V# t0 G9 [
  1. // Пакет org.l2jmobius.gameserver.model.actor4 h; |& ]" H4 t( C
  2. package org.l2jmobius.gameserver.model.actor;
    ( _1 m- z* ]& I; i/ d* N; I- R6 O
  3. 2 P2 Y! F: y  c6 ]  g
  4. // Перечисление для типов атак
    , D' G( l' X8 s  r% }* d" n
  5. public enum AttackType {) f4 L& A# T% y
  6.     PHYSICAL, MAGICAL;
    , v: V8 h7 X/ \# w- ~8 d; w! J6 S
  7. }
    / s9 f" O: H, b) f- F' B+ e, u
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.  I) R! z6 [" u
Обновленный класс для агрессивного состояния монстра:
, l- z' E. w# `( J* {& l2 X) N  p
+ C, E2 @# L5 ]/ i' T
  1. // Пакет org.l2jmobius.gameserver.model.actor.state  ?  a/ T1 ~1 U& w, z
  2. package org.l2jmobius.gameserver.model.actor.state;6 X! a5 I; b' m8 ]

  3. + M/ x$ |9 t- q" r
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    / `. O4 D3 t6 l
  5. import org.l2jmobius.gameserver.model.actor.AttackType;. f7 h# Q. X% K& s0 y
  6. 0 v/ f2 K- \; i  _) N9 [
  7. import java.util.Random;) |  n" x( S- a7 `
  8. 2 x) a4 _  m- q: ?
  9. public class AggressiveState implements MonsterState {. r* `  K) Z- I3 n* m+ q( F
  10.     private Random random = new Random();# k7 \; q: l2 ~# o3 g! ?( K' M

  11. ; |+ u+ L: d5 H* V$ z
  12.     @Override& ~3 v- k' n0 R
  13.     public void handleState(Monster monster) {6 U. @6 {- E' Z
  14.         // Выбираем случайный тип атаки: физическая или магическая; a( ?0 \  h/ L( @
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;
    5 \' Z! r0 ]. t1 r4 ~

  16. ' |- T8 x' @; {
  17.         // Логика для агрессивной фазы боя
    " X  [3 @: P# A% s' m% l  Q
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    ( M: C9 I$ U, W: ?
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");$ ~% d6 [% l6 [8 @# U
  20.         
    6 P3 t3 k6 k% i
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    2 [2 A2 ?. O3 M) Q- l
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;% f  ^+ m( r+ P, @1 \
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);. m( W% C4 q. q3 @3 C# o3 r
  24.     }
    # ]; v4 W9 d5 D9 G' v1 M
  25. }$ U7 l! S' k3 V% E3 N
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! B' N- e1 I5 G5 V" r! _+ O$ P5 s

3 l: a8 B( n6 M* g% G2 Z
  1. // Пакет org.l2jmobius.gameserver.model.actor( P6 o, N0 ]$ C3 k
  2. package org.l2jmobius.gameserver.model.actor;) e' T: |0 ?' t- B+ E% r" y1 N

  3. 6 W9 o- G$ }  M" b- X
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;) h. P+ B2 J9 e9 c' L
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;: c% ^  Y' V" {" P" |2 e
  6. ! ~( }! X" o) Y: k
  7. public class Monster extends Creature {
    ( Y2 u2 g& X% X* v* j& C
  8.     private String name;/ E2 l- \# ~, k' F9 Y: F0 Z
  9.     private double attackPower;/ I0 G4 F+ M* J3 W/ k: O5 c' I
  10.     private MonsterState state; // Текущее состояние монстра
    9 E; y3 E# Y& B4 e

  11. 6 I+ F- W, G& K' d
  12.     // Конструктор монстра
    ) E, A8 X6 ~3 B% S
  13.     public Monster(String name, double attackPower) {1 P0 n  u& z7 ]7 `
  14.         this.name = name;+ {5 r3 q! M' `9 |4 x7 [! @
  15.         this.attackPower = attackPower;# G: Y; q- s, }4 q7 c: l0 y( N; O
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию" k$ k6 X+ |" n3 {8 x
  17.     }1 ^: m6 K2 a2 d! k8 [, l

  18. * m" F8 F/ d' J2 t7 \4 u+ A' q; O
  19.     // Метод для смены состояния+ G2 j4 }3 J( V! z
  20.     public void setState(MonsterState newState) {2 X5 p7 X3 t* r3 z0 M
  21.         this.state = newState;" f$ [$ G; f/ f% c( d4 f
  22.     }
    & ]0 ]; y+ d/ M& ?  S; k( Z
  23. / H: i5 {$ \5 T( o* |8 s9 j6 _6 H
  24.     // Выполнение действий на основе текущего состояния3 x$ h' x) c( v; `+ T
  25.     public void executeState() {! i5 Z3 P+ H; X& I9 L& ]
  26.         state.handleState(this);
    . `' L" v6 n1 X2 l: Z
  27.     }
    $ `* b) u7 S/ `' t, \

  28. 7 K- j$ U, y& @1 U) j  i' {9 J
  29.     // Геттеры и сеттеры
    + I) w- {* X) j3 ~- r) r
  30.     public String getName() {
    8 l! [6 I- v' L: @. \: N: V
  31.         return name;3 P1 Q/ @* c; A) L( l8 _
  32.     }( p2 F" V, {, T" H$ C; y; D
  33. $ {$ ~1 C) e- V* i
  34.     public double getAttackPower() {
    + @1 C: j* [0 h. U4 t# J* e3 g: ]
  35.         return attackPower;
    ' K3 G, Q5 K; L9 n' b" `
  36.     }/ b, ^: ?# {+ d& Y! b

  37. ) n4 Q/ M5 w$ m7 z. o
  38.     public void setAttackPower(double attackPower) {' F7 V* |" j. }5 o% p8 a1 W0 N
  39.         this.attackPower = attackPower;& C8 R8 j$ U  [/ j. e* f. A9 R! L
  40.     }6 U% [- U8 V- @; R$ v
  41. }
    & S. |) V0 x! T8 ?
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
4 d' b: w$ b6 R& r' x4 a4 C+ @5 I
  1. // Пакет org.l2jmobius.gameserver.model.battle$ P! I0 ], z) N9 P  \; \( b
  2. package org.l2jmobius.gameserver.model.battle;# y! o, P% I& s; w

  3. ) a& p! d! s, q6 S
  4. import org.l2jmobius.gameserver.model.actor.Monster;5 b/ Y0 z+ ]  P
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    8 _/ |# x# H# h, l! }
  6. ' t  A# m8 G% D, V# m$ l6 d, L
  7. public class BattleSimulation {
    & P& L' H/ Y$ q9 l
  8.     public static void main(String[] args) {) {1 E' M/ \. U' ~6 {, y' B! o4 I
  9.         // Создаем монстра
    " j  m$ c" }% ^: _. q1 D
  10.         Monster monster = new Monster("Дракон", 100);4 L6 s" z/ m4 D# O
  11. $ l$ T5 Y. c: J+ P+ p, y
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак" l* n% `3 F( V8 M
  13.         monster.setState(new AggressiveState());! ^. L! @1 S( H
  14.         monster.executeState();
    , t' C; r8 a' L0 ]5 Z
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    4 Q. M+ i' ~. _- X4 ^
  16.     }' x+ @9 P2 @* U5 w
  17. }
    4 \& @( Y! ^4 B3 p' _
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
0 i$ C, l3 `3 ]Если у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!
# Z! s4 B3 S  m+ y' E# \2 i8 d) Y
. r: o: m& U! B5 U' f* X
# B# l8 N  X3 P' B6 g
' O2 J9 y6 D# S" U8 j5 U; F
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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