Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!1 ]. w" z  w, V/ O) y
- _. }1 G5 ], F# U7 T: S9 g
- n; n$ j. J( o& S& f
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы.
( O) o' j! _3 R+ ?' BЗадавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!
! B# ^/ \; G9 _5 Y$ H  R4 qАстралия ?; s: Q$ a/ }+ ^6 c! {) v9 G; [% F

0 i* U/ O% k2 p1 d- u, [! O( _

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!0 ]2 a7 J9 [7 Y
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?) p6 ?0 Q9 ^1 q( s" k" j

2 x6 I% J& a2 L% y% C
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54
+ i! }- l' _8 h
AlexCoder опубликовал в 2024-10-16 18:31
9 I, Y1 u$ N. K3 @( X6 @: D! ^День добрый!) h. r: f6 l, _( H. W& a
В статье описано взаимодействие игрока с N ...

7 ?' o' f  F5 b/ b+ iДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). : l4 V. Z' |$ K6 h2 a7 g1 D

9 l% P: J2 w$ m' FЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.6 b7 K5 e2 j" v: L+ {8 U0 Z
9 @. H3 g! F9 X2 E0 Z1 s
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.6 o8 ^' H9 {5 Q* J5 v! N

6 C, R5 Q( q2 I! {7 h+ Z$ w8 P# k
  1. <font color="Green">// Пакет для состояний монстра</font>' F; J& E: N0 Z  ^
  2. package org.l2jmobius.gameserver.model.actor.state;( D; _- n& j5 Y5 n; ^) d
  3. <font color="Green">
    ' E  `: a. D& \
  4. // Интерфейс, представляющий состояния монстра</font>. H  M& z  f) m2 o' c  [+ H7 h
  5. public interface MonsterState {
    7 g# z; x$ o% v  Y
  6.     void handleState(Monster monster);0 N: N  ~$ B8 a; ]" Q& o
  7. }
    , l8 e- V: ]' H
Скопировать код
9 a! `" R$ J: R3 T4 V( |
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
  N( U& l- G# [7 q- V+ @
  G+ h8 `0 _' D' bКласс для начального состояния монстра:/ E7 W+ E6 j! O
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    / K) T0 F! h& G3 F+ C
  2. package org.l2jmobius.gameserver.model.actor.state;
    : a) Q! f/ N  L1 j' u
  3. 8 }' I3 \# K  G+ Z4 C- {
  4. import org.l2jmobius.gameserver.model.actor.Monster;- W; h/ |2 r9 o7 k2 P+ C/ M
  5. * O) S- W6 d- Z
  6. public class InitialState implements MonsterState {
    1 \& b- O: `" ~* W& l7 _
  7.     @Override
    : @+ Y/ G7 \/ x/ R8 ~9 m
  8.     public void handleState(Monster monster) {1 S0 t: @  m! _* A
  9.         // Начальная фаза боя
    # Z! T& T& D) O" k3 p" U# ]
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    # |% F- E: r4 k0 E- N5 L: A
  11.     }
      q/ M, I6 C% A- v6 R! c
  12. }
    $ w4 @2 @# E0 f: E3 ]$ {  \  s7 s
Скопировать код

8 j8 N& Y9 z# ]; @0 Z7 |. I$ M# i1 C# X$ U( a( f0 e4 r! f

7 D, [0 b: \5 a' [) J) M' O
6 g& s* T4 l' D0 \+ |
& D. \1 m4 r3 a2 u- Q7 t$ S
6 B  K5 ]0 {4 c
% F* E. c/ b5 E$ u
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ K- b  E3 j* F& ~- C0 V1 V( ]- E; j7 T5 I. z0 g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 X3 Y/ e" s) n" _8 p5 n+ t  K, S5 e6 G
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 i, L# n4 x. x
$ H9 o$ t. p, D  _/ H! Q, i
  1. // Пакет для состояний монстра
    9 A! Q! Q1 g# C  {2 N
  2. package org.l2jmobius.gameserver.model.actor.state;0 t/ {. H$ o: Q% z, K* V

  3.   z  q' D* P: d/ Z: U& d& H
  4. // Интерфейс, представляющий состояния монстра0 t) M2 R' A% z' \% T0 x( _# [
  5. public interface MonsterState {
    4 ]/ l; F2 h& o$ I! N0 s7 a8 ^+ J
  6.     void handleState(Monster monster);
    % X4 i( x5 D% \* u) N
  7. }8 D" {: w, @8 u. @* z( M
Скопировать код
& Q2 Y+ n6 \' N9 L( A3 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& B% j5 l! @! d& p. N; m) o. \  E; {  k) w0 z6 F; c. l$ l
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 `" j. [( c) l
9 H2 x' ~  \) w5 Q7 [$ f
Класс для начального состояния монстра:4 Z- r0 p8 g; a. n, c$ t+ \
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    & J  x; E) Q# m4 P
  2. package org.l2jmobius.gameserver.model.actor.state;
    ' D' `/ c: h  l% `, I( K
  3. 4 b9 N+ f& D$ O/ ~, {
  4. import org.l2jmobius.gameserver.model.actor.Monster;; `2 p7 v! b) s% g4 V' R1 G1 L

  5. : q1 Z- s6 ]5 i( t3 S& c* v
  6. public class InitialState implements MonsterState {) r6 ~0 X( U8 V! @5 z7 T
  7.     @Override( b- O, [8 ?* @1 X6 Z
  8.     public void handleState(Monster monster) {  C, G% _8 _4 G
  9.         // Начальная фаза боя2 P7 _1 @; E, v- G
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    0 ]4 G  _+ d5 \$ s# U
  11.     }
    % R0 _; b3 O  `
  12. }* B+ I% B  P! d! P, M# d# z: Q) G
Скопировать код
Класс для агрессивного состояния монстра:
& h, }5 f/ }$ q3 e
  1. // Пакет org.l2jmobius.gameserver.model.actor.state) y' V& S! c. @0 X1 L# F
  2. package org.l2jmobius.gameserver.model.actor.state;
    ! c/ n) |! _) \, T, b

  3. 4 `- B  e" e% f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( m  V9 J& f8 x. c) N- u
  5. ; Z6 w4 ^0 d9 B
  6. public class AggressiveState implements MonsterState {7 y" v0 L5 b* Q# k3 V; g
  7.     @Override4 g: C8 N$ R9 M* G: \& {1 y0 P8 [
  8.     public void handleState(Monster monster) {' o7 v7 r% ]1 a$ G3 R
  9.         // Агрессивная фаза боя
    % ^! F5 {% l' ~( K% Z" Q
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( R6 F0 ]3 f2 m/ j" `9 @
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки) q% E, I# Y- x9 }
  12.     }6 L7 S; n" M; S/ u% V# T, V# X
  13. }4 i& }4 N' M0 w! A$ U: L, H
Скопировать код
Класс для финального состояния монстра:
1 @* Y1 c: Z7 b; v! p4 j9 `4 E
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    6 c2 a8 X& I, j8 l# N4 E) I
  2. package org.l2jmobius.gameserver.model.actor.state;! d4 D$ h5 F6 t7 B; @4 P

  3. ' n4 E* {0 h6 q, Y" F% f
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    . _, T2 L5 X* N
  5. 2 E& E; m+ ?, Q. j+ \% m
  6. public class FinalState implements MonsterState {) N8 w1 H8 _( Q* V
  7.     @Override
    0 @: @' t# H! t4 ^, u4 v6 Z8 y
  8.     public void handleState(Monster monster) {
    ( }; _8 x$ o5 q6 B2 `2 \
  9.         // Финальная фаза боя2 t) v* f1 V0 s1 d7 }
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");
    , s- ^% l( O% f3 ^* S- M
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    2 o0 J% U* _4 B2 t- O
  12.     }; Y2 N0 P4 G& p% [, T- f$ o* ^
  13. }
    1 Y' X" }" x2 P& y: `0 Z6 k% ?* C
Скопировать код

7 g$ T5 O: _( \- pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: l: o* D+ U* x7 b+ ^+ H- e
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . v) X! U- ]. B: P, r! l6 |
  2. package org.l2jmobius.gameserver.model.actor;$ X& g# R) {7 `
  3. - }4 `8 }0 b) I8 g- \* z* k
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;: l& {" n2 H5 e& M6 P2 I
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;9 L& e5 b8 L; ?

  6. , J# B' x) Y7 M
  7. public class Monster extends Creature {
    ) ^2 h' m; f$ E+ y2 d* k. Y
  8.     private String name;6 K. z& ^& j: u3 H
  9.     private double attackPower;
    # q. }" Y! J3 c& A% ?) |/ k0 J1 n
  10.     private MonsterState state; // Текущее состояние монстра
    - O& u: n, J: }2 S6 e

  11. ; l! C4 ]2 A( V: K7 }& G
  12.     // Конструктор монстра, \  ?) ^, P# m/ N, Z" i
  13.     public Monster(String name, double attackPower) {
    2 j: m7 G" H" Z3 X% s
  14.         this.name = name;5 P) g( V7 A* d1 D5 g* e8 F* W4 B% F
  15.         this.attackPower = attackPower;
    6 s& w7 S5 M$ L' U' }. C7 \  c
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние/ M, n" I: @0 \% ]8 ^7 y/ e) J
  17.     }8 q7 o  a/ q- u+ t

  18. / |  n/ I2 C* B, F3 V/ |& p
  19.     // Метод для смены состояния
    $ `3 P# ^7 E$ R/ C- U9 Y7 D/ O6 M
  20.     public void setState(MonsterState newState) {
      f. P4 x5 q# L6 q; l  E. a( V
  21.         this.state = newState;7 M$ G( r  m7 z& V% d$ m
  22.     }0 L0 v+ B: c+ c
  23. ) @. v# Z0 P% r" e  K0 A
  24.     // Выполнение действий на основе текущего состояния
    % F7 U) x! {$ g6 X8 u; u! \
  25.     public void executeState() {7 s; K" q/ w/ Y7 ?
  26.         state.handleState(this);
    4 K7 s7 d  S- n5 g# |# U; [/ O
  27.     }9 r+ V2 l+ F1 w# H$ N$ U' `
  28. 7 d& a7 G' T3 ~
  29.     // Геттеры и сеттеры
    $ ~1 N; V: T9 V% U
  30.     public String getName() {6 s+ X$ {2 s/ B" m4 B- S
  31.         return name;
    / Q  Z. |/ m5 R
  32.     }
    & o) i$ ^, O: c7 G
  33. 0 x1 q" {/ d: }
  34.     public double getAttackPower() {" w: @5 R" [- H+ k
  35.         return attackPower;
    - s: T* O$ O( \, `, O2 {
  36.     }, O6 x" v, ]: q: }

  37. ) C7 U. [/ [! F0 w& K
  38.     public void setAttackPower(double attackPower) {  w7 \6 k/ x! `9 x9 B( v9 n
  39.         this.attackPower = attackPower;
    0 a6 P# o8 ~& g$ O. W) X# n. r& r
  40.     }
    1 ^/ P6 d2 X4 K/ o; O2 ]4 t
  41. }
    9 I" M; d& ]8 B7 i& @) Q$ [
Скопировать код
8 D3 v% d. f: G/ \8 K; G
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.2 @& O+ k' h( c) j; a2 p: z
4 j; Y. a; `; s6 H4 Z* b/ z
  1. // Пакет org.l2jmobius.gameserver.model.battle
    - u1 \; |! n) h
  2. package org.l2jmobius.gameserver.model.battle;0 t) I. R; n1 ]
  3. : `" ^4 D; `/ t8 {5 q) w7 b
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ( L" }2 _) c' Y4 @5 G4 _( ^
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 j* Q$ z9 g4 Q8 L2 J6 G
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    - W4 M0 R: T1 q  M9 }
  7. , `7 A# i  X9 u, G
  8. public class BattleSimulation {
    0 l; U4 K6 k, ]: S9 \. s
  9.     public static void main(String[] args) {: T( H9 D4 U/ M# R
  10.         // Создаем монстра с начальной атакой+ u. ]+ I% H- m9 ]
  11.         Monster monster = new Monster("Дракон", 100);$ R4 O8 X8 ^- D1 |9 h
  12. ( U/ n; G! j2 k6 d9 N4 m7 C+ P
  13.         // Начальная фаза
    + f" J. k; k0 `  z4 F$ w' W/ J* L  v
  14.         monster.executeState();
    0 \! f& I/ P" O8 b, m, {# N
  15. ! ?$ |' W3 o5 D9 G7 w9 x
  16.         // Переход в агрессивную фазу: v; v4 f* u/ Q( [3 u4 U
  17.         monster.setState(new AggressiveState());% K) s& S4 j( F4 K; H# v7 W
  18.         monster.executeState();% B# e( E& m; l! V0 c% u

  19. 6 t) w9 h: `, y& a1 d3 e* u9 ^
  20.         // Финальная фаза- K/ S% z3 @" V7 b
  21.         monster.setState(new FinalState());
    3 I& L0 B1 n* e) \
  22.         monster.executeState();
    : h$ F1 ?6 Q. F  E9 h- O  R" o" D1 [
  23.     }/ q5 m( |* K/ x3 `1 p5 K# l
  24. }
    " R( t' U( k) f8 H
Скопировать код

0 O  f! M0 Q' p; n$ GКомментарии по структуре пакетов и классов:
: r3 m9 A+ {% z( I8 n
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- n/ Y0 w6 q. U; p) S" ~" b" d3 d
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 Q# a  f2 j  y5 h" cЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( n4 g* K9 A+ @- Q
+ K7 I- N+ n; f% a

: a2 _6 @  ?& k3 S9 g: x- q5 k* t
. W/ K: V5 E5 T' E+ v

0 X% ~- D3 c+ e+ N! X& }
' |/ A5 O# n6 V0 S& U+ R+ V, Y9 z8 @' U/ R

  P5 O# W% D% u9 o4 `
/ U$ x, U9 r: [1 c5 i$ u6 G9 |/ ?: L
. d, |$ k8 W5 f8 O
: v6 C0 Q8 w( ?1 G: \( {
2 ?$ D$ J. e9 h

) F2 Z( F! t( |+ _
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
- d7 R% W/ I" Q( gДля управления сложными взаимодействиями, такими как  ...

8 W5 ]8 I' |$ C  P4 c) C' g$ f# GОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21+ c1 W+ Y' x' n  U0 [" a
Отличный подход! Использование шаблона "Состояние" де ...

4 B5 U. S$ P9 B7 c2 L- N- pХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.( ~( u) `' G) [1 y0 q" H. y7 H
' h+ w  {  Q! \" u. Z; E: e# m5 W$ Z
Шаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
  M0 o. h& V1 A* `& b  m5 A. H- \, k$ T! z: [. D- ~
  1. // Пакет org.l2jmobius.gameserver.model.actor1 @; G! f# ]$ p5 ^6 p, I8 @
  2. package org.l2jmobius.gameserver.model.actor;
    ( E, o6 n+ {( ^

  3. & s9 ]; j! W$ c7 v
  4. // Перечисление для типов атак
    5 s" a, _% D$ m! h# I% m! g
  5. public enum AttackType {
    # P7 J3 b- ^9 K/ Y" X2 O: f
  6.     PHYSICAL, MAGICAL;$ t  W" }) v' ~* c2 ~
  7. }" Z0 q( v+ f) `: g/ W
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
' S3 D- y8 k+ o4 g/ B# v- O* k/ Z' F0 c( RОбновленный класс для агрессивного состояния монстра:' F. [$ O. M' E- R* F1 p
4 D  O7 A& m: e. {8 t3 x9 x
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
      z* q' M6 x4 h$ h
  2. package org.l2jmobius.gameserver.model.actor.state;
    / @! `" W# K( G

  3. 5 j8 Z( p/ w3 v! w$ y0 w+ {0 t& U
  4. import org.l2jmobius.gameserver.model.actor.Monster;, g( M  i- p, w( }! r& X2 L
  5. import org.l2jmobius.gameserver.model.actor.AttackType;% d. g* U8 i, V: @  R$ h1 t" d

  6. 6 S  ^& D3 x* [0 G/ {
  7. import java.util.Random;
    0 B8 j$ Z8 e& p1 `0 ~

  8. : x9 b0 o% j  |8 k
  9. public class AggressiveState implements MonsterState {
    5 K  Q0 @* x1 Y5 F* w& U
  10.     private Random random = new Random();9 z5 n# G. ]+ @" U  T' {# t2 n

  11. ! ?5 M6 W) g" _5 m5 r
  12.     @Override
    # T1 A( o* c' D2 z
  13.     public void handleState(Monster monster) {! F6 Q9 j0 f0 a3 q0 r' k: {
  14.         // Выбираем случайный тип атаки: физическая или магическая
    ; q& C" [1 v  s8 n" T. K
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;: G( X5 d! \; I* E- Q8 i6 y

  16. 6 \, p2 U: C4 d5 Y; h$ r% F  l
  17.         // Логика для агрессивной фазы боя
    7 N1 e9 H& a2 Z7 o; {
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    7 Q  t. W, q* }1 |- \4 s9 x
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");2 }8 w) d, t9 g
  20.         
    / Q: ^$ `7 ^1 N4 z% \
  21.         // Увеличиваем силу атаки в зависимости от типа атаки
    0 {( s/ G9 P, ?- K
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;* p) A; M* \' M5 h8 `" u  Q
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);
    7 b6 z6 b+ u* ~- W% |& G1 X6 n
  24.     }% |3 E. s+ I1 b$ S! d
  25. }
    2 s) k* f+ T3 X, K2 s
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки! a/ W9 {2 e4 d2 E3 N" _
0 N6 D0 N& B4 I* R1 r9 z5 }
  1. // Пакет org.l2jmobius.gameserver.model.actor: j1 k) u7 I5 @7 w
  2. package org.l2jmobius.gameserver.model.actor;
    3 j6 Z$ f, g" A: t5 n1 {
  3. 1 E# _- w# |0 x' M
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;- j3 w9 p# |7 b& b& a0 ~
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    ! y# ], |6 |# V1 }' d- F

  6. , N; l  l0 Y. s* u) t
  7. public class Monster extends Creature {
    ! Z7 [, n6 J9 F0 M- }# D& V
  8.     private String name;8 \5 {! ]* \6 W9 Q
  9.     private double attackPower;7 B% S  X7 ^0 T4 w% N7 ^% J: ^
  10.     private MonsterState state; // Текущее состояние монстра
    ! K. J6 ~( L6 l
  11. & _/ W% a/ \2 z/ _8 ^( \; V
  12.     // Конструктор монстра5 M0 U7 ^1 H1 E& O4 J
  13.     public Monster(String name, double attackPower) {9 {, i2 J# _3 `, H' u
  14.         this.name = name;6 E" `! G8 ]/ R. z" a
  15.         this.attackPower = attackPower;
    6 u% _/ p# d( v* M) R) D( k; [
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    ( E1 ~* z" b" r. p0 v! u  s
  17.     }/ v- ?, C; O7 i+ }' u$ C/ o) J
  18. : g2 i6 I5 v/ m, S/ Y, s
  19.     // Метод для смены состояния% H: V* U; A" q" v- v
  20.     public void setState(MonsterState newState) {* }2 I5 e5 z; d, U6 G3 c5 d8 I
  21.         this.state = newState;) F8 F5 C0 {" Z8 m9 e
  22.     }
    9 `. q9 W5 B4 |% r0 R- c
  23. ; }3 \4 s* J7 D1 \( s; [7 d
  24.     // Выполнение действий на основе текущего состояния
    * j  |5 S' P9 y8 V
  25.     public void executeState() {: y- V0 R/ j& q3 [# G! ?
  26.         state.handleState(this);
    # v0 @: J% o& D
  27.     }
    * Q+ M0 Q; ^; Q- A, e7 Y4 k

  28. 8 N* g" I% M! o& z
  29.     // Геттеры и сеттеры
    4 C4 T0 w/ S$ D" |. A/ m- h
  30.     public String getName() {
    + m# T- _; z4 W/ v5 k4 {1 }
  31.         return name;
    * b( v! j+ ~2 O$ W4 ]
  32.     }
    / B' V  S1 b" i( J
  33. 2 U! l. ~& q- q9 A" I4 t, F
  34.     public double getAttackPower() {
    6 f. z( H/ I2 x" H1 ?" z
  35.         return attackPower;
    % q  K- u5 y* [5 h
  36.     }$ G( `3 a; w5 p- m1 {" l

  37. , w, T; h7 z, N
  38.     public void setAttackPower(double attackPower) {
    + t& Y1 C! w. W! U, \- \* `% H' H+ P
  39.         this.attackPower = attackPower;
    ) a+ z# W- F( ~
  40.     }
    - u3 p" Z# @; k  E$ g
  41. }7 r8 Q  ^; \! t' S/ x
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.
( q1 W/ d2 G7 J+ K8 f( `4 H" K8 J6 R1 e3 n" ~& S& [
  1. // Пакет org.l2jmobius.gameserver.model.battle
    / I) Y! w; v0 h8 S7 |" R. y' |
  2. package org.l2jmobius.gameserver.model.battle;
    " A9 `: v. V6 O% F
  3. 4 `3 \4 f+ G4 h! s$ y9 }' C
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    2 N$ f. m7 O: ]0 k; O/ f
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    . i! @4 ?. ~( m" {3 C8 j

  6. # L$ e3 ]( i$ o7 ~0 N  B
  7. public class BattleSimulation {
    9 P8 M6 Y! r* S  x! N0 l
  8.     public static void main(String[] args) {0 x9 v9 S, w/ h5 y
  9.         // Создаем монстра
    ; n) r& i4 W& s6 ]& q
  10.         Monster monster = new Monster("Дракон", 100);- J7 E) `% U2 G2 r
  11. ' \5 V- h# V7 G& B
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак
    8 r; u9 U! U, ]+ p0 ~9 M$ l
  13.         monster.setState(new AggressiveState());" _$ U1 z- v) l
  14.         monster.executeState();0 t: h4 }9 {* p4 [4 I* d9 }; r0 ^) }7 E
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак4 O/ c2 n3 ~. V% u4 ^: c9 X
  16.     }
    5 K! J/ q. b% T% x+ a7 ~' ^1 m2 i
  17. }  f+ w9 _' q$ E
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
) k6 u- K' |! ]/ a+ R' hЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!9 }; p6 ~: P, [( c% X& @* y

4 O5 F" q# l9 X4 a1 `0 h7 n& f! O
1 p! b# A7 A7 y* I
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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