本系列文章由@二货梦想家张程 所写,转载请注明出处。

本文章链接: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++】游戏编程学习笔记之三:游戏循环的使用的更多相关文章

  1. 【Visual C++】游戏编程学习笔记之四:透明动画实现

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...

  2. 【Visual C++】游戏编程学习笔记之八:鼠标输入消息(小demo)

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  3. 【Visual C++】游戏编程学习笔记之七:键盘输入消息

     本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.c ...

  4. 【Visual C++】游戏编程学习笔记之六:多背景循环动画

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44264153 作者:ZeeCod ...

  5. DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  6. DirectX 11游戏编程学习笔记之6: 第5章The Rendering Pipeline(渲染管线)

            本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com         注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...

  7. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  8. 【Visual C++】游戏编程学习笔记之五:单一背景滚动

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44224963 作者:ZeeCod ...

  9. 【Visual C++】游戏编程学习笔记之九:回合制游戏demo(剑侠客VS巡游天神)

    本系列文章由@二货梦想家张程 所写,转载请注明出处. 作者:ZeeCoder  微博链接:http://weibo.com/zc463717263 我的邮箱:michealfloyd@126.com ...

随机推荐

  1. ICL Auto Vectorization

    简介 此文简单介绍如何使用intel c++编译器实现向量化加速. 全文如下安排: base : 待优化的源代码. vectorization : 第一个向量化版本. aligned : 内存对其对向 ...

  2. 网络爬虫框架Scrapy简介

    作者: 黄进(QQ:7149101) 一. 网络爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本:它是一个自动提取网页的程序,它为搜索引擎从万维 ...

  3. EBS销售订单挑库发放处理程序

    来自:http://blog.csdn.net/cunxiyuan108/article/details/6014769 在EBS实施中,经常遇到从外部传进来一个被登记的销售订单,需要通过程序进行销售 ...

  4. mysql进阶(二十六)MySQL 索引类型(初学者必看)

    mysql进阶(二十六)MySQL 索引类型(初学者必看)   索引是快速搜索的关键.MySQL 索引的建立对于 MySQL 的高效运行是很重要的.下面介绍几种常见的 MySQL 索引类型.   在数 ...

  5. ROS_Kinetic_26 使用rosserial_windows实现windows与ROS master发送与接收消息

    使用rosserial_windows实现windows与ROS master发送与接收消息(适用版本hydro,indigo,jade,kinetic) 官方wiki地址汇总请参考:http://b ...

  6. Dynamics CRM 开启图表的3D效果展示

    CRM中的图表在我们的业务场景中用的很多,用户可以根据自己的实际需求来构建图表查看数据.我们平时看到的图表都是平面的,像下图中的这种,那有没有一种方式可以让展示3D效果看起来更立体呢,答案是可以的. ...

  7. 剑指offer面试题3 二维数组中的查找 (java)

    注:java主要可以利用字符串的length方法求出长度解决这个问题带来方便 public class FindNum { public static void main(String[] args) ...

  8. 18 Ui美化

    资源文件的使用: 一: res中文件中放置的文件类型: res/drawable//放处理过的图片 res/drawable-XXX //放的Ui切得图 >res/anim 放动画 >re ...

  9. React实现动画效果

    流畅.有意义的动画对于移动应用用户体验来说是非常必要的.和React Native的其他部分一样,动画API也还在积极开发中,不过我们已经可以联合使用两个互补的系统:用于全局的布局动画LayoutAn ...

  10. 讲究门面的Request

    为什么说Request讲究门面?注意这里所说的门面并非我们常理解的外表的意思,其实是说它使用了门面设计模式,门面的使用主要用于数据安全的考虑.一个大的系统体系的多个子系统之间涉及交互通信.一个系统中的 ...