Створення кастумних Node-ів (Сцен) та їх використання - 4 - Lever
Передумови
Скачайте даний проєкт.
Нові C# структури які потрібно розуміти
C# - Інтерфейси - пояснення.
Інтерфейси – це структура у суті своїх схожа на наслідування. Їх можна розглядати як контракти, які визначають, які методи та властивості повинен реалізувати клас.
Основні характеристики інтерфейсів:
- Абстракція:Інтерфейси містять лише оголошення методів (сигнатури) без їхньої реалізації. Це дозволяє визначити що повинен робити клас, не визначаючи як.
- Множинна реалізація:Клас може реалізувати декілька інтерфейсів одночасно, що дає змогу досягти більшої гнучкості та повторного використання коду.
- Уникнення тісної залежності:Використання інтерфейсів дозволяє зменшити залежність між класами. Замість того, щоб клас залежав від конкретної реалізації іншого класу, він залежить від інтерфейсу. Це полегшує зміну реалізації без впливу на інші частини коду.
- Конвенція іменування:Зазвичай назва інтерфейсу починається з літери 'I' (наприклад, IAnimal).
interface IAnimal
{
void MakeSound(); // Метод без реалізації
}
class Dog : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Woof!");
}
}
class Cat : IAnimal
{
public void MakeSound()
{
Console.WriteLine("Meow!");
}
}У цьому прикладі IAnimal – це інтерфейс, який визначає метод MakeSound(). Класи Dog і Cat реалізують цей інтерфейс, надаючи власну реалізацію методу MakeSound(). Це дозволяє обробляти об'єкти Dog і Cat як об'єкти типу IAnimal, не знаючи конкретного типу.
Навіщо використовувати інтерфейси?
- Гнучкість:Легше замінювати або розширювати функціональність, не змінюючи інші частини коду.
- Модульність:Сприяють створенню більш модульного та підтримуваного коду.
Що нового?
Зміни у даному проєкті.
Нова структура:
- Level1
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Paralax
- Parallax2D1
- Sprite2D
- Parallax2D2
- Sprite2D
- Parallax2D3
- Sprite2D
- Parallax2D4
- Sprite2D
- Objects
- MovingPlatforms
- MovingPlatform
- Levers
- Lever-Platform1
- Lever-Ball
- Lever-Text
- Lever-Wall
- Balls
- MoveBall
- Displays
- Display
- Walls
- Wall
- Player
- Player
Додано Lever (Lever.tscn):
- Lever
- InteractionArea
- Sprite2D
- CollisionShape2D
А також змінено MovingPlatform, додано нові сцени з акцентом на взаємодію з Lever.tscn.
Додано InteractionArea (InteractionArea.tscn) та InteractionManager (InteractionManager.tscn):
InteractionArea
InteractionArea – це клас, який успадковується від Area2D, що використовується для визначення областей в грі, де гравець може взаємодіяти з об'єктами(нодами та сценами). Ключові аспекти включають:
Властивості:
- ActionName:
String(за замовчуванням: "Interact"), який зберігає текст, що буде показуватись користувачу (наприклад, "[E] для взаємодії"). - Height: Обчислюється на основі висоти текстури та масштабу
Sprite2D, використовується для позиціювання підказки взаємодії. - Interact: Callable, який зберігає функцію, що виконується(викликається) під час взаємодії.
Поведінка:
- Коли
CharacterBody2D(гравець) входить в область, він реєструється вInteractionManager. - Коли гравець покидає область, він скасовує свою реєстрацію.
- Висота динамічно обчислюється на основі текстури та масштабу спрайту.
InteractionManager
InteractionManager це клас, який успадковується від Node2D, який керує всіма InteractionArea-ми та обробляє взаємодії гравця з ними. Ключові аспекти включають:
Властивості:
- ActiveInteractionAreas: Список об'єктів
InteractionArea, які в цей момент знаходяться в зоні досяжності гравця. - CanInteract: Булеве значення, яке запобігає швидким повторним взаємодіям.
- Label: Елемент UI, який відображає підказку взаємодії (наприклад, "[E] для взаємодії").
Поведінка:
- Реєстрація/Скасування реєстрації: Відстежує, які об'єкти
InteractionAreaє активними (ввійшли/вийшли з зони досяжності гравця). - Сортування: Сортує активні області взаємодії за відстанню до гравця, щоб віддати пріоритет найближчій.
- Обробка вводу: Прослуховує дію "interact" (наприклад, натискання "E") та активує найближчу взаємодію, якщо вона є дійсною.
- Оновлення UI: Показує/приховує підказку взаємодії на основі найближчого
InteractionAreaта позиціонує її відносно висоти області.
Потік Взаємодії
- Гравець входить в
InteractionArea, який реєструється вInteractionManager. InteractionManagerсортує активні області за відстанню та оновлює UI.- Коли гравець натискає клавішу взаємодії,
InteractionManagerвикликає метод Interact найближчогоInteractionArea. - Гравець покидає область, і вона скасовує свою реєстрацію.
Lever.tscn
Lever.tscn - що він робить та його структура.
Структура:
- Lever (StaticBody2D)
- InteractionArea
- Sprite2D
- CollisionShape2D
Код:
using Godot;
public partial class Lever : StaticBody2D
{
// Експортована змінна для об'єкту, яким керує важіль.
[Export]
public Node ObjectUnderControl;
// Приватна змінна для інтерфейсу ILeverable, щоб працювати з об'єктом під контролем.
private ILeverable ObjectUnderControlILeverable;
// Приватна змінна для Sprite2D, який представляє візуальний елемент важеля.
private Sprite2D Sprite2D;
// Приватна змінна для InteractionArea, яка визначає область взаємодії з важелем.
private InteractionArea InteractionArea;
// Масив текстур для різних станів важеля (ліворуч, центр, праворуч).
private Texture2D[] LeverTextures = new Texture2D[3];
// Змінна для відстеження поточного стану важеля (0 - ліворуч, 1 - центр, 2 - праворуч).
private int LeverStatus = 0;
// Метод, який викликається при готовності ноду.
public override void _Ready()
{
// Перевірка, чи призначено об'єкт, яким керує важіль.
if (ObjectUnderControl is null)
{
GD.PrintErr("FATAL: Lever has no ObjectUnderControl assigned!");
}
// Перевірка, чи реалізує призначений об'єкт інтерфейс ILeverable.
if (ObjectUnderControl is ILeverable leverable)
{
ObjectUnderControlILeverable = leverable;
}
else
{
GD.PrintErr("Assigned object does not implement ILeverable: ", ObjectUnderControl);
}
// Отримання ноду Sprite2D з дерева нодів.
Sprite2D = GetNode<Sprite2D>("InteractionArea/Sprite2D");
// Отримання ноду InteractionArea з дерева нодів.
InteractionArea = GetNode<InteractionArea>("InteractionArea");
// Прив'язка методу OnInteract до події Interact в InteractionArea.
InteractionArea.Interact = new Callable(this, "OnInteract");
// Завантаження текстур для різних станів важеля.
LeverTextures[0] = (Texture2D)GD.Load("res://Assets/Spritesheets/Lever/lever-left.png");
LeverTextures[1] = (Texture2D)GD.Load("res://Assets/Spritesheets/Lever/lever-def.png");
LeverTextures[2] = (Texture2D)GD.Load("res://Assets/Spritesheets/Lever/lever-right.png");
// Оновлення текстури важеля відповідно до початкового стану.
UpdateTexture();
}
// Метод, який викликається при взаємодії з важелем.
private void OnInteract()
{
// Зміна стану важеля.
LeverStatusUpAndRollover();
// Оновлення текстури важеля відповідно до нового стану.
UpdateTexture();
// Виклик методу OnLeverStateChanged в об'єкті під контролем, щоб повідомити його про зміну стану важеля.
ObjectUnderControlILeverable.OnLeverStateChanged(LeverStatus);
}
// Метод для збільшення та переходу по станах важеля.
private void LeverStatusUpAndRollover()
{
LeverStatus++;
// Якщо стан важеля вийшов за межі, повертаємось до початкового стану.
if (LeverStatus >= 3)
LeverStatus = 0;
}
// Метод для оновлення текстури важеля відповідно до поточного стану.
private void UpdateTexture()
{
Sprite2D.Texture = LeverTextures[LeverStatus];
}
}
// Інтерфейс для об'єктів, які можуть реагувати на зміну стану важеля.
public interface ILeverable
{
// Метод, який викликається при зміні стану важеля.
public void OnLeverStateChanged(int state);
}Пояснення:
Призначення та функціональність:
Основне призначення класу Lever – це передавати інформацію про свою поточну позицію (або стан) іншим об’єктам у сцені. Це досягається шляхом реалізації інтерфейсу ILeverable. Інтерфейс визначає метод OnLeverStateChanged, який викликається, коли стан важеля змінюється.
Сцена та взаємодія:
ObjectUnderControl: Змінна, яка зберігає посилання на об’єкт, яким керує важіль. Цей об’єкт повинен реалізувати інтерфейсILeverable, щоб отримати сповіщення про зміну стану важеля.Sprite2D: Візуальна репрезентація важеля у сцені.InteractionArea: Область взаємодії, яка визначає, коли важіль може бути активований гравцем.LeverTextures: Масив текстур, які використовуються для візуалізації різних станів важеля (ліворуч, центр, праворуч).LeverStatus: Змінна, яка зберігає поточний стан важеля (0 - ліворуч, 1 - центр, 2 - праворуч).
Логіка роботи:
- При ініціалізації (
_Ready) важіль перевіряє, чи призначеноObjectUnderControlта чи він реалізує цей об’єкт інтерфейсILeverable. - Метод
OnInteractвикликається, коли гравець взаємодіє з важелем (черезInteractionArea). - У методі
OnInteractстан важеля змінюється (LeverStatusUpAndRollover) та оновлюється його візуальна репрезентація (UpdateTexture). - Метод
OnLeverStateChangedвикликається на об’єктіObjectUnderControl, щоб повідомити його про зміну стану важеля.
Приклади використання:
MoveBall: Змінює швидкість руху об'єкта, залежно від стану важеля.Wall: Робить стіну видимо/невидимою і активує/деактивує колізії залежно від стану важеля.MovingPlatform: Змінює швидкість переміщення платформи.
Таким чином, Lever виступає як центральний елемент, який дозволяє керувати станом та поведінкою інших об'єктів у сцені. Він надає механізм для створення взаємодії та логіки, залежної від дій гравця.
build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse