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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00 0 I) {5 ~' a5 S; U% B" \

; ?8 l! M1 j' T& V
4 e7 D$ E- M& p% f6 R& f/ cШаг 1: Введение в классы и методы на примере L2j_Mobius
; n- S1 p2 H5 n. iС статьёй можно ознакомится в разделе Обучение > Читать$ }% I* }3 {$ y; A! }

) \! R6 f  j: c4 y, n# pДобро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.7 ~- D  s# u0 c
2 N# e/ ~3 O6 @$ {& Y
Обсуждаем:% x, f6 T# k5 F9 K( ]' s2 O% E
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!! v( Z6 O2 H" s8 ~! `5 g

$ Q/ f1 p% r8 A

0 _- @- x; }) eИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! 😄 Но мы вместе разберемся!2 ]- ?; r. b5 [; B' _

2 G) |1 e2 O- j8 M4 f
5 h; w" B, g  ^# m, P
! V* c* ~+ ~9 u4 `; ?6 ]& Z: }/ `# j5 h% H, ^3 d  B
7 ?- E& ~) U# r9 C

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
1 u5 ^# B+ Q: z1 a
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:172 p8 ~, O' j, o9 c
Почему мы используем ключевое слово this для ссылки на п ...
+ s' P: b  J+ x
Ключевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.( Z+ p$ j* a/ J& j2 u& Q$ U
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.2 ~+ ~8 n; X/ d

! Z2 b6 J0 ]: x+ R9 xВот пример:1 l6 |: N* M  O, ~
  1. public class Player {+ s. n0 z0 Y% k) |3 ^4 U( T
  2.     private String name;
    * G# n1 P0 F1 P% M2 b) W/ n+ Z
  3. ) f) d. f: ^# {* w
  4.     // Конструктор
    ( i7 F" b8 k1 g0 x* A) ?
  5.     public Player(String name) {) L1 \2 r2 \+ p0 h
  6.         this.name = name; // Используем this для указания на поле класса
    + `0 p0 s* H3 |  z2 n8 J
  7.     }6 N4 V* {* C- ~& V6 k; `+ K

  8. $ |3 `$ x+ ~$ O. n: k
  9.     // Геттер для имени
    - |% D4 `0 e* x6 Z1 ?3 h
  10.     public String getName() {7 f; R( @. Y8 J, h$ c/ _
  11.         return this.name; // Используем this для обращения к полю класса
    ; o* @4 [. h  U8 ?! @$ @' @
  12.     }
    8 }0 ~! }! \, l
  13. }# E5 F* a6 l3 Z% c1 d
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.7 \9 u( R; X3 i+ y3 h

/ C" N! J0 `, R* ?; JКогда необходимо использовать this:
$ |/ \. X$ c: F" G( D+ P7 KПример передачи this:
. I+ t/ I# o) M$ X% M6 W9 F, _
  1. public class Game {- Y2 P: }: H) f) C( l6 M5 R
  2.     public void start(Player player) {
    % I* Y0 P' Q2 D4 K6 S  \
  3.         System.out.println("Игра началась с игроком: " + player.getName());) v+ q1 D+ c9 E3 i. B8 b6 j
  4.     }
    ; ^2 V, K) E2 \: u
  5. }
    , \8 A5 T" p; j9 d9 f. g

  6. ) p3 M+ T1 _& Y3 A! {
  7. public class Player {2 P1 F8 D% o' g' [/ r7 e1 _
  8.     private String name;
    . G+ y+ v; a  K( l: k

  9. 2 |+ S% [5 u" f9 Y6 D/ |
  10.     public Player(String name) {# \7 |6 `  `/ d
  11.         this.name = name;
    ) [  }1 v9 \$ k0 O
  12.     }4 z  E! V4 ?  W

  13. + m4 P& C- K7 K+ X
  14.     public void joinGame(Game game) {/ K4 @! e. M* H. X" x% I, Y
  15.         game.start(this); // Передаем текущий объект Player
    ( \, d$ Y  f. e; b4 V
  16.     }
    5 `9 `, i' Q" u
  17. }! e' i& ?, A/ t% L) H! Y6 G
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.7 B3 v! R( ~( g+ H3 {


; d" T8 i. S: k1 k4 y4 h! M6 e. XПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! 😄
) `8 u3 `1 L4 z6 a. J2 y: ^; L7 c  H$ r. h2 a/ V) ?

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день!
( B" r: H9 Y5 TКак создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 ! \6 Q$ f% D) E! N6 n. U+ c3 Q% |
Mike123 опубликовал в 2024-10-17 20:053 Q& l2 a4 D% h
Добрый день! 2 w) @" ~  A9 J9 ?' Z/ o
Как создаются и вызываются методы в Java? Мо ...

  X7 L2 f0 x, r2 T+ M. nПривет, Mike 123! 👋0 Z$ I. G1 \  I/ b6 B# F; H
Отличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.* ], E& U; }5 h5 k0 i. J
, k6 a; e$ }! P. g+ H
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.. D* c* G" ]* K- e9 p( d" l
3 {3 G) `- e# O0 P# d' ?* Q
  O8 t$ n* y7 H( ?
Как создаются методы в Java?/ ~" p8 Q) m4 ^: |
8 d' T; s6 @& u; J. K: |* Z; i
Методы в Java создаются внутри классов. Вот базовый шаблон метода:2 {3 {$ _) v" |9 ^4 P3 f$ X

! z- M8 ?/ }& o2 H- ]4 r
  1. public returnType methodName(parameters) {3 d9 K# N: e, Z
  2.     // код метода
    / s( T) R: a+ F  Y
  3.     return value;
    . Z8 v! v7 Q$ `* A. F& \
  4. }1 Q4 N0 o+ L6 r* P  x3 w0 V& y
Скопировать код

4 E. A2 {$ n  S! h  G" b& zТеперь перейдём к примеру.& A5 x# C1 x  \3 b: \: g
! n0 {& s8 S) ?/ K5 m! ?+ {. V
Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода
7 Z2 Y6 e$ _- r  Z. i) W
  1. public void attack(Npc target) {  // public void атака(Npc цель)
    4 l1 J& |: o( j2 Z4 Q
  2.     // Вызов метода атаки NPC% R/ y! @  |; o7 G5 A  E- O% s0 B
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());
    ! ~2 _; Z0 {/ }" L% Q
  4. }  Q7 q( J* b5 `& z
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
/ c4 Q. B3 T  U! w. ^/ L: Y1 h* [* N; Y9 g" K$ ^/ {

- ?, y+ u3 n3 N3 U8 W4 M6 eКласс Npc.java — вызов метода
: G$ h3 l: O8 J
' X  j% H1 X3 p4 J( w- B! m* W( i
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)) }* _& c& m& Y& F% f6 X
  2.     // Логика получения урона NPC0 X, X$ ?) l1 u
  3.     this.health -= damage;  // это.здоровье -= урон;0 l+ n- `& L2 |
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    # y- \8 l( `6 [
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());, P5 G8 d; Y0 ]4 j& o2 o3 j: R2 \
  6.     : e9 w8 ^; O4 y, t. W3 n4 Y- H
  7.     // Проверка на смерть NPC1 R/ H( X& R# B: F- {
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)
    & w  ]! Z" P7 s" g9 L8 ?- F+ p
  9.         this.die();  // это.умереть();
    0 p- m4 x. s" n
  10.     }
    5 X; \* P, ]  T( H! _! h
  11. }6 X& o! Z" j6 T  V
Скопировать код
Пример взаимодействия (с переводом)
  o+ ~" L+ X* C9 O6 L
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");! F% e# L/ F* [. B; P
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");% K9 }3 u6 y: `2 ^

  3. ' J" ]% b3 W/ \$ i5 G
  4. // Игрок атакует гоблина
    0 i$ S) @2 t: y! ?
  5. player.attack(goblin);  // игрок.атаковать(гоблин);( r9 g  l4 [8 I! W2 {4 f
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода. 8 g* y: N; w+ e4 B+ B. h# v0 F

  J* y5 ]: T7 g2 ^
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.$ o& F1 D  \: O
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!- L- q8 U3 P1 h* K
! v5 Q: }$ D, z: A: s

Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30/ c8 s: E* O. N' i
Привет, Астралия! Огромное спасибо за твои разъяснения ...
2 v7 I% f5 K5 [* C: N
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.
0 {% y* e- {5 O1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
5 r' R6 y8 I+ ~% Y4 L
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)
    - Y; _2 i4 W* ~- X  o
  2.     // Логика взаимодействия игрока с NPC
    $ y/ H* n0 ~" Y2 x5 U: E
  3. }! J% [( ~7 x, g8 M; S6 C- E) ^
Скопировать код
3. moveToLocation(int x, int y, int z)) @9 X! y5 D% R; Y6 h; ?. Z* J+ m7 ^/ }
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)
      D* J1 J% [* S/ l5 K' v
  2.     // Логика перемещения NPC
    4 H- R$ b; U; m9 C- T
  3. }0 c7 t4 W2 d% J% e3 p
Скопировать код
4. attackCharacter(Creature target)' z" z$ W7 B4 t: r9 H  h
  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 урон, Существо атакующий): F/ A0 y8 x% t! W+ t0 j7 o3 C7 \
  2.     this.health -= damage;  // NPC теряет здоровье" g' X$ u( w/ e9 @* Q
  3.    
    ) Z' ^- ?; t5 L
  4.     if (this.health <= 0) {; X; n) i: y1 Z; \
  5.         die();  // Если здоровье упало до 0, NPC умирает
    / w3 ?; C& k- m
  6.     }% H6 x( f" I) J& @, o* ~: M3 A
  7. }+ w% k0 _/ H. ^2 F/ O, R& o+ u. t
Скопировать код
6. die()
7 l0 D+ }$ J" Z! E2 ^7 A
  1. public void die() {  // public void умереть()
    0 u2 |0 y3 v. x
  2.     // Логика смерти NPC- h% f+ f9 \* G5 \- x3 T7 K
  3. }1 C3 n! j% |, L8 {! s4 }5 G, O
Скопировать код
7. isDead()( N* o# W* y" {! Z! k" O7 R! I
5 v, Y: k. m4 I3 l6 \0 f
  1. public boolean isDead() {  // public boolean мертв()
    - f( {, \" b5 Z% q. H4 v/ ~+ W' ^
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    * W# W' r! d7 r3 P! n0 ~. I( q
  3. }
    0 y6 f$ o! ^. Y5 q& V
Скопировать код
8. heal(int amount); P1 G( ]; [3 j7 N1 i$ O5 B8 ]
  1. public void heal(int amount) {  // public void вылечить(int количество)1 p! G/ T) B6 f/ @. @' C' i
  2.     this.health += amount;  // Увеличиваем здоровье
    8 C0 t5 c0 M' o+ f% s$ A( H
  3.    
    / A: c  J$ Z5 v6 {
  4.     if (this.health > this.maxHealth) {2 ]6 H' ]. \) T0 L3 b2 M  c" e
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального" Z! @' ~% g4 `4 n& z" j
  6.     }
    " V) K7 k1 h4 s2 G- a
  7. }
    0 m+ k: A7 Q, r$ y5 A3 U6 A5 B
Скопировать код
9. doCast(Skill skill)4 C- J* o+ j6 N6 J+ q
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)
    ! @( X' s0 Z1 c$ I
  2.     // Логика применения скилла NPC
    0 H! B4 i! I: W4 X6 f
  3. }
    " c8 b- F3 {' c
Скопировать код
10. onInteract(Player player)
5 e2 V) E9 m7 V) p

  1. 9 w) M4 u7 ~( Z' p
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)6 |/ D9 }6 o6 \9 Y$ h7 r$ j
  3.     // Логика взаимодействия с NPC
    + {8 w# p/ m* H- h
  4. }
    7 L0 r, c0 u2 }8 V+ M: w: }
Скопировать код
11. showChatWindow(Player player)
: o! z, J# B% t6 p3 U
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок), Y! D- \: ^5 m
  2.     // Логика открытия окна диалога
      m/ g! z" C0 B9 `) t
  3. }
    * q; I' `6 e# T1 E; d* a0 ]  f
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.; F, t. P6 r6 _* O7 E
Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
. [9 C- j% `9 b
0 ^6 P3 W- W: q
) G2 S. E7 {: J; T8 ?
& d, r: u7 u( T8 G
' _' g5 h" K9 L' h8 g! s( f




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