代码拉取完成,页面将自动刷新
同步操作将从 留天下/UIEngine 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
C++编写的简单UI引擎,方便开发windows界面程序,附件中含有用此UI引擎开发的游戏地图编辑器和一个冒险小游戏(该游戏暂时还未做完)。 项目附件中有地图编辑器和冒险小游戏64位可执行文件。UiEngine文件夹中包含项目源码,UIEngneLib文件夹包含UI引擎静态链接库,可直接下载和UiEngine文件夹中的源码使用。
HWND hWnd = CreateWindowW(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
0,0,800,600, nullptr, nullptr, hInstance, nullptr);
if (!hWnd)
{
return FALSE;
}
MyEngine::cGameEngine::GetEngine()->init(hWnd); //初始化并绑定窗口句柄
MyEngine::cGameEngine::GetEngine()->CreateCircle(RECT{ 10,10,100,100 }); //新建一个圆
MyEngine::cGameEngine::GetEngine()->CreateLine(POINT{ 20,30 }, POINT{ 100,200 }); //新建一个直线
MyEngine::cButton* btn = new MyEngine::cButton(L"点我", 100, 30);
btn->SetX(100);
btn->SetY(200);
MyEngine::cGameEngine::GetEngine()->AddEngineUi(btn); //出直接Create之外还可以,自己新建后添加到Engine。
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
//在程序结束的恰当位置必须调用MyEngine::cGameEngine::GetEmgine()->ReleaseSelf释放资源
添加资源池统一管理GDI句柄资源,主要是管理图片资源,资源池主要采用单例设计模式,一处加载到处使用。 添加CLock互斥锁,纠正了多线程下时常会发生的资源共享异常。这次更新同时也修复了以前经常会发生异常的bug
#include"cResourcePool.h"
class LoadResource
{
public:
LoadResource()
{
cResourcePool::AddObjByKey("pic1",(HBITMAP)LoadImage(nullptr,L"D:\\puc1.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic2",(HBITMAP)LoadImage(nullptr,L"D:\\puc2.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic3",(HBITMAP)LoadImage(nullptr,L"D:\\puc3.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
cResourcePool::AddObjByKey("pic4",(HBITMAP)LoadImage(nullptr,L"D:\\puc4.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE));
}
~LoadResource(){};
}
#include"cResourcePool.h"
class Test
{
public:
Test()
{
HBITMAP h= cResourcePool::GethObjByKey("pic1");
}
~Test(){}
}
上面的示例只是为了说明资源池中的资源,在加载之后可在任何地方使用,真实情况时用户而定,想要详细了解使用,可查看UIEngine源码,有详细注释
此次更新主要将cGameEngine类更改为单实例类,同时增加了一个cSight类用于辅助管理Engine的图形绘制。
此次更新主要重写了cMyTimer定时器类,修复了多线程下的资源共享问题;同时对cCircle圆类进行了一些细微的调整
此次更新后引擎将不再依赖与vs创建的win32项目模板而是由引擎自己创建并销毁窗口。
#include<cGameEngine.h>
using namespace MyEngine;
#pragma comment(lib,"UIEngine.lib")
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
_In_opt_ HINSTANCE hPrevInstance,
_In_ LPWSTR lpCmdLine,
_In_ int nCmdShow)
{
cGameEngine::GetEngine()->init(hInstance); //初始化引擎
cGameEngine::GetEngine()->CreateText(L"文本", 100, 200); //直接创建
cGameEngine::GetEngine()->CreateRectangle(POINT{ 300,20 }, 100, 50); //直接创建
cCircle* pCir = new cCircle(POINT{ 200,400 }, 30);
cGameEngine::GetEngine()->AddEngineUi(pCir); //手动添加
return cGameEngine::GetEngine()->LuanchEngine(); //运行启动引擎
}
将cResourcePool和cGameEngine单实例类更改为线程安全版
示例代码
//单例设计模式
atomic<cResourcePool*> ato_theOne = nullptr;
cResourcePool* theOne = nullptr;
mutex g_cpmutex;
cResourcePool* MyEngine::cResourcePool::GetResourcePool()
{
theOne = ato_theOne.load(memory_order_relaxed);
atomic_thread_fence(memory_order_acquire);
if (theOne == nullptr)
{
lock_guard<mutex> lock(g_cpmutex);
theOne = ato_theOne.load(memory_order_relaxed);
if (theOne == nullptr)
{
theOne = new cResourcePool;
atomic_thread_fence(memory_order_release);
ato_theOne.store(theOne, memory_order_release);
}
}
return theOne;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。