DirectX9完全面向对象框架
#pragma once
#define UNICODE
//Direct3D lib
#include<d3d9.h>
#include<d3dx9.h>
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib") //Default lib
#include<wchar.h>
#include<tchar.h>
#include<assert.h>
#pragma comment(lib, "winmm.lib") namespace Clear
{
template<typename T>
void SafeRelease(T t)
{
if (t)
{
t->Release();
t = nullptr;
}
}
template<typename T>
void SafeDelete(T t)
{
if (t)
{
delete t;
t = nullptr;
}
}
}
class DXApp
{
public: DXApp(HINSTANCE hInstance = nullptr);
virtual ~DXApp(); bool InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen); bool InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen);
bool InitDirect3D_9(); virtual LRESULT MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam);
virtual int Run();
void RenderShell();
virtual void Render() = ;
virtual void Update() = ;
virtual void OnLostDevice() = ;
virtual void OnResetDevice() = ; protected: HINSTANCE m_AppInstance;
HWND m_hWindowedHWND;
WCHAR m_strAppTitle[];
UINT m_windowWidth;
UINT m_windowHeight; bool m_bFullScreen;
bool m_bLostDevice; //Direct3D_9 properties
IDirect3D9* m_pD3D;
D3DPRESENT_PARAMETERS m_PresentParamenters;
IDirect3DDevice9* m_pD3Ddevice; };
DXApp.cpp
#include "DXApp.h" //Store DXApp global pointer
namespace Global
{
DXApp* g_pDxapp = nullptr;
}
LRESULT CALLBACK MainProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
if (Global::g_pDxapp)
{
return Global::g_pDxapp->MsgProc(hWnd, Message, wParam, lParam);
}
else
{
return DefWindowProc(hWnd, Message, wParam, lParam);
}
} DXApp::DXApp(HINSTANCE hInstance)
{
m_AppInstance = hInstance;
m_hWindowedHWND = nullptr;
Global::g_pDxapp = this; } DXApp::~DXApp()
{
Clear::SafeRelease(m_pD3D);
Clear::SafeRelease(m_pD3Ddevice);
} bool DXApp::InitDXApp(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
if(!InitWindow(title, width, height, fullscreen))
return false;
if (!InitDirect3D_9())
return false; return true;
} bool DXApp::InitWindow(const WCHAR* title, UINT width, UINT height, bool fullscreen)
{
// Initialize window's properties
wsprintfW(m_strAppTitle, title);
m_windowWidth = width;
m_windowHeight = height;
m_bFullScreen = fullscreen;
m_bLostDevice = false; const WCHAR* CLASSNAME = L"DEMOCLASS";
WNDCLASSEX wcex;
ZeroMemory(&wcex, sizeof(wcex));
wcex.style = CS_VREDRAW | CS_HREDRAW;
wcex.cbClsExtra = ;
wcex.cbSize = sizeof(wcex);
wcex.cbWndExtra = ;
wcex.hbrBackground = nullptr;
wcex.hCursor = LoadCursor(m_AppInstance, IDC_ARROW);
wcex.hIcon = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hIconSm = LoadIcon(m_AppInstance, IDI_APPLICATION);
wcex.hInstance = m_AppInstance;
wcex.lpfnWndProc = MainProc;
wcex.lpszClassName = CLASSNAME;
wcex.lpszMenuName = nullptr;
if (!RegisterClassEx(&wcex))
{
OutputDebugString(L"DXApp::InitWindow: RegisterClassEx()failed!");
return false;
} // adjust window size
RECT adjR;
SetRect(&adjR, , , m_windowWidth, m_windowHeight);
AdjustWindowRect(&adjR, WS_OVERLAPPEDWINDOW, false);
UINT w = adjR.right - adjR.left;
UINT h = adjR.bottom - adjR.top;
UINT x = GetSystemMetrics(SM_CXSCREEN) / - w / ;
UINT y = GetSystemMetrics(SM_CYSCREEN) / - h / ;
m_hWindowedHWND = CreateWindow(CLASSNAME, m_strAppTitle, WS_OVERLAPPEDWINDOW, x, y, w, h, nullptr, nullptr, m_AppInstance, nullptr);
if (!m_hWindowedHWND)
{
OutputDebugString(L"DXApp::InitWindow: CreateWindow()failed!");
return false;
} ShowWindow(m_hWindowedHWND, SW_SHOWDEFAULT); return true;
} bool DXApp::InitDirect3D_9()
{
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION); D3DCAPS9 d3dcaps;
int vertex_proc = ;
m_pD3D->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &d3dcaps);
if (d3dcaps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
vertex_proc = D3DCREATE_HARDWARE_VERTEXPROCESSING;
}
else
{
vertex_proc = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
} ZeroMemory(&m_PresentParamenters, sizeof(m_PresentParamenters));
m_PresentParamenters.BackBufferCount = ;
m_PresentParamenters.BackBufferWidth = m_windowWidth;
m_PresentParamenters.BackBufferHeight = m_windowHeight;
m_PresentParamenters.BackBufferFormat = D3DFMT_A8R8G8B8;
m_PresentParamenters.EnableAutoDepthStencil = true;
m_PresentParamenters.AutoDepthStencilFormat = D3DFMT_D24S8;
m_PresentParamenters.hDeviceWindow = m_hWindowedHWND;
m_PresentParamenters.Flags = ;
m_PresentParamenters.SwapEffect = D3DSWAPEFFECT_DISCARD;
m_PresentParamenters.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
m_PresentParamenters.MultiSampleQuality = ;
m_PresentParamenters.MultiSampleType = D3DMULTISAMPLE_NONE;
m_PresentParamenters.Windowed = true;
m_PresentParamenters.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; // create device
if (FAILED(m_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_hWindowedHWND, vertex_proc, &m_PresentParamenters, &m_pD3Ddevice)))
{
OutputDebugString(L"DXApp::InitDirect3D_9: CreateDevice()failed!");
return false;
} return true;
} LRESULT DXApp::MsgProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
{
switch (Message)
{
case WM_KEYDOWN:
if (wParam == VK_ESCAPE)
DestroyWindow(hWnd);
return ;
case WM_DESTROY:
PostQuitMessage();
return ;
} return DefWindowProc(hWnd, Message, wParam, lParam);
} int DXApp::Run()
{
MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, nullptr, , , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
RenderShell();
}
} return (int)msg.wParam;
} void DXApp::RenderShell()
{
if (m_bLostDevice)
{
HRESULT hr = m_pD3Ddevice->TestCooperativeLevel();
if (hr == D3DERR_DEVICELOST)
{
OnLostDevice();
return;
}
if (hr == D3DERR_DEVICENOTRESET)
{
m_pD3Ddevice->Reset(&m_PresentParamenters);
OnResetDevice();
return;
} m_bLostDevice = false;
}
m_pD3Ddevice->Clear(, nullptr, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(, , ), .f, 0L);
m_pD3Ddevice->BeginScene();
Update();
Render();
m_pD3Ddevice->EndScene();
HRESULT hr = m_pD3Ddevice->Present(, , , );
if (hr == D3DERR_DEVICELOST)
m_bLostDevice = true;
}
DirectX9完全面向对象框架的更多相关文章
- Web3D编程入门总结——面向对象的基础Web3D框架
本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...
- Web三维编程入门总结之二:面向对象的基础Web3D框架
本篇主要通过分析Tony Parisi的sim.js库(原版代码托管于:https://github.com/tparisi/WebGLBook/tree/master/sim),总结基础Web3D框 ...
- IOC框架
一. IOC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们打开机 ...
- 产品前端重构(TypeScript、MVC框架设计)
最近两周完成了对公司某一产品的前端重构,本文记录重构的主要思路及相关的设计内容. 公司期望把某一管理类信息系统从项目代码中抽取.重构为一个可复用的产品.该系统的前端是基于 ExtJs 5 进行构造的, ...
- 转:IOC框架
CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...
- 热门的PHP框架
每个PHP框架都拥有各自独特的地方.同时PHP语言已经获得了巨大的认同并且成为了世界上最通用的服务器脚本语言.PHP也俨然成为了最容易学习的web动态开发语言.在PHP发展的同时,PHP框架也迅速崛起 ...
- [Spring框架]Spring IOC的原理及详解。
这里感谢 CSDN 的原博客:http://blog.csdn.net/m13666368773/article/details/7802126 看后 受益匪浅,这里再重温一遍Spring IOC ...
- Ioc原理及常用框架
1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果我们 ...
- IoC框架(转载)
1 IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑. 图1:软件系统中耦合的对象 如果 ...
随机推荐
- ubuntu13.10更新sources.list
步骤: 1>设置网络连接方式,NAT 2>自动获取ip address 10.0.2.15 3>更新源soureces.list soureces.list deb http://m ...
- winform和wpf里必知的多线程知识
背景: 很多小伙伴经常在群里问线程的问题,平时我经常转一些视频教程这些人不看,我就自己写个总结吧 不过还是要注意的是,切换本来就不能太频繁,要一口气改. wpf的viewmodel就不需要UI线程,更 ...
- 498. (leetcode)对角线遍历
498. 对角线遍历 根据题目的图像看,主要有两种走法,第一种是向右上(顺时针方向),第二种是向左下(逆时针)走 我们设 x ,y初始为0,分别对应横纵坐标 现在分析右上(0,2) 为例:(注意右上的 ...
- Django学习 之后端视图与ajax
一.Ajax简介 在此之前你一定需要先学习下JavaScript JSON 可见: 前端学习 之 JavaScript 之 JSON 1.简单介绍 我们以前知道的前端向后端发送数据的方式有: GET: ...
- 设计模式课程 设计模式精讲 11-2 装饰者模式coding
1 代码演练 1.1 代码演练1(未使用装饰者模式) 1.2 代码演练2(使用装饰者模式) 1 代码演练 1.1 代码演练1(未使用装饰者模式) 需求: 大妈下班卖煎饼,加一个鸡蛋加一元,一个火腿两元 ...
- SSM(Spring-SpringMvc-Mybatis)练习
1.总结 https://pan.baidu.com/s/1kXlCf4r 密码:hv6v 2.代码 https://pan.baidu.com/s/1pNgKph5 密码:6rcm 3.资料 h ...
- Spring之IOC、AOP和事务
IOC 什么是IOC?如果你回答:Spring是个IOC容器,实现原理是反射,没了.这样证明你没有真正理解IOC. IOC的意思是控制反转,还有个外号叫依赖注入(DI).为什么起这么晦涩难懂的名字呢? ...
- vue v-model 数据双向绑定(笔记)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 四 动态sql 标签的使用(if&where&sql片段&foreach)
if标签的使用: userMapper.xml userMapper.java junit: where标签: 注意:写了where标签就不用手动写where语句 sql片段的设置和调用: forr ...
- LeetCode 804 唯一摩尔斯密码词
package com.lt.datastructure.Set; import java.util.TreeSet; /* * 一个摩斯码,对应一个字母.返回我们可以获得所有词不同单词翻译的数量. ...