核心利用win心跳函数GetTickCount利用差量锁定fps,如下代码锁定30fps,缺点为如果计算机不能以30fps运行,程序将低于30fps

  1. #define WIN32_LEAN_AND_MEAN // just say no to MFC
  2.  
  3. #include <windows.h> // include all the windows headers
  4. #include <windowsx.h> // include useful macros
  5. #include <mmsystem.h> // very important and include WINMM.LIB too!
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9.  
  10. // DEFINES ////////////////////////////////////////////////
  11.  
  12. // defines for windows
  13. #define WINDOW_CLASS_NAME "WINCLASS1"
  14.  
  15. #define WINDOW_WIDTH 400
  16. #define WINDOW_HEIGHT 300
  17.  
  18. // MACROS /////////////////////////////////////////////////
  19.  
  20. #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
  21. #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
  22.  
  23. // GLOBALS ////////////////////////////////////////////////
  24. HWND main_window_handle = NULL; // globally track main window
  25.  
  26. HINSTANCE hinstance_app = NULL; // globally track hinstance
  27. char buffer[80]; // general printing buffer
  28.  
  29. // FUNCTIONS //////////////////////////////////////////////
  30. LRESULT CALLBACK WindowProc(HWND hwnd,
  31. UINT msg,
  32. WPARAM wparam,
  33. LPARAM lparam)
  34. {
  35. // this is the main message handler of the system
  36. PAINTSTRUCT ps; // used in WM_PAINT
  37. HDC hdc; // handle to a device context
  38. char buffer[80]; // used to print strings
  39.  
  40. // what is the message
  41. switch(msg)
  42. {
  43. case WM_CREATE:
  44. {
  45. // do initialization stuff here
  46. // return success
  47. return(0);
  48. } break;
  49.  
  50. case WM_PAINT:
  51. {
  52. // simply validate the window
  53. hdc = BeginPaint(hwnd,&ps);
  54.  
  55. // end painting
  56. EndPaint(hwnd,&ps);
  57.  
  58. // return success
  59. return(0);
  60. } break;
  61.  
  62. case WM_DESTROY:
  63. {
  64.  
  65. // kill the application, this sends a WM_QUIT message
  66. PostQuitMessage(0);
  67.  
  68. // return success
  69. return(0);
  70. } break;
  71.  
  72. default:break;
  73.  
  74. } // end switch
  75.  
  76. // process any messages that we didn't take care of
  77. return (DefWindowProc(hwnd, msg, wparam, lparam));
  78.  
  79. } // end WinProc
  80.  
  81. // WINMAIN ////////////////////////////////////////////////
  82. int WINAPI WinMain( HINSTANCE hinstance,
  83. HINSTANCE hprevinstance,
  84. LPSTR lpcmdline,
  85. int ncmdshow)
  86. {
  87.  
  88. WNDCLASSEX winclass; // this will hold the class we create
  89. HWND hwnd; // generic window handle
  90. MSG msg; // generic message
  91. HDC hdc; // graphics device context
  92.  
  93. HPEN pen=NULL; // used to draw screen saver
  94. int color_change_count = 100; // used to track when to change color
  95.  
  96. // first fill in the window class stucture
  97. winclass.cbSize = sizeof(WNDCLASSEX);
  98. winclass.style = CS_DBLCLKS | CS_OWNDC |
  99. CS_HREDRAW | CS_VREDRAW;
  100. winclass.lpfnWndProc = WindowProc;
  101. winclass.cbClsExtra = 0;
  102. winclass.cbWndExtra = 0;
  103. winclass.hInstance = hinstance;
  104. winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  105. winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
  106. winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
  107. winclass.lpszMenuName = NULL;
  108. winclass.lpszClassName = WINDOW_CLASS_NAME;
  109. winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  110.  
  111. // save hinstance in global
  112. hinstance_app = hinstance;
  113.  
  114. // register the window class
  115. if (!RegisterClassEx(&winclass))
  116. return(0);
  117.  
  118. // create the window
  119. if (!(hwnd = CreateWindowEx(NULL, // extended style
  120. WINDOW_CLASS_NAME, // class
  121. "Time Inverval Locked Screen Saver", // title
  122. WS_OVERLAPPEDWINDOW | WS_VISIBLE,
  123. 0,0, // initial x,y
  124. WINDOW_WIDTH, // initial width
  125. WINDOW_HEIGHT,// initial height
  126. NULL, // handle to parent
  127. NULL, // handle to menu
  128. hinstance,// instance of this application
  129. NULL))) // extra creation parms
  130. return(0);
  131.  
  132. // save main window handle
  133. main_window_handle = hwnd;
  134.  
  135. // get the dc and hold onto it
  136. hdc = GetDC(hwnd);
  137.  
  138. // seed random number generator
  139. srand(GetTickCount());
  140.  
  141. // endpoints of line
  142. int x1 = rand()%WINDOW_WIDTH;
  143. int y1 = rand()%WINDOW_HEIGHT;
  144. int x2 = rand()%WINDOW_WIDTH;
  145. int y2 = rand()%WINDOW_HEIGHT;
  146.  
  147. // intial velocity of each end
  148. int x1v = -4 + rand()%8;
  149. int y1v = -4 + rand()%8;
  150. int x2v = -4 + rand()%8;
  151. int y2v = -4 + rand()%8;
  152.  
  153. // enter main event loop, but this time we use PeekMessage()
  154. // instead of GetMessage() to retrieve messages
  155. while(TRUE)
  156. {
  157. // get time referrence
  158. DWORD start_time = GetTickCount();
  159.  
  160. // test if there is a message in queue, if so get it
  161. if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  162. {
  163. // test if this is a quit
  164. if (msg.message == WM_QUIT)
  165. break;
  166.  
  167. // translate any accelerator keys
  168. TranslateMessage(&msg);
  169.  
  170. // send the message to the window proc
  171. DispatchMessage(&msg);
  172. } // end if
  173.  
  174. // is it time to change color
  175. if (++color_change_count >= 100)
  176. {
  177. // reset counter
  178. color_change_count = 0;
  179.  
  180. // create a random colored pen
  181. if (pen)
  182. DeleteObject(pen);
  183.  
  184. // create a new pen
  185. pen = CreatePen(PS_SOLID,1,RGB(rand()%256,rand()%256,rand()%256));
  186.  
  187. // select the pen into context
  188. SelectObject(hdc,pen);
  189.  
  190. } // end if
  191.  
  192. // move endpoints of line
  193. x1+=x1v;
  194. y1+=y1v;
  195.  
  196. x2+=x2v;
  197. y2+=y2v;
  198.  
  199. // test if either end hit window edge
  200. if (x1 < 0 || x1 >= WINDOW_WIDTH)
  201. {
  202. // invert velocity
  203. x1v=-x1v;
  204.  
  205. // bum endpoint back
  206. x1+=x1v;
  207. } // end if
  208.  
  209. if (y1 < 0 || y1 >= WINDOW_HEIGHT)
  210. {
  211. // invert velocity
  212. y1v=-y1v;
  213.  
  214. // bum endpoint back
  215. y1+=y1v;
  216. } // end if
  217.  
  218. // now test second endpoint
  219. if (x2 < 0 || x2 >= WINDOW_WIDTH)
  220. {
  221. // invert velocity
  222. x2v=-x2v;
  223.  
  224. // bum endpoint back
  225. x2+=x2v;
  226. } // end if
  227.  
  228. if (y2 < 0 || y2 >= WINDOW_HEIGHT)
  229. {
  230. // invert velocity
  231. y2v=-y2v;
  232.  
  233. // bum endpoint back
  234. y2+=y2v;
  235. } // end if
  236.  
  237. // move to end one of line
  238. MoveToEx(hdc, x1,y1, NULL);
  239.  
  240. // draw the line to other end
  241. LineTo(hdc,x2,y2);
  242.  
  243. // lock time to 30 fps which is approx. 33 milliseconds
  244. while((GetTickCount() - start_time) < 33);
  245.  
  246. // main game processing goes here
  247. if (KEYDOWN(VK_ESCAPE))
  248. SendMessage(hwnd, WM_CLOSE, 0,0);
  249.  
  250. } // end while
  251.  
  252. // release the device context
  253. ReleaseDC(hwnd,hdc);
  254.  
  255. // return to Windows like this
  256. return(msg.wParam);
  257.  
  258. } // end WinMain
  259.  
  260. ///////////////////////////////////////////////////////////

2D游戏编程5—锁定频率的更多相关文章

  1. 2D游戏编程7—星空案例

    // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say ...

  2. 2D游戏编程6—windows程序模板

    // INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say ...

  3. 2D游戏编程3—GDI

    WM_PAINT消息触发程序重新绘制界面,过程如下: PAINTSTRUCT    ps;    // used in WM_PAINT HDC        hdc;    // handle to ...

  4. 2D游戏编程4—Windows事件

    windows消息传来的参数分解: Message: WM_ACTIVATE Parameterization: fActive      = LOWORD(wParam);       // act ...

  5. 2D游戏编程2--windows高级编程

      windows应用程序布局 编译流程 响应菜单事件消息 菜单消息处理实例: LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wpar ...

  6. 2D游戏编程1--windows编程模型

    一.创建一个windows程序步骤 1.创建一个windows类 2.创建一个事件处理程序 3.注册windows类 4.用之前创建的windows类创建一个窗口 5.创建一个主事件循环   二.存储 ...

  7. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  8. 3D游戏编程大师技巧──2D引擎的编译问题

    接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...

  9. 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)

    http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...

随机推荐

  1. skip跳跃表的实现

    skiplist介绍 跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入.删除.查找的复杂度均为O(logN).跳表的具体定义, 跳表是由William Pugh发明的, ...

  2. 理解依赖注入(IOC)和学习Unity

    资料1: IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...

  3. delete删除多表

    1.DELETE a.*, aa.* FROM student a, person aa WHERE a.id = aa.city_id AND a.name = '' 2.DELETE a.*, a ...

  4. 如何彻底删除PPA软件库

    添加一个PPA源 sudo add-apt-repository ppa:user/ppa-name 如添加cairo-dock到weekly update源 sudo add-apt-reposit ...

  5. IEnumerable,ICollection,IList,List区别

    做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 首先我看看 IEnumerable: / ...

  6. sql 判断一个表的数据不在另一个表中

    SELECT a.* FROM a LEFT JOIN b ON a.key = b.key WHERE (b.key IS NULL) end as flag from a select id fr ...

  7. C++返回引用的函数

    要以引用返回函数值,则函数定义时的格式如下: 类型标识符&类型名 (形参列表及类型说明) { 函数体 } 用const限定引用的声明方式为: const 类型标识符&引用名=目标变量名 ...

  8. [转载]做一个 App 前需要考虑的几件事

    本文转自http://limboy.me/tech/2016/07/06/starting-an-app.html ========================================= ...

  9. [原博客] BZOJ 2725 : [Violet 6]故乡的梦

    这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中  ...

  10. hdu 4731

    一道找规律的题,但今天的智商捉急,一直都想不到点子上: 比赛之后和别人讨论的时候,在n=2的情况下,前面两个是aa,后面就接着很多个aababb,然后最后再判断下就行了~~~ 以后对于这种题还是不要太 ...