ZhangZemin007 发表于 2013-1-26 12:27:46

C/C++游戏之旅(三)————键盘控制图形移动之游戏主框架

本文中我们将尝试着控制窗口中的小圆跟随者上下左右键的操作来移动,会涉及键盘事件响应,游戏帧数控制等一些类问题,废话少说,先贴上源码:
#include "main2.h"#include "MENUs.h"#define WIN32_LEAN_AND_MEAN#include <stdlib.h>#include <windows.h>       #include <windowsx.h>#include <stdio.h>#include <math.h>#include <mmsystem.h>#define WINDOW_CLASS_NAME "MY_CLASS"#define WINDOW_WIDTHGetSystemMetrics(SM_CXFULLSCREEN)#define WINDOW_HEIGHT GetSystemMetrics(SM_CYFULLSCREEN)// 图形的移动距离int xv = 50;int yv = 50;// 图形的开始坐标int ball_x = WINDOW_WIDTH/2;int ball_y = WINDOW_HEIGHT/2;int ball_x_old=WINDOW_WIDTH/2;int ball_y_old=WINDOW_HEIGHT/2;HWND hwnd=NULL;HPEN   black_pen=NULL;HBRUSH black_brush=NULL;HPEN   white_pen=NULL;HBRUSH green_brush=NULL;LRESULT CALLBACK WindowProc(HWND hwnd,   UINT msg,                           WPARAM wparam,                           LPARAM lparam){PAINTSTRUCTps;//图形绘制结构体HDChdc=NULL;//句柄switch(msg){case WM_CREATE: //窗口创建时      {return(0);} break;case WM_PAINT: //窗口重绘时{hdc = BeginPaint(hwnd,&ps);//开始绘制      EndPaint(hwnd,&ps);//结束绘制return(0);   } break;case WM_DESTROY://窗口销毁时{PostQuitMessage(0);return(0);} break;case WM_COMMAND:{switch(LOWORD(wparam)){//老实说:我也不知道这个函数是什么意思,从何而来,起什么作用                case MENU_FILE_ID_EXIT:                     {                     // 退出                     PostQuitMessage(0);                     } break;                case MENU_FILE_ID_OPEN:                                    {                     } break;                // handle each of sounds                case MENU_FILE_ID_CLOSE:                     {                     } break;                case MENU_FILE_ID_SAVE:                     {                     } break;}}case WM_KEYDOWN:{switch(wparam){                case VK_RIGHT:                     {ball_x_old=ball_x;ball_y_old=ball_y; //移动图形 ball_x+=xv;printf("ball_x_old:%d   ball_x:%d\n",ball_x_old,ball_x);                      } break;                case VK_LEFT:                                    { ball_x_old=ball_x; ball_y_old=ball_y;//移动图形 ball_x-=xv;printf("ball_x_old:%d   ball_x:%d\n",ball_x_old,ball_x);                      } break;                case VK_UP:                     { ball_x_old=ball_x; ball_y_old=ball_y;//移动图形 ball_y-=yv;printf("ball_y_old:%d   ball_y:%d\n",ball_y_old,ball_y);                     } break;                case VK_DOWN:                     {ball_x_old=ball_x;ball_y_old=ball_y;   //移动图形ball_y+=yv;printf("ball_y_old:%d   ball_y:%d\n",ball_y_old,ball_y);                     } break;case VK_ESCAPE:{PostQuitMessage(0);return(0);   }break;}}default:break;    }//将消息队列中 不属于该进程的消息发送给系统进程return (DefWindowProc(hwnd, msg, wparam, lparam));}//程序入口int WINAPI WinMain(HINSTANCE hinstance,//应用程序当前事例的句柄       HINSTANCE hprevinstance,//应用程序的前事例的句柄。对于一个32的位程序,该参数总为NULL       LPSTR lpcmdline,//指向应用程序命令行的空字符串的指针,不包括函数名。获得整个命令行,参看GetCommandLine       int ncmdshow//指明窗口如何显示   ){WNDCLASSEX winclass;//声明窗体信息结构体MSG   msg; HDC   hdc;winclass.cbSize=sizeof(WNDCLASSEX);//计算结构体大小winclass.style=CS_DBLCLKS | CS_OWNDC;//设置窗口风格,宽和高改变时刷新窗口winclass.lpfnWndProc=WindowProc;//指向时间句柄的函数指针,基本上都是响应某个操作的回调函数(是我们自己定义的函数),这里设为空。//下面两个字段原本是为了指示windows将附加的运行时间告诉系统的,大多数人都设为0winclass.cbClsExtra=0;winclass.cbWndExtra=0;winclass.hInstance=hinstance;//系统传给winmain函数的句柄winclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);//设置窗体图标winclass.hCursor=LoadCursor(NULL,IDC_ARROW);//设置光标winclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);//获取系统画刷、画笔、调色板或字体的一个句柄。winclass.lpszClassName=WINDOW_CLASS_NAME;//为自己创建的结构体赋别名,将来用它可以来引用该结构体winclass.lpszMenuName=NULL;//菜单资源,以后再作解释winclass.hIconSm=LoadIcon(NULL,IDI_APPLICATION);//应用程序图标//注册结构体if(!RegisterClassEx(&winclass)){return(0);}int x=GetSystemMetrics(SM_CXFULLSCREEN);//获取全屏 x的宽度int y=GetSystemMetrics(SM_CYFULLSCREEN);//获取全屏 y的高度//创建窗口hwnd=CreateWindowEx(NULL,WINDOW_CLASS_NAME,"哥的第一个窗口",WS_POPUP|WS_VISIBLE,0,0,x,y,NULL,NULL,hinstance,NULL);if(NULL==hwnd){return(0);}//得到图形设备描述表hdc = GetDC(hwnd);//创建花笔和刷子white_pen = CreatePen(PS_SOLID, 1, RGB(255,255,255));black_pen = CreatePen(PS_SOLID, 1, RGB(0,0,0));green_brush = CreateSolidBrush(RGB(0,255,0));black_brush = CreateSolidBrush(RGB(0,0,0));// 循环发送消息while(TRUE){          DWORD startTime=GetTickCount();//记录系统启动之后运行到现在的时间// 获取消息if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))   {    // 是否退出   if (msg.message == WM_QUIT)   break;   //转换消息   TranslateMessage(&msg);   // 发送消息   DispatchMessage(&msg);   } // 图形设备描述表选择画笔和刷子SelectObject(hdc, black_pen);SelectObject(hdc, black_brush);//画圆Ellipse(hdc, ball_x_old, ball_y_old, ball_x_old + 50, ball_y_old + 50);// 边界检测if (ball_x < 0 ){ball_x=0;}if(ball_x > WINDOW_WIDTH - 50){ ball_x=WINDOW_WIDTH - 50;;} // 边界检测if (ball_y < 0){ball_y=0;}if(ball_y > WINDOW_HEIGHT - 50){ ball_y=WINDOW_HEIGHT - 50;} // 图形设备描述表选择画笔和刷子SelectObject(hdc, white_pen);SelectObject(hdc, green_brush);// 画圆Ellipse(hdc, ball_x, ball_y, ball_x +50, ball_y + 50);//设置游戏帧数为1000/33,即每秒30帧while((GetTickCount()-startTime)<33);}//释放所有笔和刷子DeleteObject(white_pen);DeleteObject(black_pen);DeleteObject(green_brush);DeleteObject(black_brush);//释放图形设备描述表ReleaseDC(hwnd,hdc);return(msg.wParam);}
当你运行商上面的代码会看到一个小圆,用上下左右键去控制他,看看效果如何?
同时这也是我们后面编写程序的主要框架,也就是说,后面的代码都会在这个基础之上来修改,下一文中我们将会开始研究DirectX.
页: [1]
查看完整版本: C/C++游戏之旅(三)————键盘控制图形移动之游戏主框架