Створення кастумних Node-ів (Сцен) та їх використання - 3 - Платформи (2)
Передумови
Скачайте данний проєкт.
Що нового?
Зміни у данному проєкті.
Нова структура:
- Level1
- Map
- Tiles
- {...}
- Paralax
- {...}
- Objects
- MovingPlatforms
- MovingPlatform
- Player
- Player
Перенесенно Player у окрему сцену (Player.tscn):
- Player
- Camera2D
- MainCollisionShape2D
- SeparatorCollisionShape2D
- AnimatedSprite2D
Змінено MovingPlatform - анімація тепер керується кодом, детальніше у наступній частині теми.
MovingPlatform
Сцена MovingPlatform та її код.
Структура:
- MovingPlatform
- PathFollow2D
- RemoteTransform2D
- AnimatableBody2D
- TileMapLayer
- CollisionShape2D
- Area2D
- CollisionShape2D
- AnimationPlayer
Код:
using Godot;
using Red;
public partial class MovingPlatform : Path2D
{
// [Export] дозволяє задавати значення в редакторі Godot.
[Export]
public float BaseStep = 0.003f; // Базова швидкість руху по шляху. Визначає, наскільки швидко платформа переміщається.
public float CurrentStep = 0; // Поточний крок, який використовується для управління рухом по шляху.
public bool PlayerInZone = false; // Булева змінна, яка вказує, чи знаходиться гравець в зоні дії платформи.
// Приватні змінні для доступу до інших Node в сцені.
private AnimationPlayer AnimationPlayer;
private PathFollow2D PathFollow2D;
private Area2D Area2D;
// override _PhysicsProcess(double delta) - Функція, яка викликається на кожному фізичному кадрі.
public override void _PhysicsProcess(double delta)
{
// RedMath.EaseInOut - функція з бібліотеки Red для плавної анімації руху.
// PathFollow2D.ProgressRatio - значення від 0 до 1, яке визначає позицію на Path2D.
// CurrentStep / 5 - параметр, який впливає на швидкість зміни ProgressRatio.
PathFollow2D.ProgressRatio = RedMath.EaseInOut(PathFollow2D.ProgressRatio, CurrentStep, CurrentStep / 5, 0, 1, 15);
// Перевірка, чи досягнуто кінця або початку шляху.
if (PathFollow2D.ProgressRatio == 1 || PathFollow2D.ProgressRatio == 0)
{
// Зміна напрямку руху, шляхом зміни знаку CurrentStep.
CurrentStep = -CurrentStep;
}
}
// override _Ready() - Функція, яка викликається, коли Node готовий до використання.
public override void _Ready()
{
// Отримання посилань на інші Node.
AnimationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
PathFollow2D = GetNode<PathFollow2D>("PathFollow2D");
Area2D = GetNode<Area2D>("AnimatableBody2D/Area2D");
// Ініціалізація CurrentStep базовим значенням.
CurrentStep = BaseStep;
// Підключення сигналів Area2D для відстеження входу та виходу об'єктів в зону дії.
Area2D.BodyEntered += OnBodyEntered;
Area2D.BodyExited += OnBodyExited;
// Встановлення початкової позиції на шляху.
PathFollow2D.ProgressRatio = 0.1f;
}
// OnBodyEntered(Node body) - Функція, яка викликається при вході об'єкта в Area2D.
private void OnBodyEntered(Node body)
{
// Перевірка, чи є об'єкт CharacterBody2D (гравець).
if (body is CharacterBody2D player)
{
GD.Print("Player in"); // Виведення повідомлення в консоль.
PlayerInZone = true; // Встановлення значення PlayerInZone в true.
}
}
// OnBodyExited(Node body) - Функція, яка викликається при виході об'єкта з Area2D.
private void OnBodyExited(Node body)
{
// Перевірка, чи є об'єкт CharacterBody2D (гравець).
if (body is CharacterBody2D player)
{
GD.Print("Player out"); // Виведення повідомлення в консоль.
PlayerInZone = false; // Встановлення значення PlayerInZone в false.
}
}
}Основні властивості класу:
- BaseStep: Визначає базову швидкість руху платформи по шляху. Чим більше значення, тим швидше платформа переміщається.
- CurrentStep: Поточний крок, який використовується для контролю руху платформи. Він змінюється в процесі руху і впливає на швидкість та напрямок.
- PlayerInZone: Булева змінна, що вказує, чи знаходиться гравець в зоні дії платформи. Це може використовуватись для активації певних подій або взаємодій.
Функції:
- _Ready(): Ця функція викликається, коли вузол (
node) готовий до використання. В ній відбувається наступне:- Отримання посилань на інші вузли: AnimationPlayer, PathFollow2D, Area2D.
- Ініціалізація CurrentStep значенням BaseStep.
- Підключення сигналів Area2D для відстеження входу та виходу об'єктів (зокрема, гравця) в зону дії платформи. Сигнали BodyEntered та BodyExited підключені до функцій OnBodyEntered та OnBodyExited відповідно.
- Встановлення початкової позиції платформи на шляху, встановивши PathFollow2D.ProgressRatio в 0.1f.
- _PhysicsProcess(double delta): Ця функція викликається на кожному фізичному кадрі гри. В ній відбувається основна логіка руху платформи:
- Обчислення нового значення PathFollow2D.ProgressRatio за допомогою функції RedMath.EaseInOut. Ця функція забезпечує плавний рух платформи, додаючи ефект прискорення та уповільнення. Параметри функції RedMath.EaseInOut налаштовують швидкість та характер цього руху.
- Перевірка, чи досягнуто платформою кінця або початку шляху (PathFollow2D.ProgressRatio == 1 || PathFollow2D.ProgressRatio == 0). Якщо так, то змінюється знак CurrentStep, що змінює напрямок руху платформи.
- OnBodyEntered(Node body): Ця функція викликається, коли об'єкт (наприклад, гравець) входить в зону дії платформи (Area2D). Вона перевіряє, чи є об'єкт CharacterBody2D (гравець), і, якщо так, виводить повідомлення в консоль та встановлює PlayerInZone в true.
- OnBodyExited(Node body): Ця функція викликається, коли об'єкт виходить з зони дії платформи. Вона виконує аналогічні дії, але встановлює PlayerInZone в false.
Механізм руху платформи:
У функції _PhysicsProcess значення ProgressRatio змінюється за допомогою функції RedMath.EaseInOut. Ця функція забезпечує плавний рух.
Коли платформа досягає кінця або початку шляху, знак CurrentStep змінюється, що призводить до зміни напрямку руху. Таким чином, платформа постійно рухається вперед і назад по заданому шляху.
build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse