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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 3 D! v- C. T' d5 f
* k4 ~4 l/ X$ W$ ~! V9 U
. v, g7 Q, ~3 h0 w+ r* ~
Шаг 1: Введение в классы и методы на примере L2j_Mobius4 t  N5 i2 U, w% x* G$ @
С статьёй можно ознакомится в разделе Обучение > Читать
0 l4 J/ S2 `* _! d. a1 s8 }2 ]0 P8 r% ]& {6 g  j, Z
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.  h1 x6 x+ X2 r- d$ C6 x3 f- C
, X+ p' b9 Q4 Q
Обсуждаем:
8 t1 q' E$ I8 S2 pНе стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!. H' g: w. o  e" N# t, f8 l

( v2 A# W7 A% r) [

3 ?+ f  f! D! AИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!
+ M) j8 j! U3 U2 T. L. {: e+ o; q+ J3 @0 d# ~! W: S

2 p8 ?5 ?7 q2 U' T7 n: E9 r
# w8 L8 @" Y1 \7 g" f
3 }, e9 R$ F! j) S6 y. [  Q1 y
2 B$ x5 y. ?1 n
Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
& u6 ?2 C2 b+ X8 d5 k3 d
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17; l% P. P4 X5 B$ a: f
Почему мы используем ключевое слово this для ссылки на п ...
) j0 {2 ~: G* P2 u$ k$ @7 g6 ]
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.$ L/ ]4 E  z% z* ^/ J, p' z
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.3 z) P; ^) o8 ]9 j. `9 u

0 ^) G$ t7 N5 Y) M" \4 ?Вот пример:% T% T/ q, Y) z9 Z' x7 i; O; P! Y% y
  1. public class Player {
    ) [6 R, V+ D1 R3 e2 U( T
  2.     private String name;
    % h) N. |1 v$ w1 W9 K: K5 {+ I$ Z
  3. 1 b/ w" V/ h7 r# l# O
  4.     // Конструктор
    / H" B8 |" s: k3 Z. l2 s
  5.     public Player(String name) {) h4 \8 {2 l( I* d2 p1 Z4 [% M
  6.         this.name = name; // Используем this для указания на поле класса
    4 g( ~9 H$ @! p! {! _
  7.     }; G  q+ {, {1 u$ Y% D

  8. 3 e0 Y/ M) A4 v0 b3 E; U; G5 ~9 B3 k
  9.     // Геттер для имени7 ^, ~: [& P3 F, R) D% h
  10.     public String getName() {
    6 f3 G% i; A& ]9 U/ ]
  11.         return this.name; // Используем this для обращения к полю класса
    8 b. O2 ]; V9 q/ G) ], g/ ~7 d
  12.     }
    2 s: T% e7 y/ s, A
  13. }7 c1 |1 _  X/ ]" v3 `
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name., ]& g  D7 K) J/ H, d  h4 t
) i/ }0 i$ ~! q+ B
Когда необходимо использовать this:. H4 c, {1 r+ e
Пример передачи this:
2 c6 k7 N0 ]/ Z' g( @' C$ g4 L) X9 k4 I
  1. public class Game {! ~) n  E9 J4 z
  2.     public void start(Player player) {3 X9 E9 ~* {6 u- E  w1 P+ ?
  3.         System.out.println("Игра началась с игроком: " + player.getName());& T# A: k, x  R: p4 n& b
  4.     }
    / _7 g0 D9 _* T. ]6 d% q
  5. }# g7 P( \: e$ a, i

  6. . |# D+ x" A3 |7 _) i4 ?
  7. public class Player {
    + U5 `9 T' y% I# M# W, p$ |
  8.     private String name;
    4 {) d- D7 \# f& u! N" \
  9. $ o( _  O9 }8 ^: A) a, a' X
  10.     public Player(String name) {5 g4 F3 \5 u: r% ]
  11.         this.name = name;( T! r0 K& n: C! T9 [
  12.     }
    ' K. h/ y: U9 s' ]- @1 G' ?* W

  13. 1 Q3 x' R" w9 ~0 {% t" T
  14.     public void joinGame(Game game) {
    ; ]% \+ v# G8 E8 p7 s
  15.         game.start(this); // Передаем текущий объект Player
      \; h9 j; I; U7 E5 {- }/ e/ B  c
  16.     }
    . J/ @1 Y; g8 j9 ~, @$ T6 D/ e" Q6 b
  17. }& c: B* C, J4 B) r0 [
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.3 }) s1 f4 D4 [" V/ G3 o' `! a# A

0 [3 z  d7 w9 C' L# P6 Z7 B$ y/ x6 f
Помните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
; t8 Z- d$ z9 G# o3 U6 \" C/ f7 U6 I3 h9 n( I5 ^# t  B) M/ y9 }, T

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день! & ]. u# b" s* W
Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 ' ~$ n% b4 v$ h2 j# h
Mike123 опубликовал в 2024-10-17 20:05! m( X: `2 G! I8 ?( S- M; Y
Добрый день!
* ?" q# ^4 A$ f$ ]  bКак создаются и вызываются методы в Java? Мо ...

, \+ z" j& E4 [( DПривет, Mike 123! ?2 N- g6 _/ U# g, ]" y1 e0 M. W
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать./ Q: P4 u% Y7 K; Y6 X. e: j, L* U

3 V' e  f" ?. S: H! X" a% L( U5 rДля лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.
! b; W+ H% c: J* I& l/ p9 w( F9 V( ~$ S+ x0 h

2 k$ V! j% u6 n, O8 |' rКак создаются методы в Java?) U) t& q  V8 B" s* \; [

6 e6 C! z# K. W3 S# ~Методы в Java создаются внутри классов. Вот базовый шаблон метода:  S' C$ c2 `; `8 q0 I4 |- m) C

7 Y' c% v$ P& n9 f& P
  1. public returnType methodName(parameters) {: X6 c" R  A) I+ B1 R, P9 p
  2.     // код метода  C! ^2 b! Z2 L5 ^% u
  3.     return value;8 z# M* @- Y4 M* Q; Z/ d
  4. }! \7 j  z* R" F0 B$ u
Скопировать код
) Q  X* P& C, V: U5 G
Теперь перейдём к примеру.
. Q; g3 y2 f& L; h3 ^! s7 [& J3 f6 A. `* b
Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода
1 O. N2 O- q  B9 D, R' V  }) c
  1. public void attack(Npc target) {  // public void атака(Npc цель)2 R1 r- j+ F% A8 C  B) T
  2.     // Вызов метода атаки NPC
    & }+ c) ~9 o4 J% K9 d; Q; F
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());
    ' I7 N* W3 y3 g* _% w
  4. }
    . q- ]5 g, j! `& @6 f" d3 [
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
8 u: C. \2 U( j+ k
- N( k; t- h, h. h( q/ M% P, D! H( h; b5 _4 C5 P& e: c) ]- ^
Класс Npc.java — вызов метода
! K  {# n( ^% ^8 }6 t2 f) ^8 b/ d
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    & m2 ]5 U; q3 I
  2.     // Логика получения урона NPC* J1 D9 w7 m4 A* L1 p* C2 g: @$ v7 g2 F
  3.     this.health -= damage;  // это.здоровье -= урон;3 F" g3 h6 `2 K' X* q1 |
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    4 ^. V$ l" _: p7 t- w6 {! e% W
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());& Q9 H5 S# L& ^0 z; ~
  6.    
    2 }1 O( `. R6 E3 J4 U
  7.     // Проверка на смерть NPC0 j" B. ?8 p$ }9 d. l
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    - P+ q) z' d" i7 {5 V3 v
  9.         this.die();  // это.умереть();* {/ Y+ ^' s, J
  10.     }
    % \# [! P& e* b! o
  11. }
    " p% c2 e9 v' C! t
Скопировать код
Пример взаимодействия (с переводом)- [* h/ H: r; x) A1 \1 g  b! a
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");! _) j6 z# o3 g' W
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    6 Q2 h: b( z2 l; {3 u. Y+ c
  3. 7 X* @4 x/ Q1 J
  4. // Игрок атакует гоблина
    - O# O1 U( y' }( B
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    $ F& Q) r3 T9 J! j% Y4 F# i$ o
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
! w9 J8 d" L7 j9 a' t/ O6 X! r5 P' J* H9 L) ]3 ]* w, z

Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.
3 m0 {  X& r7 S. R3 GУ меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!1 j  l) T; A6 e  F, G
, C( I/ O* X% d- w; U! O

Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30, w8 J7 U* h( z: z* W& \3 h" v  N
Привет, Астралия! Огромное спасибо за твои разъяснения ...
+ @, ]* C" q( e
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.# ^8 H) o; v: e3 s1 N
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)- w6 ]' g) X0 A* |+ B$ G! M3 n
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)
    + a9 t7 {& @( Y1 B+ J& W! D
  2.     // Логика взаимодействия игрока с NPC% T) F7 c# T# M( w5 `3 _
  3. }
    $ b5 w* z/ M. U$ V
Скопировать код
3. moveToLocation(int x, int y, int z)
& x5 Z" l. w7 T
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)
    0 y. I) F+ x6 U: i/ \4 q3 Q! J# a
  2.     // Логика перемещения NPC' Y, h5 v% }, H# \: D. ~
  3. }
    % P. W6 ~! o7 f5 J0 l6 R
Скопировать код
4. attackCharacter(Creature target)5 G5 n( @7 z2 [4 Z$ g2 {4 q2 |
  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 урон, Существо атакующий). d2 S# `9 I+ P$ L# [& |
  2.     this.health -= damage;  // NPC теряет здоровье
    3 B, ]7 s* e5 ]7 A8 U. e. j4 g
  3.     4 z1 {% M( @& x% o
  4.     if (this.health <= 0) {  {4 i' c1 K5 d% [5 p3 o1 T5 o
  5.         die();  // Если здоровье упало до 0, NPC умирает: W% h5 H( i8 V
  6.     }7 f- }1 v# g: o
  7. }
    - a+ V4 Z, x- U) a. o6 K
Скопировать код
6. die()
/ \& `+ b. ^( @8 k. Q( u' T% [
  1. public void die() {  // public void умереть()7 D# B; ^- a  w9 G( Z. J' }
  2.     // Логика смерти NPC: V) ^8 F2 w, V" ~2 ?2 F- ]0 V) r
  3. }1 |) O4 ~# a2 m. |, C2 _3 {2 `
Скопировать код
7. isDead()
3 Z( }3 R/ y9 H0 k7 P( i# s& u" n/ q; C3 k- I% p  E* X: S/ e
  1. public boolean isDead() {  // public boolean мертв()
    ) a. j+ L) N6 N. K" x. s
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    * `0 a9 j8 C; h0 a2 i* J5 K  L
  3. }
    ) Z( \$ }/ Y7 M  ]( i% y! I7 ?9 y
Скопировать код
8. heal(int amount)
# W% P/ I; d  V. v3 ]
  1. public void heal(int amount) {  // public void вылечить(int количество)
    8 ~5 g9 C/ [0 y5 x: r
  2.     this.health += amount;  // Увеличиваем здоровье
    8 `/ f( l  i5 J) [4 b9 ^
  3.    
    9 B  o. ^% P6 I, r0 l$ m+ i5 S' ^5 f
  4.     if (this.health > this.maxHealth) {
    9 h* O/ g* {, K% ^# R1 [
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального% ]+ Z: ]/ r  F/ T' i
  6.     }
    8 x# v$ w7 N3 ^7 q7 u
  7. }  n/ h( _! G7 A
Скопировать код
9. doCast(Skill skill)
  }% s+ G) G: G/ |4 P1 {
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
    " H- F: k# a1 ?8 K! I
  2.     // Логика применения скилла NPC
    ' W4 W6 |" F0 K* B; |+ d
  3. }
    * X' ~! y( W1 i
Скопировать код
10. onInteract(Player player)% D. b" k5 d- o6 ]& U0 ]

  1. / n) ^9 W5 a0 u7 `+ u
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)$ X. [, X" v1 l$ p' c* r3 E
  3.     // Логика взаимодействия с NPC" [0 a( N% Z2 K3 B' ]- |
  4. }+ z6 i5 S6 |( n: e& `: K9 J
Скопировать код
11. showChatWindow(Player player)
/ @6 W! N8 c$ d% ^! A
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)* v5 O+ w  q  \+ T+ X8 \
  2.     // Логика открытия окна диалога
    & C& x" I3 v1 B8 f9 H' `$ h
  3. }
    ) f  q! V5 V; E$ h
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.  v/ v, H" I$ D! L, m
Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!; d6 {, d! w# O* g: }. b" D" V
9 x  A$ f; v( E
/ ~6 @. t. Z& f8 l2 q
3 `3 @( o0 H) v7 |1 N

1 s" [8 M( @+ n4 P6 ^$ r




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