2D游戏编程5—锁定频率
核心利用win心跳函数GetTickCount利用差量锁定fps,如下代码锁定30fps,缺点为如果计算机不能以30fps运行,程序将低于30fps
- #define WIN32_LEAN_AND_MEAN // just say no to MFC
- #include <windows.h> // include all the windows headers
- #include <windowsx.h> // include useful macros
- #include <mmsystem.h> // very important and include WINMM.LIB too!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- // DEFINES ////////////////////////////////////////////////
- // defines for windows
- #define WINDOW_CLASS_NAME "WINCLASS1"
- #define WINDOW_WIDTH 400
- #define WINDOW_HEIGHT 300
- // MACROS /////////////////////////////////////////////////
- #define KEYDOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
- #define KEYUP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)
- // GLOBALS ////////////////////////////////////////////////
- HWND main_window_handle = NULL; // globally track main window
- HINSTANCE hinstance_app = NULL; // globally track hinstance
- char buffer[80]; // general printing buffer
- // FUNCTIONS //////////////////////////////////////////////
- LRESULT CALLBACK WindowProc(HWND hwnd,
- UINT msg,
- WPARAM wparam,
- LPARAM lparam)
- {
- // this is the main message handler of the system
- PAINTSTRUCT ps; // used in WM_PAINT
- HDC hdc; // handle to a device context
- char buffer[80]; // used to print strings
- // what is the message
- switch(msg)
- {
- case WM_CREATE:
- {
- // do initialization stuff here
- // return success
- return(0);
- } break;
- case WM_PAINT:
- {
- // simply validate the window
- hdc = BeginPaint(hwnd,&ps);
- // end painting
- EndPaint(hwnd,&ps);
- // return success
- return(0);
- } break;
- case WM_DESTROY:
- {
- // kill the application, this sends a WM_QUIT message
- PostQuitMessage(0);
- // return success
- return(0);
- } break;
- default:break;
- } // end switch
- // process any messages that we didn't take care of
- return (DefWindowProc(hwnd, msg, wparam, lparam));
- } // end WinProc
- // WINMAIN ////////////////////////////////////////////////
- int WINAPI WinMain( HINSTANCE hinstance,
- HINSTANCE hprevinstance,
- LPSTR lpcmdline,
- int ncmdshow)
- {
- WNDCLASSEX winclass; // this will hold the class we create
- HWND hwnd; // generic window handle
- MSG msg; // generic message
- HDC hdc; // graphics device context
- HPEN pen=NULL; // used to draw screen saver
- int color_change_count = 100; // used to track when to change color
- // first fill in the window class stucture
- winclass.cbSize = sizeof(WNDCLASSEX);
- winclass.style = CS_DBLCLKS | CS_OWNDC |
- CS_HREDRAW | CS_VREDRAW;
- winclass.lpfnWndProc = WindowProc;
- winclass.cbClsExtra = 0;
- winclass.cbWndExtra = 0;
- winclass.hInstance = hinstance;
- winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- winclass.hCursor = LoadCursor(NULL, IDC_ARROW);
- winclass.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
- winclass.lpszMenuName = NULL;
- winclass.lpszClassName = WINDOW_CLASS_NAME;
- winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
- // save hinstance in global
- hinstance_app = hinstance;
- // register the window class
- if (!RegisterClassEx(&winclass))
- return(0);
- // create the window
- if (!(hwnd = CreateWindowEx(NULL, // extended style
- WINDOW_CLASS_NAME, // class
- "Time Inverval Locked Screen Saver", // title
- WS_OVERLAPPEDWINDOW | WS_VISIBLE,
- 0,0, // initial x,y
- WINDOW_WIDTH, // initial width
- WINDOW_HEIGHT,// initial height
- NULL, // handle to parent
- NULL, // handle to menu
- hinstance,// instance of this application
- NULL))) // extra creation parms
- return(0);
- // save main window handle
- main_window_handle = hwnd;
- // get the dc and hold onto it
- hdc = GetDC(hwnd);
- // seed random number generator
- srand(GetTickCount());
- // endpoints of line
- int x1 = rand()%WINDOW_WIDTH;
- int y1 = rand()%WINDOW_HEIGHT;
- int x2 = rand()%WINDOW_WIDTH;
- int y2 = rand()%WINDOW_HEIGHT;
- // intial velocity of each end
- int x1v = -4 + rand()%8;
- int y1v = -4 + rand()%8;
- int x2v = -4 + rand()%8;
- int y2v = -4 + rand()%8;
- // enter main event loop, but this time we use PeekMessage()
- // instead of GetMessage() to retrieve messages
- while(TRUE)
- {
- // get time referrence
- DWORD start_time = GetTickCount();
- // test if there is a message in queue, if so get it
- if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
- {
- // test if this is a quit
- if (msg.message == WM_QUIT)
- break;
- // translate any accelerator keys
- TranslateMessage(&msg);
- // send the message to the window proc
- DispatchMessage(&msg);
- } // end if
- // is it time to change color
- if (++color_change_count >= 100)
- {
- // reset counter
- color_change_count = 0;
- // create a random colored pen
- if (pen)
- DeleteObject(pen);
- // create a new pen
- pen = CreatePen(PS_SOLID,1,RGB(rand()%256,rand()%256,rand()%256));
- // select the pen into context
- SelectObject(hdc,pen);
- } // end if
- // move endpoints of line
- x1+=x1v;
- y1+=y1v;
- x2+=x2v;
- y2+=y2v;
- // test if either end hit window edge
- if (x1 < 0 || x1 >= WINDOW_WIDTH)
- {
- // invert velocity
- x1v=-x1v;
- // bum endpoint back
- x1+=x1v;
- } // end if
- if (y1 < 0 || y1 >= WINDOW_HEIGHT)
- {
- // invert velocity
- y1v=-y1v;
- // bum endpoint back
- y1+=y1v;
- } // end if
- // now test second endpoint
- if (x2 < 0 || x2 >= WINDOW_WIDTH)
- {
- // invert velocity
- x2v=-x2v;
- // bum endpoint back
- x2+=x2v;
- } // end if
- if (y2 < 0 || y2 >= WINDOW_HEIGHT)
- {
- // invert velocity
- y2v=-y2v;
- // bum endpoint back
- y2+=y2v;
- } // end if
- // move to end one of line
- MoveToEx(hdc, x1,y1, NULL);
- // draw the line to other end
- LineTo(hdc,x2,y2);
- // lock time to 30 fps which is approx. 33 milliseconds
- while((GetTickCount() - start_time) < 33);
- // main game processing goes here
- if (KEYDOWN(VK_ESCAPE))
- SendMessage(hwnd, WM_CLOSE, 0,0);
- } // end while
- // release the device context
- ReleaseDC(hwnd,hdc);
- // return to Windows like this
- return(msg.wParam);
- } // end WinMain
- ///////////////////////////////////////////////////////////
2D游戏编程5—锁定频率的更多相关文章
- 2D游戏编程7—星空案例
// INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say ...
- 2D游戏编程6—windows程序模板
// INCLUDES /////////////////////////////////////////////// #define WIN32_LEAN_AND_MEAN // just say ...
- 2D游戏编程3—GDI
WM_PAINT消息触发程序重新绘制界面,过程如下: PAINTSTRUCT ps; // used in WM_PAINT HDC hdc; // handle to ...
- 2D游戏编程4—Windows事件
windows消息传来的参数分解: Message: WM_ACTIVATE Parameterization: fActive = LOWORD(wParam); // act ...
- 2D游戏编程2--windows高级编程
windows应用程序布局 编译流程 响应菜单事件消息 菜单消息处理实例: LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wpar ...
- 2D游戏编程1--windows编程模型
一.创建一个windows程序步骤 1.创建一个windows类 2.创建一个事件处理程序 3.注册windows类 4.用之前创建的windows类创建一个窗口 5.创建一个主事件循环 二.存储 ...
- Windows游戏编程之从零开始d
Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...
- 3D游戏编程大师技巧──2D引擎的编译问题
接上一篇文章,这里将介绍2D引擎的编译,从现在开始才真正进入<3D游戏编程大师技巧>的学习.本书的第一.二章只是简介了游戏编程和windows编程,从第三章开始才是介绍<window ...
- 游戏编程算法与技巧 Game Programming Algorithms and Techniques (Sanjay Madhav 著)
http://gamealgorithms.net 第1章 游戏编程概述 (已看) 第2章 2D图形 (已看) 第3章 游戏中的线性代数 (已看) 第4章 3D图形 (已看) 第5章 游戏输入 (已看 ...
随机推荐
- skip跳跃表的实现
skiplist介绍 跳表(skip List)是一种随机化的数据结构,基于并联的链表,实现简单,插入.删除.查找的复杂度均为O(logN).跳表的具体定义, 跳表是由William Pugh发明的, ...
- 理解依赖注入(IOC)和学习Unity
资料1: IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection). 作用:将各层的对象以松耦合的方式组织在一 ...
- delete删除多表
1.DELETE a.*, aa.* FROM student a, person aa WHERE a.id = aa.city_id AND a.name = '' 2.DELETE a.*, a ...
- 如何彻底删除PPA软件库
添加一个PPA源 sudo add-apt-repository ppa:user/ppa-name 如添加cairo-dock到weekly update源 sudo add-apt-reposit ...
- IEnumerable,ICollection,IList,List区别
做C#的同学们,都知道,一类只能有一个继承类,但可以实现多个接口.这句话就告诉我们:IEnumerable,ICollection,IList,List区别了 首先我看看 IEnumerable: / ...
- 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 ...
- C++返回引用的函数
要以引用返回函数值,则函数定义时的格式如下: 类型标识符&类型名 (形参列表及类型说明) { 函数体 } 用const限定引用的声明方式为: const 类型标识符&引用名=目标变量名 ...
- [转载]做一个 App 前需要考虑的几件事
本文转自http://limboy.me/tech/2016/07/06/starting-an-app.html ========================================= ...
- [原博客] BZOJ 2725 : [Violet 6]故乡的梦
这个题在bzoj上好像是个权限题,想做的可以去Vani的博客下载测试数据.这里有题面. 简单叙述一下题意:给你一个n个点.m条边的带权无向图,S点和T点,询问Q次删一条给定的边的S-T最短路. 其中 ...
- hdu 4731
一道找规律的题,但今天的智商捉急,一直都想不到点子上: 比赛之后和别人讨论的时候,在n=2的情况下,前面两个是aa,后面就接着很多个aababb,然后最后再判断下就行了~~~ 以后对于这种题还是不要太 ...