【Visual C++】游戏编程学习笔记之三:游戏循环的使用
本系列文章由@二货梦想家张程 所写,转载请注明出处。
本文章链接:http://blog.csdn.net/terence1212/article/details/44208419
作者:ZeeCoder 微博链接:http://weibo.com/zc463717263
我的邮箱:michealfloyd@126.com 欢迎大家发邮件来和我交流编程心得
you are what you read!与大家共勉!
-------------------------------------------------------分割线:ZeeCoder-----------------------------------------------
上一个学习笔记中写了用定时器来实现简易动画,但是在实际游戏编程开发中,往往需要游戏画面在一秒之内更新至少25次以上,这一秒钟内程序还必须进行消息的处理和大量数学运算甚至音效的输出等操作。如此看来,定时器往往满足不了这一需求。所以提出了游戏循环的概念,其基本思想是:判断其中的内容是否有当前要处理的消息,如果有则处理,否则按照设定的时间间隔来重绘画面。其代码如下:
<span style="font-size:12px;">//gamecircle
GetMessage(&msg,NULL,NULL,NULL);//MSG初始化,如果没有初始化会报错
while ( msg.message != WM_QUIT)//如果窗口消息不是WM_QUIT,则继续运行循环
{
//BOOL PeekMessage( //函数原型
// LPMSG IpMsg, //接受消息用的MSG指针
// HWND hWnd, //某消息被检查的窗口句柄
// UINT wMSGfilterMin, //指定被检查的消息范围里的第一个消息
// UINT wMsgFilterMax, //指定被检查的消息范围里的最后一个消息
// UINT wRemoveMsg //确定消息如何被处理
// );
if ( PeekMessage( &msg , NULL ,0 ,0 ,PM_REMOVE))//PM_REMOVE消息从队列里除掉
{
TranslateMessage( &msg);
DispatchMessage(&msg);
}
else
{
tNow = GetTickCount();
if (tNow - tPre >= 100) //相差0.1秒时在进行重绘操作
MyPaint(hdc);
}
}</span>
上述代码理解后就可以进行游戏循环的编程了。来看具体代码
1、声明全局变量
// Global Variables: HINSTANCE hInst; // current instance TCHAR szTitle[MAX_LOADSTRING]; // The title bar text TCHAR szWindowClass[MAX_LOADSTRING]; // the main window class name HBITMAP walker[16]; HDC hdc , mdc ; HWND hwnd; DWORD tPre , tNow ,tCheck; //tPre记录上一次的绘图时间,tNow记录此次准备绘图的时间,tCheck记录每秒开始的时间 int num ,frame ,fps;//num记录图号,frame用来累加每次画面更新的次数,fps记录每秒画面更新的次数
2、主函数
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: Place code here.
MSG msg;
//HACCEL hAccelTable;
// Initialize global strings
LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
LoadString(hInstance, IDC_GAMECIRCLE, szWindowClass, MAX_LOADSTRING);
MyRegisterClass(hInstance);
// Perform application initialization:
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
////gamecircle
GetMessage(&msg,NULL,NULL,NULL);//MSG初始化,如果没有初始化会报错
while ( msg.message != WM_QUIT)
{
//BOOL PeekMessage(
// LPMSG IpMsg, //接受消息用的MSG指针
// HWND hWnd, //某消息被检查的窗口句柄
// UINT wMSGfilterMin, //指定被检查的消息范围里的第一个消息
// UINT wMsgFilterMax, //指定被检查的消息范围里的最后一个消息
// UINT wRemoveMsg //确定消息如何被处理
// );
if ( PeekMessage( &msg , NULL ,0 ,0 ,PM_REMOVE))//PM_REMOVE消息从队列里除掉
{
TranslateMessage( &msg);
DispatchMessage(&msg);
}
else
{
tNow = GetTickCount();
if (tNow - tPre >= 100) //相差0.1秒时在进行重绘操作
MyPaint(hdc);
}
}
3、自定义绘图函数
void MyPaint(HDC hdc)
{
TCHAR str[40];
if (num == 15)
num =0;
frame++; //更新次数加1
if (tNow - tCheck >= 1000)
{
fps = frame;
frame = 0 ;
tCheck = tNow;
}
SelectObject(mdc , walker[num]);
_stprintf_s(str , TEXT("每秒显示%d个画面") ,fps );
TextOut(mdc , 0 ,0 , str , _tcslen(str));
BitBlt(hdc , 0 ,0 ,600 ,450 , mdc , 0 , 0 ,SRCCOPY);
tPre = GetTickCount(); //记录此次绘图时间
num++;
}
4、初始化函数
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
TCHAR filename[20] ;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
{
return FALSE;
}
MoveWindow(hWnd , 10 ,10 ,600 ,450 ,true);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
int i;
//载入各个人物位图
for ( i = 0 ; i <= 15 ;i++)
{
_stprintf_s(filename , TEXT("%d.bmp") , i);
walker[i] = (HBITMAP)LoadImage(NULL , filename , IMAGE_BITMAP , 121 ,129, LR_LOADFROMFILE);
}
num = 0 ;
frame = 0 ;
MyPaint(hdc);
return TRUE;
}
5、实现效果:
我们设定的画面更新时间是0.1秒,那么每秒中最多更新10次。
笔记三就写到这里了,还是那句话,欢迎大家发邮件和我交流学习~也请继续关注我的学习笔记~
学习游戏编程的路还很长,我还没有入门,望继续坚持下去,自我勉励~
end~
【Visual C++】游戏编程学习笔记之三:游戏循环的使用的更多相关文章
- 【Visual C++】游戏编程学习笔记之四:透明动画实现
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- 【Visual C++】游戏编程学习笔记之七:键盘输入消息
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...
- 【Visual C++】游戏编程学习笔记之六:多背景循环动画
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44264153 作者:ZeeCod ...
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- Bash脚本编程学习笔记07:循环结构体
本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...
- 【Visual C++】游戏编程学习笔记之五:单一背景滚动
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...
- 【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)
本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder 微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...
随机推荐
- 【SSH系列】深入浅出spring IOC中三种依赖注入方式
spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控 ...
- 初识gd库
必备基础 开启GD拓展 列表使用 获取图片信息代码 图片详细信息 特效函数 示例 运行结果 分析 获取图片基本信息 获取图片宽度 获取图片高度 获取图片后缀名 获取图片mime类型 操作图片 添加文字 ...
- springmvc的介绍和第一个例子
SpringMVC是Spring 框架自带的一部分. SpringMVC底层基于:Servlet Struts2底层基于:filter struts1底层基于:Servlet spring 各模块 我 ...
- JAVA面向对象-----面向对象(基础预备知识汇总)
终于整理好了面向对象基础预备知识,但是有点多,所以你们懂的,贴图,较长的代码我还是会排版出来的,我不想把时间浪费在排版上在word里排版一次已经很浪费时间了,所以请谅解. public class C ...
- 集合框架之Collection接口
Collection 层次结构中的根接口.Collection表示一组对象,这些对象也称为 collection 的元素.一些 collection 允许有重复的元素,而另一些则不允许.一些 coll ...
- Dynamics CRM2015 Update1 新功能之表单增强功能
CRM2015 Update 1发布后,系统的界面的变化很大,仔细观察后会发现表单窗体也有些不同了,在CRM2015 Update1的官方介绍中对此变化的解释是起用了新的窗体呈现引擎,让界面更好看加载 ...
- Android简易实战教程--第二十七话《自定义View入门案例之开关按钮详细分析》
转载此博客请注明出处点击打开链接 http://blog.csdn.net/qq_32059827/article/details/52444145 对于自定义view,可能是一个比较大的 ...
- 【Netty源码分析】Reactor线程模型
1. 背景 1.1. Java线程模型的演进 1.1.1. 单线程 时间回到十几年前,那时主流的CPU都还是单核(除了商用高性能的小机),CPU的核心频率是机器最重要的指标之一. 在Java领域当时比 ...
- UNIX网络编程——进程间通信概述
一.顺序程序与并发程序特征 顺序程序特征 顺序性封闭性:(运行环境的封闭性)确定性可再现性 并发程序特征 共享性并发性随机性 二.进程互斥 1.由于各进程要求共享资源,而且有些资源需要互斥使用,因此各 ...
- linux下连接windows的远程桌面
拿ubuntu来举例: 1安装rdesktop 2 rdesktop -f 196.168.1.11:3389 3 哦鸟