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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 9 l( J/ Q9 H, Z4 r& k" t

4 Q8 n7 M3 L# R8 Z
" W0 q% r1 d( @9 i: J3 p  RШаг 1: Введение в классы и методы на примере L2j_Mobius
8 g+ ?; }+ ^6 k6 e9 TС статьёй можно ознакомится в разделе Обучение > Читать& D; {6 _" @: D& f

) w* E) `3 u) j" H8 U/ HДобро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
& q/ Y. {4 A8 W$ W# s. b
: I3 u$ Y$ I/ y( R0 bОбсуждаем:
; }0 U8 ?  i; {% [8 YНе стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!
+ Z$ x: V1 k* t
4 Z. X, K, Z! ~' e/ [5 ?

1 P3 o7 \  F3 O. N' Z2 [; cИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!" m( {* B6 x' ~

) ^8 |# {2 I# t" g# v
( }9 }) }# h/ O8 P8 I1 b/ h. R2 e
9 O; B+ N2 t3 k& L: b7 F/ M+ v' X4 a6 {- x
8 d% [2 W8 w- d* |9 M

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
2 l6 ^& n8 r( U9 f1 d8 `1 M
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17
  q6 G& o& @, }+ }0 ^! N+ ^* |Почему мы используем ключевое слово this для ссылки на п ...
, }  N6 j9 U& y$ G; r6 s5 ]
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.* _- ]# `7 i5 W9 B, W4 ^, c% [7 v
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.% L7 W5 _  z, X& O! c5 h! X# e7 Q! @

1 Q# P( a& D  o; A- S( kВот пример:
9 [! Y3 z# g  A8 U6 j* ^
  1. public class Player {
    ! Z' b4 ?. S1 e) S
  2.     private String name;  ^" P9 r4 @+ {5 T- i- F0 I

  3. + ]& I( c4 V* s/ E4 L, n5 ~) @
  4.     // Конструктор
    + T0 |  v$ o! d' p7 T0 m
  5.     public Player(String name) {
    ' `" y0 [; O8 S) j
  6.         this.name = name; // Используем this для указания на поле класса
    ) _. _5 ^" a# T9 B
  7.     }3 s1 {* K9 G6 ?; v- ]9 [6 p( a

  8. 4 ]8 o! X# y" w# {) Z9 z6 d
  9.     // Геттер для имени
    1 ~. w1 @8 U- d' X
  10.     public String getName() {
    0 o, m- D4 `4 b% T+ {; [
  11.         return this.name; // Используем this для обращения к полю класса
    + m8 N" u; |* K
  12.     }1 b# H, P/ g" t! ?4 R
  13. }8 a' A- S* w2 N& a
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.
. F2 R& ~/ e* X, q" q' z" Q8 F' |) O) Y
Когда необходимо использовать this:- ?, x! L# A* `2 ^1 N& l
Пример передачи this:: h; q8 r6 t" ^1 H( g1 ^; _
  1. public class Game {! `, R4 Q' p( |1 R! H6 ?5 m; f
  2.     public void start(Player player) {# u' N6 P* U# J7 L* i
  3.         System.out.println("Игра началась с игроком: " + player.getName());( H" ]3 v. G3 y( C; n
  4.     }
    % J: r+ {& W9 o! m8 u; Z( u* q
  5. }8 @3 E$ R! t" W6 |

  6. + |" L! d7 D) r+ S1 ]1 _
  7. public class Player {
    5 w* Z! _3 c6 T* b5 W) z0 F
  8.     private String name;
    , r8 a- E& Q. y; p) [6 d0 {

  9. + W. I& ~3 V1 \: J4 X4 L
  10.     public Player(String name) {
    " Z+ k& n7 `( ~1 s" I& m  M% m
  11.         this.name = name;3 X$ k' H: d; _' e, [
  12.     }
    + m  b5 t* ^& S$ W+ K

  13. & }, Z# i# p# L$ M
  14.     public void joinGame(Game game) {* N+ b% k; k% v5 N8 J, v  |" B
  15.         game.start(this); // Передаем текущий объект Player
    0 x( P/ `9 O3 v0 T1 \8 z: [1 b
  16.     }
    ' n5 x$ e- n8 ?' b
  17. }
    7 D8 r6 d* Q; D
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.0 y  [7 w, @4 |) R7 R5 N  k


# G: d3 w1 D% JПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?3 R$ {3 L6 z7 ?& `) U

; f( y1 X" x1 t- ]
Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
; U2 }9 n) M& B) I9 Y4 u0 _Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 ( Z5 \& U1 c2 X( u+ T# J( j& `0 G2 S
Mike123 опубликовал в 2024-10-17 20:05
' V) u& e& d1 m+ {2 E9 vДобрый день! 6 r1 _/ K' H7 m, ]( w& M) M1 r* k
Как создаются и вызываются методы в Java? Мо ...
" m* N# c% a; D: o
Привет, Mike 123! ?
' I! ~( i2 H/ U7 R4 V. y& Q1 c7 h7 }Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.
6 E! ]- [  O$ f8 X% I6 G6 k
1 }8 K4 |5 `8 U8 F7 bДля лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.
/ X* T9 j8 j* M# v- y$ m# Y1 q
: Q! x# a3 f0 R! G) \
5 z5 v+ W* m/ ZКак создаются методы в Java?' A9 t/ {% t% j- ?9 j, b
' x$ d: l5 c, O, d  ?. ^
Методы в Java создаются внутри классов. Вот базовый шаблон метода:; }/ y7 f/ b2 a9 u' O
1 W) f0 J5 ?2 s4 X( |+ H
  1. public returnType methodName(parameters) {* N9 w0 i3 H, n/ B
  2.     // код метода
    , a8 Q& I/ ?3 D
  3.     return value;; C. y/ n7 a3 _  L4 F8 h
  4. }
    3 {2 ]3 r; h+ V( x2 s
Скопировать код
' j0 `/ N1 v9 u( X( S& s) A
Теперь перейдём к примеру.
- N/ c( `* v( P3 W' \+ X* u6 v
+ o$ E! `7 [, d8 e1 i3 Z% }* XПример на основе L2J_Mobius с переводомКласс Player.java — создание метода1 g9 Y; i1 F; I
  1. public void attack(Npc target) {  // public void атака(Npc цель). ?  d6 C# n5 L5 Y9 g+ n8 G
  2.     // Вызов метода атаки NPC0 J& u1 K/ H- d" r" R7 M6 x
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());
    0 S, N2 v# W5 l
  4. }
    % D0 H9 S: V, D* l
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).9 r$ b% o3 y1 K! f$ W

) [) ?* h2 e( n2 c( T3 }! N3 F8 H9 p$ e4 K: l1 ]  S
Класс Npc.java — вызов метода
' g3 U: i9 E7 u  D7 g* z' X( o  w
" h1 e1 }0 W, G, q, |0 h
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    8 S: ]5 _) p" i1 e' Q
  2.     // Логика получения урона NPC
    5 m" d* ]! X. ?4 u, ]
  3.     this.health -= damage;  // это.здоровье -= урон;) \' d4 o% R( T3 Y- @
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    5 K* }# N+ T2 j* h8 A; v. I
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    0 [2 L# C& C- d+ A. g& s( Z6 a
  6.     % ]$ O+ U/ G9 O
  7.     // Проверка на смерть NPC
    . \, p) H2 c3 K5 z& g7 c" ?
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)% Q, t5 j3 Y) \5 R7 J, K8 z
  9.         this.die();  // это.умереть();
    9 j$ g" G) u8 h3 \/ B
  10.     }# J$ o- P/ V* X+ T! z
  11. }# @" O8 i2 J2 ^9 H9 V% g. ^; K
Скопировать код
Пример взаимодействия (с переводом)
" _0 L+ Y# E# H0 k" r( ]
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");
    1 X: \: G+ N6 \2 q/ V
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    / p6 Q7 Y$ T2 X+ D) Q! v% W* O1 B, l

  3. ) i' v% ~- x& m% P
  4. // Игрок атакует гоблина
      J; ]1 X, E! A. Y$ e- s$ p$ l
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    + F9 i9 F% X- {) G3 r# y& y
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода. $ M$ R3 r6 Q. l4 g9 Z& i! C$ D' t3 i0 O

# h. i! a: {/ o0 z' [
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.0 {! ^5 y, }* v' s. g, g0 V
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!* `* N. L4 O' K* h9 l

( s, N4 n- b7 K$ C
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
& E8 X- N( h0 b  }Привет, Астралия! Огромное спасибо за твои разъяснения ...

/ p( b" }& Q: Z4 VОсновные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.
) ~9 V. ^9 g1 p( R2 Q+ b: i) `1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)6 C/ V4 \; e& R
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок); X/ w9 {, c/ \7 d5 y
  2.     // Логика взаимодействия игрока с NPC
    4 z/ J% ?! m  r/ n3 k5 X
  3. }
    # E/ {+ ?; f! r4 c* h/ W  {8 }
Скопировать код
3. moveToLocation(int x, int y, int z)! P1 [* ^) }# p* K
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)- B5 S' Z8 d6 D. K- t8 O
  2.     // Логика перемещения NPC, i. r' P+ [9 w$ V9 i4 F. D' \
  3. }7 H- t* Z$ ~7 b) Q& [3 P7 T
Скопировать код
4. attackCharacter(Creature target)# P% Y; z1 V; Q  H5 D
  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 урон, Существо атакующий)
    3 E, M6 S; I" }  _: y8 O4 Q* V
  2.     this.health -= damage;  // NPC теряет здоровье
      B' M( S6 `. _6 s9 `% Q1 X( r
  3.    
    , {/ y# o3 x3 V4 R
  4.     if (this.health <= 0) {8 Y* |- i# A+ U. v4 t
  5.         die();  // Если здоровье упало до 0, NPC умирает
    8 e- O, @! Q2 b3 b* R: T
  6.     }$ i7 T' d; v7 e: V! |! i; x# C
  7. }
    % M9 ^8 {/ A1 q# I. n
Скопировать код
6. die(): L8 G  u8 B; V
  1. public void die() {  // public void умереть()" p* Y8 }3 C0 y! |
  2.     // Логика смерти NPC5 o) F/ X/ \; Y/ v  C- ?# l3 m' I
  3. }8 P+ Q/ D" J" H" g- {0 k1 T
Скопировать код
7. isDead()
0 Q' u" t8 I' _  L9 J$ C$ P9 d9 u( O' R2 }/ {( Y6 [
  1. public boolean isDead() {  // public boolean мертв(), v( M/ G* m2 Z9 g# ]. _% l: x
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    ) k4 Z2 ?! Y8 p2 v0 L( I- X5 {
  3. }# H' Z) H9 t0 n: V: Z6 m+ v: k
Скопировать код
8. heal(int amount)5 Z9 y; m: \+ u6 |& X0 Q
  1. public void heal(int amount) {  // public void вылечить(int количество)
    ; S: `2 y: j: o9 \, T5 F2 W- d7 Z
  2.     this.health += amount;  // Увеличиваем здоровье5 A. U8 ]7 @, y9 W. l+ j3 m
  3.     1 k, ~9 r  h2 L4 y% X9 N
  4.     if (this.health > this.maxHealth) {: H% ^+ S+ L: X, M/ K9 }$ c, ?
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    ! L4 P0 C8 z" J
  6.     }
    " d3 l! z, T/ b# ~
  7. }( v( |6 _4 ]( y) U
Скопировать код
9. doCast(Skill skill)+ @/ L& `0 X3 ~& p# L0 J
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)1 L. r, A  b. J! m
  2.     // Логика применения скилла NPC
    + H( H0 W' Q3 ]1 d' z
  3. }
    ( k. c# j  C2 X( p: A  S
Скопировать код
10. onInteract(Player player)
1 H9 ?* H7 `% d: Z7 [# H

  1. 8 E7 t- [/ X5 Q* p
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    8 B5 |0 t) e( j& j- b9 b; D
  3.     // Логика взаимодействия с NPC. z+ x: K& i5 ~& ?1 K
  4. }1 O* z1 W/ G4 H
Скопировать код
11. showChatWindow(Player player), Y$ X. [) G9 F
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    6 h) j2 y" `9 b/ I4 s3 N8 v9 m9 ?1 f5 X
  2.     // Логика открытия окна диалога
      B3 x) e' `9 b- u; w% F& a
  3. }5 d+ e/ H9 I+ t( a/ X
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.5 R& D3 h! L( K; n' {" n  m0 K
Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
- M2 X7 h$ ^9 i4 k' r" o# R) u$ d! _$ q& @* v+ Y

! T5 @2 w! c: Z; i! R
/ Z3 {) }* O# w
+ S/ U0 E7 q% T




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