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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00
8 |0 k% c8 B8 s7 \
1 T, i# v1 T; Z+ D
5 T. T& V4 i! S# e1 y* QШаг 1: Введение в классы и методы на примере L2j_Mobius7 g! d; g2 t) _) R* a4 _9 A2 m# Z" w
С статьёй можно ознакомится в разделе Обучение > Читать+ c0 Y4 \5 H0 X- g
2 `* v. p9 y$ _& r( J
Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.
: c) V. s6 |( d+ ]/ @" E' V# n& a' {, i0 T3 ^( K
Обсуждаем:: M1 ]' m8 _2 T- J) ~
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!: |$ q5 c1 @1 K$ H5 Q4 G

! O1 i& w% I8 }0 v, ~9 t
6 U, Y) a& K- c
И помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!
* q# Z2 J. J1 F* X7 R8 B9 B- H0 I
3 f9 d8 z  O* v- s6 E9 W
" I8 r5 [4 |& ]- d# [/ U# _6 R* _: A/ D  [) b1 d% D, S

* ~, [9 t! O  R2 O% z/ O5 l, u
" j. w5 R  c9 w% q+ I- Q1 ?
Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
0 p3 U( X. o9 e" T7 t% e3 s
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17
7 |  V# [4 S1 J9 \Почему мы используем ключевое слово this для ссылки на п ...

0 M% t' K& ~7 A9 C! X4 DКлючевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.
8 k- `6 d  F5 ~9 L/ a: TПредставим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.
  a+ _% f* i0 v0 [) Y7 c) d! S2 e  B2 T" N: T1 ^  {' S
Вот пример:
$ r% F  v0 b' P7 L, ?* h
  1. public class Player {
    0 i0 V" v1 Z* }! W
  2.     private String name;0 r& L1 k# q- g1 r) v, g- q, U
  3. ' l/ k( v1 X- P" P5 q# f
  4.     // Конструктор
    0 ~  P9 s% I  e2 F" ?: |6 Z7 h
  5.     public Player(String name) {
    ! w" K. x1 f0 s) `8 E
  6.         this.name = name; // Используем this для указания на поле класса
      T) B9 M3 k- C# V1 X. \$ L& P
  7.     }
    - v. V" s; e8 d  S  n: y
  8. 0 {0 T/ [$ i) P
  9.     // Геттер для имени
    + q  f2 _" b7 X! e: |
  10.     public String getName() {
    7 X, ~7 x# f7 b4 x2 ?# Y
  11.         return this.name; // Используем this для обращения к полю класса3 a8 F* m* R' X: X9 ]
  12.     }
    , t8 Q  \+ o& t# C7 q1 N
  13. }
    & p& P- p- d( v# m
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.
3 o( r3 ~. s6 \. ~* y7 @$ p
% J. Z' Q3 V2 Q. c% _  n; F, xКогда необходимо использовать this:; ?+ q+ z% {4 A% p+ i0 j
Пример передачи this:, @* ~  y4 S& ^& G9 Q
  1. public class Game {
    5 i; |+ F% M; L
  2.     public void start(Player player) {
    & z# q! v$ Q! j) _3 H
  3.         System.out.println("Игра началась с игроком: " + player.getName());" d. {3 B. H- U7 `% e, ]& R
  4.     }
    4 E8 n- O1 A7 o+ w  f1 V. C
  5. }
    ; j. K7 |4 Q+ I* _
  6.   f0 |) u5 x4 S: f$ E9 U5 K
  7. public class Player {
    ) o% ?: h8 |. R2 B' ~/ n' E
  8.     private String name;" H5 `3 H; x; U
  9. " t  v$ ?$ H1 R, J2 B0 E4 d
  10.     public Player(String name) {
    " x. i1 K9 F) H: C! E( |& d
  11.         this.name = name;1 U  K/ k- J  a+ T0 W$ N0 `
  12.     }: c/ @7 z9 _* `( `. k% Y- W7 `
  13. 4 M9 d7 S* l! Z4 a
  14.     public void joinGame(Game game) {
    $ t1 t1 c/ o- `0 D
  15.         game.start(this); // Передаем текущий объект Player
    , G. o9 A9 h2 x0 c& ~
  16.     }- W% z% y0 V3 b! z% w1 h. f0 M
  17. }
    9 D- Y/ [! r5 y; z; ^  \* {
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.& ]* k$ W  J* V, E; A- E1 {


% ^- H# z/ _: X  i, E9 y) ^# @0 xПомните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
  R5 X. d7 n' ]( B0 g6 ~$ ~
$ \' ^! P2 S4 e6 q# l% l, o
Автор: Mike123    Время: 2024-10-17 20:05
Добрый день! $ _5 A4 D% J5 q2 s
Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24 & v8 {! R) j: y4 a8 m0 ?& D
Mike123 опубликовал в 2024-10-17 20:05- ~9 D0 }8 [3 T9 K* y4 @0 p
Добрый день!
  z2 l$ b% L; U* k- B7 ]6 QКак создаются и вызываются методы в Java? Мо ...

! T! P5 x; ^+ \$ MПривет, Mike 123! ?
+ F% i6 m* x2 Y- k) D) `; UОтличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать., X+ Z/ ~) G0 }* j+ Q, k2 p7 W

; [7 g/ n2 q  J% ]# h: @) KДля лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.
% z$ k% D3 g" J) R3 v8 }" o
( [+ U5 a7 p1 n; n" P( p7 O% @
# m; w5 l7 `0 K9 |: \Как создаются методы в Java?: x. M% K" v. t+ M  a
" X0 i( B" A3 d. {0 ?5 J
Методы в Java создаются внутри классов. Вот базовый шаблон метода:
( ]& g1 B4 L" K% l5 I
; @/ ?6 ?" s* @" X
  1. public returnType methodName(parameters) {
    1 Y! A+ F, i" ]# _9 r
  2.     // код метода$ B2 g  B) s- D' U) L
  3.     return value;4 V& c# _; y! K; x; p
  4. }
    " W7 U' E2 j$ I4 |) c! y6 M
Скопировать код
5 Z' f( n9 C! ^3 f- k
Теперь перейдём к примеру.' w! I3 c7 S& d  b3 I
/ |; Z: U1 f9 w1 ~. a% d4 u
Пример на основе L2J_Mobius с переводомКласс Player.java — создание метода8 q! [! Q6 ^! }1 R* d
  1. public void attack(Npc target) {  // public void атака(Npc цель)
      y) p+ y3 f" d
  2.     // Вызов метода атаки NPC- K, P$ {. \6 i: T- {, r$ T
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());; F$ S! H& n0 j/ D7 ~" v
  4. }& `; k- p: h' j# h
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
% L. H8 H9 e+ w) y# G! Y% Z4 J6 a0 s5 e' P! x7 `7 T

* t8 [4 |; I# K8 C8 cКласс Npc.java — вызов метода
2 M: f3 ^9 n! B* {# X2 W% P5 f, R# b1 t: R# p
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    % Y; a. n( F% {1 _5 W# `
  2.     // Логика получения урона NPC
    6 o! |! A( b2 {
  3.     this.health -= damage;  // это.здоровье -= урон;- f( J& C* ~7 i5 i1 `* \! }' d
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  2 B  f; i1 B; Q  W# J" q
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    $ f5 G6 b  _+ B. T
  6.    
    6 P. R; A, i* c) [: Z
  7.     // Проверка на смерть NPC  B4 A& Q# U/ I' k
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)) s7 ?  m8 x% T) k# e1 A
  9.         this.die();  // это.умереть();( y  N5 \, A: c, R3 E- C/ L: N- I
  10.     }1 M8 Y1 L+ v% s
  11. }# f. |) n5 Z4 A
Скопировать код
Пример взаимодействия (с переводом)9 \) S6 E& n7 M8 X
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");' I# A$ [! ~8 i, h& Q! }
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");& Z' z3 \# R( N" ~) t# d9 O

  3. ; Q$ |3 X. M/ d0 ?& z
  4. // Игрок атакует гоблина' U' N0 k) }" f( L
  5. player.attack(goblin);  // игрок.атаковать(гоблин);" A& J" h5 I  {  E' j
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
1 B; V* Y, n& N- \. M4 U
* q) h% y2 l7 w* J# M9 z$ `4 u& Z
Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.
- M* `. E6 s( T* B) }У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!* j6 K1 Z% L. H$ C

+ A* _# ^6 g- Q% h8 z! K* f5 b
Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30: [9 }1 Q7 s5 O' i
Привет, Астралия! Огромное спасибо за твои разъяснения ...
2 o$ i3 r" l9 S
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.3 c; ^- ^, l) f7 J6 W
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)
8 k6 @0 v; F* _/ C% G8 j0 b
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)
    1 m; D$ E& x; M2 B" p& x) ^
  2.     // Логика взаимодействия игрока с NPC% v5 j+ r  r% [" x+ B  x3 J( ^
  3. }
    % U! ~) p' o0 J- w- \$ d
Скопировать код
3. moveToLocation(int x, int y, int z)
# ~' G4 A* i- i3 \; n1 ]( V
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z), o1 ^  n: O% k) P( E
  2.     // Логика перемещения NPC8 W. B8 B1 B6 L' `
  3. }
    ( W  h% ]% y3 y, B$ {
Скопировать код
4. attackCharacter(Creature target)
3 M- r' ]/ k1 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 урон, Существо атакующий)
    ( v* W+ g+ e5 R( X4 a" [* k
  2.     this.health -= damage;  // NPC теряет здоровье
    * U$ x: e* Z2 ^/ y6 x  Y! o
  3.    
    " c8 l; Q9 F( W$ R* z1 M& v" p/ ]- e
  4.     if (this.health <= 0) {  f+ @" W) X4 M3 W6 m& R8 b6 r6 s
  5.         die();  // Если здоровье упало до 0, NPC умирает
    1 l$ H% G" [  X$ g) @, A) [
  6.     }
    , [  |8 n! w# q; x0 F/ ]5 s
  7. }
    * v* n# O6 l3 h- ]
Скопировать код
6. die()
! c' V2 G' B  Z3 w0 ^" T! M( Z
  1. public void die() {  // public void умереть()1 E% f: Z" K" v% v
  2.     // Логика смерти NPC
    * F8 I# O6 R9 ^& b% V6 z( V6 c1 w
  3. }* m& F* R4 |. b4 g) j; E
Скопировать код
7. isDead()
* ~/ P+ K, y/ E3 j- R
! R. C1 I# Z7 u. D6 R2 m
  1. public boolean isDead() {  // public boolean мертв(), R; I% J3 Q' `, q$ x8 d
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    - k. ~' c' }* }; c
  3. }! ~/ o' X4 U' h- M2 l
Скопировать код
8. heal(int amount)2 ]$ E; T) k( O7 z' s4 x5 w
  1. public void heal(int amount) {  // public void вылечить(int количество); v3 a( F2 X) O5 n! H
  2.     this.health += amount;  // Увеличиваем здоровье
    : R6 L/ w" `% j3 }( j+ [0 I
  3.    
    % x) x2 [8 v) W, k
  4.     if (this.health > this.maxHealth) {0 R, Q* @; b' C/ n) M+ @0 j
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального
    * p$ ~# d2 B5 ^% S- L9 K. s
  6.     }% E1 h# v1 _( [$ ]! N2 H& g
  7. }
    " k- X$ z* j( R7 ]; u
Скопировать код
9. doCast(Skill skill)
9 y  z5 \3 `% y. t( U* M0 n. n
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)+ R+ G% S2 z4 p5 Q7 f& i: l
  2.     // Логика применения скилла NPC, W  w" f' K1 t$ h; q, u! T9 A1 A
  3. }
      p* A7 O! F- l# G* y6 Y
Скопировать код
10. onInteract(Player player); u* l# p1 Q4 S# x: l" V+ C( z" }
  1. 2 K7 V1 B" ~/ C' l$ O
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    - k. I: P9 A5 `
  3.     // Логика взаимодействия с NPC
    2 T2 d1 H, L) _0 Y! i* u& ~
  4. }6 c. u0 {& |" M1 O
Скопировать код
11. showChatWindow(Player player)
5 d- g! j5 Q  t5 z& O
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)
    2 s5 S& r2 L+ n9 |& c0 e( ~% y
  2.     // Логика открытия окна диалога) p; c: S5 @: T) R
  3. }
    ( J* T$ B( b; x; D
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
! @" U  n# {6 x; o5 ]Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!$ e0 d2 Q% Q* V

( D; K% p3 D+ g& y7 l' x. z: J) a# [8 d- n' B
" @. _7 }+ T( v/ b* d: v* ~

! h; D! L8 L9 P: b' q/ J& _8 R




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