Створення кастумних Node-ів (Сцен) та їх використання - 1
Підготовка основної сцени
Додайте Node Items для наших кастумних Node-ів.
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- {...}
- Paralax
- {...}
- Items
- Player
- {...}
Перший кастумний Node (scene) - ball
Створюємо наш перший кастумний Node (scene).
Створіть базову структуру нашого Node:
Що у вас повинно вийти
- RigidBody2D
- Sprite2D
- CollisionShape2D
Збережіть наш Node з назвою ball:
Настройте Node-и-компоненти нашого ball:
- Використайте assets/Spritesheets/Balls/{
1}/{2}.png як текстуру дляSprite2D.
Де:1- Колір;2- Емоція. - Настройте
CollisionShape2D(з формою CircleShape2D).
Додайте наш Node на нашу карту (в Items):
Це було досить легко, АЛЕ є одна проблема, наш ball завеликий.
Зменште його:
- Зменште scale
Sprite2D. - Зменште
CircleShape2DуCollisionShape2D.
Використання кастумного Node дозволяє нам створювати N-ну екземплярів цього Node:
Прив'язка коду до кастумного Node-у
Кастумний Node (scene) та базовий код.
Ми розглянемо наступне:
- Стандартний виклик функції при ініціалізації
Node. - Стандартний виклик функції при кожному фізичному кадрі.
- Виклик функції при події входження в/покидання зони об’єктом (гравцем).
Підготуйте ball до додання коду:
Додайте RigidBody2D>Area2D>CollisionShape2D:
Що у вас повинно вийти
- RigidBody2D
- Sprite2D
- CollisionShape2D
- Area2D
- CollisionShape2D
Перемістіть ball у якесь зручне для роботи над ним місце:
Для подальшої простоти роботи з ball відключимо все логування у нашому персонажі:
Прив'яжіть даний код до ball:
using Godot;
// Клас Ball наслідується від RigidBody2D
public partial class Ball : RigidBody2D
{
// Приватне поле для зберігання посилання на Area2D Node, який буде використовуватися для виявлення колізій
private Area2D Area2D;
// Метод, який викликається під час ініціалізації об'єкта, коли він готовий до роботи
public override void _Ready()
{
// Отримуємо посилання на дочірній Node з назвою "Area2D" і приводимо його до типу Area2D
Area2D = GetNode<Area2D>("Area2D");
// Підписуємося на подію BodyEntered, яка виникає коли якийсь тіло входить у зону Area2D
// При виклику події буде викликано метод OnBodyEntered
Area2D.BodyEntered += OnBodyEntered;
// Підписуємося на подію BodyExited, яка виникає коли якесь тіло покидає зону Area2D
// При виклику події буде викликано метод OnBodyExited
Area2D.BodyExited += OnBodyExited;
}
// Обробник події, який викликається коли тіло входить у зону Area2D
// Параметр body містить посилання на об'єкт, що ввійшов
private void OnBodyEntered(Node body)
{
GD.Print("Enter");
}
// Обробник події, який викликається коли тіло покидає зону Area2D
// Параметр body містить посилання на об'єкт, що вийшов
private void OnBodyExited(Node body)
{
GD.Print("Exit");
}
}Цей код створює клас(Node) Ball, який успадковує властивості від RigidBody2D. Він має Area2D, який використовується для виявлення колізій. У методі _Ready() отримуємо посилання на дочірній Node Area2D і підписується на події BodyEntered та BodyExited. Коли тіло входить або виходить з зони Area2D, викликаються методи OnBodyEntered та OnBodyExited, які просто виводять повідомлення Enter або Exit.
Приклади коду для ball
Приклади коду для нашого кастумного ball.
Виводить Loaded при загрузці:
using Godot;
public partial class Ball : RigidBody2D
{
public override void _Ready()
{
GD.Print("Loaded");
}
}Виводить Frame при кожному фізичному кадрі:
using Godot;
public partial class Ball : RigidBody2D
{
public override async void _PhysicsProcess(double delta)
{
GD.Print("Frame");
}
}Видаляється з певним випадковим шансом:
using System;
using Godot;
public partial class Ball : RigidBody2D
{
public static Random Rand = new Random();
public override async void _PhysicsProcess(double delta)
{
if (Rand.Next(0, 500) == 1)
{
GD.Print("Deleting");
QueueFree(); //Видалення Node (видаляється той Ball у якому була викликана ця функція)
}
}
}Видаляється після 10 секунд:
using System;
using Godot;
public partial class Ball : RigidBody2D
{
private DateTime CreateTime = DateTime.Now; //При створені Ball записуємо час коли це сталось
public override async void _PhysicsProcess(double delta)
{
TimeSpan timePassed = DateTime.Now - CreateTime; //Рахуємо різницю між часом який є зараз та CreateTime
GD.Print($"Time passed:" + timePassed);
if (timePassed.TotalSeconds >= 10) //якщо пройшло більше 10 секунд
{
GD.Print("Deleting");
QueueFree(); //Видалення Node (видаляється той Ball у якому була викликана ця функція)
}
}
}З певним випадковим шансом збільшується:
using System;
using Godot;
public partial class Ball : RigidBody2D
{
public static Random Rand { get; set; } = new Random();
public Sprite2D Sprite2D { get; set; }
public CollisionShape2D CollisionShape2D { get; set; }
public override void _Ready()
{
Sprite2D = GetNode<Sprite2D>("Sprite2D");
CollisionShape2D = GetNode<CollisionShape2D>("CollisionShape2D");
}
public override async void _PhysicsProcess(double delta)
{
if (Rand.Next(0, 100) == 1)
{
GD.Print("Growing");
Sprite2D.Scale += new Vector2(0.01f, 0.01f);
CollisionShape2D.Scale += new Vector2(0.01f, 0.01f);
}
}
}З певним випадковим шансом зменшується:
using System;
using Godot;
public partial class Ball : RigidBody2D
{
public static Random Rand { get; set; } = new Random();
public Sprite2D Sprite2D { get; set; }
public CollisionShape2D CollisionShape2D { get; set; }
public override void _Ready()
{
Sprite2D = GetNode<Sprite2D>("Sprite2D");
CollisionShape2D = GetNode<CollisionShape2D>("CollisionShape2D");
}
public override async void _PhysicsProcess(double delta)
{
if (Rand.Next(0, 100) == 1)
{
GD.Print("Growing");
Sprite2D.Scale -= new Vector2(0.01f, 0.01f);
CollisionShape2D.Scale -= new Vector2(0.01f, 0.01f);
}
}
}Міняє текстуру якщо гравець наближається:
using Godot;
// Клас Ball наслідується від RigidBody2D
public partial class Ball : RigidBody2D
{
// Приватне поле для зберігання посилання на Area2D Node, який буде використовуватися для виявлення колізій
private Area2D Area2D { get; set; }
private Sprite2D Sprite2D { get; set; }
private Texture2D Texture2DPlayerClose { get; set; }
private Texture2D Texture2DPlayerFar { get; set; }
// Метод, який викликається під час ініціалізації об'єкта, коли він готовий до роботи
public override void _Ready()
{
// Отримуємо посилання на дочірній Node з назвою "Area2D" і приводимо його до типу Area2D
Area2D = GetNode<Area2D>("Area2D");
Sprite2D = GetNode<Sprite2D>("Sprite2D");
// Підписуємося на подію BodyEntered, яка виникає коли якийсь тіло входить у зону Area2D
// При виклику події буде викликано метод OnBodyEntered
Area2D.BodyEntered += OnBodyEntered;
// Підписуємося на подію BodyExited, яка виникає коли якесь тіло покидає зону Area2D
// При виклику події буде викликано метод OnBodyExited
Area2D.BodyExited += OnBodyExited;
//загружаємо текстури з асетів у змінні
Texture2DPlayerClose = (Texture2D)GD.Load($"res://assets/Spritesheets/Balls/red/smile.png");
Texture2DPlayerFar = (Texture2D)GD.Load($"res://assets/Spritesheets/Balls/green/smile.png");
}
// Обробник події, який викликається коли тіло входить у зону Area2D
// Параметр body містить посилання на об'єкт, що ввійшов
private void OnBodyEntered(Node body)
{
//перевіряємо чи Node який попаву у зону це CharacterBody2D (гравець), а не наприклад RigidBody2D (інший Ball)
if (body is CharacterBody2D)
{
GD.Print("Enter");
Sprite2D.Texture = Texture2DPlayerClose;
}
}
// Обробник події, який викликається коли тіло покидає зону Area2D
// Параметр body містить посилання на об'єкт, що вийшов
private void OnBodyExited(Node body)
{
//перевіряємо чи Node який попаву у зону це CharacterBody2D (гравець), а не наприклад RigidBody2D (інший Ball)
if (body is CharacterBody2D)
{
GD.Print("Exit");
Sprite2D.Texture = Texture2DPlayerFar;
}
}
}build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse