Top.Mail.Ru

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

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

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

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

x
Добро пожаловать в обсуждение статьи "Шаг 3.3: Взаимодействие игровых объектов"!% T- \3 b* A  T/ F& k$ u

# Y9 `: y7 t; b
( {: G0 B/ C% F* K5 Y
Здесь вы можете задавать любые вопросы, связанные с реализацией взаимодействий между игровыми объектами, такими как игроки, NPC и монстры, в серверной разработке Lineage 2 на Java. Обсудим, как создать динамическое взаимодействие в игровом мире, как правильно использовать события и триггеры, и как улучшить боевые и диалоговые системы., M* c0 \+ p) l9 o
Задавайте вопросы, делитесь опытом, предложениями и идеями — ваше участие поможет углубить наши знания и сделать разработку серверов еще более интересной!0 F1 p3 r. K2 C% a& u5 [" W
Астралия ?2 L8 H* g# L1 p

' |3 D5 L5 K- |7 {" x! `2 T& I- a/ j" R

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

AlexCoder Опубликовано 2024-10-16 18:31:29 | Показать все сообщения
День добрый!' L) x# Y3 F8 m7 p
В статье описано взаимодействие игрока с NPC и монстрами через простые методы. Как лучше всего реализовать более сложные взаимодействия, например, если нужно добавить несколько фаз боя с разными состояниями монстра? Есть ли оптимальный способ управления состояниями объектов, чтобы не перегружать логику боевых сценариев?8 O. U/ T) N1 h8 q: I% h

% `4 d: O& a% [1 C
AlexCoder Опубликовано 2024-10-16 20:53:49 | Показать все сообщения
Последний раз это сообщение было отредактировано AlexCoder в 2024-10-16 20:54 $ r6 H; m0 ^: q0 ]" J; u
AlexCoder опубликовал в 2024-10-16 18:313 [' H3 p+ V7 Z
День добрый!* w5 H. ?6 {, ?# \. C4 Y3 s- c
В статье описано взаимодействие игрока с N ...

" G+ @7 f! \* W9 P+ c4 ]  F( e" DДля управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
% b/ ]- K$ d3 B0 g8 [
" |" a( @: D4 S2 \- HЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.: u( s3 S; C+ S. l

$ ^% Q% `- w9 ^( {" G* h% B& K- c' |Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., I8 W, v+ Q% t7 C0 k
5 Y3 [. N2 Q% c
  1. <font color="Green">// Пакет для состояний монстра</font>
    $ a) y2 C& Z" ]1 z) g- U- R
  2. package org.l2jmobius.gameserver.model.actor.state;3 j* Y5 x5 w3 H8 ]) F- u
  3. <font color="Green">$ Y$ Y8 Q6 n( f: T1 |: Q  n9 C
  4. // Интерфейс, представляющий состояния монстра</font>
    + r; I# Q7 |. `
  5. public interface MonsterState {
    ; l$ s$ P2 ^6 T+ W: `! F5 F2 A
  6.     void handleState(Monster monster);
    - G2 A( j0 F3 g
  7. }- @% C4 {5 j& {- V* e- \8 ^
Скопировать код

( ]7 o4 D0 l9 Y) V" L+ hШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
& ^! m( f1 a1 |8 b! l1 `% a/ B& ^5 M
Класс для начального состояния монстра:$ y" Q& f  P! G/ b/ G# A
  1. <font color="Green">// Пакет org.l2jmobius.gameserver.model.actor.state</font>
    # L$ I' r7 ]6 l" e% u
  2. package org.l2jmobius.gameserver.model.actor.state;# n0 \+ k- N( @3 D: Q
  3. / t) r- A/ m( Y' Y3 D( G) k
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    ; H. t. _: S& I, y
  5. 8 w/ O8 m0 Y! O) m$ I2 V
  6. public class InitialState implements MonsterState {
    / V- Z( R$ x5 c& I: a* Q$ C  X
  7.     @Override
    6 @4 Q1 B5 `9 A+ w' H7 Y) z
  8.     public void handleState(Monster monster) {, \( l7 N( ^8 o9 W
  9.         // Начальная фаза боя
    1 `2 i" m6 L2 ^% S# A5 z7 c
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");
    ; x$ m+ X  W* n
  11.     }
    / ]5 y: N6 b) Y) b7 \/ r& M) @2 t
  12. }$ s) s5 M' G) P( t9 T
Скопировать код

8 V  s4 }+ i  }, T4 _' c$ j* a& n, u6 X! F9 H
( P0 n, @. J: y' J  I! @* R  ~2 P
2 o* p+ Z2 ]8 l5 Y2 L& I
: f& S6 ~. M1 S: c2 W

4 o- }$ v  w, F2 O# M) Z' l9 R) T, Y7 D
 Автор| Astraliya Опубликовано 2024-10-16 21:04:54 | Показать все сообщения
Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
6 m. Q( A8 V# }# e; L- A, B0 a! r0 d$ m$ a  f7 o
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 U- E& x% j- f9 h; C* M
9 {- k0 r/ C# p: J( v
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.! I8 ^8 ?0 C& E* G; [* w( k
7 ]! Z0 Y0 O1 Z
  1. // Пакет для состояний монстра& p: q, R0 ~- A( m& t
  2. package org.l2jmobius.gameserver.model.actor.state;
    % G; E# o' ?  e
  3. ' J  [& u  T* v( C) D6 A  r: B* g9 }# J
  4. // Интерфейс, представляющий состояния монстра
    3 t7 d+ g6 g; m
  5. public interface MonsterState {
    : v7 I( v, [6 P5 H  }7 F$ C
  6.     void handleState(Monster monster);8 I$ b- v8 I: S% \; w0 x: a0 |
  7. }7 z- U& o7 ~' I, o0 W- I
Скопировать код
6 Z5 M9 x, S- u; L+ b
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
3 x' W4 z5 w! r* r2 O
. p( e/ Q$ ~: c6 Z+ Y! `7 i9 OЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
0 F7 R, o7 O- P, S
/ D/ y4 w2 R0 F& WКласс для начального состояния монстра:
: i" U( n# W) r8 e, l
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ( \; @8 z3 n# M  H; b- d
  2. package org.l2jmobius.gameserver.model.actor.state;3 I/ }8 ?; ~- W

  3. 6 U, v, t9 y1 f. Q( V, L
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    + a2 i! W( j' K
  5. 0 [; g+ j' r3 Z" B& X
  6. public class InitialState implements MonsterState {
    ' L7 b1 h( A3 z; Q7 [! X* L
  7.     @Override
    ( {  M- l+ Z: Y+ p. H
  8.     public void handleState(Monster monster) {- `( Y6 n4 I" E3 W/ H
  9.         // Начальная фаза боя
    ; t: Z2 |+ [2 {" g# c  m
  10.         System.out.println(monster.getName() + " начинает бой с обычной атакой.");( }" W( g5 V' l- N
  11.     }
    * ]! s) U7 h- m  f! r& Z
  12. }
    8 o  _" e3 Y) D9 ~$ p
Скопировать код
Класс для агрессивного состояния монстра:
: x/ |/ H; ]7 ?) H& A
  1. // Пакет org.l2jmobius.gameserver.model.actor.state$ i0 ^$ V8 T! Z9 F& T# n
  2. package org.l2jmobius.gameserver.model.actor.state;
    ( l+ O& G* k7 |. Q
  3. 3 w2 \$ C) Z& I
  4. import org.l2jmobius.gameserver.model.actor.Monster;6 G+ [( r: F# l% q
  5. 8 D6 o* u* [. `5 B) M" `# ]# r
  6. public class AggressiveState implements MonsterState {
    : C3 J/ c0 V0 |6 j
  7.     @Override
    # F7 @& w  Y0 x4 |
  8.     public void handleState(Monster monster) {5 c8 Y3 ?4 L& c9 o+ O- B- V
  9.         // Агрессивная фаза боя
    # F; i# E  T8 {# j0 [& e
  10.         System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 T4 E  M- E! l1 k! O% t
  11.         monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки' F4 p: ~$ p& O% S- W9 @. ?
  12.     }
    3 q$ k; h' |) T2 O% f3 q
  13. }
    2 K( W/ P0 }$ m- S  U. S- L
Скопировать код
Класс для финального состояния монстра:) V+ J3 j! W6 V/ @* t
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    # D" Y0 h6 \% w) l1 i) ~' Y" i* m! }9 H
  2. package org.l2jmobius.gameserver.model.actor.state;
    , _6 [# E* C8 ]0 B2 j2 G  q
  3. + j  {0 u. D6 g) X* V% g- w
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 S. @6 l8 `! i5 @

  5. 7 t. D" s! b* D- q% Z7 k/ L0 P
  6. public class FinalState implements MonsterState {
    # s' g. C" ]3 }: Z3 A2 \! d8 m
  7.     @Override0 Q" x" Y8 m  u4 z% D1 {7 U5 E
  8.     public void handleState(Monster monster) {0 R; _! q. _6 Z6 @" o' [
  9.         // Финальная фаза боя
    8 T- X: X9 n# l0 `% B
  10.         System.out.println(monster.getName() + " готовится к финальной атаке!");9 L1 e: {2 e* G+ X
  11.         monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
    # W" p1 d( x3 x: L$ y9 [
  12.     }$ W+ ]4 r6 ~7 d& n
  13. }
    0 y6 f4 w' [* D+ R
Скопировать код

2 |. j: A& N, u6 {8 PШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.8 Y# _$ _/ R) @4 F6 d4 o
  1. // Пакет org.l2jmobius.gameserver.model.actor
    4 \; E2 R  M: ^- p! U" [- S1 ^
  2. package org.l2jmobius.gameserver.model.actor;2 N$ h1 V( d$ x$ r- D
  3. ! g2 l) k6 {. {( }
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    ; h7 C" u0 d1 ?" ?1 \
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;
    . l: O7 k+ T. S

  6. * f$ Z7 v0 j6 \
  7. public class Monster extends Creature {
    7 C' h" c7 S: Z# v$ W2 h5 v7 k" @
  8.     private String name;! {* }$ _$ Z  Z% W4 T* R  [3 V# L
  9.     private double attackPower;
    - B8 H  @- \; z: Y2 l
  10.     private MonsterState state; // Текущее состояние монстра9 ]/ _) R" ^9 {: o, T$ i# h
  11. " y4 y+ Y& P5 Y* o
  12.     // Конструктор монстра
    7 u) h& Z/ P' d# N  K
  13.     public Monster(String name, double attackPower) {
    . G% Z/ s5 |* w* ]7 a$ R4 b
  14.         this.name = name;" U. t+ R- }5 l% w7 L9 E; `
  15.         this.attackPower = attackPower;6 L; A' |+ ]: [: z" `; r
  16.         this.state = new InitialState(); // Устанавливаем начальное состояние
    % t" }3 P) d; Z
  17.     }/ A, Q! f: k, r" O
  18. 8 _! ?" }4 j! w1 b5 Q# m" B
  19.     // Метод для смены состояния/ i+ Y1 w$ U/ `0 A
  20.     public void setState(MonsterState newState) {
    . ~% I. u6 @, R0 |7 K8 n/ B) u
  21.         this.state = newState;
    ; t: ?' n5 l9 J" \& ~
  22.     }
    3 K9 \7 v) u* r! X  ?5 s+ {7 E) y; \
  23. 1 ^$ \% q& }: ?0 _1 p$ z, G
  24.     // Выполнение действий на основе текущего состояния
    , @/ J0 V7 Y( D5 G; a4 t& T
  25.     public void executeState() {" x6 |: X3 U' `; O' g; }
  26.         state.handleState(this);
    7 g8 m$ _+ _: {* _7 k9 {2 i- l' t
  27.     }! M$ r) ^# t9 _) F

  28. ' w' Z8 Q$ D2 [7 W! w  p
  29.     // Геттеры и сеттеры
    2 s; b7 j" n5 I! `( D
  30.     public String getName() {
    + Q1 I! _; [# u/ h
  31.         return name;
    4 a/ |& Y8 R6 F0 G+ a- s
  32.     }. U$ W7 _) S- G4 T1 D3 d( w0 m

  33. 0 O0 t8 w0 C( P
  34.     public double getAttackPower() {
    2 ~' H) l# E* d
  35.         return attackPower;
    0 I  c5 ?9 j! h4 V+ D8 I
  36.     }
    ( O; I4 N6 z8 Y

  37. ) P7 W1 N8 [0 m& q' b' P! X+ C' R6 F# m
  38.     public void setAttackPower(double attackPower) {" C$ _; I" }9 j' A
  39.         this.attackPower = attackPower;
    : B1 x6 y1 Q1 F1 P, O
  40.     }
    " d# m( k" y3 v! Z( N' E- \
  41. }" H2 [) x& B3 q+ Y! K
Скопировать код

( S( _% I5 G7 @2 B7 K8 ^" G5 cШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра./ Y* I' u& k, S6 e; g  J% h$ k

/ f% A! h# |) l( E, A" Q' c; u% g4 P
  1. // Пакет org.l2jmobius.gameserver.model.battle
    8 @8 |8 |6 K4 H$ S% x/ B
  2. package org.l2jmobius.gameserver.model.battle;
    / K: J. {% R' `! v

  3. 9 a' @* E$ J6 R- c
  4. import org.l2jmobius.gameserver.model.actor.Monster;' c5 `9 J3 n/ I+ ?  W/ L0 V' ~4 Y
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    1 C# ~( }3 l5 K, z: j
  6. import org.l2jmobius.gameserver.model.actor.state.FinalState;
    ' t1 i3 F* j) Q8 J( i6 o
  7. % L# Z9 \0 U$ M2 f7 s; Q
  8. public class BattleSimulation {
    & H8 k( Q  J) ?6 W
  9.     public static void main(String[] args) {4 R/ U/ i  u2 C7 u
  10.         // Создаем монстра с начальной атакой3 z9 @' x6 r; Z6 h. X
  11.         Monster monster = new Monster("Дракон", 100);
    1 j( Z- X$ j! H( P* h% E. n/ `$ S7 H

  12. : R! _  t  b! C/ [) A6 \: n
  13.         // Начальная фаза
    % i3 r, @! z" F8 {' x! J
  14.         monster.executeState();
    ' V% }: G& T% I6 [% m# K/ z* j
  15. , }( v5 f% ?0 v  ]
  16.         // Переход в агрессивную фазу
    ( C) A1 U+ v5 l0 R4 k
  17.         monster.setState(new AggressiveState());
    7 g1 }" R7 |! e( [
  18.         monster.executeState();4 x, T4 D7 W* |  ~' ~

  19. 9 F/ c- Q# g4 d
  20.         // Финальная фаза$ h& S5 H4 f. A4 p
  21.         monster.setState(new FinalState());
    9 J- L& H. |# ~2 m' Q
  22.         monster.executeState();5 _- j  \) c4 F% l  f0 J. y
  23.     }
    + }" ]! \2 d( o3 W8 J/ L
  24. }# B9 _1 o) g2 q
Скопировать код

4 {& \5 y/ S9 H6 q; G9 qКомментарии по структуре пакетов и классов:
4 c% ^/ I/ {' s  b
  • Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
  • Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
  • Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: ~0 L# h, B( U. F7 e2 x8 k' P& G
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код., |( Q$ Z) @4 ~- T: |: G
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( ~) g0 ]; a6 z% [

& O8 S- c0 H" u; b1 L
5 D5 E' N( z8 {; A  L/ D
- Q  t7 U4 m- T: _
- H% `+ ], q. G. j7 {7 O4 K* {/ Q0 T$ q; J$ }' K3 j- x- U+ n

; @: F" ~  ^# |5 n" I) \9 D3 b5 q% H' ~  D7 ^' x6 C

% ~9 i+ H. j4 S1 ?1 q2 |$ `+ B+ d! x" ~

, B) e" o: \# @4 U- F& m( |( h8 ]3 O4 j& E- V

5 B3 f* d! @0 ?1 i8 N7 E, d; G+ w
3 i) `% N+ W/ ]$ {. x$ I* }4 g3 D, `3 H; y5 N8 `
AlexCoder Опубликовано 2024-10-16 21:21:15 | Показать все сообщения
Astraliya опубликовал в 2024-10-16 21:04
( z: F9 G8 G8 k. B$ JДля управления сложными взаимодействиями, такими как  ...

. Z0 P) r, d% X* NОтличный подход! Использование шаблона "Состояние" действительно помогает сделать код более чистым и управляемым. Я задумался: если мы добавим несколько фаз в бою с различными типами атак (например, магические и физические атаки), можно ли расширить этот паттерн, чтобы каждая фаза также учитывала тип атаки? Например, чтобы в агрессивной фазе монстр мог случайным образом чередовать типы атак. Как лучше организовать это в рамках данного паттерна?
 Автор| Astraliya Опубликовано 2024-10-16 21:33:48 | Показать все сообщения
AlexCoder опубликовал в 2024-10-16 21:21
6 A+ {  M- w2 r  ?' N1 JОтличный подход! Использование шаблона "Состояние" де ...

1 I- {0 {8 c: H( i2 U; v6 RХороший вопрос! Да, шаблон "Состояние" можно легко расширить, чтобы учесть различные типы атак. В этом случае можно добавить логику для чередования атак (магических и физических) в каждом состоянии.. e9 p7 |; P0 a6 I, i# b; ?( N

3 d& j7 K( L" }( z( WШаг 1: Добавление типа атакиДля этого давайте создадим перечисление (enum) для типов атак и добавим его в наши состояния. Это позволит монстру случайным образом выбирать тип атаки во время боя.
" m( I% P& N' p- R) g, F
" _* r6 U+ F! z1 @* f* L$ w' m
  1. // Пакет org.l2jmobius.gameserver.model.actor
    . R% C4 @/ t) f
  2. package org.l2jmobius.gameserver.model.actor;& `, k1 N2 L( ]/ B- o. G
  3. % u  r4 w* n! o$ ^( l" H( _9 C
  4. // Перечисление для типов атак
      t: h" ?% C" ^* g
  5. public enum AttackType {5 w& _' `. b+ J
  6.     PHYSICAL, MAGICAL;
    $ T# A- b! m" Y  O8 H3 p% v; {( H
  7. }
    : X% F/ _8 L+ G
Скопировать код
Шаг 2: Обновление состояний для поддержки разных атакТеперь обновим состояния монстра, чтобы в каждом из них можно было чередовать типы атак.
3 j1 z% r3 E' `# e6 tОбновленный класс для агрессивного состояния монстра:% C2 M. v/ N/ i0 f3 b$ T3 b
2 I2 i$ `, d3 D
  1. // Пакет org.l2jmobius.gameserver.model.actor.state
    ; L2 F2 l+ L$ ?3 X! Z! X8 p/ o9 \
  2. package org.l2jmobius.gameserver.model.actor.state;. G! K" f. \/ {4 B
  3. & H+ |3 s% L% a4 m8 w) L: Z
  4. import org.l2jmobius.gameserver.model.actor.Monster;, h  r5 |( ^' M! R# D, t& J7 J
  5. import org.l2jmobius.gameserver.model.actor.AttackType;
    2 N% h4 ~$ v* x5 ]8 {
  6. ! o+ G  `( r' a; j3 l  h
  7. import java.util.Random;5 z6 s$ |6 B: D; R+ d* s( v6 g

  8. $ `" D! |( l) k& Z
  9. public class AggressiveState implements MonsterState {: X: ?+ O; P) x  u: ?: r: }) h
  10.     private Random random = new Random();. o7 }1 {4 |2 C8 ~7 z/ A+ g

  11. 8 @/ Z& i8 `. t' R, A
  12.     @Override
    / j! G  E9 R: ~% E
  13.     public void handleState(Monster monster) {
    " w) E# y+ i3 m5 B
  14.         // Выбираем случайный тип атаки: физическая или магическая
    $ n; d. u6 A2 T3 P$ i2 g; H8 x
  15.         AttackType attackType = random.nextBoolean() ? AttackType.PHYSICAL : AttackType.MAGICAL;4 ~% U' A; j( ^3 D+ l" g7 d
  16. 9 M) ~. [8 n2 t" Q& n1 @
  17.         // Логика для агрессивной фазы боя
    # B3 y; m4 k& |0 w* g
  18.         System.out.println(monster.getName() + " становится агрессивным и использует "
    $ o* D: h! w% p7 c" J- y
  19.             + (attackType == AttackType.PHYSICAL ? "физическую" : "магическую") + " атаку!");7 @8 a" B" A3 r) j# w
  20.         9 V7 N3 p* W6 R* ]" K
  21.         // Увеличиваем силу атаки в зависимости от типа атаки& \& ]) X* \* G7 y
  22.         double multiplier = (attackType == AttackType.PHYSICAL) ? 1.5 : 1.2;
      b% z, [! G; w
  23.         monster.setAttackPower(monster.getAttackPower() * multiplier);0 Q0 M# k, d! R
  24.     }
    ! c' T! F% }3 w, v. E2 Z
  25. }
    , w1 X. a! i5 Q; t
Скопировать код
Шаг 3: Модификация класса MonsterТеперь класс Monster будет использовать состояние с логикой выбора типа атаки
8 i  N. ]2 x' J/ T- {2 t5 ^- W( i" f. e6 d. K6 e
  1. // Пакет org.l2jmobius.gameserver.model.actor% L6 A- |- r3 }
  2. package org.l2jmobius.gameserver.model.actor;5 n4 F5 E5 \/ D" a3 W
  3. 3 r  ]( z: s: |, D; X) T) K4 w6 U
  4. import org.l2jmobius.gameserver.model.actor.state.MonsterState;
    * W/ H% F8 l  [6 g: {3 k2 i) y- B
  5. import org.l2jmobius.gameserver.model.actor.state.InitialState;  G9 J* V' s3 O' ^8 J
  6. : V+ M8 K+ d  M+ c
  7. public class Monster extends Creature {( a" H# u. F2 p/ ~
  8.     private String name;6 v) o3 i3 t1 k" p
  9.     private double attackPower;. t; v, `* S8 w: S2 Q3 Y
  10.     private MonsterState state; // Текущее состояние монстра
    ; q* n7 i3 \$ }
  11. 8 b9 d# x* s; C' b# p# D4 n
  12.     // Конструктор монстра
    + N& [* B: x9 w" l
  13.     public Monster(String name, double attackPower) {
    8 x' y% H" w- Q. P
  14.         this.name = name;2 f- A7 d8 C3 M# q( B3 O! U
  15.         this.attackPower = attackPower;
    - U+ W7 S) `* g3 t7 ?1 j9 Z. J
  16.         this.state = new InitialState(); // Начальное состояние по умолчанию
    $ F! C, x9 W- k( S: }6 S+ V
  17.     }% h: ]2 d* m: X. Z+ J/ Y6 \
  18. # d/ I' C- I% a3 R! Q; g
  19.     // Метод для смены состояния
    , z7 t" F/ W/ R) \2 c7 R+ \
  20.     public void setState(MonsterState newState) {% \1 J0 J$ @* _8 x4 b4 e
  21.         this.state = newState;) S& I9 g/ C$ C( x! _+ ?: X( P
  22.     }
    . I- N+ ~) F& R0 ^& ]
  23. " E$ A' L; o2 |2 {) u
  24.     // Выполнение действий на основе текущего состояния
    ) \, q) x' q  @
  25.     public void executeState() {' b6 c" t7 c+ x2 c( z. B
  26.         state.handleState(this);
    ' ~% j4 |( z9 W4 U2 \
  27.     }/ f; N" x: d7 p( a
  28. 4 I9 a7 c7 s; q' m
  29.     // Геттеры и сеттеры
      |" y% `: |% S
  30.     public String getName() {4 c' I$ l" m1 A" ], p
  31.         return name;
    7 L; s2 q6 \% k# y; g; g7 P2 V
  32.     }
    * I( q6 }5 G5 ]! n4 n
  33. 2 U! k# s/ k! I8 u. H8 K; W' D
  34.     public double getAttackPower() {
    . i* X1 k+ d; ~) l8 C
  35.         return attackPower;- b! Z% u: A1 I: N; i
  36.     }
    # ?4 _9 J8 }) Y) e7 [, M

  37. 7 o# r' u+ F# R' D, a8 a6 G
  38.     public void setAttackPower(double attackPower) {
    9 F  h( m" O8 M- B1 @( A0 X
  39.         this.attackPower = attackPower;0 [$ ]3 e8 D; w& O2 b9 E, R8 J3 M
  40.     }* s7 N& ]* [& b# q% x* Y. s
  41. }) S  a1 `3 j4 A1 v/ G
Скопировать код
Шаг 4: Тестирование нового поведенияТеперь давайте посмотрим, как монстр будет чередовать типы атак в агрессивной фазе.) T2 M; H! A1 f7 t+ @+ V
5 D6 d8 A2 Y7 \- T6 G5 F! E2 N6 \/ T
  1. // Пакет org.l2jmobius.gameserver.model.battle0 q2 d# _  }5 d" w$ Y; W7 U8 G
  2. package org.l2jmobius.gameserver.model.battle;: Q5 E* F3 \4 f; [% T, @. J- A
  3. # R$ m6 E' Y& ]1 ?6 U' e. I4 M
  4. import org.l2jmobius.gameserver.model.actor.Monster;
    5 s9 r1 }3 ~. o# N& m; b
  5. import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
    ; m/ U/ `. Y3 s4 q, h

  6. 1 {$ P  q2 z8 D7 m+ C, i, w; K! d
  7. public class BattleSimulation {
    5 y' d" f* V" F
  8.     public static void main(String[] args) {; @5 Y% Z2 P; d( P9 `5 ?! k& P2 _- ^
  9.         // Создаем монстра1 p( N' P  u! _6 Z+ T; |9 H
  10.         Monster monster = new Monster("Дракон", 100);, R% c4 K) x) U3 y0 J# e% w! S
  11. : L( T3 u4 G$ F2 l6 n3 `' u
  12.         // Переключаем монстра в агрессивное состояние с разными типами атак$ p% K5 y3 F, }8 I$ b: I4 {6 l7 @8 [
  13.         monster.setState(new AggressiveState());
    ' A7 o+ C$ Q; `
  14.         monster.executeState();& m4 t" ?+ [  D7 ?% i; v  J+ _; O
  15.         monster.executeState(); // Повторяем, чтобы увидеть чередование атак
    & m" f8 w5 X; l4 h6 `
  16.     }6 G) F) S9 B' u$ R  p# U8 {
  17. }7 q5 H# Y7 H! p4 S% M! R7 H- T; R
Скопировать код
ЗаключениеВ результате, с помощью перечисления AttackType, мы можем легко добавлять и чередовать типы атак в зависимости от состояния. Это гибкий способ управления сложными взаимодействиями в бою, не перегружая основной код. Выбор типа атаки можно ещё больше расширить, добавив, например, урон или специальные способности, в зависимости от типа атаки.
! I2 Z' T8 j. T: Y, \0 a! pЕсли у тебя есть еще идеи или предложения по улучшению, всегда рад обсудить!8 U$ M/ B6 @. o/ a# @6 E" P
0 \, v- c/ s9 O! i/ H
1 Y2 }. c! Z' g0 b7 ^

, ^: o. S0 }2 v
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

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

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

подписок0

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

постов9

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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