Застосунок, Об’єкт гри

текст перекладу
Luke Engine — Реалізація класів Application та GameObject

Цей проект є частиною розробки ігрового рушія. Повний вихідний код і документацію можна знайти на GitHub:

Репозиторій Luke Engine

1. Реалізація класу Application

Клас Application є ядром ігрового рушія, який керує основним ігровим циклом. Ось базова структура:

1.1 Структура заголовного файлу

namespace luke {  
 class Application {  
 public:  
 void Initialize(); // Початкове налаштування  
 void Run(); // Основний ігровий цикл  
 void Update(); // Оновлення кожного кадру  
 void LateUpdate(); // Обробка після оновлення  
 void Render(); // Виведення на екран  
 };  
}

1.2 Потік виконання

Клас Application виконується в наступному порядку:

  1. Initialize(): Виконує необхідне налаштування при запуску гри
  2. 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);  

 }  


}

Результат

pic

Перекладено з: Application, GameObject

Leave a Reply

Your email address will not be published. Required fields are marked *