DirectX游戏开发之代码的框架简析

此次学习过程中,主要参考的是大神“毛星云”的博客DirectX 官方SDK,不少代码是在前两者的基础上略做修改
在这两个上面你能够学得更全面,而我现在所做的仅仅是提供个人学习的一些看法和感悟吧!不少代码都是引用上面两者的。


框架第一步,“徒手”捏出一个窗口

游戏最最最基础的呈现就是一个窗口啊!我们第一步就来搞这个。
窗口的一生:

  1. 设计窗口类
 //设计一个窗口类,像是私人定制一种自己喜欢的窗口的属性的组合,比喻为设计一种新的车型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";       //指定窗口类的名字。
  1. 注册窗口类
    //注册窗口类,比喻为设计好图纸后,拿去什么机构那里登记备案if( !RegisterClassEx( &wndClass ) )             //对窗口类进行注册,这样才能创建该类型的窗口return -1;      
  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

多简洁,加上一张背景图,完美啊!

  1. 窗口移动、显示、更新
    //窗口的移动、显示与更新MoveWindow(hwnd,250,80,WINDOW_WIDTH,WINDOW_HEIGHT,true);        //调整窗口显示时左上角位置,不然是在(0,0)不好看ShowWindow( hwnd, nShowCmd );   //调用ShowWindow函数来显示窗口UpdateWindow(hwnd);             //对窗口进行更新,就像我们买了新房子要装修一样
  1. 注销窗口类
    //窗口类的注销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游戏开发之代码的框架简析相关推荐

  1. DirectX游戏开发之一个API玩转音乐

    DirectX游戏开发之一个API玩转音乐 当你闭上眼睛,打开一款游戏,如刺客信条,英雄联盟,DNF,或者是当有一个人坐在你背后玩一款新游戏,第一时间吸引你的是什么? 没错,就是各种游戏的音效,包括背 ...

  2. MTK IMS框架简析(2)——IMS注册过程

    之前在<MTK IMS框架简析(1)--代码架构及模块初始化> 中已经分析了ims代码的构成和重点类的初始化,接下来以启用VOLTE子功能为例,具体分析AP侧IMS服务的注册过程. 概要 ...

  3. WWDC15 iOS游戏开发3个新框架全解

    简介 在此次WWDC的游戏相关视频中,苹果再一次展现了它非凡的技术整合和持续创新能力.除了继续完善已有的2D游戏框架SpritKit, 3D游戏框架SceneKit和全新的图形渲染API Metal ...

  4. 什么是游戏开发的实体系统框架

    原文地址:http://blog.csdn.net/aisajiajiao/article/details/19011259 上周我发布了Ash,一个Actionscript游戏开发实体系统框架,许多 ...

  5. 什么是游戏开发的实体系统框架 What is an entity system framework for game development

    原文地址 上周我发布了Ash,一个Actionscript游戏开发实体系统框架,许多人问我这个问题"什么是实体系统框架?"本文就是我详尽的答案. 实体系统逐渐流行起来了,比较著名的 ...

  6. slg游戏客户端框架简析

    前言 从18年3月开始,进入新公司,参与一款slg海战类游戏的开发,全程负责slg海战类游戏大地图模块的开发,以及部分框架的完善和其他内容的开发.游戏已经正式上线一段时间了,工作空闲了一些,趁空闲的这 ...

  7. iOS游戏开发之使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏(教程含源码)

    实战需求 使用 Spritekit 框架和 Swift 的 iOS 2D 太空射击游戏 本文价值与收获 看完本文后,您将能够作出下面的界面 实战代码 1.主界面 import SpriteKit im ...

  8. H5版俄罗斯方块游戏开发:需求分析和框架实现

    俄罗斯方块和五子棋一样,规则简单,上手容易.几乎每个开发者,都会在其青春年华时,签下"xx到此一游".犹记得大一老师在布置大程作业的时候提过:"什么都可以写,唯一不能写的 ...

  9. 第三人称游戏开发-常用代码(1)

    开发第三人称游戏,对于摄像机控制的一个简单代码..代码直接赋给摄像机,把游戏主角标签设为Player,摄像机就会自动找到主角并跟随. using UnityEngine; using System.C ...

最新文章

  1. Redis启动多端口,运行多实例(转)
  2. php socket非阻塞,php stream_set_blocking设置非阻塞模式,php stream_set_blocking影响函数fgets()和fread()...
  3. Kubernetes存储之volume
  4. Linux / openwrt / Ubuntu 18.04 虚拟机中的 openwrt 如何联网
  5. Redis(九):Redis特殊类型之geospatial
  6. Spring Boot(十三)RabbitMQ安装与集成
  7. LeetCode-8-String to Integer (atoi)
  8. python不同颜色散点图_Python+matplotlib绘制不同大小和颜色散点图实例
  9. Spring常用注解用法总结
  10. 【初探IONIC】不会Native可不可以开发APP?
  11. 【干货摘录】和秋叶一起学PPT书本中干货集合、PPT设计必备网站、找字体网站
  12. 波兰表达式 逆波兰表达式
  13. 昨天晚上,世界首富马斯克给我上了一课!
  14. [转]Linux面试题(2020最新版)
  15. 数据结构与算法:B树(B-Tree)定义及搜索、插入、删除基本操作
  16. Redis介绍、安装、客户端
  17. FFMpeg.AutoGen(1)讲解官方example代码:Main函数、 解码
  18. 流量为王时代,APP推广需要解决难题,如何解决分享绑定上下级关系。
  19. 【总结】初创公司用AWS搭建高扩展性架构
  20. JQueryDOM和遍历

热门文章

  1. 架构师之数字判断-----------------怎么判断一个字符串是个数字
  2. 9.6 去中心化的自治组织
  3. 与dB相关的参数(B/dB/dBW/dBm/dBV/dBu)
  4. 华为机试python打印机_华为校园招聘上机笔试题 扑克牌大小(python)
  5. Excel的简单编程
  6. ssm基于BS架构的校园爱心捐赠与物品交换平台的设计与实现毕业设计源码301133
  7. 湖泊遥感研究进展(概述)
  8. 2017年Android百大框架排行榜
  9. 为什么RSA公钥每次加密得到的结果都不一样?
  10. Java学习记录 Java与JSON