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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 * _3 J# e2 ~6 o  j
0 t! H& o$ W0 o: N) V8 V5 ^
& r6 O5 t/ R2 ?
Шаг 1: Введение в классы и методы на примере L2j_Mobius( o2 X! l+ \; V. L& \( @
С статьёй можно ознакомится в разделе Обучение > Читать
; {5 _6 b. G" ^+ j$ n+ P3 \! A, U; r  \& e1 G# I4 M
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
+ J9 ^' c3 @9 [) ?& p; R. o( J% ?% O) ]
Обсуждаем:* l5 v" i2 t8 X: ^' N" d  _
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!/ Y2 R: s/ _' Q% C4 n! p
; x7 x  P& s7 i- F1 a


+ e- F# ]' A' l5 I) mИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! 😄 Но мы вместе разберемся!( D% e* b- `/ c/ I. `4 c2 x# f9 `$ T
) M4 G+ l4 I3 I& m0 Q
6 Z7 L$ [3 w. u/ V) l9 ~" [3 h
2 r7 t. v% D' Y: P1 P

! I. ]' ^6 I3 k& N
8 h' P3 t% P4 V3 E+ |1 l3 e5 @& U
Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
9 U$ ^) M5 U- u, t) r1 s  W# o2 }
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17+ f) [) G. v2 d+ E* m7 y1 F/ T
Почему мы используем ключевое слово this для ссылки на п ...
$ N& r# D* F" c& w( i* O
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.
5 P) l7 D% c. @4 ?Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.
$ `2 d: ?/ V1 y" v
/ @$ h7 S# u0 K& r2 t1 p, T5 nВот пример:1 G' w2 `* n. S$ E
  1. public class Player {
    ! N9 i* ^5 X: x2 [7 Z5 R" p
  2.     private String name;
    " M2 ~! k6 C0 G8 A5 N; r
  3. ( o0 J' e( G5 Z+ `: }# P
  4.     // Конструктор5 V5 l5 f$ `. n7 q$ w' F' C$ f0 F- a
  5.     public Player(String name) {
    6 @- y) _. O, Q" t0 x3 t6 n; I
  6.         this.name = name; // Используем this для указания на поле класса4 w' w( z' w" N$ z
  7.     }7 i2 \+ N' R. ?

  8. 8 v6 J" L$ k* P* u3 d' ]( H  d5 J
  9.     // Геттер для имени
    3 b) y3 j. l# d! h' H! y9 Q% w
  10.     public String getName() {8 @2 K- r; U) n: x* I: J. i
  11.         return this.name; // Используем this для обращения к полю класса
    & A& j! V$ g. H. \3 h) j
  12.     }
      o3 R0 O% r0 k; y
  13. }! R5 H4 c& ^4 v: s
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.: o$ R+ L: j/ H( O6 @( l+ @+ r

3 L9 I- [8 q# LКогда необходимо использовать this:
+ E6 g2 c7 G% o  zПример передачи this:
  e- O) T  N7 ?! n. [
  1. public class Game {
    1 H& l. W; L4 K" v8 j0 p
  2.     public void start(Player player) {, Z* z) ?5 @% i, b
  3.         System.out.println("Игра началась с игроком: " + player.getName());) T: S& d+ Y$ [% k( H: z1 B
  4.     }* b! m6 x' F3 w9 p. `
  5. }
    ) m. U; W( J+ s/ w

  6. ! p7 @, `2 D& H) A+ j  L
  7. public class Player {
    5 K) u* R( a/ K" _( U# `
  8.     private String name;
    9 e3 A- w2 I0 O3 i' G2 L
  9. ; a: J7 F! R8 B1 ]" u
  10.     public Player(String name) {; M7 \9 _/ `4 P% u
  11.         this.name = name;
    2 g3 Z# d2 E% G' P8 W7 T. T
  12.     }
    / F+ T% M  l- ?4 l
  13. - Y2 l0 o- Z! q# E, \
  14.     public void joinGame(Game game) {
    , r8 y- ?1 e  H7 X
  15.         game.start(this); // Передаем текущий объект Player" [6 C% m9 d& Z5 {
  16.     }! ?* D+ u/ t0 y- F, L/ [# E
  17. }( }; [" Z+ N- T: Z
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.
" o1 }' k4 i& I3 a. j5 J! ?+ p

; V& Y! m) h; }& @5 NПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! 😄) i+ `4 a' c  x7 Q8 k4 K- e

' {  G4 N! i6 J2 O
Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
" ~1 |3 ]3 j# p2 {Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24
) h+ k# J6 t4 M5 o; \9 o1 P9 z4 @
Mike123 опубликовал в 2024-10-17 20:05
( r7 q! J6 `4 ~Добрый день!
! U& Q* o1 R3 m* J8 _) I% kКак создаются и вызываются методы в Java? Мо ...

, b% _, d# k* XПривет, Mike 123! 👋
* L2 x8 A; w0 _! `6 o" x0 ~Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.& C+ ?2 h  F3 p; J9 A0 Y2 D

& l% K$ l0 M) u6 v9 o3 DДля лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.' H  H% z9 j, z+ _: [
/ p, J: ]- L; w% d( a6 g! M

+ {" m) [0 e" |* c. VКак создаются методы в Java?& p  E& ^0 X8 O7 B4 N* `5 O

$ ]/ @6 W, @' ~Методы в Java создаются внутри классов. Вот базовый шаблон метода:; J1 Q9 n% p6 {6 R7 M* n/ ^8 U

2 e% `9 `! Y. Q7 k' z
  1. public returnType methodName(parameters) {  m$ r6 r8 ]7 g- {
  2.     // код метода4 T6 z: r1 r3 D0 q* n$ G
  3.     return value;* {1 s" P8 M! ]
  4. }
    ) e) y# I% M; j/ O( X; Y
Скопировать код
) l! V1 W! S; T( ]: ?) P
Теперь перейдём к примеру., s" W! ~$ Q- t* ]. ~& ?8 K7 N3 s) R$ R% l

) a. j8 t, x2 r. U2 v; J' W" kПример на основе L2J_Mobius с переводомКласс Player.java — создание метода
4 P, i/ g" `) g8 N. e
  1. public void attack(Npc target) {  // public void атака(Npc цель)
    5 a0 Q! t" Z9 ]3 @
  2.     // Вызов метода атаки NPC: H2 D8 K# q8 p. h& z
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());
    8 p* @5 X5 c5 J; Y$ P+ [
  4. }5 U2 o) [: A" M
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
2 M, i. F# Z3 c+ K5 H* V  ]/ _" P- O% {# N# t3 f' L
8 J5 f' _! ~, k2 r
Класс Npc.java — вызов метода9 [8 @, W4 g% I. ?8 X4 N
1 e; |2 R7 K# f% E# p: n/ r# x
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    5 ?: I5 d0 {; L& V( A& J/ @
  2.     // Логика получения урона NPC
    . ~2 V( z# j7 |
  3.     this.health -= damage;  // это.здоровье -= урон;
    ! s  \& h# P/ D7 {: h
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  6 v0 L5 z% J, h
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());; i& M$ o2 H, V) D! C3 a! S7 G
  6.     ' [/ a! Y3 z4 e  ~% t9 L$ F
  7.     // Проверка на смерть NPC
    ' ]5 v: Y# |4 e5 ~
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    ) \1 C0 i- N5 S. Y: v
  9.         this.die();  // это.умереть();
    3 f1 ?+ Z2 W: _' c8 }/ w
  10.     }
    8 z( q( ]* N: Q" p
  11. }7 ~6 Q7 D+ D, a$ e
Скопировать код
Пример взаимодействия (с переводом)
* ?+ F% k" q9 K% {6 k
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");% }; C# u9 n4 |2 u
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");& w, `6 w# _$ l' W; h  o
  3. . E5 W- O3 i* p9 W$ v+ t: h) k7 |
  4. // Игрок атакует гоблина6 M) Q, a- o9 X/ i3 a; l. d
  5. player.attack(goblin);  // игрок.атаковать(гоблин);% W% z/ Q/ A& U- w% V
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
# {4 |3 w5 c& \1 V
/ Q$ c7 r) }* r/ _
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.( ~6 d/ V, f( K% S/ |. s, H2 [
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!7 A, B" i2 v$ d/ e
+ Y* C* c! ?! o* U  _) S5 V2 @, V

Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
4 X: d1 q' W  _+ L" w7 uПривет, Астралия! Огромное спасибо за твои разъяснения ...

- m/ F( p3 h/ s* W: X/ LОсновные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.
9 d- l( Y9 w: j& U5 s4 k7 ~3 v3 s1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
$ A' U, y; q. N1 `1 ]$ ]
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)2 ?6 r3 a# v0 q9 }/ s
  2.     // Логика взаимодействия игрока с NPC+ |6 y/ M6 u6 ~! |) e0 X
  3. }
    / u- J. y! H4 K6 T: t! N' l
Скопировать код
3. moveToLocation(int x, int y, int z)* H9 d0 Y% T3 L- b3 e/ u
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)
    9 D4 G0 U7 R+ `( N% d- j1 U, ~; Q2 q7 r
  2.     // Логика перемещения NPC& T& p4 R# z4 s9 O
  3. }  [9 v8 `( X: ^$ V& S1 z$ v
Скопировать код
4. attackCharacter(Creature target)$ {9 z0 `- B2 q& o; y' o
  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 урон, Существо атакующий), ~/ ?, y7 J' g5 k9 |4 p% x/ {
  2.     this.health -= damage;  // NPC теряет здоровье
    7 p% q' [: \+ ^" V, ~& n: B
  3.     1 g( W0 D6 i8 K6 I, n) X, x+ j
  4.     if (this.health <= 0) {
    * j3 _; M/ Z+ C2 D7 n7 |6 n+ F, Y2 d
  5.         die();  // Если здоровье упало до 0, NPC умирает& q) e" U) |4 l  s. m
  6.     }
    ) J( Q' E: Y3 w: E! S4 C
  7. }
    + U) j. U* y0 |) u
Скопировать код
6. die()
( S" q0 \$ {3 ]' u
  1. public void die() {  // public void умереть()/ `$ ?) E4 I" u3 u4 l
  2.     // Логика смерти NPC2 j) t' M  P2 Y
  3. }
    ) x  o! l4 H% l- ?
Скопировать код
7. isDead()1 j: |6 |) [/ c

/ @1 [2 a4 S% v2 F) ]/ C
  1. public boolean isDead() {  // public boolean мертв(); s* Y! S" ^0 e
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    & H5 x( R2 p& }: V0 G/ I5 H8 k
  3. }
    " |9 n5 R% Y7 c- R+ X6 n- i7 @% n- I$ p
Скопировать код
8. heal(int amount)
7 Y) X' `9 E2 Q7 I
  1. public void heal(int amount) {  // public void вылечить(int количество)' x" V! n: M+ s! ?% z# o8 {! ]* e
  2.     this.health += amount;  // Увеличиваем здоровье
    ' `1 x" J4 X! ]1 }, z/ m, V9 h
  3.    
    8 J0 O( ^% S# \8 `% F: R
  4.     if (this.health > this.maxHealth) {
    ( |% |2 w( l- q( |( w: H
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    9 |6 f4 D% r/ t
  6.     }
    - y9 s* y. _" m& Y: j6 D# V, J
  7. }3 E! |! z: y# `0 B$ o
Скопировать код
9. doCast(Skill skill)
1 {9 j8 T4 U8 V7 r/ ]
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
    4 b, g6 e- b! ]
  2.     // Логика применения скилла NPC$ h6 c6 c3 V; R) _4 r& V
  3. }; k+ F  d2 E/ g/ P  p
Скопировать код
10. onInteract(Player player)
: |* t1 ~- a6 X, j

  1. : @: k) j4 X  B# D9 ]9 v
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    ( d* e/ g8 }$ W, x# A- j8 E0 D
  3.     // Логика взаимодействия с NPC; j  M" r6 H. g& o# `4 n1 d+ R
  4. }- t: {: W% }1 R/ K) ?3 p) b
Скопировать код
11. showChatWindow(Player player)9 r! z# v( m0 v- t7 ~  g
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    ; O" ^8 {* @, v8 \9 k
  2.     // Логика открытия окна диалога# {! y. M: X" R' j
  3. }
    ' E3 t- p* s5 `: @8 ~; o3 X9 o
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.2 f- B. k  e$ {: R/ r
Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
! w6 [4 A. H% O7 Z3 S% c
6 j' G/ m7 l& {! t  }3 E
" z, ]* i% \' H& m# s: M: G4 e7 M
5 o0 ~3 h3 r! z# v$ ]( Y- h% D0 b; |1 k; Q2 k





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