Quick Start
Создание нового проекта
Самый быстрый способ начать работу с Wudgine — использовать шаблон базового проекта:
wudgine create my-first-game --template basic
cd my-first-game
Эта команда создаст новый проект с базовой структурой и всеми необходимыми файлами.
Структура проекта
После создания проекта вы увидите следующую структуру файлов:
my-first-game/
├── assets/
│ ├── models/
│ ├── textures/
│ └── shaders/
├── src/
│ ├── components/
│ ├── systems/
│ ├── ui/
│ └── main.cpp
├── CMakeLists.txt
└── wudgine.config.json
Запуск проекта
Чтобы запустить созданный проект, выполните:
wudgine build
wudgine run
Вы увидите окно с пустой сценой и базовой камерой.
Добавление объекта на сцену
Давайте добавим простой куб на сцену. Откройте файл src/main.cpp
и найдите функцию initializeScene()
. Добавьте следующий код:
void initializeScene() {
// Создаем сущность для куба
Entity cube = world.createEntity("Cube");
// Добавляем компонент Transform для позиционирования
auto& transform = cube.addComponent<Transform>();
transform.position = Vector3(0.0f, 0.0f, 0.0f);
transform.rotation = Quaternion::identity();
transform.scale = Vector3(1.0f, 1.0f, 1.0f);
// Добавляем компонент MeshRenderer для отображения
auto& renderer = cube.addComponent<MeshRenderer>();
renderer.mesh = AssetManager::loadMesh("cube");
renderer.material = AssetManager::loadMaterial("default");
// Добавляем компонент для вращения (опционально)
auto& rotator = cube.addComponent<Rotator>();
rotator.speed = 45.0f; // градусов в секунду
}
#pragma once
#include <wudgine/component.h>
struct Rotator : public Component {
float speed = 45.0f; // градусов в секунду
// Сериализация компонента
template<typename Archive>
void serialize(Archive& archive) {
archive(speed);
}
};
#pragma once
#include <wudgine/system.h>
#include "../components/Rotator.h"
class RotationSystem : public System {
public:
void update(float deltaTime) override {
// Запрашиваем все сущности с компонентами Transform и Rotator
auto query = world->query<Transform, Rotator>();
// Обновляем каждую сущность
query.forEach([deltaTime](Entity entity, Transform& transform, Rotator& rotator) {
// Вращаем объект вокруг оси Y
Quaternion rotation = Quaternion::fromEulerAngles(0.0f, rotator.speed * deltaTime, 0.0f);
transform.rotation = transform.rotation * rotation;
});
}
};
Теперь добавьте систему вращения в основной файл:
#include "systems/RotationSystem.h"
// ...
int main() {
// ...
// Регистрируем систему вращения
world.addSystem<RotationSystem>();
// ...
}
Запуск и тестирование
Соберите и запустите проект снова:
wudgine build
wudgine run
Теперь вы должны увидеть вращающийся куб в центре экрана!
speed
в компоненте Rotator
.Добавление интерактивности
Давайте добавим простое взаимодействие с кубом при клике мыши:
#pragma once
#include <wudgine/system.h>
#include <wudgine/input.h>
class InteractionSystem : public System {
public:
void update(float deltaTime) override {
// Проверяем, был ли клик левой кнопкой мыши
if (Input::isMouseButtonPressed(MouseButton::Left)) {
// Получаем позицию мыши
Vector2 mousePos = Input::getMousePosition();
// Создаем луч для проверки пересечения
Ray ray = Camera::main()->screenPointToRay(mousePos);
// Проверяем пересечение с объектами
RaycastHit hit;
if (Physics::raycast(ray, hit)) {
// Получаем сущность, с которой произошло пересечение
Entity hitEntity = hit.entity;
// Если у сущности есть компонент Transform
if (hitEntity.hasComponent<Transform>()) {
auto& transform = hitEntity.getComponent<Transform>();
// Изменяем масштаб объекта
transform.scale *= 1.2f;
// Выводим сообщение в консоль
Debug::log("Клик по объекту: " + hitEntity.getName());
}
}
}
}
};
Не забудьте добавить эту систему в основной файл:
#include "systems/InteractionSystem.h"
// ...
int main() {
// ...
// Регистрируем систему взаимодействия
world.addSystem<InteractionSystem>();
// ...
}
Что дальше?
Поздравляем! Вы создали свою первую интерактивную сцену в Wudgine. Теперь вы можете: