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

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

Автор: Astraliya    Время: 2024-10-16 21:14
Название: Шаг 1: Введение в классы и методы на примере L2j_Mobius
Последний раз это сообщение было отредактировано Astraliya в 2024-10-21 18:00
' z% ^! r3 N+ w9 d; B' A* }5 E7 Z. S3 ~2 h, D( M$ R

/ f- d  J  M) HШаг 1: Введение в классы и методы на примере L2j_Mobius3 t7 [! d2 m8 C% s7 n2 c. O* G% p
С статьёй можно ознакомится в разделе Обучение > Читать
- O: ]; }( z9 S0 B: J; d
/ f0 M5 B% t! u" [. b/ ?7 S7 J* X' ]Добро пожаловать в обсуждение первого шага нашего цикла образовательных статей по Java для разработки серверов Lineage 2 на основе сборки L2J_Mobius! В этой ветке вы можете задать любые вопросы по теме классов и методов в Java, обсудить примеры из статьи и поделиться своими наблюдениями.: }8 a# _  O% X8 m8 I3 p
3 |9 Z! p) X; a6 i
Обсуждаем:- Q1 C8 a" H' B! k& o2 S
Не стесняйтесь задавать вопросы, делиться опытом и помогать другим изучать Java и разработку серверов Lineage 2!+ `3 ^$ o- {/ U* m  y4 u; X. Y

: i* e' d7 Z) O

5 t# j  n+ Q) N7 \" JИ помните, если код не работает — значит, это он проверяет, насколько вы упорны! ? Но мы вместе разберемся!3 m$ L% @  d0 F9 \4 ?

$ s% ?8 m, A9 |. G0 Y7 d2 [
6 h8 o; _8 J, b6 Y' V0 p8 Y, J+ v" g8 f* m- F( x  J' i

+ O$ K! `5 {+ r& p# A6 j# x& f4 Z% v8 I: ?& [

Автор: Mike123    Время: 2024-10-17 01:17
Почему мы используем ключевое слово this для ссылки на поля класса?
( r9 m+ c) N# e4 }+ t7 i& B
Автор: Astraliya    Время: 2024-10-17 01:29
Mike123 опубликовал в 2024-10-17 01:17! v2 V1 K% i) ^$ C% C) D
Почему мы используем ключевое слово this для ссылки на п ...

* t2 c/ L  u6 `) }8 ]1 IКлючевое слово this в Java используется для ссылки на текущий объект класса. Оно необходимо в тех случаях, когда имена параметров метода совпадают с именами полей класса.2 V# l* M. w: \% ?
Представим, что у нас есть класс Player, у которого есть поле name. Когда мы передаем значение этому полю через конструктор или метод, можно столкнуться с ситуацией, когда параметр метода или конструктора имеет то же имя, что и поле класса.
  m: w) p6 ?/ N& }5 \- `" T0 p4 D! p4 {! R; ~8 x1 H0 H
Вот пример:9 s. y& W0 }7 `2 b  v5 ~
  1. public class Player {
    $ b5 A5 D1 E1 |& C
  2.     private String name;
    6 a( v0 p, J/ g( R! i% b% ^  ~, k# X
  3. 1 g) [. _  G, z& b/ J
  4.     // Конструктор
    % Y: W2 c& q/ Z
  5.     public Player(String name) {4 i0 d1 h. a' j/ }: {
  6.         this.name = name; // Используем this для указания на поле класса
    - @4 l* p/ f/ X/ C9 b3 i5 V* g
  7.     }/ B1 f9 d5 o! u6 ^" {$ @
  8. & t4 u5 ^9 K5 h; j' M, G" C
  9.     // Геттер для имени
    7 P. y! r! I3 W% U( U# F4 D/ r
  10.     public String getName() {
    ; {9 M1 w" W8 B
  11.         return this.name; // Используем this для обращения к полю класса
    - U1 w7 K5 a- Y! h" u8 Y& [
  12.     }7 v2 [# y/ l; B' R4 |
  13. }
    . y* \$ @3 x+ E% u. w1 i6 M
Скопировать код
В этом примере параметр конструктора и поле класса называются одинаково — name. Чтобы указать, что мы говорим именно о поле класса, а не о параметре метода, мы используем this.name. Это ясно даёт понять компилятору, что мы присваиваем значение параметра name полю класса name.
7 [# R. `) o3 c" z) I+ C7 k' e2 w" }4 n
Когда необходимо использовать this:; j  `0 T, Y. j
Пример передачи this:
$ |+ z9 L4 W- X( D
  1. public class Game {
    ) C3 N  i2 U+ [6 ]5 B0 C
  2.     public void start(Player player) {
    0 c0 Y5 Z- v! j6 C/ S7 [* Q3 y* Y
  3.         System.out.println("Игра началась с игроком: " + player.getName());
    7 I  F6 p8 v' Y$ S- g
  4.     }
    1 `0 H# ?$ t; P$ a* o+ k
  5. }
    ) y7 F5 ]/ |( B0 k
  6. 8 ]( R0 x$ e$ G" [
  7. public class Player {! ?: B% E% p! m
  8.     private String name;
    / \) K+ z  X) C4 F
  9. " {0 F+ }1 Q( w7 v' x$ d' ?$ f
  10.     public Player(String name) {
    ; F9 B3 x8 w/ Y, Q) d
  11.         this.name = name;$ e8 w5 m* T7 {; j
  12.     }, r( U& T& R( W+ F' l/ y6 W  w
  13. $ x. \0 p& Z3 r0 h
  14.     public void joinGame(Game game) {7 |: ]+ ], f7 `+ P$ b
  15.         game.start(this); // Передаем текущий объект Player2 N8 g; C* y" B3 ^. |9 B4 G# R
  16.     }/ t, J) b$ G  O3 h2 y( k' ?
  17. }5 y# w2 A3 ?7 c3 L0 X7 P
Скопировать код
Заключение:Использование this помогает избежать путаницы между параметрами и полями класса и делает код более понятным. Это ключевой инструмент для работы с объектами и методами в Java.. }. y- L2 z; d; ^& N' Y

+ {, [! L* |  ^- {. t
Помните, если Java кажется сложной, просто представьте, что она — это NPC, которого нужно приручить! ?
# g# r8 R2 i% U. r6 N/ @. M$ j1 N9 B" l

Автор: Mike123    Время: 2024-10-17 20:05
Добрый день! : J- V# k' w6 R: B
Как создаются и вызываются методы в Java? Можешь показать на примере взаимодействия между методами?
Автор: Astraliya    Время: 2024-10-17 20:23
Последний раз это сообщение было отредактировано Astraliya в 2024-10-17 20:24
  q  ~3 W$ v/ y' L: N. n- `
Mike123 опубликовал в 2024-10-17 20:055 C# o+ J* H6 C0 W
Добрый день!
6 X9 W- S9 e; u9 ~% L# cКак создаются и вызываются методы в Java? Мо ...
# ~' o  K: E; d/ v( _
Привет, Mike 123! ?
$ s/ k: }$ C" Y& f' SОтличный вопрос! Давай разберём, как создаются и вызываются методы в Java, на примере из исходников L2J_Mobius. Методы — это один из основополагающих элементов в программировании, и они позволяют нам разбить код на удобные блоки, которые можно многократно использовать.. v: x, n  w" |1 m$ q' I8 |7 Z' p- f
( F1 R, g4 O4 Y4 K9 p" O
Для лучшего понимания логики кода и изучения английского языка информация будет подаваться в двуязычном формате. Сначала будет представлен код на английском, а затем — его перевод на русский язык с пояснениями. Такой подход позволит не только разобраться в структуре кода, но и улучшить владение английской технической терминологией.6 e7 W. a- V. ], m' J
5 R; L) B  `0 i6 W
$ R. x8 v9 B2 i* k  D
Как создаются методы в Java?
& u: U0 P7 p5 [  C& R7 C
: o. L. j0 W( N7 AМетоды в Java создаются внутри классов. Вот базовый шаблон метода:
7 K/ C1 \' g: S7 b" [0 @0 j" g7 G  P$ G
  1. public returnType methodName(parameters) {5 `, c8 |9 u& l7 k. D! K& v
  2.     // код метода5 V6 ?( C. i. l
  3.     return value;7 n: r1 H- u4 y  K7 ]
  4. }/ s0 Y  E8 U6 L- Y' N
Скопировать код

: w9 c  _7 q5 G) ~Теперь перейдём к примеру.5 T5 C1 `7 B$ G% _4 B& i, d' n

- i( I) z$ G" D6 b& UПример на основе L2J_Mobius с переводомКласс Player.java — создание метода
* j% {# l  U/ {& z
  1. public void attack(Npc target) {  // public void атака(Npc цель)7 X& M4 a+ H2 s# ~; o9 O- E. o( U
  2.     // Вызов метода атаки NPC
    9 H& @+ D% k  {5 J/ \6 S$ u  @
  3.     target.receiveDamage(this, calculateDamage());  // цель.получитьУрон(это, рассчитатьУрон());- \; v% E. t6 Z; G: w
  4. }
    8 M$ U3 F4 F9 ^. E  @
Скопировать код
Метод называется attack (атака) и принимает объект Npc в качестве параметра.Внутри метода вызывается другой метод у Npc — receiveDamage (получитьУрон), передавая объект игрока (this — это) и результат расчёта урона (calculateDamage() — рассчитатьУрон()).
' \; F" f) \, R1 ~
5 N( t* q. c3 H( w% G
. @2 L+ u; T  T' A* yКласс Npc.java — вызов метода! P7 }( k4 ^1 {( Q& F  K+ ^

: a/ \' T# g& v9 I# A' K
  1. public void receiveDamage(Player player, int damage) {  // public void получитьУрон(Игрок игрок, int урон)
    3 \4 Y6 @" a. O
  2.     // Логика получения урона NPC; {' y/ r  T: E' C% u! {& y
  3.     this.health -= damage;  // это.здоровье -= урон;
    & H$ H$ t$ Q) O, v
  4.     System.out.println(player.getName() + " нанес " + damage + " урона NPC " + this.getName());  
    0 J; R- S# G: y; A
  5.     // System.out.println(игрок.получитьИмя() + " нанес " + урон + " урона NPC " + это.получитьИмя());
    # F6 a! [5 o6 _, y8 M1 a: q6 A
  6.    
    & ~$ t( q* x/ p! D; ?# c' P
  7.     // Проверка на смерть NPC
    5 Q2 u1 G& F& R+ s5 G
  8.     if (this.health <= 0) {  // если (это.здоровье <= 0)" |6 f% \2 Z/ p) i& N/ X
  9.         this.die();  // это.умереть();7 }! }1 K. q- ^1 k( g% T& G
  10.     }: F4 W6 i* M. o
  11. }$ v0 `+ A5 e5 w- x5 U! Y( w
Скопировать код
Пример взаимодействия (с переводом)
; k- E& @  F/ t$ M; D) `/ [# Q1 e
  1. Player player = new Player("Mike123");  // Игрок игрок = новый Игрок("Mike123");- X3 b0 P2 o4 c8 k8 X* ]$ y: m
  2. Npc goblin = new Npc("Гоблин");  // НПЦ гоблин = новый НПЦ("Гоблин");! G- e& ~  g, m" u8 S
  3. ' M) a% X7 c5 R- `7 y& N) Z
  4. // Игрок атакует гоблина. V; X. O/ d- W3 n. c
  5. player.attack(goblin);  // игрок.атаковать(гоблин);
    , z' f" b) o$ D5 a% a) Z/ Y8 V
Скопировать код
акой подход поможет тебе учить английский, а также понять логику кода.
0 w9 g& `4 E1 z5 q& e3 \% ?5 J+ ?1 e9 S- C2 K; l3 E

Автор: Mike123    Время: 2024-10-17 20:30
Привет, Астралия! Огромное спасибо за твои разъяснения и помощь! Теперь я начинаю лучше понимать, как работают методы в Java и как они взаимодействуют друг с другом. Мне очень помог твой пример, особенно с переводом на русский — это здорово облегчает процесс изучения.$ W( p% |: N' b* s* g
У меня возник ещё один вопрос: какие классы из сборки L2J_Mobius можно использовать для создания базового NPC? Хотелось бы попробовать реализовать простого NPC с минимальным набором функций. Заранее благодарю за ответ!
* a9 Y6 h3 S) F7 N! k0 f$ [6 t( U6 Z( i* R

Автор: Astraliya    Время: 2024-10-17 20:57
Mike123 опубликовал в 2024-10-17 20:30
) ^4 Z7 L% J* v6 NПривет, Астралия! Огромное спасибо за твои разъяснения ...
9 s, N5 q" C' x8 i
Основные методы, которые используются для NPC в сборке L2J_Mobius, связаны с их взаимодействием с игроками, передвижением, боем и управлением их состоянием. Вот несколько ключевых методов из классов Npc.java и Creature.java, которые ты можешь использовать для создания и управления NPC.0 t( I* U3 x. g; ~# O
1. getName() и getId()
  1. <blockquote>public String getName() {  // public String получитьИмя()
Скопировать код
2. onAction(Player player)& i" }8 m" [+ w
  1. public void onAction(Player player) {  // public void наДействие(Игрок игрок)1 q( h9 M! h, i% j+ @( c
  2.     // Логика взаимодействия игрока с NPC4 m6 W# }) c" K3 V
  3. }5 ?) T8 Q* H( [# C7 v+ n3 _
Скопировать код
3. moveToLocation(int x, int y, int z)
  R! `/ e9 e9 Z; y6 X" x  d7 ]* C
  1. public void moveToLocation(int x, int y, int z) {  // public void переместитьсяВ(х, у, z)7 g$ g$ [/ v; X3 U6 w; ^5 h
  2.     // Логика перемещения NPC
    6 E* T% ]. z2 v/ S! M& T3 [
  3. }( u3 {/ U0 h1 i) z" v# i" `( u/ v
Скопировать код
4. attackCharacter(Creature target)- k9 U. v( L8 W$ Z: ]6 W9 w9 I
  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 урон, Существо атакующий)
    1 q9 g9 h0 M) \8 r
  2.     this.health -= damage;  // NPC теряет здоровье
    , o) y8 S& [% l, c7 g2 P6 c  O
  3.    
    ) l! k9 r# J8 w
  4.     if (this.health <= 0) {
    # ], @! z  H0 ?- @' e/ y
  5.         die();  // Если здоровье упало до 0, NPC умирает/ e9 e" C# Q; F6 X! X3 Q! q& ]
  6.     }, p0 q$ B# u4 t( |# U
  7. }
    3 M1 s# q6 Z1 ?
Скопировать код
6. die(): T9 [5 E# R% Y( F3 A
  1. public void die() {  // public void умереть()9 C! @* ]4 p% w" S
  2.     // Логика смерти NPC
    " L  O; a  X: u9 u6 }! ]
  3. }
    1 X! N$ J5 e* Y7 n. O
Скопировать код
7. isDead()5 Z! y2 S( N' H: s7 H
7 L) S5 }! N9 X8 o' _
  1. public boolean isDead() {  // public boolean мертв()
    5 d' J+ F' v, |4 O! W
  2.     return this.health <= 0;  // Возвращает true, если здоровье <= 0
    4 O0 h4 t6 T. [7 m+ f# ?6 ^
  3. }( g7 b* q" |) T8 j. \
Скопировать код
8. heal(int amount)# {+ f# U, i, ~1 t, `; S/ |
  1. public void heal(int amount) {  // public void вылечить(int количество)4 t" A1 J* ^, d
  2.     this.health += amount;  // Увеличиваем здоровье4 C9 W# \, d7 W& d6 q& C
  3.    
    ( j' |: }- f! {0 }- Q
  4.     if (this.health > this.maxHealth) {9 b  ]0 o5 \  O- x' v4 r, Q# A6 v
  5.         this.health = this.maxHealth;  // Здоровье не может быть больше максимального5 D* n# S' g6 L- B( Q0 h! }+ r: Q) L! X
  6.     }; ^6 t* }3 g# ?) o
  7. }: d# {  J4 |9 J' \( {
Скопировать код
9. doCast(Skill skill)1 {% A2 y8 u( ^1 |
  1. public void doCast(Skill skill) {  // public void использоватьЗаклинание(Умение скилл)2 o' |$ t8 F9 f, O( K0 g
  2.     // Логика применения скилла NPC
    + X, D( F% v6 k. m8 t
  3. }/ a  v9 w& T* o% X5 b
Скопировать код
10. onInteract(Player player)
0 Q6 C7 L$ z0 h5 ^

  1. ! I) L, u( {3 ?/ `; j. O5 V! D
  2. public void onInteract(Player player) {  // public void наВзаимодействие(Игрок игрок)
    ! u  G$ H9 ?# T5 ]6 {8 V" V% Z+ T
  3.     // Логика взаимодействия с NPC& ?1 e' C" E- f1 b0 `. U
  4. }: k  b; W, g( o2 W- S
Скопировать код
11. showChatWindow(Player player)( j# y$ p& b7 C7 o& i4 E. Y
  1. public void showChatWindow(Player player) {  // public void показатьОкноДиалога(Игрок игрок)0 U* s$ S( X* m8 G
  2.     // Логика открытия окна диалога
    3 x# V8 ~% r! P- T5 f7 M
  3. }8 U8 g5 t( W3 L8 l
Скопировать код
ЗаключениеЭти методы помогут тебе создать функционального NPC, который может взаимодействовать с игроками, получать и наносить урон, двигаться, использовать заклинания и вести диалоги. Ты можешь начать с базового NPC и постепенно добавлять ему новые функции, используя указанные методы.
3 Z! _2 _' u, |* K9 n1 H' A% g/ {Если тебе нужны примеры кода или более детальные разъяснения — не стесняйся, спрашивай!
1 w& {, q% l4 `+ s) Z5 a* O( y; x' f3 \- t
1 w# r/ A6 g% }; N: R

# N9 n7 J9 N3 `7 C
& a( |7 c2 ^& O% `. c- J2 n




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