текст перекладу
Luke Engine — Реалізація класів Application та GameObject
Цей проект є частиною розробки ігрового рушія. Повний вихідний код і документацію можна знайти на GitHub:
1. Реалізація класу Application
Клас Application є ядром ігрового рушія, який керує основним ігровим циклом. Ось базова структура:
1.1 Структура заголовного файлу
namespace luke {
class Application {
public:
void Initialize(); // Початкове налаштування
void Run(); // Основний ігровий цикл
void Update(); // Оновлення кожного кадру
void LateUpdate(); // Обробка після оновлення
void Render(); // Виведення на екран
};
}
1.2 Потік виконання
Клас Application виконується в наступному порядку:
- Initialize(): Виконує необхідне налаштування при запуску гри
- Run(): Виконує основний ігровий цикл
— Update(): Оновлює ігрову логіку
— LateUpdate(): Обробляє пост-оновлення
— Render(): Малює на екран
void Application::Run() {
Update(); // Оновлення ігрової логіки
LateUpdate(); // Пост-обробка
Render(); // Виведення на екран
}
2. Реалізація класу GameObject
GameObject є базовим класом для всіх об'єктів у грі. Наразі він реалізує позицію та базову функціональність переміщення в 2D-координатній системі.
2.1 Основні функції GameObject
namespace luke {
class GameObject {
public:
GameObject();
~GameObject();
// Основні функції ігрового циклу
void Update();
void LastUpdate();
void Render(HDC mHdc);
// Функції, що стосуються позиції
void SetPosition(float x, float y);
float GetPositionX();
float GetPositionY();
private:
float mX; // Координата X
float mY; // Координата Y
};
}
2.2 Реалізація переміщення за допомогою клавіатури
Функція Update() класу GameObject обробляє введення з клавіатури для переміщення об'єкта:
void GameObject::Update() {
// Переміщення залежно від натискання стрілок
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
mX -= 0.1f; // Переміщення вліво
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
mX += 0.1f; // Переміщення вправо
}
if (GetAsyncKeyState(VK_UP) & 0x8000) {
mY -= 0.1f; // Переміщення вгору
}
if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
mY += 0.1f; // Переміщення вниз
}
}
2.3 Реалізація виведення на екран
Функція Render() класу GameObject використовує GDI Windows для малювання простого прямокутника:
void GameObject::Render(HDC mHdc) {
// Створення синьої кисті
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
HBRUSH oldBrush = (HBRUSH)SelectObject(mHdc, brush);
// Малювання прямокутника в поточній позиції
Rectangle(mHdc, 100 + mX, 100 + mY, 200 + mX, 200 + mY);
}
Висновок
Завдяки цій реалізації ми отримали чітке розуміння базової архітектури ігрового рушія та принципів поведінки ігрових об'єктів. Надалі ми плануємо додавати нові функції для розвитку цього рушія в повнофункціональний інструмент, придатний для розробки ігор.
Код
1. Application
[
enginesetting · LUKE-hyungjin/lukeengine@9ad2727
Внесіть свій внесок у розробку LUKE-hyungjin/luke_engine, створивши акаунт на GitHub.
github.com
](https://github.com/LUKE-hyungjin/lukeengine/commit/9ad272762f22d193d9dc4d3a4a62045b7a210ebc?source=postpage-----ed5844b7eef1--------------------------------)
application.h
#pragma once
#include
namespace luke {
class Application
{
public:
void Initialize();
void Run();
void Update();
void LateUpdate();
void Render();
private:
};
}
application.cpp
#include "Application.h"
namespace luke {
void Application::Initialize() {
}
void Application::Run() {
Update();
LateUpdate();
Render();
}
void Application::Update() {
}
void Application::LateUpdate() {
}
void Application::Render() {
}
}
2.
текст перекладу
GameObject
[
addgameobject · LUKE-hyungjin/lukeengine@7b40804
Внесіть свій внесок у розробку LUKE-hyungjin/luke_engine, створивши акаунт на GitHub.
github.com
](https://github.com/LUKE-hyungjin/lukeengine/commit/7b4080498aee041bd96eab66cf9054e14731e30d?source=postpage-----ed5844b7eef1--------------------------------)
GameObject.h
#pragma once
#include "Commoninclude.h"
namespace luke {
class GameObject
{
public:
GameObject();
~GameObject();
void Update();
void LastUpdate();
void Render(HDC mHdc);
void SetPosition(float x, float y) {
mX = x;
mY = y;
}
float GetPositionX() { return mX; }
float GetPositionY() { return mY; }
private:
float mX;
float mY;
};
}
GameObject.cpp
#include "GameObject.h"
namespace luke {
GameObject::GameObject(): mX(0.0f), mY(0.0f) {
}
GameObject::~GameObject() {
}
void GameObject::Update() {
if (GetAsyncKeyState(VK_LEFT) & 0x8000) {
mX -= 0.1f;
}
if (GetAsyncKeyState(VK_RIGHT) & 0x8000) {
mX += 0.1f;
}
if (GetAsyncKeyState(VK_UP) & 0x8000) {
mY -= 0.1f;
}
if (GetAsyncKeyState(VK_DOWN) & 0x8000) {
mY += 0.1f;
}
}
void GameObject::LastUpdate() {
}
void GameObject::Render(HDC mHdc) {
HBRUSH brush = CreateSolidBrush(RGB(0, 0, 255));
HBRUSH oldBrush = (HBRUSH)SelectObject(mHdc, brush);
Rectangle(mHdc, 100 + mX, 100 + mY, 200 + mX, 200 + mY);
}
}
Результат
Перекладено з: Application, GameObject