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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00
) ~; h/ N. ]. y1 k' ]+ _5 N/ b! v" p) O, r/ c

; W% q! P# j8 d% X9 Z4 }+ ]. @Шаг 1: Введение в классы и методы на примере L2j_Mobius
$ z* O/ c) Q- m- B  }С статьёй можно ознакомится в разделе Обучение > Читать
7 m$ s9 s, r# N+ a
  D3 N4 r/ p7 I* v) l. a) m/ L! u' kДобро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
) q# a! W1 |5 l" f+ l4 z
' ?6 o6 v# s9 x3 o) I( NОбсуждаем:7 J0 \' f% `. O; l; l/ ]+ j
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!6 M* o) {2 J8 L. Z, K3 K9 O
/ Y) C" I( |9 e' ~3 h


0 Z/ d7 p2 \/ V7 ]/ m! k' _. \2 h- lИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!, W. F2 |. W+ l& m# m1 q7 A) X

; u# Q3 {2 L4 i& M, P- `8 M3 g

( J4 K# K: B' \& A  l$ X& x
8 ~- D* N7 f" Z- d6 T& f9 ?$ N4 a, Z

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?( E/ D; f9 o1 T' g( `; n. m

Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17
6 e4 F( F7 _4 K9 r  O' y, NПочему мы используем ключевое слово this для ссылки на п ...
) Q' q  O  B- V8 H5 p  A9 C
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.. W6 Q' z5 l* S, P
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.
& ^  b. e( b/ @' W- I; E: Q
; M* e6 Z* v% A- L* j, NВот пример:1 X* Z, N( q5 Z: {! `' F6 [) K2 d
  1. public class Player {" s1 ?% [  u3 }/ ~% p2 a8 B
  2.     private String name;
    " P$ z8 G) B6 [  T8 s/ p: s

  3. + L: z- D5 W# C/ Z9 H  p) D
  4.     // Конструктор3 w# Y% K5 m: g0 O
  5.     public Player(String name) {
    : ]1 Y2 Z! }, P7 N. X) F
  6.         this.name = name; // Используем this для указания на поле класса
    $ F  Y+ b/ P7 f: [) g( c; j: B
  7.     }1 b6 w* D# u" j/ |

  8. ; f  G0 Q, S8 D+ N" v
  9.     // Геттер для имени
    9 T  f' E8 i! h- I
  10.     public String getName() {9 p1 \$ G+ v: c
  11.         return this.name; // Используем this для обращения к полю класса
    , P+ Q# B- H7 ?' j2 L
  12.     }8 {7 E: V; N$ F$ X) x
  13. }0 `( K( Y& E1 I. T6 G; E1 i& \! ^+ r3 R
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.# X! M' m/ X( `) x/ d
" ^1 {7 e) ~* g4 o
Когда необходимо использовать this:
4 z) J# P( P" _! ]: a1 x& UПример передачи this:5 y% V6 Z( S$ s1 S
  1. public class Game {
    ) k7 x: s) X9 t
  2.     public void start(Player player) {
    ! J' n/ ?0 @. v: H  x4 w
  3.         System.out.println("Игра началась с игроком: " + player.getName());' v9 j7 ^: Y* A3 X% P( p: O' z
  4.     }2 c% V) ?% w/ K& n  [9 T' A
  5. }- M8 w! S3 G# C; l

  6. ' {  x3 e$ r7 Q$ D
  7. public class Player {7 @; {, ^  z' ~+ j$ L4 J
  8.     private String name;$ H1 I% b9 ~, I3 m' l

  9. " Z  o: O0 j) w8 C
  10.     public Player(String name) {
    6 @  r# G& Y0 |' G+ y7 y% K# _
  11.         this.name = name;' r2 g, ]4 K, f! ~: v& i
  12.     }6 X" M' B1 @. T

  13. " X! Y6 o% ^% }9 s
  14.     public void joinGame(Game game) {4 ~* z, }! C& Z' v
  15.         game.start(this); // Передаем текущий объект Player2 y1 R0 e% E: \4 Q) J; E9 j
  16.     }/ T, V" m: |9 \
  17. }$ Q0 a% h6 q" B1 H
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.
! i0 h% o4 S9 t

' v/ O, B4 E& Z1 Z+ v- VПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
& n0 @4 R$ [/ z, v+ F' e' ?9 o4 N0 j! K- e

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
( \' `8 ~1 x! \4 P$ j4 s$ R0 VКак создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24
( Q( H* f. t8 s' `4 H
Mike123 опубликовал в 2024-10-17 20:05
. w# H! z9 H$ [. r5 ^( P/ v: zДобрый день!
1 `; ^' K6 R' P1 rКак создаются и вызываются методы в Java? Мо ...

: h0 n' M7 {: u: j: x2 hПривет, Mike 123! ?  v* m- a; K7 G, E1 A& L9 v- S
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.
4 O+ m. j' V, Q" d9 ]# b& H3 S  o" p1 c
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.' [1 S: f8 l/ V8 G0 G

0 H6 v( I$ `1 h  v/ B8 I
7 x0 v& Q  y9 e' [, K; ~4 w2 GКак создаются методы в Java?! ?1 w) \; {: {% c5 q0 ?
6 b9 Y- n9 |: O
Методы в Java создаются внутри классов. Вот базовый шаблон метода:
% F3 C6 ~1 L7 D9 _% \$ i
* Y' C# o3 t- D; q- l  w
  1. public returnType methodName(parameters) {8 Z3 F! a) l: K+ \5 @3 o% B0 }3 X. P
  2.     // код метода' ^0 x+ |+ ]+ g3 D; v) x
  3.     return value;
    & I: G+ u( W3 c7 A9 h" [/ h5 X/ Q. A
  4. }% p0 p4 D, W) ]# n# d
Скопировать код
& z; W0 l5 W6 k8 [. B' D0 z, `
Теперь перейдём к примеру.. G% E" F; R( W$ m

+ y3 c! z$ B% B0 tПример на основе L2J_Mobius с переводомКласс Player.java — создание метода
2 V# _  {/ t! J9 O3 B; j& e& P; N
  1. public void attack(Npc target) {  // public void атака(Npc цель)7 ?& j& o& K) f! C& H+ ^3 _
  2.     // Вызов метода атаки NPC
    ) \9 S5 I7 S8 N
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());
    - h% a! q8 C; C; n
  4. }! c4 R- H( _8 k
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).$ c; P& U! F3 l6 ?
/ d9 L& p5 z/ \: [3 @

6 w) I) @% A9 M6 a, [Класс Npc.java — вызов метода
0 F$ v) @5 k, C7 \% D- H, j3 P6 ?1 l1 `9 ^. w# R
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    3 _5 V5 D' p! d& A( r6 s( b
  2.     // Логика получения урона NPC' Y- w9 r% }  b# t# |5 A
  3.     this.health -= damage;  // это.здоровье -= урон;4 t* |+ }  b9 S: o: S( ]8 D- H
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  % K% a/ u, e' O: c) v
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    % o1 N+ a5 f  q% q  N" n0 v( M8 b, Q3 P
  6.     - Q2 g3 k/ S% l6 Q
  7.     // Проверка на смерть NPC4 T; U( Q: k+ d9 }& R  G
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0). Q( e5 M6 m/ b3 x7 z" q. p8 y
  9.         this.die();  // это.умереть();- ]" }0 ^4 \: X4 Z% R& I
  10.     }
    " f6 I' b! ~* Z8 V* ^$ z, ]' P4 s
  11. }
    : l, F% k3 }: o* M# }
Скопировать код
Пример взаимодействия (с переводом), {% e" D8 F# P! R. ^% U" c7 k% \4 h8 O
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");3 s  `" d( _" c# q6 c4 h2 q
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    + a! Z7 j! Z7 S( P4 A1 q
  3. ) b8 h+ P% B" @& q3 q4 [
  4. // Игрок атакует гоблина
    2 ~7 v) b, C# V- r1 x( ^2 W
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    ; c$ J. _( E; D. K. M( ]9 K
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода. . }7 r# _( N  r7 Q$ O

+ [2 R7 l" c$ B  q* U3 k9 R
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.
1 l" Q: v/ i# @, W+ |У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!; L% S) v. X, c  J5 Z% O7 Y8 t" B
$ P$ I/ b+ Q3 _7 s

Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
/ D$ @3 m7 N1 X- I  e) `Привет, Астралия! Огромное спасибо за твои разъяснения ...

: C/ J2 V# o; ^5 ~% c  gОсновные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.
( V& }! F4 d& s  K1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
8 Q' D; {2 ]" ]9 [' d  l9 e, L
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)1 _1 N" q) x* K
  2.     // Логика взаимодействия игрока с NPC# M- n; _) M+ Q" S% k
  3. }
    ( |; T6 ^; @0 i  E
Скопировать код
3. moveToLocation(int x, int y, int z)  r! F: M" B. U% O- m5 }7 N! H
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)
    ; N5 t; U/ i4 w
  2.     // Логика перемещения NPC
    ( r2 r. N& p2 b2 n: P7 v
  3. }' i# ^' @9 o" |7 h' l$ ?/ B
Скопировать код
4. attackCharacter(Creature target)
7 J7 t. ?9 s9 E: H+ ]2 d+ @; J$ T
  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: a: ~# h& T, u; g+ V/ |
  2.     this.health -= damage;  // NPC теряет здоровье
    # A4 c9 y+ B8 \: @# L& y
  3.    
    ( s7 _, w7 j0 f! g
  4.     if (this.health <= 0) {
    # R% |+ z% s. P, J: M
  5.         die();  // Если здоровье упало до 0, NPC умирает3 q5 G* g( Y! m0 v' L
  6.     }
    3 y  h2 G3 ]7 o* b( K+ D% R
  7. }
    2 T0 a5 f  }$ M3 F$ R. t- y# i
Скопировать код
6. die()! Q. F- Y# k: t  c) ~8 E! ]8 A
  1. public void die() {  // public void умереть()7 t$ K$ s5 y8 `5 U' }
  2.     // Логика смерти NPC
    * S% W; _/ p3 U0 q
  3. }
    8 v: \) u" u( D8 H5 o) P. n
Скопировать код
7. isDead()
# I4 ^$ ?0 E, x) E" f2 r
% V: i9 H- V' f( ?& R2 }
  1. public boolean isDead() {  // public boolean мертв()
    6 P) v- ]# M4 p  W
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0$ A+ b2 Z( }9 ]% m
  3. }
    4 b1 r7 a& H) @9 X/ k
Скопировать код
8. heal(int amount)$ f/ }0 U6 K1 f3 y: D. L2 R
  1. public void heal(int amount) {  // public void вылечить(int количество)* G( R. k; G" x) O9 Y) x
  2.     this.health += amount;  // Увеличиваем здоровье
    + X6 ^5 s) w3 W5 G( ^& z$ N# ^5 l
  3.     8 T( K; j4 s8 t7 x1 O% i: }
  4.     if (this.health > this.maxHealth) {7 [' x1 K, L6 j
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального) `3 g% e2 z# a  ~) s( @) z2 l
  6.     }
    2 \/ K) k7 G+ s0 y  f0 {  M
  7. }3 @: S3 O& k& P
Скопировать код
9. doCast(Skill skill)
: C; o, g4 p2 B) j
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
      H0 @8 X, h- B5 i% ?* M5 X
  2.     // Логика применения скилла NPC2 T$ D0 m) ~! a4 D& B8 J" _$ V( Z
  3. }2 N8 V- A! v$ a; Z% h
Скопировать код
10. onInteract(Player player)+ a( `% h" q2 p" O! x* G' ~
  1. ' I0 e7 K8 u5 B
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок): Y1 E" q$ U7 Y/ Z
  3.     // Логика взаимодействия с NPC8 ^* P8 d: H& N8 j$ a
  4. }' J7 u- b& V" j/ A
Скопировать код
11. showChatWindow(Player player)
9 f* Z! W6 R- Y! c
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)5 d+ S. n) c8 c6 J' v
  2.     // Логика открытия окна диалога- S0 Q5 h9 k% [+ d$ B
  3. }& Z  A4 r! F1 W' J$ u
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
6 u. i6 q' M* ^9 xЕсли тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!5 ?/ `3 `. Y0 ^2 T8 u& P1 i4 a
: j) i/ a7 }/ f, D7 d! q% o4 E

9 p! s9 Q+ n* G" ?6 x# P6 H
" j* A9 c. n: S  O+ ~* v( h' p  l  t+ J1 Z





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