下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 VC++_win32_API_游戏开发(最新)

VC++_win32_API_游戏开发(最新).ppt

VC++_win32_API_游戏开发(最新)

liuwei
2010-12-20 0人阅读 举报 0 0 暂无简介

简介:本文档为《VC++_win32_API_游戏开发(最新)ppt》,可适用于IT/计算机领域

VCwinAPI游戏开发VCwinAPI游戏开发主讲教师:李璟联系电话:Email:lijingsdjzueducnVCwinAPI游戏开发VCwinAPI游戏开发Windows编程Windows应用程序的组成与编程游戏实现原理与WindowGDI绘图游戏实例的剖析Windows编程Windows编程WindowsAPI编程基础窗口事件驱动句柄消息Windows应用程序的常用消息WindowsAPI编程基础WindowsAPI编程基础Windows编程的方法主要有两种方法:传统编写法:利用API函数。交互式方法:利用MFC类库。为使程序员编写具有Windows风格的应用程序Windows提供了一个应用程序编程接口(ApplicationProgrammingInterface简称API)它是Windows系统与Windows应用程序间的标准程序接口。上千个API函数包含了各种窗口类和系统资源。API可以为应用程序提供windows系统特殊函数及数据结构。windows应用程序可以利用大量API函数调用系统功能。MFCMFCMFC,MicrosoftFoundationClassLibrary微软基础类库约有个类。MFC封装了大部分API函数并提供了一个应用程序框架简化了和标准了windows程序设计。但WindowsAPI编程方法始终是windows编程的基础。窗口窗口编写一个Windows应用程序首先应创建一个或多个窗口而后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。事件驱动事件驱动Windows程序设计是针对事件或消息的它的执行顺序取决于事件发生的顺序。在Windows环境下应用程序启动后系统等待用户在图形用户界面内的输入选择如鼠标按键、键盘按键、窗口被创建、关闭、改变大小、移动等对系统来说这都是事件都会产生相应的windows消息。事件驱动编程方法对于编写交互式程序很有用处它避免了死板的操作模式。句柄句柄句柄顾名思义指的是一个windows对象的把柄。Windows中的句柄都是位的指针变量用来指向某个windows对象所占据的内存区。句柄的使用极大地方便了Windows管理其内存中的各种windows对象。常用句柄类型及其说明常用句柄类型及其说明消息消息消息是描述事件发生的信息。Windows应用程序通过消息进行信息交换。在Windows中消息用结构体MSG表示其结构如下:TypedefstructtagMSG{HWNDhwnd窗口句柄UNITmessage消息号。WPARAMwParam用于提供消息的附加消息。LPARAMlParam用于提供消息的附加消息。DWORDtime指定消息送至队列的时间POINTpt指定消息发送时屏幕光标的位置}MSGVC中存在几种系统定义的消息分类不同的前缀符号经常用于识别消息的分类如下表所示:VC中存在几种系统定义的消息分类不同的前缀符号经常用于识别消息的分类如下表所示:Windows应用程序的常用消息Windows应用程序的常用消息鼠标消息主要有:WMLBUTTONDOWN:产生单击鼠标左键的消息。WMLBUTTONUP:放开鼠标左键时产生的消息。……键盘消息主要有:WMKEYDOWN:按下一个系统键时产生的消息。WMKEYUP:放开一个系统键时产生的消息。……窗口消息主要有:WMCREATE:窗口创建时由CreateWindows函数发出的消息。WMCLOSE:关闭窗口时产生的消息。WMQUIT:退出应用程序时由PostQuitMessage函数发出消息。……Windows应用程序的组成与编程Windows应用程序的组成与编程典型的Windows程序结构入口函数WinMain()窗口函数WinProc()windows应用程序的常用数据类型API编程实例典型的Windows程序结构典型的Windows程序结构Windows应用程序的主体由以下两个函数完成:WinMain()函数负责建立窗口和建立消息循环。WinProc()函数负责消息的处理。典型的Windows程序结构典型的Windows程序结构入口函数WinMain()入口函数WinMain()WinMain()函数类似C语言中的Main函数是Win应用程序入口函数。WinMain()函数主要完成创建主窗口并产生和处理消息循环。WinMain()函数WinMain()函数因为windows是多任务系统所以同一应用程序的多个窗口可能会同时存在。windows系统对每个窗口的执行称为一个实例用一个实例句柄来唯一标识。WinMain()函数与DOS程序的main()函数起同样的作用有一点不同的是WinMain()函数必须带有四个参数它们是系统传递给它的。WinMain()函数的原型如下:intPASCALWinMain(HINSTANCEhInstance,当前实例句柄HINSTANCEhPrevInstance,前一个实例句柄LPSTRlpCmdLine,命令行字符intnCmdShow)窗口显示方式WinMain()函数WinMain()函数第一个参数hInstance是标识该应用程序当前实例的句柄。第二个参数是hPrevInstance它是用来标识该应用程序的前一个实例的句柄。第三个参数是lpCmdLine是指向应用程序命令行参数字符串的指针。最后一个参数是nCmdShow是一个用来指定窗口显示方式的整数。这个整数值可以是SWSHOW、SWHIDE、SWSHOWMAXIMIZED、SWSHOWMINIMIZED等。WinMain()函数主要由部分组成:窗口初始化消息循环窗口初始化包括以下主要步骤:窗口初始化包括以下主要步骤:定义窗口类:通过给窗口类数据结构WINDCLASS赋值设置窗口类的各种属性。如窗口边框、窗口标题栏文字、窗口大小和位置、鼠标、背景色等。注册窗口类:Win系统本身提供部分预定义的窗口类程序员也可以自定义窗口类。窗口类必须先注册后使用。窗口类的注册由函数RegisterClass()实现。创建窗口实例:创建窗口类的实例由CreateWindows()函数实现。窗口显示:窗口类的显示是由ShowWindows()函数和UpdateWindows()函数实现的。ShowWindows()函数:应用程序通过调用ShowWindows()函数在屏幕上显示窗口。UpdateWindows()函数:显示窗口后应用程序调用UpdateWindow更新并绘制用户区并发出WMPAINT消息。消息循环消息循环Windows为当前执行的每个Windows程序维护一个消息队列。在发生输入事件之后Windows将事件转换为一个消息并将消息放入程序的消息队列中。程序通过执行一块称之为消息循环的程序代码从消息队列中取出消息。以下是WinMain()函数中消息循环的代码:消息循环以调用GetMessage()开始它从消息队列中取出一个消息while(GetMessage(msg,,,)){将消息msg结构传给Windows进行一些键盘转换。TranslateMessage(msg)将该消息发送给窗口消息处理程序进行处理。DispatchMessage(msg)}WinMain()函数的大致结构WinMain()函数的大致结构intPASCALWinMain(……){①定义窗口类:WNDCLASSwndclasswndclassstyle=CSHREDRAW|CSVREDRAW……十个字段wndclasslpszClassName=”Lei”②注册窗口类:RegisterClass(wndclass)③创建窗口:HWNDhwndhwnd=CreateWindow()④显示及更新窗口:ShowWindow()UpdateWindow()⑤消息循环:MSGmsgWhile(GetMessage(msg,,,)){TranlateMessage(msg)DispatchMessage(msg)}returnmsgwParam}窗口函数WndProc()窗口函数WndProc()窗口函数WndProc()就是Windows应用程序的消息处理程序。窗口函数WndProc()定义了应用程序对接收到的不同消息的响应包含了对各种可能接收到的消息的处理过程。WndProc函数由一个或多个switch语句组成。每一条case语句对应一种消息当应用程序接收到一个消息时相应的case语句被激活并执行相应的响应程序模块。窗口消息处理程序不予处理的所有消息被传给名为DefWindowProc的Windows函数进行默认处理。消息处理函数WndProc的大致结构消息处理函数WndProc的大致结构LRESULTCALLBACKWndProc(HWNDhMainwnd,UINTmessage,WPARAMwParam,LPARAMlParam)窗口函数的定义{switch(message){caseWMKEYDOWN:击键消息{……break}case……:{……break}……caseWMDESTROY:关闭应用程序窗口时发出的消息{PostQuitMessage()发出WMQUIT消息结束应用程序return}default:break}调用缺省消息处理过程returnDefWindowProc(hMainwnd,message,wParam,lParam)}windows应用程序的常用数据类型windows应用程序的常用数据类型API编程实例API编程实例所有的Windows应用程序中都有一个程序初始化的过程。下面以一个实现最简单功能的程序WinApiDemo为例说明Windows程序的基本框架。操作步骤如下:()打开VisualC。选择File菜单的New在出现的对话框中选择Projects栏目(新建工程)并点取其下的WinApplication项表示使用Win环境创建应用程序。()在Locatin(路径)中填入工程的路径然后在ProjectName(项目名称)中填入“WinApiDemo”其它按照缺省设置单击OK按钮。()选择File菜单的New在出现的对话框中选择Files栏目(新建文件)并点取其下的CSourceFile项表示新建一个C源文件。在右边的File栏中输入“WinApiDemo”最后确定让Addtoproject检查框打上勾单击OK按钮。()在“WinApiDemocpp”文件中输入以下程序代码。WinApiDemocpp源代码()WinApiDemocpp源代码()#include<windowsh>头文件LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM)窗口函数声明这一函数将处理发往应用程序窗口的各种消息charszClassName="windowclass"窗口结构体的名称charszAppTitle="API建立窗口实例"窗口的标题INTPASCALWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpszCmdParam,INTnCmdShow)WinMain()函数的定义{HWNDhMainWnd窗口句柄MSGmsg消息结构体WNDCLASSwinclass窗口结构体if(!hPrevInstance){winclassstyle=CSHREDRAW|CSVREDRAW窗口风格winclasslpfnWndProc=WndProcwinclasscbClsExtra=附加参数winclasscbWndExtra=附加参数winclasshInstance=hInstance当前应用程序实例句柄winclasshIcon=LoadIcon(,IDIAPPLICATION)窗口图标winclasshCursor=LoadCursor(,IDCARROW)窗口光标winclasshbrBackground=(HBRUSH)GetStockObject(LTGRAYBRUSH)窗口背景色为浅灰色winclasslpszMenuName=窗口菜单winclasslpszClassName=szClassName给窗口结构体命名CreateWindow()函数将根据窗口结构体的名称来建立窗口RegisterClass(winclass)注册窗口}WinApiDemocpp源代码()WinApiDemocpp源代码()下面用CreateWindow()函数来建立窗口并返回所建立窗口的句柄hMainWnd=CreateWindow(szClassName,窗口结构体的名称szAppTitle,窗口的标题WSOVERLAPPEDWINDOW,窗口风格为可重叠窗口下面四个参数代表窗口左上角xy坐标和窗口的宽度与高度都使用缺省值CWUSEDEFAULT,CWUSEDEFAULT,CWUSEDEFAULT,CWUSEDEFAULT,下面参数分别为父窗口句柄、窗口菜单句柄、应用程序实例句柄和附加参数,,hInstance,)ShowWindow(hMainWnd,SWSHOWNORMAL)显示最大化窗口UpdateWindow(hMainWnd)更新窗口下面用While()循环来建立消息循环while(GetMessage(msg,,,))获取消息填充msg结构体{TranslateMessage(msg)翻译键盘消息DispatchMessage(msg)向窗口函数发送消息让窗口函数处理}returnmsgwParam}WinApiDemocpp源代码()WinApiDemocpp源代码()LRESULTCALLBACKWndProc(HWNDhMainwnd,UINTmessage,WPARAMwParam,LPARAMlParam)窗口函数的定义{switch(message){caseWMKEYDOWN:击键消息{MessageBox(hMainwnd,"键按下了!","Keyboard",MBOK)break}caseWMRBUTTONDOWN:鼠标消息{MessageBox(hMainwnd,"鼠标右键按下了!","Mouse",MBOK)break}caseWMLBUTTONDOWN:鼠标消息{MessageBox(hMainwnd,"鼠标左键按下了!","Mouse",MBOK)break}caseWMDESTROY:关闭应用程序窗口时发出的消息{PostQuitMessage()发出WMQUIT消息结束应用程序return}default:break}调用缺省消息处理过程returnDefWindowProc(hMainwnd,message,wParam,lParam)}WinApiDemocpp源代码()WinApiDemocpp源代码()caseWMRBUTTONDOWN:{MessageBox(GetFocus(),messageright,"API建立窗口实例",MBOK|MBICONINFORMATION)break}caseWMLBUTTONDOWN:{MessageBox(GetFocus(),messageleft,"API建立窗口实例",MBOK|MBICONINFORMATION)break}caseWMDESTROY:关闭应用程序窗口时发出的消息{PostQuitMessage()发出WMQUIT消息结束应用程序return}default:break}returnDefWindowProc(hMainwnd,message,wParam,lParam)其它没有处理的消息交给Windows做默认处理}WinApiDemo的运行画面WinApiDemo的运行画面游戏实现原理与WindowGDI绘图游戏实现原理与WindowGDI绘图游戏实现的基本原理WindowGDI基本概念利用GDI实现游戏中的绘图游戏实现的基本原理游戏实现的基本原理WindowGDI基本概念WindowGDI基本概念GDIGraphicsDeviceInterface即图形设备接口是WindowsAPI的一个重要组成部分。GDI是Windows图形显示程序与实际物理设备之间的桥梁GDI使得用户无需关心具体设备的细节而只需在一个虚拟的环境(即逻辑设备)中进行操作。GDI用一套通用的图形对象来向屏幕內存甚至是打印机绘图。GDI函数大致可分类为:设备上下文函数:如GetDC、CreateDC、DeleteDC。画线函数:如LineTo、Polyline、Arc。填充画图函数:如Ellipse、FillRect、Pie。画图属性函数:如SetBkColor、SetBkMode、SetTextColor。文本、字体函数:如TextOut、GetFontData。位图函数:如SetPixel、BitBlt、StretchBlt。坐标函数:如DPtoLP、LPtoDP、ScreenToClient、ClientToScreen。映射函数:如SetMapMode、SetWindowExtEx、SetViewportExtEx。元文件函数:如PlayMetaFile、SetWinMetaFileBits。区域函数:如FillRgn、FrameRgn、InvertRgn。路径函数:如BeginPath、EndPath、StrokeAndFillPath。裁剪函数:如SelectClipRgn、SelectClipPath。设备上下文设备上下文在GDI编程中几乎所有的操作都围绕设备上下文(DC)展开。设备上下文DeviceContext简称DC是Windows使用的一种结构所有GDI操作前都需取得特定设备的上下文。设备上下文的句柄是HDC。HDC是一个你可以向其绘图的句柄它可以代表整个屏幕一个窗口的客戶区域一个存在內存中的位图或是一个打印机。例如如果你想在一个窗口上绘图首先你要用GetDC()来获取代表这个窗口的HDC然后你就可以用任何以HDC为参数的GDI函数来绘图了。位图位图位图可以用LoadBitmap()来完成大多数的基本操作比如简单地装入一个位图资源。GDI不能直接用位图对象来绘图因为绘图操作已经被设备上下文抽象了只能通过设备上下文来绘制位图。利用位图绘图的大体思路是:把位图对象装入设备上下文通过设备上下文把位图显示在屏幕上。利用GDI实现游戏中的绘图利用GDI实现游戏中的绘图游戏中的绘图主要通过是绘制位图来实现的。在游戏中因为角色位图的位置是不断变化的所以设备上下文中的合成位图的内容也是不断变化的。为了实现游戏画面的刷新通常是利用缓存设备上下文来保存下一帧的合成位图对象。下一帧的合成位图对象是根据角色位图的实时位置和状态重新渲染后的结果。下面举例给出了利用GDI实现位图绘图的主要步骤:定义windows屏幕设备句柄变量windowDC定义窗口缓冲设备句柄变量bufferDC定义一个位图内存设备句柄变量picDC定义一个位图句柄变量picBMP定义一个缓冲位图句柄变量bufferBMP调用GetDC()获取当前整个屏幕设备的句柄值赋给windowDC调用CreateCompatibleDC()创建与windowDC兼容的内存设备并将其句柄值赋给位图内存设备变量picDC。调用CreateCompatibleDC()创建与windowDC兼容的内存设备并其句柄值赋给窗口缓冲设备变量bufferDC。调用CreateCompatibleBitmap()创建与windowDC兼容的位图对象并将该位图的句柄值赋给bufferBMP。调用LoadBitmap()加载指定位图资源并获取给该位图资源的句柄值赋给picBMP。调用SelectObject()将缓冲位图句柄bufferBMP和窗口缓冲设备句柄bufferDC关联。调用SelectObject()将位图句柄picBMP和位图内存设备picDC关联。两次调用特定运算的BitBlt()函数来对位图内存设备picDC中的位图进行“去背”处理后把结果保存在窗口缓冲设备bufferDC中。调用BitBlt()函数将窗口缓冲设备中的全部图像内容拷贝到屏幕设备windowDC上显示。GetDC()函数GetDC()函数函数功能:该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。函数原型:HDCGetDC(HWNDhWnd)参数:hWnd:设备上下文环境被检索的窗口的句柄如果该值为GetDC则检索整个屏幕的设备上下文环境。返回值:如果成功返回指定窗口客户区的设备上下文环境如果失败返回值为。CreateCompatibleDC()函数CreateCompatibleDC()函数函数功能:该函数创建一个与指定设备兼容的内存设备上下文环境(DC)。函数原型:HDCCreateCompatibleDC(HDChdc)参数:hdc:现有设备上下文环境的句柄如果该句柄为该函数创建一个与应用程序的当前显示器兼容的内存设备上下文环境。返回值:如果成功则返回内存设备上下文环境的句柄如果失败则返回值为。CreateCompatibleBitmap()函数CreateCompatibleBitmap()函数函数功能:该函数创建与指定的设备环境相关的设备兼容的位图。函数原型:HBITMAPCreateCompatibleBitmap(HDChdc,intnWidth,intnHeight)参数:hdc:设备环境句柄。nWidth:指定位图的宽度单位为像素。nHeight:指定位图的高度单位为像素。返回值:如果函数执行成功那么返回值是位图的位图句柄如果函数执行失败那么返回值为。LoadBitmap()函数LoadBitmap()函数函数功能:该函数从模块的可执行文件中加载指定的位图资源。函数原型:HBITMAPLoadBitmap(HINSTANCEhInstance,LPCTSTRlpBitmapName)参数:hlnstance:指向模块实例的句柄。lpBitmapName:指向字符串指针。该字符串包含了要加载的位图资源名称。返回值:如果函数执行成功则返回值是指向指定位图的位图句柄。如果函数执行失败那么返回值是。SelectObject()函数SelectObject()函数函数功能:该函数选择一对象到指定的设备上下文环境中。函数原型:HGDIOBJSelectObject(HDChdc,HGDIOBJhgdiobj)参数:hdc:设备上下文环境的句柄。hgdiobj:被选择的对象的句柄这些对象包括位图、画刷、字体、笔、区域等。返回值:如果选择对象不是区域并且函数执行成功那么返回值是对象的句柄。BitBlt()函数BitBlt()函数函数功能:该函数对指定的源设备环境区域中的像素进行位块转换并传送到目标设备环境。函数原型:BOOLBitBlt(HDChdcDest,intnXDest,intnYDest,intnWidth,intnHeight,HDChdcSrc,intnXSrc,intnYSrc,DWORDdwRop)参数:hdcDest:指向目标设备环境的句柄。nXDest:指定目标矩形区域左上角的X轴逻辑坐标。nYDest:指定目标矩形区域左上角的Y轴逻辑坐标。nWidth:指定源和目标矩形区域的逻辑宽度。nHeight:指定源和目标矩形区域的逻辑高度。hdcSrc:指向源设备环境的句柄。nXSrc:指定源矩形区域左上角的X轴逻辑坐标。nYSrc:指定源矩形区域左上角的Y轴逻辑坐标。dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据如何与目标矩形区域的颜色数据运算以完成最后的颜色。常见的光栅操作代码(dwRop)常见的光栅操作代码(dwRop)SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。SRCAND:通过使用AND(与)操作符来将源和目标矩形区域内的颜色合并。SRCPAINT:通过使用布尔型的OR(或)操作符将源和目标矩形区域的颜色合并。WHITENESS:使用与物理调色板中索引有关的颜色填充目标矩形区域。(对于缺省物理调色板来说这个颜色就是白色)。BLACKNESS:表示使用与物理调色板的索引相关的色彩来填充目标矩形区域(对缺省的物理调色板而言该颜色为黑色)。DSTINVERT:表示使目标矩形区域颜色取反。MERGECOPY:表示使用布尔型的AND(与)操作符将源矩形区域的颜色与特定模式组合一起。MERGEPAINT:通过使用布尔型的OR(或)操作符将反向的源矩形区域的颜色与目标矩形区域的颜色合并。NOTSRCCOPY:将源矩形区域颜色取反于拷贝到目标矩形区域。NOTSRCERASE:使用布尔类型的OR(或)操作符组合源和目标矩形区域的颜色值然后将合成的颜色取反。计算机中的GRB颜色计算机中的GRB颜色在计算机中使用的是数字图像处理每一种颜色都是由RGB表示的RGB是指红(RED)、绿(GREEN)、蓝(BLUE)三原色。RGB颜色值是红绿蓝种颜色的强度每个原色的GRB颜色值的取值范围为(#)~(#FF)。RGB进制颜色值即是红绿蓝三原色各自进制颜色值的组合。如(,,)的进制颜色值为#FFFFFF。举例:白色是三原色值均为最大时混合成的的颜色所以颜色表示为(,,)进制就用#FFFFFF表示。黑色是三原色值均为最小时混合成的的颜色所以颜色表示为(,,)进制就用#表示。在数字图像处理中可以实现OR、AND等逻辑运算。运算规律如下:任何颜色同白色(#FFFFFF)进行OR运算结果都为白色进行AND运算结果都是该颜色本身。任何颜色同黑色(#)进行OR运算结果都为该颜色本身进行AND运算结果都是黑色。例如可以进行对图所示的位图进行去“背景色”的处理:首先将“图”位图同目标地颜色进行“或”(OR)运算得到的结果是:“图”白色处为白色其他处为目标地颜色。再将“图”位图同目标地颜色进行“与”(AND)运算得到的结果是:“图”位图水果处为原颜色而其他处为目标地颜色从而达到了精确“去背”的效果。图图假设图所示的尺寸为px×pxhdc为内存句柄picDC为该位图的内存位图句柄。则:以下两条语句会达到的效果:在屏幕(xpos,ypos)上显示“蛇头朝上”位图”:BitBlt(hdc,xpos,ypos,,,picDC,,,SRCPAINT)或运算BitBlt(hdc,xpos,ypos,,,picDC,,,SRCAND)与运算以下两条语句会会达到的效果:在屏幕(xpos,ypos)上显示“蛇头朝下”位图:BitBlt(hdc,xpos,ypos,,,picDC,,,SRCPAINT)BitBlt(hdc,xpos,ypos,,,picDC,,,SRCAND)图实现位图绘图的核心代码实现位图绘图的核心代码……HDCwindowDC=windows屏幕设备HDCbufferDC=缓冲设备环境HDCpicDC=位图内存设备HBITMAPpicBMP=位图句柄HBITMAPbufferBMP=缓冲位图句柄windowDC=GetDC()bufferDC=CreateCompatibleDC(windowDC)picDC=CreateCompatibleDC(windowDC)giClientWidth,giClientHeight分别是窗口的宽和高。bufferBMP=CreateCompatibleBitmap(windowDC,giClientWidth,giClientHeight)picBMP=(HBITMAP)LoadImage(,"snakebmp",IMAGEBITMAP,,,LRLOADFROMFILE)SelectObject(bufferDC,bufferBMP)将窗口的初始画面位图选入缓冲DCSelectObject(picDC,picBMP)将角色位图选入选入角色位图DC……BitBlt(bufferDC,xpos,ypos,,,picDC,,,SRCPAINT)或运算BitBlt(bufferDC,xpos,ypos,,,picDC,,,SRCAND)与运算将整个画面从缓冲DC拷贝出屏幕BitBlt(windowDC,,,giClientWidth,giClientHeight,bufferDC,,,SRCCOPY)游戏实例剖析游戏实例剖析分析:贪吃蛇游戏是一个深受人们喜爱的游戏一条蛇在密闭的围墙内沿当前方向移动在围墙内不断随机出现水果和毒果。玩家通过按键盘上的四个光标键控制蛇头向上下左右四个方向移动如果蛇头吃到水果蛇的身体长一节分数加分。如果蛇头撞到墙壁或蛇头触碰到其身体或吃到毒果游戏结束。程序的要点:程序的要点:用一个小矩形块表示蛇的一节身体身体每长一节增加一个矩形块。移动时必须从蛇头开始所以蛇不能向相反方向移动。如不按任何键蛇自行在当前方向上前移。当游戏者按了有效的方向键后蛇头朝着指定的方向移动一步移动一节身体所以当按了有效的方向键后先确定蛇头的位置然后蛇身体随着蛇头移动图形的实现是从蛇头的新位置开始画出蛇。根据以上分析设计了两个类:CTable类、CSnack类。主要基本数据结构及常量的定义()主要基本数据结构及常量的定义()节点图像显示运动状态(方向)enumBitmapState{MNONE,MUPUP,MDOWNDOWN,MLEFTLEFT,MRIGHTRIGHT,MUPLEFT,MUPRIGHT,MLEFTUP,MLEFTDOWN,MRIGHTUP,MRIGHTDOWN,MDOWNRIGHT,MDOWNLEFT}节点运动状态(方向)enumMoveState{SNONE,SUP,SDOWN,SLEFT,SRIGHT}坐标位置结构structSPoint{intxinty}#defineTBSTATEOK正常#defineTBSTATEFOOD食物#defineTBSTATEBLOCK障碍-毒果#defineTBSTATESBLOCK障碍-墙主要基本数据结构及常量的定义()主要基本数据结构及常量的定义()游戏状态定义#defineGAMESTATEWAIT游戏等待状态#defineGAMESTATERUN游戏运行状态#defineGAMESTATEEND游戏结束状态界面相关物件尺寸定义#defineWALLWIDTH外墙从左部到游戏区的宽度#defineWALLHEIGHT外墙从顶部到游戏区的高度#defineBMPSCOREBOARDWIDTH分数位图板的宽度#defineBMPSCOREBOARDHEIGHT分数位图板的高度#defineBMPWALLWIDTH墙位图的宽度#defineBMPWALLHEIGHT墙位图的高度classCSnake{structSnakeStruct定义蛇体状态{MoveStatehead头部MoveState*body身体MoveStatetail尾部}private:intmlength蛇的长度SnakeStructmnewSnake蛇的新态的所有节点运动状态SnakeStructmoldSnake蛇的原态的所有节点运动状态BitmapState*mpStateArray蛇的所有节点显示位图的状态SPoint*mpPos蛇体坐标private:BitmapStateGetRightState(MoveStateoldDirect,MoveStatenewDirect)根据新旧两个身体的运动趋势情况返回当前应当显示的身体状态public:voidMove(void)voidChangeDirect(MoveStated)改变方向条件:非对立方向voidAddBody(intn=)蛇的身体增长voidSetHeadPos(intx,inty)设置蛇头的坐标BitmapState*GetStateArray(void)取蛇的状态标识数组SPoint*GetPos(void)取蛇的位置数组boolIsHeadTouchBody(intx,inty)检测蛇头是否触碰到其身体intGetLength(void)取蛇身的长度voidInitial(void)初始化用作游戏结束后重新开始public:CSnake(intxpos=,intypos=,intlen=)~CSnake()}classCTable{private:intmwidth桌子的宽度intmheight桌子的高度intmfoodNumber水果的数目intmblockNumber障碍物(毒果)的数目CSnakemsnake桌子上的蛇int**mboard桌子面板二维数组public:CTable()~CTable()voidInitialTable(intw,inth)初始化桌子面板boolAddBlock(intx,inty)在某个位置放置毒果boolAddFood(intx,inty)在某个位置放置水果boolClearFood(intx,inty)清除某个位置的果实CSnake*GetSnake(void)获取蛇对象int**GetBoard(void)取桌子对象intGetData(intx,inty)取桌子某个位置数据voidSnakeMove(void)蛇的移动boolChangeSnakeDirect(MoveStated)改变蛇的方向}主程序(maincpp)中的全局变量主程序(maincpp)中的全局变量CTabletable创建一个桌子inttableBlockWidth=桌子的格子的宽度inttableBlockHeight=桌子的格子的高度intiScores=游戏的得分UINTuGameState=GAMESTATEWAIT当前游戏状态HDCwindowDC=windows屏幕设备HDCbufferDC=缓冲设备环境HDCpicDC=snake图像内存设备HDCendDC=游戏终结图像内存设备HDCscoreDC=分数板内存设备HWNDhAppWnd=本application窗口句柄HBITMAPpicBMP=snake图像位图句柄HBITMAPbufferBMP=缓冲位图句柄HBITMAPendBMP=游戏终结图像内存句柄HBITMAPhbmpWall=墙位图句柄HBITMAPhbmpScore=分数板位图句柄HBRUSHhbrushWall=墙画刷UINTuSnakeMoveTimer蛇移动的定时器标识UINTuFoodAddTimer水果产生的定时器标识框架的位置数据定义RECTgClientRectRECTgGameValueRectintgiClientWidthintgiClientHeightWinMain()方法()WinMain()方法()intWINAPIWinMain(HINSTANCEhCurrentInst,HINSTANCEhPrevInstance,PSTRlpszCmdLine,intnCmdShow){WNDCLASSwndClassHWNDhWndMSGmsgUINTwidth,height定义窗口wndClassstyle=CSHREDRAW|CSVREDRAW……wndClasslpszClassName="SnakeCLASS"注册窗口RegisterClass(wndClass)取整个屏幕的尺寸width=GetSystemMetrics(SMCXSCREEN)height=GetSystemMetrics(SMCYSCREEN)创建窗口hWnd=CreateWindow("SnakeCLASS","skybluesnake",WSPOPUP,,,width,height,,,hCurrentInst,)hAppWnd=hWnd显示窗口ShowWindow(hWnd,nCmdShow)UpdateWindow(hWnd)WinMain()方法()WinMain()方法()获取窗体大小GetClientRect(hAppWnd,gClientRect)giClientWidth=gClientRectrightgClientRectleftgiClientHeight=gClientRectbottomgClientRecttop将游戏区域分成纵横均为块的小方块并计算每块区域的大小tableBlockWidth=(giClientWidth*WALLWIDTH)tableBlockHeight=(giClientHeight*WALLHEIGHT)windowDC=GetDC()获取当前主窗口设备与windowDC关联创建与windowDC兼容的内存设备环境bufferDC=CreateCompatibleDC(windowDC)picDC=CreateCompatibleDC(windowDC)endDC=CreateCompatibleDC(windowDC)scoreDC=CreateCompatibleDC(windowDC)位图的初始化或载入位图bufferBMP=CreateCompatibleBitmap(windowDC,giClientWidth,giClientHeight)picBMP=(HBITMAP)LoadImage(,"snakebmp",IMAGEBITMAP,,,LRLOADFROMFILE)hbmpWall=(HBITMAP)LoadImage(,"brickbmp",IMAGEBITMAP,,,LRLOADFROMFILE)endBMP=(HBITMAP)LoadImage(,"endbmp",IMAGEBITMAP,,,LRLOADFROMFILE)hbmpScore=(HBITMAP)LoadImage(,"scoreboardbmp",IMAGEBITMAP,,,LRLOADFROMFILE)WinMain()方法()WinMain()方法()声明位图与设备环境的关联SelectObject(bufferDC,bufferBMP)SelectObject(picDC,picBMP)SelectObject(endDC,endBMP)SelectObject(scoreDC,hbmpScore)建立画刷与其名相对应的图像的关联以备用刷子将墙刷出来用PatBlt()实现hbrushWall=CreatePatternBrush(hbmpWall)StartGame()while(GetMessage(msg,,,)){TranslateMessage(msg)DispatchMessage(msg)}returnmsgwParam}WndProc()方法()WndProc()方法()LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/74

VC++_win32_API_游戏开发(最新)

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利