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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00
" H: t4 f1 P1 [! G# V. K1 g. y( H& ]: f- l0 q+ b

# Z8 \* P+ V' X, IШаг 1: Введение в классы и методы на примере L2j_Mobius8 E2 n0 n& X* |3 J+ R
С статьёй можно ознакомится в разделе Обучение > Читать
( j( c0 {6 Y4 B# e: S" U' m/ j0 ~! I0 W- d/ P" B. g
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.! x1 {4 a1 s* g5 E
3 b/ C6 Q" c* Y5 I$ U, v$ C7 l: F
Обсуждаем:
- S8 v; n  |5 N# c. z: a( yНе стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!
# S' B" @, I6 m6 r4 o" _
) F- O& m- H6 U/ q, n

4 y6 N% ^5 O" R* ]; @# ~И помните, если код не работает — значит, это он проверяет, насколько вы упорны! 😄 Но мы вместе разберемся!
" F' v: w7 i# Q& D* B. p. ?* G
' ]+ R+ v# \9 a/ ^6 l* |$ H
2 N' f( O+ G( a+ o' j( `8 `
1 ]: ]7 ~# }- s" F' t5 E7 N5 n4 S8 F! }2 L! D. C$ i7 i$ F1 x
. K" I2 g" ?4 [

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?" o  D( t( S' h  C2 X

Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:171 H6 E+ z* f  `# `8 s8 v: y
Почему мы используем ключевое слово this для ссылки на п ...

) [. _6 \5 q' B) |  l9 dКлючевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.* h8 r6 V/ K( ], w+ {$ |, j8 w  [
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.5 k7 e1 T* R) M. P" q1 i

% R; |, }+ H% h! X9 UВот пример:
3 p7 I+ F( k- j8 \
  1. public class Player {1 B5 ~# v; w4 j4 Z
  2.     private String name;
    ' x' g7 N% S$ F

  3. ( O9 Y$ g. F8 U
  4.     // Конструктор
    $ J; q1 t& t& f! \5 G6 _
  5.     public Player(String name) {
    : s- @( [  Y! _+ _
  6.         this.name = name; // Используем this для указания на поле класса' S( T1 _) y9 H$ v' V  N, \
  7.     }
    , t4 B, `8 l! N6 Q/ z" T
  8. 9 m+ v# c7 H- s/ Z# T$ h# g1 d
  9.     // Геттер для имени
    & @' ]0 k+ \9 L' P9 w- @/ j
  10.     public String getName() {
    8 D( c9 g& P' \
  11.         return this.name; // Используем this для обращения к полю класса
    : Q, g" X/ q7 Y2 C0 z" f4 N
  12.     }8 k& O' _; d7 r* D7 K' }
  13. }
    / n+ ^" s' S# [; K
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.
* e% k& C$ M1 A1 `+ ^8 V, H' B5 d( i
Когда необходимо использовать this:. m, |7 G* T) m) m/ b6 L( q. _2 v
Пример передачи this:
+ u$ T* f: Y% U# ?% s' s
  1. public class Game {
    4 c8 e* c7 M) H" y1 E! z+ J
  2.     public void start(Player player) {
    " j. j& B# |1 ]; N
  3.         System.out.println("Игра началась с игроком: " + player.getName());- e8 T' p( a6 B! }& d
  4.     }* r5 K& }1 I5 e! P& e0 ^- `$ [
  5. }# |7 T3 Y) s! y8 V: O) B
  6. ; B/ H- g! g" g9 C
  7. public class Player {
    3 t/ f) M' f0 b! s& M1 m" F
  8.     private String name;$ [6 F3 e+ P8 c

  9. : m, f$ \# `, Q5 t+ y3 M
  10.     public Player(String name) {* @0 [! Z+ m( \
  11.         this.name = name;
    % a" y3 e) C' q% n
  12.     }
      c" {' h& q- Z2 l2 X9 E
  13. % U- ]! F, `0 k  H5 _7 K& f5 T4 J* B
  14.     public void joinGame(Game game) {
    " h3 e" ?7 T' ?4 g% [/ R7 y8 m; p
  15.         game.start(this); // Передаем текущий объект Player
    3 [+ k5 X6 X" b6 I, |" m  b! X! J
  16.     }4 {" r5 b. x" Q7 y1 B
  17. }
    & ^6 N, W7 P% U4 Z6 B/ A
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.
1 {4 Y' h  \9 g  r% R& `2 Q( @
/ J3 J+ i' E  Z) `* l9 W" X# B
Помните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! 😄8 _: u+ w, n- V3 ?

* P0 D) g1 U# j
Автор: Mike123    Время: 2024-10-17 20:05
Добрый день! ! t0 a5 p, Q; a/ U$ ]4 |- a4 s2 {
Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 ) M) O* r- `, }7 ]7 M. i: E
Mike123 опубликовал в 2024-10-17 20:05
9 M% \# _. @$ m6 JДобрый день!
+ s* ~# G4 K6 h& pКак создаются и вызываются методы в Java? Мо ...
9 @) C. D7 N9 `+ z8 P: G" G, e% S
Привет, Mike 123! 👋. {. [+ E/ U! E/ r% G2 ^  m
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.- M+ C* J$ E+ _' m
% M0 g; G, o" q" w; n
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.
7 S5 d, N# A: b4 ^% k7 A' i3 F1 w: G. m. |* \  N3 I

  H' G9 L6 J! _Как создаются методы в Java?
0 _) n, i+ w& g$ M( H& F5 q( x6 {1 [: @4 U8 t% T5 S) j, J- Y6 t
Методы в Java создаются внутри классов. Вот базовый шаблон метода:
$ J" h. I  l# J. a
- `+ Y& [* ]8 U+ B
  1. public returnType methodName(parameters) {
    $ `+ q8 p8 z- h1 ]( v2 {
  2.     // код метода
    ! ~$ I: s9 S6 d! }+ [/ {
  3.     return value;/ ?$ N7 J' ^1 f5 M2 q! h
  4. }. T) X% N4 @2 \( Z& A4 y; ?
Скопировать код
" p0 U9 ~0 p( N5 E/ E, e
Теперь перейдём к примеру.
( W5 ^5 }4 t/ s' e- ?4 O! s( I' }* N# E! _
Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода9 m: v  }. P- L/ M* b* o& U
  1. public void attack(Npc target) {  // public void атака(Npc цель)
    % d& K! x& c) S2 l* b' \5 s
  2.     // Вызов метода атаки NPC
    ( v$ ]) q% e! ?5 E
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());; l8 c1 s; n0 q8 j
  4. }
    6 z# b% z& Y, }- i
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
' |7 G* ?3 A( K& ?) B; y) Z; K$ D
+ T$ H9 e5 j3 g4 f0 v$ N& d+ q0 H# ]; u& y; f
Класс Npc.java — вызов метода  _: U+ E$ k1 A0 l. V6 G( F
4 X, R- P+ D5 c7 @+ R9 l
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    9 V' O. m0 r7 v
  2.     // Логика получения урона NPC
    ) d# M5 _4 u4 o* P$ h
  3.     this.health -= damage;  // это.здоровье -= урон;  N+ S7 ~! k9 d# r
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    ; s8 B+ j2 ~: z5 w
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    : ?2 A  x" K( u. C4 S' |! N' z
  6.    
    - ]/ ~5 Y8 k8 Y2 _
  7.     // Проверка на смерть NPC5 \; [! M+ m5 R3 f
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    5 A! {0 v; N1 a) ]& {! h
  9.         this.die();  // это.умереть();5 i- s4 ?! a6 K6 R/ [
  10.     }! ]/ `$ d; u. A0 j
  11. }
    6 Q- Y/ X6 b- C/ F
Скопировать код
Пример взаимодействия (с переводом)
- I& P* H- F$ L  `3 T$ a$ X" Z
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");
    1 R' i7 `5 X8 `: q) o) U
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");
    3 A& i; ?) J# }9 ~
  3. . D6 J: {: V+ _; D" H
  4. // Игрок атакует гоблина
    2 y7 A9 O0 g5 h3 f
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    # K  R9 n; \) n+ ]
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
* E0 B$ c6 B7 ^+ n$ ]! ?$ s! e' K( |, {0 i( y/ s/ ?

Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.+ e4 Z; c4 `; {
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!
% \8 O4 p1 E: u4 L: ]
/ [0 m9 F/ n+ H0 s7 M
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30' m- Y# e8 i) v
Привет, Астралия! Огромное спасибо за твои разъяснения ...
' M& S/ p; [$ _! n! ?3 k& E
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.
, G' e1 A1 f2 J/ Z  G9 ]% c% U9 H1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)/ {1 u  _! |5 f) x! v
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)
    8 t2 L% H& y/ [1 G, h
  2.     // Логика взаимодействия игрока с NPC7 ~5 g% P* }! S; o( E; o% e* ]
  3. }  l7 X; _; h# [2 d/ R- [, n
Скопировать код
3. moveToLocation(int x, int y, int z)" v5 s& ]: V% O" S6 U1 |4 I6 p: J
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)
    + \$ _. U$ N3 V1 `+ y, m
  2.     // Логика перемещения NPC5 k0 T: f; a  V4 r5 I
  3. }; I6 x1 t% C/ q6 ]! b# L
Скопировать код
4. attackCharacter(Creature target), |% r, V, R* V; j5 Z$ x
  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 урон, Существо атакующий)
    ) ~' a3 x& C4 d1 v2 o
  2.     this.health -= damage;  // NPC теряет здоровье
    : {: }' M5 E% B5 j% H
  3.    
    9 N! M; J' k/ d. Z: v& ?0 Y* I8 Q
  4.     if (this.health <= 0) {* I, R$ I+ b% X' B
  5.         die();  // Если здоровье упало до 0, NPC умирает
    1 B8 L1 [% L2 L0 X+ l
  6.     }
    * |% P: ?0 ~0 b, p
  7. }! z$ |' e( ?6 r( S. |7 f  p- u
Скопировать код
6. die()) b4 c+ S' j$ E+ S; M
  1. public void die() {  // public void умереть()
    , C0 v2 [/ ~4 D4 N
  2.     // Логика смерти NPC1 C: e0 P% C4 e( k7 p' f$ w  D
  3. }
    0 ]: ^( R+ F6 @  }) f: w+ i
Скопировать код
7. isDead()
2 ^: K. N: J" J# l) R) n/ w  h# l( y6 \: M9 ^  U6 e
  1. public boolean isDead() {  // public boolean мертв()
    ) }' }6 R# S9 j( R( _, b* K
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    4 n- M9 h* |( N) y: V
  3. }
    " m  v+ L5 e# \' l4 b
Скопировать код
8. heal(int amount)0 c) e( T% @8 [( W& Y- I8 i
  1. public void heal(int amount) {  // public void вылечить(int количество)
    # S1 q4 j0 c& |/ D+ |
  2.     this.health += amount;  // Увеличиваем здоровье
    $ L7 g- k4 M6 z) d& ?- _2 t+ [1 d
  3.     5 \4 C: z# A: k
  4.     if (this.health > this.maxHealth) {
      g6 }! a0 O/ v0 V
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    & B" U* l5 ]; E# b
  6.     }
    # g2 V4 d2 s5 c) f. j, T  C9 |- T
  7. }  l6 d8 K, M* W' P" f7 l
Скопировать код
9. doCast(Skill skill)
/ r+ N! M! `. S- N3 S7 h" A- e
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
    4 W* @* j6 }% \7 x7 `- @6 G) v
  2.     // Логика применения скилла NPC
    6 s% M$ \4 Z* e' Z  f- {; f
  3. }0 W$ L& ?0 l7 d! T& w  @
Скопировать код
10. onInteract(Player player)
* k8 N) T! ~: B, k
  1. 9 H  p- d9 n% ?0 {3 U0 i% w
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    $ y+ |- n- z. ]9 E2 R
  3.     // Логика взаимодействия с NPC
    8 P% R' c2 J, o, t5 \# D' j
  4. }
    3 @3 R9 M9 C9 H0 F
Скопировать код
11. showChatWindow(Player player)
! B: x3 r# m5 X; H
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    ; m2 o: d& m2 s% u7 F
  2.     // Логика открытия окна диалога
    0 F  x% A' w- B; l+ l
  3. }
    6 t7 f! c1 i/ ^1 `
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
+ l* g! g9 V0 A/ k; \Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
9 Z0 h7 o. |7 h2 X- K  e
: o7 c  E$ z+ c% Z( {4 U& J
. D, U: |9 d, d) U; Y$ ]2 q- p$ ?5 V' ~* P; b

( A* W  c3 b4 q* J) [




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