artace.ru - творческий сектор

Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius [Версия для печати]

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 8 C  k% A6 v6 V6 A% _$ d6 ^

* L/ N: Q* v6 k- T
5 b" S% x$ l5 p2 y1 ^. ?- aШаг 1: Введение в классы и методы на примере L2j_Mobius! Z3 N( A/ p, m! Y+ Y3 E! Y. o8 n3 q
С статьёй можно ознакомится в разделе Обучение > Читать
  u; o! t; [: o! w) E' j* t2 b8 n8 |. U/ b; y: G5 x! B3 f
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
: Z, k2 _4 P  d. w8 C4 C
. w$ K6 c7 E6 ]4 W  k! z2 _Обсуждаем:# i% D6 c/ V: [
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!
- {" Q$ k2 }! Z" ?- ]) l. ~3 O! z9 d* S) D& k5 M# D0 m' b

  P2 |  I) I( _4 x  b
И помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!5 H0 l4 w% u6 j
* p2 I  Z9 |' p6 _! J

4 Y8 R: [' s* z( H! |& M
' f1 ?* Q8 b$ [$ F. M# m$ n
, ]8 ]4 p" }4 t6 {  `2 k4 H2 w: e' T# S  H5 e  s6 M0 b7 j

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
! Z* V1 A, X  Z8 V# x0 c- y: O: J
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17. E! l- o, a$ ~
Почему мы используем ключевое слово this для ссылки на п ...
' P  y4 e; ^! b% P
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.! z$ @% I+ X* b* D
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.. M5 Q1 F, t7 N
! H  E, M4 G: S& q  U* `
Вот пример:3 U, _6 a& U( j/ @. A
  1. public class Player {6 d$ m$ {+ i6 a. Y
  2.     private String name;! {: V, p4 n8 K" ~0 \
  3. % m# {" g1 |0 s: D3 |& k
  4.     // Конструктор
      a# J5 _+ e! F: G% Y
  5.     public Player(String name) {. i/ ]" z* w, @5 h7 ~; c
  6.         this.name = name; // Используем this для указания на поле класса# s$ U& b* z: p6 X0 c3 W, F; U7 S* ]
  7.     }
    ; a! p5 N1 p+ J4 O3 e( {

  8. * R5 s. _* \0 ~9 b0 j" D( w
  9.     // Геттер для имени1 a) P2 Y- `! z& O  ?
  10.     public String getName() {8 x( O8 ]/ \( ]3 E4 R3 K
  11.         return this.name; // Используем this для обращения к полю класса, `# y& d/ O9 X2 d; O) u+ h
  12.     }3 G; m  K; t( P
  13. }
    2 I0 H2 y/ h3 y6 P. ?# |
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.# N0 u) K0 {! G$ K0 \2 L3 n

. Z% _8 x4 H  T/ C; I/ xКогда необходимо использовать this:
* d% m, \) `# V/ c$ jПример передачи this:
7 A, o* {' o2 C# n+ F4 Z
  1. public class Game {
    # A# ?* G# v5 w: M7 K: ?
  2.     public void start(Player player) {
    $ v6 ^5 R7 S! T+ I+ `0 s$ w: Y
  3.         System.out.println("Игра началась с игроком: " + player.getName());
    6 l- ]+ t' Q+ R! j8 z
  4.     }+ q) i9 [# e8 q7 @$ K. S% S! J, ]+ H
  5. }9 p! p- Z  @- r( M! F; ~

  6. ( W, s. P; V- T  u+ X5 {
  7. public class Player {
    " G0 X8 d7 a5 h4 T
  8.     private String name;3 u9 e4 Z/ K3 Y- p1 R3 Y" e
  9. " p% _8 l9 m) H) |7 b
  10.     public Player(String name) {
    : A% n+ C# m/ b2 F; e6 Q! V
  11.         this.name = name;5 c4 G  j9 \' V0 n& n# s
  12.     }& k5 C/ S2 ^" s) p$ @

  13. 1 n$ z2 x0 e  E4 N, P
  14.     public void joinGame(Game game) {
    # h. m5 w) Z% @
  15.         game.start(this); // Передаем текущий объект Player) p8 G2 ]0 N. P% p$ m! z
  16.     }
    % f  @4 ^4 T; ?/ l6 y$ j6 E
  17. }
    " [. N" W' b$ X0 @( n
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.
. `) v, D$ k; L5 ]6 \. g

; q7 {0 V" k. d( W. Q6 _Помните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
) P/ e- n3 Q1 t, j. p' o, o5 o# ~% E0 e6 w8 H

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день! $ Y! \/ t9 L' y' S1 N5 k( d) J1 j
Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 ; p) P- V6 S4 z5 w6 m
Mike123 опубликовал в 2024-10-17 20:05
3 R7 q8 y4 v8 J* _: b$ z2 \Добрый день! . g% d2 ?0 N9 I3 e2 Z" A; t
Как создаются и вызываются методы в Java? Мо ...

. t/ l6 Y+ D, r" ^Привет, Mike 123! ?, a5 q5 o5 h* V) M% ^8 w1 p6 G
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.& @, V" ~2 b, O( P

! j: \0 C2 t! J, @# V, sДля лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.4 @+ \3 ]- c, `. f" y0 Y0 l6 t

: D, {+ _# G( c, A/ i9 j0 U2 x/ l. l% [9 Z( l' h2 w
Как создаются методы в Java?2 ^: W$ P3 ]" f2 O2 \/ `

8 E. Q4 }+ P3 ^' BМетоды в Java создаются внутри классов. Вот базовый шаблон метода:- E% X& S4 x( n; |4 t9 P2 w0 x
4 C- [0 K! w) Q' M
  1. public returnType methodName(parameters) {  M* w8 K2 C8 y0 w4 S4 v4 e. n6 ?
  2.     // код метода
    8 e  c0 A6 j6 {* K- ~3 i! x
  3.     return value;: g% c" D' X- Z
  4. }
    ! X4 n8 {2 Y8 G0 V9 P7 j* O/ F& p
Скопировать код
0 ^& ]5 D4 U/ H5 C
Теперь перейдём к примеру.
7 l1 j6 A5 F) t2 v7 J% e# _) B2 x$ X; p; E
Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода" z$ J3 X7 ?4 B) A8 i7 q
  1. public void attack(Npc target) {  // public void атака(Npc цель)7 E: I+ ?1 n# c" a! j9 b7 u
  2.     // Вызов метода атаки NPC
    . U: V9 S8 B5 |* {
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());7 r6 @5 p5 s+ o& k' V6 M
  4. }" F7 s" V  b3 J0 o7 |
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
" i# S- }( D' L) J
+ U( y* V. r/ b& G- ~8 x+ _
* P$ t) t0 Z( j' Y# s( C& S- XКласс Npc.java — вызов метода5 ~! Y# f1 E6 s* w% M
. W3 L2 Y$ X7 ~! s
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    # H, h, y2 H' t9 E3 _) L. W% H
  2.     // Логика получения урона NPC
    & ^" T7 r* t7 G. C1 r
  3.     this.health -= damage;  // это.здоровье -= урон;
    , W% C" b& D1 _' W6 u% T/ t' y4 M3 l/ L  Z
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    0 W- I! E" P/ U3 S/ x' z. \/ l
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    1 j5 i% e; ~3 E' Q& l! y( r
  6.     ) n% n5 I" P% Q  u' w' U
  7.     // Проверка на смерть NPC5 m! @8 L6 w8 B
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    2 l( g% r3 j# G( s& Q9 _7 b2 X
  9.         this.die();  // это.умереть();- R3 ~1 _" @+ \: |( S6 M
  10.     }. a* T+ i& G2 n( G8 A
  11. }% l6 ^' ?9 Z! n# s
Скопировать код
Пример взаимодействия (с переводом)$ c7 T1 o0 X  z8 e, _5 R
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");+ ?6 \  F3 I$ U" {, c: v; S' T* B
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    " \/ M, w2 O% t! E( c5 ^1 j

  3. 1 F5 a5 _* F3 n6 |+ P7 T0 c
  4. // Игрок атакует гоблина! S9 q# R: P$ o. r, @7 i7 @
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    3 \. L* A0 ~( s" L
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода. ) T( y0 C& R& X1 T8 \

7 X* n6 N' X  Y, O7 {6 P9 J* l6 i7 O
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.' M; q8 o) w* _2 ~. [( e% ~* E/ g( w
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!
4 e7 F5 @$ C3 m$ A  s0 U# q6 U
/ Q# o4 d* V# g+ k5 L$ P
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
2 B: y$ L4 S1 }) B2 \% k/ O3 eПривет, Астралия! Огромное спасибо за твои разъяснения ...
' l$ P9 @. b; p0 t  C7 |
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC., Q5 }$ X$ C, P( l) i8 O
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)) z* ^, n2 O+ E3 }! h4 K
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)# V) }1 B8 O5 q1 f& r( M1 ?
  2.     // Логика взаимодействия игрока с NPC
    4 C$ s2 I9 P6 M" x  Y' X
  3. }
    4 S) k% B1 v: S) O4 B9 t0 [' u5 R
Скопировать код
3. moveToLocation(int x, int y, int z)
+ ^/ V$ E- X( t+ H
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)0 B9 {* `! X- |& a8 @! Z% C
  2.     // Логика перемещения NPC7 |7 n* k& M2 ~: O7 z: Y
  3. }8 w/ y! L' f+ t# {3 X8 T6 t% c$ l
Скопировать код
4. attackCharacter(Creature target)
( E; @0 L: U; s% j
  1. <blockquote>public void attackCharacter(Creature target) {  // public void атаковатьСущество(Существо цель)
Скопировать код
5. takeDamage(int damage, Creature attacker)
  1. public void takeDamage(int damage, Creature attacker) {  // public void получитьУрон(int урон, Существо атакующий)# d" E8 C1 J9 U  C
  2.     this.health -= damage;  // NPC теряет здоровье+ @- W0 N; X/ S$ K- `5 P' ?& R8 ~# K  I& N
  3.     / Q! v( d7 X8 e0 E( n/ E
  4.     if (this.health <= 0) {- p( v5 l. r' A& D4 ^* z" i; p
  5.         die();  // Если здоровье упало до 0, NPC умирает# |, m4 n/ W( b% C4 j
  6.     }( B: d/ A" K* _* \8 `! U+ o# \
  7. }* E! f* H) r5 k1 Y7 a% k) O& H
Скопировать код
6. die()
6 j* K7 I6 K9 P
  1. public void die() {  // public void умереть()
    8 L' @: g6 n7 ~; d1 K' A8 U
  2.     // Логика смерти NPC
    % e1 m4 L" T7 r+ }6 ^
  3. }6 |7 q: X) [0 I8 }
Скопировать код
7. isDead()  U% L* t8 O% r; O

0 g/ {' e+ A  ?$ K
  1. public boolean isDead() {  // public boolean мертв()
    6 ^4 |3 j1 I" i5 @! c9 m2 z* x
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 04 e( z) J2 ^3 G/ }
  3. }5 @0 h0 D# h$ o6 J3 A; O
Скопировать код
8. heal(int amount)
; @" P: |3 D4 L& `0 S) f# o/ L
  1. public void heal(int amount) {  // public void вылечить(int количество)' T: V) W0 x: J) p7 \
  2.     this.health += amount;  // Увеличиваем здоровье# |9 _4 M! A" F# _2 e
  3.     ! W7 h* e& S- f/ y. u5 g
  4.     if (this.health > this.maxHealth) {/ l0 \1 i0 O( i0 a4 w
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
      X& h" Q# M+ R2 z
  6.     }
    # Y6 {' C" }5 Y* m& Z
  7. }
    , P5 r4 C% N( a! t* D- y8 k' f
Скопировать код
9. doCast(Skill skill)0 c# r( F! a4 o* ~  U
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
    5 H, a0 Q6 o$ z1 ~" [) T
  2.     // Логика применения скилла NPC
    : \0 f8 A8 q9 A$ g; n( t. r. b6 [. g! p
  3. }
    ( M9 P5 r" e  I: _8 V6 E
Скопировать код
10. onInteract(Player player)
3 u0 s/ r6 Q$ a7 E# Y
  1. 9 H6 e( U4 g0 c
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    & M6 W+ Z+ |" l3 l/ H1 G
  3.     // Логика взаимодействия с NPC
    - \, ]2 ~, L& y+ Y% F. z
  4. }( d+ S0 K6 C5 u6 w( O
Скопировать код
11. showChatWindow(Player player)
% A) v) O- Z! \3 j  \
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    " [9 ~$ j3 ?! n7 g4 F4 D' S3 w$ N9 d
  2.     // Логика открытия окна диалога
    % V" |! h( }$ O; f6 i
  3. }
    & }$ Q/ L. a3 ?. x/ T* i- K3 c" {5 N
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
  l1 k8 J" h+ X: j  dЕсли тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
/ @- M* f: A/ u8 {1 H
6 I" S0 m' ^2 s* |
8 ]0 c' S+ |+ m- f
" `/ u* y: E5 B5 m4 b
' T) X$ W5 T: B0 ?7 p$ ^




Добро пожаловать artace.ru - творческий сектор (https://www.artace.ru/) Powered by Discuz! X3.5