Map Building - 3
Map Building - Створення карти - Практична робота
У цій темі ми будемо створювати та покращувати карту для вашої гри.
Короткий список того що ми будемо робити:
- 01Імпортуємо ассети.
- 02Створимо базову
Node-структуру. - 03Створимо
TileMapLayer-и. - 04Настроєм
TileMapLayer-и. - 05Використаємо
TileMapLayer-и. - 06Додамо персонажа.
- 07Настроєм персонажа.
- 08Модифікуємо карту так щоб персонаж міг вільно пересуватись по ній.
- 09Додамо паралакс (фон).
- 10Настроєм паралакс (фон).
Перенесіть TileMapLayer-и у новий Node
Перенесіть ваші TileMapLayer-и у новий Node - Tiles.
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Player
Додання базового гравця
Додання базового гравця для продовження розвитку карти.
Базова структура:
Створюємо базову Node-структуру для персонажа:
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Player
- CharacterBody2D
- Camera2D
- MainCollisionShape2D
- CollisionShape2D2
- AnimatedSprite2D
Анімації та камера:
- 1Додайте анімації assets/Animations/Characters/MC/_side idle.png та assets/Animations/Characters/MC/_side walk.png до
AnimatedSprite2Dнашого персонажа. - 2Перемістіть вашого персонажа у якесь адекватне місце.
- 3Настройте
Camera2D.
Колізії та базовий код:
- 1Перейменувати
Node-и. - 2Настройте колізію.
- 3Додайте базовий код персонажа.
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Player
- PlayerCharacterBody2D
- Camera2D
- MainCollisionShape2D
- CollisionShape2D2
- AnimatedSprite2D
using System;
using System.Runtime.CompilerServices;
using Godot;
public partial class PlayerCharacterBody2d : CharacterBody2D
{
// Константа, яка визначає прискорення руху гравця.
private const float Acceleration = 300.0f;
// Константа, яка визначає прискорення при стрибку.
private const float JumpAcceleration = 700f;
// Константа, яка визначає максимальну швидкість руху гравця.
private const float MaxSpeed = 350;
// Константа, яка визначає максимальну частоту кадрів для анімації.
private const float AnimationMaxFPS = 20;
// Вектор, який представляє силу гравітації.
private Vector2 Gravity = new Vector2(0, 50f);
// Посилання на вузол AnimatedSprite2D. Використовується для відтворення анімацій.
private AnimatedSprite2D AnimatedSprite2D;
// Метод, який викликається при готовності вузла до використання.
public override void _Ready()
{
// Отримуємо посилання на вузол AnimatedSprite2D за назвою.
AnimatedSprite2D = GetNode<AnimatedSprite2D>("AnimatedSprite2D");
}
// Метод, який викликається на кожному фізичному кроці.
public override void _PhysicsProcess(double delta)
{
// Отримуємо вектор напрямку руху від користувача.
Vector2 direction = GetDirection();
// Отримуємо поточну швидкість гравця.
Vector2 velocity = Velocity;
// Збільшуємо швидкість гравця в напрямку руху.
velocity += direction * Acceleration * (float)delta;
// Застосовуємо силу гравітації.
velocity += Gravity;
// Обмежуємо горизонтальну швидкість гравця, щоб вона не перевищувала MaxSpeed.
velocity.X = Mathf.Clamp(velocity.X, -MaxSpeed, MaxSpeed);
// Вертикальне обмеження швидкості закоментовано, можливо, для забезпечення стрибків.
// velocity.Y = Mathf.Clamp(velocity.Y, -MaxSpeed, MaxSpeed);
// Зміна анімації в залежності від руху гравця.
if (velocity.X != 0)
{
// Перевіряємо, в якому напрямку рухається гравець.
if (velocity.X > 0)
{
// Перевертаємо спрайт по горизонталі, щоб він дивився вправо.
AnimatedSprite2D.FlipH = true;
}
else if (velocity.X < 0)
{
// Перевертаємо спрайт по горизонталі, щоб він дивився вліво.
AnimatedSprite2D.FlipH = false;
}
// Запускаємо анімацію ходьби.
AnimatedSprite2D.Animation = "walk";
// Змінюємо швидкість анімації в залежності від швидкості руху гравця.
AnimatedSprite2D.SpriteFrames.SetAnimationSpeed("walk", AnimationMaxFPS * (Math.Abs(velocity.X) / MaxSpeed));
}
else
{
// Запускаємо анімацію бездіяльності.
AnimatedSprite2D.Animation = "idle";
}
// Відтворюємо анімацію.
AnimatedSprite2D.Play();
// Додаткове зменшення швидкості для більш плавного руху.
if (direction.X == 1 && velocity.X < 0 || direction.X == -1 && velocity.X > 0)
{
velocity.X *= 0.90f;
}
else if (direction.X == 0)
{
velocity.X *= 0.90f;
}
// Перевіряємо, чи натиснута кнопка стрибка та чи знаходиться гравець на землі.
if (Input.IsPhysicalKeyPressed(Key.Space) && IsOnFloor())
{
// Зменшуємо вертикальну швидкість, щоб гравець підстрибнув.
velocity.Y -= JumpAcceleration;
}
// Виводимо значення в консоль для налагодження.
GD.Print(direction.X);
GD.Print(velocity.X);
// Застосовуємо нову швидкість.
Velocity = velocity;
// Запускаємо процес переміщення та зіткнення.
MoveAndSlide();
}
// Метод, який повертає вектор напрямку руху на основі натиснутих клавіш.
public Vector2 GetDirection()
{
Vector2 direction = new Vector2();
// Перевіряємо, чи натиснута клавіша W (вгору).
if (Input.IsPhysicalKeyPressed(Key.W))
{
direction.Y += -1;
}
// Перевіряємо, чи натиснута клавіша S (вниз).
if (Input.IsPhysicalKeyPressed(Key.S))
{
direction.Y += 1;
}
// Перевіряємо, чи натиснута клавіша A (вліво).
if (Input.IsPhysicalKeyPressed(Key.A))
{
direction.X += -1;
}
// Перевіряємо, чи натиснута клавіша D (вправо).
if (Input.IsPhysicalKeyPressed(Key.D))
{
direction.X += 1;
}
return direction;
}
}Потенційна проблема з колізіями:
Якщо будуть проблеми з колізіями:
collision layer та collision mask:
Демонстрація collision layer та collision mask:
Шар (collision layer) — це те, в якому шарі знаходиться об’єкт. За замовчуванням всі об’єкти знаходяться у першому шарі.
Маска (collision mask) — це список шарів, з якими може взаємодіяти об’єкт. Якщо об'єкт не входить до одного з шарів, вказаних у масці, то він ігнорує цей об’єкт під час колізій.
Використання SeparationRayShape2D для покращення мобільності персонажа:
- 1Перейменувати
Node-и. - 2Настройте
SeparatorCollisionShape2D, щоб він використовувавSeparationRayShape2D:
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Player
- CharacterBody2D
- Camera2D
- MainCollisionShape2D
- SeparatorCollisionShape2D
- AnimatedSprite2D
Parallax2D
Використання Parallax2D для створення динамічного фону.
Parallax2D — це Node у двигуні Godot, який дозволяє створювати ефект глибини у 2D-сценах. Він досягається шляхом розміщення різних текстур або об'єктів у різні шари, які рухаються з різною швидкістю відносно камери. Це створює ілюзію простору, де об'єкти більш віддалені рухаються повільніше, ніж ті, що ближче до камери.
Базова настройка та перший шар:
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Paralax
- Paralax2D
- Sprite2D
- Player
- CharacterBody2D
- Camera2D
- MainCollisionShape2D
- SeparatorCollisionShape2D
- AnimatedSprite2D
(Motion-)Scale:
Motion Scale — це значення, яке використовується для регулювання швидкості руху шару у паралакс-фоні. Значення 1 означає, що шар рухається з такою ж швидкістю, як і камера. Якщо значення менше 1 (наприклад, 0.5), шар рухатиметься повільніше, а якщо більше 1 (наприклад, 2), то шар рухатиметься швидше.
Додамо всі інші paralax-шари:
Що у вас повинно вийти
- Node2D
- Map
- Tiles
- Background-Rocks-Background
- Background-Rocks
- Background
- Foreground
- Foreground-Rocks
- Paralax
- Paralax2D1
- Sprite2D
- Paralax2D2
- Sprite2D
- Paralax2D3
- Sprite2D
- Paralax2D4
- Sprite2D
- Player
- CharacterBody2D
- Camera2D
- MainCollisionShape2D
- SeparatorCollisionShape2D
- AnimatedSprite2D
Настроймо (Motion-)Scale paralax-шарів:
Repeat - повторення:
Повторення (Repeat) в контексті Parallax2D це змінна яка визначає, як текстура буде повторюватися при прокрутці. Це дозволяє створювати безперервний фон, де текстура може бути розтягнута або повторена для заповнення простору.
build info
- compiler
- 2.0.5.1 · 4054EF9BF6C4510A
- built
- 2026-11-08 14:31:25 UTC
WebUniverse