DirectX游戏开发之代码的框架简析
DirectX游戏开发之代码的框架简析
此次学习过程中,主要参考的是大神“毛星云”的博客和DirectX 官方SDK,不少代码是在前两者的基础上略做修改。
在这两个上面你能够学得更全面,而我现在所做的仅仅是提供个人学习的一些看法和感悟吧!不少代码都是引用上面两者的。
框架第一步,“徒手”捏出一个窗口
游戏最最最基础的呈现就是一个窗口啊!我们第一步就来搞这个。
窗口的一生:
- 设计窗口类
//设计一个窗口类,像是私人定制一种自己喜欢的窗口的属性的组合,比喻为设计一种新的车型WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定义了一个窗口类wndClass.cbSize = sizeof( WNDCLASSEX ) ; //设置结构体的字节数大小,无需修改wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口类的样式,窗口类风格指定的是该类窗口所具有的风格wndClass.lpfnWndProc = WndProc; //设置指向窗口过程函数的指针,就是说绑定该类型窗口发送的消息由哪个响应函数处理wndClass.cbClsExtra = 0; //窗口类的附加内存,取0就可以了wndClass.cbWndExtra = 0; //窗口的附加内存,取0就行了wndClass.hInstance = hInstance; //指定包含窗口过程的程序的实例句柄。wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加载自定义ico图标,开发游戏,图标也是展现风格的一面wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //指定窗口类的光标句柄。wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个白色画刷句柄 wndClass.lpszMenuName = NULL; //指定菜单资源的名字,因为游戏一般不会用到菜单资源,设为空就好wndClass.lpszClassName = L"OurFantasticWindowsClass"; //指定窗口类的名字。
- 注册窗口类
//注册窗口类,比喻为设计好图纸后,拿去什么机构那里登记备案if( !RegisterClassEx( &wndClass ) ) //对窗口类进行注册,这样才能创建该类型的窗口return -1;
- 创建窗口
//正式创建窗口,开始造车子了,一台新系列的法拉利出炉啦HWND hwnd = CreateWindow( L"OurFantasticWindowsClass",WINDOW_TITLE, //创建窗口函数CreateWindowWS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, //填WS_OVERLAPPEDWINDOW参数的位置选的是窗口的样式,//不同于设计窗口类时的样式,前者指定的是某一个窗口的样式,//后者是指定某一类窗口WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );
WS_OVERLAPPEDWINDOW
修改这个可以搞出不同样式的窗口哦!
针对于做游戏,我强烈推荐 WS_POPUP
效果如下:
WS_OVERLAPPEDWINDOW
WS_POPUP
多简洁,加上一张背景图,完美啊!
- 窗口移动、显示、更新
//窗口的移动、显示与更新MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //调整窗口显示时左上角位置,不然是在(0,0)不好看ShowWindow( hwnd, nShowCmd ); //调用ShowWindow函数来显示窗口UpdateWindow(hwnd); //对窗口进行更新,就像我们买了新房子要装修一样
- 注销窗口类
//窗口类的注销UnregisterClass(L"OurFantasticWindowsClass", wndClass.hInstance); //程序准备结束,注销窗口类
介绍下整个游戏跑起来的大体结构吧
整体把握下,培养大局观
main.cpp
//-----------------------------------【程序说明】----------------------------------------------
// 程序名称:002
// 2016年8月 by UltramanGaia520
// 描述:DirectX游戏开发之代码的框架简析
//------------------------------------------------------------------------------------------------//-----------------------------------【头文件包含部分】---------------------------------------
// 描述:包含程序所依赖的头文件
//------------------------------------------------------------------------------------------------
#include <d3d9.h>//-----------------------------------【库文件包含部分】---------------------------------------
// 描述:包含程序所依赖的库文件
//------------------------------------------------------------------------------------------------//-----------------------------------【宏定义部分】--------------------------------------------
// 描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_WIDTH 800 //窗口宽度宏
#define WINDOW_HEIGHT 600 //窗口高度宏
#define WINDOW_TITLE L"燃烧吧青春--DirectX游戏开发之代码的框架简析" //窗口标题宏#define SAFE_RELEASE(p) { if(p) { (p)->Release(); (p)=NULL; } } //安全释放宏,便于后面COM接口指针的释放//-----------------------------------【全局变量声明部分】-------------------------------------
// 描述:全局变量的声明
//------------------------------------------------------------------------------------------------//-----------------------------------【全局函数声明部分】-------------------------------------
// 描述:全局函数声明,防止“未声明的标识”系列错误
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );//窗口过程函数
HRESULT Direct3D_Init(HWND hwnd); //Direct3D的初始化
HRESULT Objects_Init(HWND hwnd); //要绘制的物体的资源初始化
VOID Direct3D_Render(HWND hwnd); //进行Direct3D渲染代码的书写
VOID Direct3D_CleanUp( ); //清理COM资源以及其他资源//-----------------------------------【WinMain( )函数】--------------------------------------
// 描述:Windows应用程序的入口函数
//------------------------------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)
{//设计一个窗口类,像是私人定制一种自己喜欢的窗口的属性的组合,比喻为设计一种新的车型WNDCLASSEX wndClass = { 0 }; //用WINDCLASSEX定义了一个窗口类wndClass.cbSize = sizeof( WNDCLASSEX ) ; //设置结构体的字节数大小,无需修改wndClass.style = CS_HREDRAW | CS_VREDRAW; //设置窗口类的样式,窗口类风格指定的是该类窗口所具有的风格wndClass.lpfnWndProc = WndProc; //设置指向窗口过程函数的指针,就是说绑定该类型窗口发送的消息由哪个响应函数处理wndClass.cbClsExtra = 0; //窗口类的附加内存,取0就可以了wndClass.cbWndExtra = 0; //窗口的附加内存,取0就行了wndClass.hInstance = hInstance; //指定包含窗口过程的程序的实例句柄。wndClass.hIcon=(HICON)::LoadImage(NULL,L"icon.ico",IMAGE_ICON,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE); //本地加载自定义ico图标,开发游戏,图标也是展现风格的一面wndClass.hCursor = LoadCursor( NULL, IDC_ARROW ); //指定窗口类的光标句柄。wndClass.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //为hbrBackground成员指定一个白色画刷句柄 wndClass.lpszMenuName = NULL; //指定菜单资源的名字,因为游戏一般不会用到菜单资源,设为空就好wndClass.lpszClassName = L"OurFantasticWindowsClass"; //指定窗口类的名字。//注册窗口类,比喻为设计好图纸后,拿去什么机构那里登记备案if( !RegisterClassEx( &wndClass ) ) //对窗口类进行注册,这样才能创建该类型的窗口return -1; //正式创建窗口,开始造车子了,一台新系列的法拉利出炉啦HWND hwnd = CreateWindow( L"OurFantasticWindowsClass",WINDOW_TITLE, //创建窗口函数CreateWindowWS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, //填WS_OVERLAPPEDWINDOW参数的位置选的是窗口的样式,//不同于设计窗口类时的样式,前者指定的是某一个窗口的样式,//后者是指定某一类窗口WINDOW_HEIGHT, NULL, NULL, hInstance, NULL );//Direct3D资源的初始化Direct3D_Init (hwnd); //窗口的移动、显示与更新MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true); //调整窗口显示时左上角位置,不然是在(0,0)不好看ShowWindow( hwnd, nShowCmd ); //调用ShowWindow函数来显示窗口UpdateWindow(hwnd); //对窗口进行更新,就像我们买了新房子要装修一样//消息循环过程MSG msg = { 0 }; //初始化msgwhile( msg.message != WM_QUIT ) {if( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) //查看应用程序消息队列,有消息时将队列中的消息派发出去。{TranslateMessage( &msg ); //将虚拟键消息转换为字符消息DispatchMessage( &msg ); //该函数分发一个消息给窗口程序,就是给你之前绑定的那个窗口过程处理函数}else{Direct3D_Render(hwnd); //进行渲染}}//窗口类的注销UnregisterClass(L"OurFantasticWindowsClass", wndClass.hInstance); //程序准备结束,注销窗口类return 0;
}//-----------------------------------【WndProc( )函数】--------------------------------------
// 描述:窗口过程函数WndProc,对窗口消息进行处理
//------------------------------------------------------------------------------------------------
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{switch( message ) //switch语句,分别处理不同的消息{case WM_PAINT: //若是客户区重绘消息Direct3D_Render(hwnd); //调用Direct3D渲染函数ValidateRect(hwnd, NULL); //更新客户区的显示break; //跳出该switch语句,要记得这句,跳出去,不然继续往下,后果不堪设想case WM_KEYDOWN: //若是键盘按下消息if (wParam == VK_ESCAPE) //如果被按下的键是ESCDestroyWindow(hwnd); //销毁窗口, 并发送一条WM_DESTROY消息break; //跳出该switch语句case WM_DESTROY: //若是窗口销毁消息Direct3D_CleanUp(); //调用自定义的资源清理函数Game_CleanUp()进行退出前的资源清理PostQuitMessage( 0 ); //向系统表明有个线程有终止请求。用来响应WM_DESTROY消息break; //跳出该switch语句default: //不属于上面的情况,调用默认的处理方式就好return DefWindowProc( hwnd, message, wParam, lParam ); //调用缺省的窗口过程}return 0; //正常退出
}//-----------------------------------【Direct3D_Init( )函数】--------------------------------------
// 描述:Direct3D初始化函数,进行Direct3D的初始化
//------------------------------------------------------------------------------------------------
HRESULT Direct3D_Init(HWND hwnd)
{if(!(S_OK==Objects_Init(hwnd))) return E_FAIL; //调用一次Objects_Init,进行渲染资源的初始化return S_OK;
}//-----------------------------------【Object_Init( )函数】--------------------------------------
// 描述:渲染资源初始化函数,在此函数中进行要被渲染的物体的资源的初始化
//--------------------------------------------------------------------------------------------------
HRESULT Objects_Init(HWND hwnd)
{return S_OK;
}//-----------------------------------【Direct3D_Render( )函数】--------------------------------------
// 描述:使用Direct3D进行渲染
//--------------------------------------------------------------------------------------------------
void Direct3D_Render(HWND hwnd)
{//暂时为空,且听下回分解
}//-----------------------------------【Direct3D_CleanUp( )函数】--------------------------------
// 描述:资源清理函数,在此函数中进行程序退出前资源的清理工作
//---------------------------------------------------------------------------------------------------
void Direct3D_CleanUp()
{//暂时为空,且听下回分解
}
代码资源:CSDN资源
PS:如果爆这样的错
往往是因为使用的字符集的问题,进入项目属性页面
换用Unicode和多字节字符集,这里经常有人错
DirectX游戏开发之代码的框架简析相关推荐
- DirectX游戏开发之一个API玩转音乐
DirectX游戏开发之一个API玩转音乐 当你闭上眼睛,打开一款游戏,如刺客信条,英雄联盟,DNF,或者是当有一个人坐在你背后玩一款新游戏,第一时间吸引你的是什么? 没错,就是各种游戏的音效,包括背 ...
- MTK IMS框架简析(2)——IMS注册过程
之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...
- WWDC15 iOS游戏开发3个新框架全解
简介 在此次WWDC的游戏相关视频中,苹果再一次展现了它非凡的技术整合和持续创新能力.除了继续完善已有的2D游戏框架SpritKit, 3D游戏框架SceneKit和全新的图形渲染API Metal ...
- 什么是游戏开发的实体系统框架
原文地址:http://blog.csdn.net/aisajiajiao/article/details/19011259 上周我发布了Ash,一个Actionscript游戏开发实体系统框架,许多 ...
- 什么是游戏开发的实体系统框架 What is an entity system framework for game development
原文地址 上周我发布了Ash,一个Actionscript游戏开发实体系统框架,许多人问我这个问题"什么是实体系统框架?"本文就是我详尽的答案. 实体系统逐渐流行起来了,比较著名的 ...
- slg游戏客户端框架简析
前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...
- iOS游戏开发之使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏(教程含源码)
实战需求 使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏 本文价值与收获 看完本文后,您将能够作出下面的界面 实战代码 1.主界面 import SpriteKit im ...
- H5版俄罗斯方块游戏开发:需求分析和框架实现
俄罗斯方块和五子棋一样,规则简单,上手容易.几乎每个开发者,都会在其青春年华时,签下"xx到此一游".犹记得大一老师在布置大程作业的时候提过:"什么都可以写,唯一不能写的 ...
- 第三人称游戏开发-常用代码(1)
开发第三人称游戏,对于摄像机控制的一个简单代码..代码直接赋给摄像机,把游戏主角标签设为Player,摄像机就会自动找到主角并跟随. using UnityEngine; using System.C ...
最新文章
- Redis启动多端口,运行多实例(转)
- php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...
- Kubernetes存储之volume
- Linux / openwrt / Ubuntu 18.04 虚拟机中的 openwrt 如何联网
- Redis(九):Redis特殊类型之geospatial
- Spring Boot(十三)RabbitMQ安装与集成
- LeetCode-8-String to Integer (atoi)
- python不同颜色散点图_Python+matplotlib绘制不同大小和颜色散点图实例
- Spring常用注解用法总结
- 【初探IONIC】不会Native可不可以开发APP?
- 【干货摘录】和秋叶一起学PPT书本中干货集合、PPT设计必备网站、找字体网站
- 波兰表达式 逆波兰表达式
- 昨天晚上,世界首富马斯克给我上了一课!
- [转]Linux面试题(2020最新版)
- 数据结构与算法:B树(B-Tree)定义及搜索、插入、删除基本操作
- Redis介绍、安装、客户端
- FFMpeg.AutoGen(1)讲解官方example代码:Main函数、 解码
- 流量为王时代,APP推广需要解决难题,如何解决分享绑定上下级关系。
- 【总结】初创公司用AWS搭建高扩展性架构
- JQueryDOM和遍历