俄罗斯方块项目指导书(SDK-C)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

项目指导书——俄罗斯方块游戏摘要:对软件需求完全理解对于软件开发工作的成功至关重要的,需求说明的任务是发现、规范的过程,有益于提高软件开发过程中的能见度,便于对软件开发过程中的控制与管理,便于采用工程方法开发软件,提高软件的质量,便于开发人员、维护人员、管理人员之间的交流、协作,并作为工作成果的原始依据,并且在向潜在用户传递软件功能、性能需求,使其能够判断改软件是否与自己的需求相关。游戏需求:随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字形)砖块下落填充给定的区域,若填满一条便消掉,积分,当达到一定的分数时,过关,设置三关,每关砖块下落的速度不同,若在游戏中各形状填满了给定区域,为输。游戏的功能要求:游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,改区域用一种颜色表明,即用一种颜色作为背景,最好设为黑色,还需用另一种颜色把黑色围起来,宽度适中,要实现美感。游戏形状(砖块)需求:良好的砖块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字形),各个砖块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。键盘处理事件(消息):砖块下落时,可通过键盘方向键(上、下、左、右)对该砖块进行向上(变形)、向下(加速)、向左移动、向右移动。显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定的分数时过关。设置三关,每关砖块下落的速度不同。说明:文件注释Demo:/*****************************************************************(C)版权所有,2007-2008,思远教育**文件名:Map.h**作者:曹杰**版本:v1.0**生成日期:2007-08-18**功能描述:游戏中关于地图程序的一些声明*******************************************************************修改日期:无**修改者:无**修改原因:无*****************************************************************/函数注释与函数体注释Demo:/*********************************************************函数名:LoadBitmapToDC**功能:加载位图资源到设备上下文句柄**入口参数:char*pszFileName位图文件名*SIZE&sizeBitmap位图的尺寸**返回值:*位图资源到内存兼容设备上下文句柄**作者:曹杰*日期:2007-8-18**********************************************************/HDCLoadBitmapToDC(char*pszFileName,SIZE&sizeBitmap){//将位图文件加载到内存HBITMAPhBitmap=(HBITMAP)LoadImage(hInst,pszFileName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);//获取位图的尺寸DIBSECTIONds;GetObject(hBitmap,sizeof(ds),&ds);sizeBitmap.cx=ds.dsBmih.biWidth;sizeBitmap.cy=ds.dsBmih.biHeight;//创建内存兼容设备上下文句柄HDChBitmapDC=::CreateCompatibleDC(NULL);//将内存中的位图加载到内存兼容设备上下文句柄SelectObject(hBitmapDC,hBitmap);//释放内存位图资源DeleteObject(hBitmap);returnhBitmapDC;}变量注释Demo:HDCg_hMemoryDC=NULL;//内存双缓冲设备上下文句柄游戏界面设置:游戏界面主界面如下:俄罗斯方块游戏具体实现:首先整个游戏需要有窗体,所以我们必须建立一个基于Win32Application的工程:PrjBlock。如下图:点击ok按钮后如下图:选择“Atypical“HelloWorld!”application.”,点击Finish按钮完成项目创建工作。对创建项目进行修改,删除多于代码:1.将主文件中的About函数的声明删除:LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);删除2.删除项目中的菜单:在MyRegisterClass函数定义中,将wcex.lpszMenuName=(LPCSTR)IDC_PRJBLOCK;修改为wcex.lpszMenuName=NULL;3.将窗体的回调函数中多于的消息处理代码删除将LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)函数修改为LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}4.删除About函数定义部分:删除以下代码//Mesagehandlerforaboutbox.LRESULTCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_INITDIALOG:returnTRUE;caseWM_COMMAND:if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL){EndDialog(hDlg,LOWORD(wParam));returnTRUE;}break;}returnFALSE;}此时,大家可以对项目进行编译,即可得到如下界面:对主界面进行修改:在整个俄罗斯方块程序中,窗体的大小不能改变,即修改窗体创建的风格即可。在InitInstance函数定义中,创建窗体函数CreateWindow的关于窗体风格的参数进行修改,即将参数WS_OVERLAPPEDWINDOW修改为WS_SYSMENU|WS_MINIMIZEBOX,即hWnd=CreateWindow(szWindowClass,szTitle,WS_SYSMENU|WS_MINIMIZEBOX,CW_USEDEFAULT,0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);修改后窗体不能改变大小,也不能最大化窗体,界面如下:消息处理:为了保证程序的规范,使得消息处理的方便,对窗体的回调函数中的消息进行改写。在各种消息中,对窗体的操作,都需要获取窗体客户区的设备上下文句柄。在WindowsAPI中有这样两个获取设备上下午句柄HDC的函数:HDCBeginPaint(HWNDhwnd,//handletowindowLPPAINTSTRUCTlpPaint//paintinformation);与之对应的释放设备上下午句柄HDC为BOOLEndPaint(HWNDhWnd,//handletowindowCONSTPAINTSTRUCT*lpPaint//paintdata);HDCGetDC(HWNDhWnd//handletowindow);与之对应的释放设备上下午句柄HDC为intReleaseDC(HWNDhWnd,//handletowindowHDChDC//handletoDC);对于这两组函数的用法,大家需要注意:BeginPaint与EndPaint函数用在WM_PAINT消息中,获取/释放设备上下文句柄HDC;而GetDC与ReleaseDC函数用在非WM_PAINT消息中,获取/释放设备上下文句柄HDC。对于窗体回调函数WndProc的修改为:LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_CREATE:{HDChDC=GetDC(hWnd);OnCreate(hWnd,hDC,wParam,lParam);ReleaseDC(hWnd,hDC);}break;caseWM_PAINT:{PAINTSTRUCTps;HDChDC=BeginPaint(hWnd,&ps);OnPaint(hWnd,hDC,wParam,lParam);EndPaint(hWnd,&ps);}break;caseWM_DESTROY:{HDChDC=GetDC(hWnd);OnDestroy(hWnd,hDC,wParam,lParam);ReleaseDC(hWnd,hDC);PostQuitMessage(0);}break;default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}消息说明:WM_CREATE消息:窗体创建消息,即在窗体创建时(还未显示之前)将会响应该消息。WM_PAINT消息:窗体绘制消息,即在窗体绘制时(所有窗体需要绘制,如窗体的大小改变后窗体需要重新绘制,窗体的边缘被屏幕遮挡住然后重新要显示时等等)将会响应该消息。WM_DESTROY消息:窗体销毁消息,即在窗体销毁时(关闭窗体后)将会响应该消息。在每个消息中,我们首先获取了窗体客户区的设备上下午句柄HDC,然后分别调用了OnCreate/OnPaint/OnDestroy函数,最后释放了设备上下午句柄HDC。在调用OnCreate/OnPaint/OnDestroy函数时,分别将窗体句柄HWND、设备上下文句柄HDC以及对应消息的携带作为了三个函数的参数进行传递。但这三个函数并未实现,下面我们将实现这三个函数:对于所有的消息中调用的函数我们将使用新的文件来实现,方法如下:1.在工程中添加新的头文件对所要实现的三个函数进行声明:使用快捷键CTRL+N或在File菜单中点击New得到New对话框如下:给头文件取名为Message.h(注:File出输入Message,在选项中选择C/C++HeaderFile项),点击OK按钮确定添加Message.h头文件。然后在头文件中编写代码:为了防止头文件被其他文件重复包含,需要使用预编译指令#ifndef…#endif。#ifndef__MESSAGE_H__//如果没有定义宏__MESSAGE_H__#define__MESSAGE_H__//定义宏__MESSAGE_H__#endif//结束预编译指令#ifndef头文件中所有的内容将全部书写在#define与#endif中间。对于在使用SDK编程中,任何文件必须包含stdafx.h,并且必须在最前面,即#ifndef__MESSAGE_H__//如果没有定义宏__MESSAGE_H__#define__MESSAGE_H__//定义宏__MESSAGE_H__#includestdafx.h#endif//结束预编译指令#ifndef下面对OnCreate/OnPaint/OnDestroy函数进行外部声明:externvoidOnCreate(HWNDhWnd,HDChWinDC,WPARAMwParam,LPARAMlParam);externvoidOnPaint(HWNDhWnd,HDChWinDC,WPARAMwParam,LPARAMlPa

1 / 42
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功