赞 | 0 |
VIP | 0 |
好人卡 | 0 |
积分 | 1 |
经验 | 0 |
最后登录 | 2021-9-29 |
在线时间 | 7 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 136
- 在线时间
- 7 小时
- 注册时间
- 2020-1-18
- 帖子
- 12
|
#include "GameEngine.h"
// 游戏引擎生成
GameEngine* g_eng = new GameEngine();
// 游戏引擎 - win32回调函数
// 唯一性
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) {
switch (msg) {
case WM_KEYDOWN:
case WM_KEYUP:
case WM_MOUSEMOVE:
case WM_LBUTTONDOWN:
case WM_LBUTTONUP:
case WM_RBUTTONDOWN:
case WM_RBUTTONUP:
case WM_MBUTTONDOWN:
case WM_MBUTTONUP:
case WM_CHAR:
case WM_ACTIVATE:
{
if (g_eng != nullptr) {
g_eng->CheckWin32Msg(msg, wp, lp);
}
}
break;
case WM_DESTROY:
{
bool result = false;
if (g_eng != nullptr) {
result = g_eng->IsActivity();
}
if (result) {
PostQuitMessage(0);
}
}
break;
default:
break;
}
return DefWindowProc(hwnd, msg, wp, lp);
}
// 构造
GameEngine::GameEngine() {
// 基础属性
eng_iskeep = true; // 可持续
eng_errorvalue = 0x00; // 错误值 - 0
eng_state = SYS_STATE_BEGIN; // 引擎状态 - 刚开始
// win32程序属性 -- 句柄
// win32程序属性 -- 基础属性
m_x = 0, m_y = 0, m_width = 1024, m_height = 769; // 固定像素大小
m_fullscreen = true; // 默认全屏
}
// 析构
GameEngine::~GameEngine() {
}
// 释放引擎
void GameEngine::ReleaseEngine() {
}
// 初始化句柄
void GameEngine::InithInst(HINSTANCE hinstance) {
m_hinstance = hinstance;
}
// 初始化引擎
void GameEngine::InitEngine() {
// 初始化 win32程序
InitWin32Process();
// 初始化 渲染部分
InitGraphicsProcess();
// 初始化 数据库部分
InitDataBaseProcess();
// 初始化场景控制部分
InitViewControlProcess();
}
// 初始化引擎
// x,y,width,height == 程序窗口大小
// Fullscreen == 全屏(默认全屏)
void GameEngine::InitEngine(int x, int y, int width, int height, bool full) {
// 设置属性
m_fullscreen = full;
if (!m_fullscreen) {
m_x = x;
m_y = y;
m_width = width;
m_height = height;
}
else {
m_x = 0;
m_y = 0;
m_width = GetSystemMetrics(SM_CXSCREEN) - 1;
m_height = GetSystemMetrics(SM_CYSCREEN) - 1;
}
// 初始化引擎
InitEngine();
}
// 初始化win32程序
void GameEngine::InitWin32Process() {
// 属性配置
// 背景画刷
if (m_hbrush == nullptr) {
m_hbrush = CreateSolidBrush(RGB(0, 0, 0));
}
// 默认光标
if (m_hcursor == nullptr) {
m_hcursor = LoadCursor(NULL, IDC_ARROW);
}
// 默认图标
if (m_hicon == nullptr) {
m_hicon = LoadIcon(NULL, IDI_APPLICATION);
}
// 窗口创建
// 信息结构体
WNDCLASSEX wc = { 0 };
wc.cbSize = sizeof(WNDCLASSEX);
wc.style = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = m_hbrush;
wc.hCursor = m_hcursor;
wc.hIcon = m_hicon;
wc.lpfnWndProc = WindowProc;
wc.hInstance = m_hinstance;
wc.lpszClassName = "youguess";
wc.lpszMenuName = "sometitle";
// 注册
if (!RegisterClassEx(&wc)) {
return;
}
else {
// 创建窗口
DWORD tmp_style = m_fullscreen ? (WS_MAXIMIZE | WS_POPUP) : WS_POPUP;
m_hwnd = CreateWindow(
wc.lpszClassName, "san9pk",
tmp_style,
m_x, m_y, m_width, m_height,
NULL, NULL, m_hinstance, NULL
);
// 创建失败
if (m_hwnd == NULL) {
}
}
}
// 初始化渲染部分
void GameEngine::InitGraphicsProcess() {
bool result = true;
// 非全屏
if (!m_fullscreen) {
result = Engine_Graphics::InitGraphics(m_hwnd, RECT{ (LONG)m_x, (LONG)m_y, (LONG)m_width, (LONG)m_height });
}
}
// 初始化数据库部分
void GameEngine::InitDataBaseProcess() {
if (g_data != nullptr) {
return;
}
g_data = new DataBase();
g_data->InitDataBase();
}
// 初始化场景控制部分
void GameEngine::InitViewControlProcess() {
if (g_view != nullptr) {
return;
}
g_view = new Manager_View();
g_view->Init();
}
// 处理事件
void GameEngine::Engine_CheckEvent() {
// 处理事件
unsigned int index = 0;
while (1) {
// 索引
if (index >= eng_eventlist.size()) {
break;
}
index++;
}
// 清空事件列表
eng_eventlist.clear();
}
// 处理更新
void GameEngine::Engine_Update() {
//
if (eng_state == SYS_STATE_EXIT) {
return;
}
else {
if (eng_state == SYS_STATE_BEGIN) {
eng_state = SYS_STATE_KEEP;
}
else {
// 场景更新
if (g_view != nullptr) {
g_view->Update();
}
}
}
// 渲染系统更新
Manager_UI::Update();
}
// 处理渲染
void GameEngine::Engine_Draw() {
// 开始 + 清屏
Engine_Graphics::Begin();
//
if (eng_state == SYS_STATE_EXIT) {
return;
}
else {
// 场景渲染
if (g_view != nullptr) {
g_view->Draw();
}
}
// UI系统绘制
Manager_UI::Draw();
// 结束
Engine_Graphics::End();
}
// 运行引擎
void GameEngine::RunEngine() {
// 窗体已创建
if (m_hwnd != NULL) {
// 显示和更新窗口
if (m_fullscreen) {
ShowWindow(m_hwnd, SW_MAXIMIZE);
}
else {
ShowWindow(m_hwnd, SW_SHOW);
}
UpdateWindow(m_hwnd);
// 消息循环
MSG msg = { 0 };
while (1) {
// 窗口消息
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
// 系统处理机制
TranslateMessage(&msg);
DispatchMessage(&msg);
if (msg.message == WM_QUIT) {
break;
}
}
else {
// 计时器
Engine_CheckEvent();
Engine_Update();
Engine_Draw();
}
}
}
}
// 接收win32消息
void GameEngine::CheckWin32Msg(UINT msg, WPARAM wp, LPARAM lp) {
// 渲染部分
Manager_UI::CheckUpdate(msg, wp, lp);
// 场景部分
if (g_view != nullptr) {
g_view->CheckUpdate(msg, wp, lp);
}
}
// 判定引擎是否结束更新
bool GameEngine::IsActivity() {
return (eng_state == SYS_STATE_EXIT);
}
// 发送结束引擎消息
void GameEngine::SelfKill() {
if (m_hwnd != nullptr) {
// 状态值更新
eng_state = SYS_STATE_EXIT;
// 立即发送摧毁窗口消息
PostMessage(m_hwnd, WM_DESTROY, 0, 0);
}
} |
|