收藏 分享(赏)

游戏设计初步.pptx

上传人:Facebook 文档编号:9738228 上传时间:2019-08-30 格式:PPTX 页数:290 大小:5.72MB
下载 相关 举报
游戏设计初步.pptx_第1页
第1页 / 共290页
游戏设计初步.pptx_第2页
第2页 / 共290页
游戏设计初步.pptx_第3页
第3页 / 共290页
游戏设计初步.pptx_第4页
第4页 / 共290页
游戏设计初步.pptx_第5页
第5页 / 共290页
点击查看更多>>
资源描述

1、WINDOWS程序设计基础,基本概念: Windows程序设计是完全不同于Dos环境下的程序设计,是一种事件驱动的程序设计方法。主要是基于消息的。当用户需要完成某种功能时,会调用操作系统的某种支持,操作系统将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应。,消息:指Windows发出的一个通知,告诉应用程序某个事情发生了, 每一次键盘按键,鼠标单击,窗口更新都会产生消息。,程序中的消息:在WINDOWS开发中,一个消息被定义成了一个结构体,typedef Struct tagMsg / MSG;,WINDOWS程序设计基础,MSG的内部结构,ty

2、pedef struct tagMSG / msgHWND hwnd; UINT message; WPARAM wParam;LPARAM lParam; DWORD time; POINT pt; MSG;,/消息来源的窗口句柄,/消息ID,/消息的附加参数,/消息产生的时间,/消息产生的窗口位置,其为消息的实质,通常为WM_XXX的样式,/如鼠标消息,WINDOWS程序设计基础,消息队列:,操作系统会为每个应用程序建立一个消息队列。这个队列是个先进先出的缓冲区:,消息响应:当应用程序收到消息的时候,针对这个消息的进行处理的过程就叫消息响应。,消息1,消息2,消息n,消息产生,消息响应,消

3、息响应是通过程序实现的,这也是Windows应用程序的主 要代码区。,WINDOWS程序设计基础,消息的传递机制:,检索队列中是否存在消息,属于某一个窗口,WINDOWS程序设计基础,窗口:窗口是屏幕上的一个矩形区域,WINDOWS程序设计基础,句柄(HANDLE):资源的标识,句柄,是整个windows编程的基础。一个句柄是指一个用来标志应用程序中的不同对象和同类对象中的不同的实例的唯一存在的32位整数值,其特性类似一个地址。,在Windows编程中,句柄可以看做是相关资源或实例,如一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等,的唯一标示。句柄在Windows编程中,大量使用,如,

4、HINSTANCE(实例句柄) HBITMAP(位图句柄) HDC(设备描述表句柄) HICON(图标句柄),实际上,WINDOWS编程中的所有句柄均统一为:HXXX,WINDOWS程序设计基础,WINDOWS自定义类型简介:,为了维护方便,WINDOWS将C/C+的内建类型都进行了重新定义,其一般定义规则为:typedef type TYPE;,如:int对应 INT, char对应CHAR,float对应FLOAT,同时,WINDOWS还按照匈牙利命名法的相关规则对相关类型指针进行了重新定义,如LPSTR, PBYTE等。另外,WINDOWS还按照需要重新定义了一些类型,如WPARAM,

5、LPARAM, WORD等,其实质也是内建类型的重命名。,参考:ms-help:/MS.VSCC.v90/MS.MSDNQTR.v90.chs/winprog/winprog/windows_data_types.htm,WINDOWS程序设计基础,UNICODE简介:,传统的英文字符采用的是ASCII编码,但A的意思是American,这也是ASCII编码最大的问题。而要表示中文、日语在内的东方语系,ASCII就不能满足要求,这时候引入了双字节的UNICODE码。,a,97,97,00,ASCII,UNICODE,char c = a,wchar_t c = a,“abc”,char* p

6、= “abc”;,wchar_t* p =L “abc”;,WINDOWS程序设计基础,C/C+语言的UNICODE类型以及对应函数:,定义头文件:wchar.h,strlen,strcat,strcpy,strcmp,ASCII版,UNICODE版,getc,wcslen,wcscat,wcscpy,wcscmp,getwc,ASCII版,UNICODE版,putc,putwc,putchar,putwchar,getchar,getwchar,printf,wprintf,sprintf,wsprintf,类型:wchar_t,实质:typedef unsigned short wchar

7、_t,WINDOWS程序设计基础,练习:请定义两个UNICODE字符串,并将大的字符串连接到小的字符串后面。,wchar_t* p1 = L”Hello”; wchar_t* p2 = L”my class”; int newLength = wcslen(p1) + wcslen(p2); wchar_t* p3 = new wchar_tnewLength + 1; if(wcscmp(p1, p2) wcscpy(p3, p2);wcscat(p3, p1); ,else wcscpy(p3, p1);wcscat(p3, p2); ,WINDOWS程序设计基础,WINDOWS程序中的U

8、NICODE类型:,TCHAR:解决通用的关键,WINDOWS使用了一个预定义宏来解决可能存在的ASCII和UNICODE不通用问题,TCHAR!,#ifdef UNICODE typedef wchar_t TCHAR #else typedef char TCHAR,同时,为了简便操作,还定义了一个更简短的宏 _T / _TEXT,来表示一个通用字符串,来源: #define _T(x) _T(x),UNICODE: #define _T(x) L#x ASCII: #define _T(x) x,WINDOWS程序设计基础,例:一个TCHAR数组,TCHAR t10 = _T(“abcd

9、e”);,TCHAR t10 = a, b, c, d, e;,t5 = d;,TCHAR* p = _T(“Hello”);,int len = lstrlen(p);,TCHAR* q = _T(“ World”); lstrcat(p, q);,WINDOWS定义了一系列的操作TCHAR的函数: lstrlen lstrcpy lstrcpyn lstrcat lstrcmp,WINDOWS程序设计基础,WINDOWS程序中的定义的其他UNICODE类型:,PCHAR, LPCH, PCH, LPSTR , PSTR = CHAR*(char*),LPCCH, PCCH, LPCSTR,

10、 PCSTR = CONST CHAR*,PWCHAR, LPWCH, PWCH, LPWSTR, PWSTR= WCHAR*,LPCWCH, PCWCH, LPCWSTR, PCWSTR = CONST WCHAR CHAR*,LPCTSTR = CONST TCHAR*,LPTSTR = TCHAR*,WINDOWS程序设计基础,例:一个完整的程序Hello Windows SDK,WINDOWS程序设计基础,程序源代码:,/helloWin.cpp,#include #include #pragma comment(lib, “Winmm.lib“) LRESULT CALLBACK W

11、ndProc(HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) ,/申明消息处理函数,/WinMain函数入口,原型查阅MSDN,/调用lib, 为了声音,WINDOWS程序设计基础,static TCHAR szAppName = _T(“Hello“); HWND hWnd; MSG msg; WNDCLASS wndClass; wndClass.style = CS_HREDRAW | C

12、S_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMe

13、nuName = NULL; wndClass.lpszClassName = szAppName;,/程序名,/窗口句柄,/消息结构体,/窗口结构体,/窗口模式初始化,/窗口过程函数,/窗口实例句柄,/读取图标,/读取光标,/窗口背景设为白色,/设置菜单,/设置窗口类名,WINDOWS程序设计基础,if(!RegisterClass(,/注册窗口,/创建窗口,/程序名和窗口名,/窗口样式,/x和y坐标,/高度和宽度,/父窗口句柄,/菜单句柄,/实例句柄,/附加参数,WINDOWS程序设计基础,ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd);whi

14、le(GetMessage( /WinMain End,/显示窗口,/更新窗口, 发送WM_PAINT,/消息循环,WINDOWS程序设计基础,LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc;PAINTSTRUCT ps;RECT rect;switch /代码见下页return DefWindowProc(hWnd, message,wParam, lParam); ,/定义一个设备上下文句柄,/定义一个绘制结构体,/矩形区域,/消息处理,见下页,/默认的消息处理函

15、数,WINDOWS程序设计基础,switch(message)case WM_CREATE:PlaySound(_T(“hello.wav“), NULL, SND_FILENAME | SND_ASYNC);return 0;case WM_PAINT:hdc = BeginPaint(hWnd, ,/对消息进行处理,/处理WM_CREATE消息,/处理WM_PAINT消息,/关闭窗口消息,WINDOWS程序设计基础,WINDOWS SDK程序设计流程,WINDOWS程序设计基础,1、入口函数:WinMain,int WINAPI WinMain(HINSTANCE hInstance, H

16、INSTANCE hPrevInstance, LPSTR lpCmdLine, int iShowCmd ),当前实例,之前实例,命令行,窗口显示模式,实例句柄,字符串,typedef char* LPSTR,如同C/C+的Main函数一样,WinMain代表了一个WINDOWS程序的入口点,其样式必须保持不变。,WINDOWS程序设计基础,程序代码中的WINMAIN函数,2、设计窗口,WINDOWS程序设计基础,typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra;int cbWndExtra;HI

17、NSTANCE hInstance; HICON hIcon;HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName;LPCTSTR lpszClassName; WNDCLASS;,窗口类型,窗口过程函数指针,当前应用程序句柄,图标句柄,光标句柄,背景画刷句柄,窗口类名,WNDCLASS wc; /初始化相关字段,WNDCLASS结构体,WINDOWS程序设计基础,代码中的设计窗口,WINDOWS程序设计基础,3、注册窗口,RegisterClass(,4、创建窗口,HWND CreateWindow( LPCTSTR lpCl

18、assName, /已注册的窗口类的名字 LPCTSTR lpWindowName, / 窗口的名字,即标题栏上显示的文字 DWORD dwStyle, / 窗口的类型 int x, / 窗口显示时左上角的x坐标 int y, /窗口显示时左上角的y坐标 int nWidth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口的句柄 HMENU hMenu, / 菜单的句柄 HINSTANCE hInstance, / 实例的句柄 LPVOID lpParam / 与窗口相关的附加参数 );,HWND hwnd = CreateWindow()

19、;,WINDOWS程序设计基础,4、显示和更新窗口,ShowWindow(hWnd,iShowCmd);,创建好的窗口句柄,显示状态,UpdateWindow(hWnd);,5、开始消息循环,MSG msg;while(GetMessage( /分派消息,来源于WinMain参数,有3种状态: SW_SHOWNORMAL, SW_SHOWMAXMIZED, SW_SHOWMINNOACTIVE,WINDOWS程序设计基础,消息循环相关函数:,BOOL GetMessage( LPMSG lpMsg, / 消息HWND hWnd, / 哪个窗口的消息队列UINT wMsgFilterMin, /

20、 消息的最小值UINT wMsgFilterMax / 消息的最大值 );,1) GetMessage:负责从消息队列中获取消息,消息过滤,2) TranslateMessage:翻译消息,BOOL TranslateMessage( const MSG *lpMsg );,例:键盘按下某个键会产生WM_KEYDOWN消息,但是要知道到底按下的那个键,需将按键信息的ASCII码插入消息,并翻译为WM_CHAR消息进行处理。,WINDOWS程序设计基础,2) DispatchMessage :分发消息,DispatchMessage函数的作用是将收到的消息传给窗口的回调函 数(CallBack

21、Function),即窗口过程函数去处理。这个窗口过程 函数就是在设计窗口类时指定的。,回调函数的概念:,回调函数是一个由开发者实现,但交由系统自动调用的函数。 其往往通过函数指针的方式赋值给某个其它函数或者数据结构 作为参数。窗口过程函数是一个典型的回调函数。,WINDOWS程序设计基础,6、窗口过程函数(消息处理)。,函数原型:LRESULT CALLBACK FuncName(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam ),所属窗口,消息,附加参数,内部结构:,switch(msg) case WM_XXX:/Do something;/

22、 return DefWindowProc(hWnd, Msg, wParam, lParam);,函数名自定,实际是一个unsigned int,WINDOWS程序设计基础,代码中处理的3个消息:,1、WM_CREATE,在窗口创建时做的事,这个消息是在CreateWindow或CreateWindowEX函数执行过程中被发送的,2、WM_PAINT,重要的绘制消息,当窗口显示区域的一部分显示内容或者全部变为“无效”,以致于必须“更新画面”时,将由这个消息通知程序。,WINDOWS程序设计基础,绘制了一段文字在窗口中间区域,3、WM_DESTROY,关闭窗口做的事,DrawText原型,WI

23、NDOWS程序设计基础,练习1.1:请参照上例设计一个基本的程序,要求窗口标题栏显示:MyFirst, 窗口正中显示Hello, My First Program, 窗口右下角显示Produced by + 你的姓名。,游戏程序设计绘制基础,WINDOWS提供了大量的GDI函数用于显示图形和文字。其关键的概念在于绘制和重绘, WM_PAINT消息、无效区域、设备环境句柄4种。,1、WM_PAINT消息和绘制与重绘,几乎所有WINDOWS绘制都和WM_PAINT对应的处理函数有关,该消息开始于UpdateWindow, 并循环来源于以下一些途径:,用户移动窗口,导致原被覆盖的窗口显示 用户调整窗

24、口大小(当窗口类型设定为CS_HREDRAW/CS_VREDRAW) 程序使用了滚动条 程序调用了InvalidateRect或InvalidateRgn强制产生,WINDOWS程序应该收集并保存所有用于绘制客户区的信息,游戏程序设计绘制基础,2、有效区域和无效区域,无效区域,需要重绘,每个窗口都维护了一个PAINTSTRUCT结构,程序只能使用这3个,游戏程序设计绘制基础,示例:鼠标单击后重绘某一区域,游戏程序设计绘制基础,示例关键代码:鼠标消息的处理,示例关键代码:WM_PAINT重绘,提示:新出现的函数,CreateSolidBrush FillRect,出现问题:并不是想要的结果,原因

25、:WM_PAINT绘制的可能性很多,需要限制绘制代码仅仅在鼠标点击后有效。,BOOL bRePaint = FALSE;,if(bRePaint),bRePaint = TRUE;,游戏程序设计绘制基础,练习1.2:请在窗口正中生成一个正方形 ,随着鼠标左键在中点点击1、2、3、4次,分别在正方形中显示红色,绿色,蓝色,黄色。点击第5次的时候,颜色消除。,提示:1、是否需要记录鼠标点击的次数。2、矩形区域是否需要记录。3、鼠标点击后,是重绘整个区域,还是重绘部分区域。4、需要处理的消息:WM_LBUTTONDOWN5、参考数据类型和函数:,游戏程序设计绘制基础,3、设备环境句柄的获取,方法1:

26、 WM_PAINT消息专用,PAINTSTRUCT ps; HDC hdc; /IN WndProc case WM_PAINT hdc = BeginPaint(hWnd, ,要点1:该方法不能再WM_PAINT消息以外使用,对应MFC的CPaintDC。,要点2:必须成对使用,要点3:,case WM_PAINT:return 0;,/错误,游戏程序设计绘制基础,方法2: 其他绘制专用,例:在WM_LBUTTONDOWN中绘制,在WM_PAINT消息外,需要在客户区内绘制的时候,必须使用: hdc = GetDC(hwnd); /Draw something; ReleaseDC(hwnd

27、, hdc);,类似于:CClientDC,而在客户区外需要绘制的时候,必须使用: hdc = GetWindowDC(hwnd); /Draw something; ReleaseDC(hwnd, hdc);,处理:WM_NCPAINT,类似于:CWindowDC,重点:绘制代码必须保存,以便失效时重绘。,游戏程序设计绘制基础,文本绘制,文本绘制的重要GDI函数为:TextOut,例:/in WM_PAINT,TextOut(hdc, 10, 10, _T(“Hello GDI”), 5);,游戏程序设计绘制基础,字体大小的概念,WINDOWS程序中,字体总是存放在一个TEXTMETRIC的

28、结构体中,并可以通过GetTextMetrics来获取当前系统中所使用的字体信息。,游戏程序设计绘制基础,示例:字符计算,abcde,fghij,隔20个字符,TCHAR* a = _T(“abcde”);,TCHAR* b = _T(“fghij”);,/in WM_PAINT,TextOut(hdc, 0, 1, a, lstrlen(a);,/in WM_CREATE,GetTextMetrics(hdc, cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2) * cxChar / 2,abcde,fghij,TextOut(hdc, 5*cxChar +

29、 20 * cxCaps, 1, b, lstrlen(b);,TextOut(hdc, 0, 1+cyChar, a, lstrlen(a);,TextOut(hdc, 5*cxChar + 20 * cxCaps, 1+cyChar, b, lstrlen(b);,要点:获取字符信息的最好时间点是在WM_CREATE里面处理,游戏程序设计绘制基础,练习1.3:利用TextOut进行字符排版,请使用MSDN查询GetSystemMetrics函数,仔细学习该函数,然后将该函数的每一个参数对应的意思和值输出,设置对齐版式函数:,游戏程序设计绘制基础,滚动条的加入,上述练习最大的问题是,如果在比

30、较小的显示器上,或窗口的大小更改,将无法完全显示。这就需要加入滚动条。滚动条分为水平滚动条(HSCROLL)和垂直滚动条(VSCROLL)两种,窗口滚动条加入的方法,调用CreateWindow,并为dwStyle参数赋值时,加入以下样式WS_VSCROLL | WS_HSCROLL,细说滚动条:,1、每个滚动条都有范围和位置两个概念存在,默认情况下,滚动条的范围是0-100,可以通过以下函数进行设置:,SetScrollRange(hwnd, iBar, iMin, iMax, bRedraw),iBar的取值为: SB_VERT或SB_HORZ,bRedraw代表是否需要WINDOWS根据

31、新的范围重绘滚动条,注意:范围取决于你要表现的内容,游戏程序设计绘制基础,滚动条的位置总是一个离散值:,例:一个范围为0-4的滚动条,游戏程序设计绘制基础,程序需要负责的滚动条相关任务:,初始化滚动条的范围和位置。 处理传送给窗口过程的滚动条消息。 更新滑块的位置。 根据滚动条的变化更新客户区的内容。,滚动条消息:,WM_VSCROLL 或 WM_HSCROLL,游戏程序设计绘制基础,细看WM_VSCROLL/HSCROLL消息:,WM_VSCROLL消息在发送时,将通过传送给消息处理函数的wParam参数低16位一个值以确定用户是什么动作,高16为确定滚动条位置。,WPARAM和LPARAM

32、实际上是一个32位的未确定类型值,对于WAPRAM或LPARAM类型,我们要取它的低16位和高16位值得方法分别是:,int x = LOWORD(wParam); int y = HIWORD(wParam);,#define LOWORD(l) (WORD)(1) #define HIWORD(1) (WORD)(DWORD)(l)16) & 0xFFFF),消息代码 = LOWORD(wParam); 当前位置 = HIWORD(wParam);,游戏程序设计绘制基础,滚动条程序设计(简单版):,1、滚动条范围:2、 当前窗口能显示的最大信息条数。3、根据消息动态改变滚动条位置。4、滚动

33、条滚动后的重绘问题。,取决于显示的内容,取决于屏幕像素和字体,取决于是什么滚动条消息,怎么反应新的内容,游戏程序设计绘制基础,滚动条程序设计(简单版):关键步骤,1、加入垂直滚动条:,2、确定滚动条范围:,/in WM_CREATE,补充:设置滚动条初始化位置,游戏程序设计绘制基础,3、确定当前窗口能显示的最大信息条数。,考虑:动态的窗口大小决定了当前窗口能显示的最大信息数也是动态的。,引入:WM_SIZE,当窗口大小和位置更改时,都会发送WM_SIZE消息,示例:,问题:那当前窗口到底能显示多少行,怎么计算呢?,假设cyChar表示的每行的高度,那么能显示的行数是cyClient / cyC

34、har,问题:那当前窗口到底能显示多少列,怎么计算呢?,假设cxChar表示的当前字体的平均宽度,那么能显示的列数是cxClient / cxChar,游戏程序设计绘制基础,4、滚动条消息处理和滑块位置确定,滚动条的消息处理也是一个类似的switchcase结构。,/IN WNDPROC & WM_VSCROLL,switch(LOWORD(wParam) case SB_LINEUP / SB_LINEDOWN:case SB_PAGEUP / SB_PAGEDOWN:case SB_THUMBPOSITION:,/假设iVSPos表示当前滑块位置。,iVSPos -= 1 / iVSPos

35、 += 1;,iVSPos -=/+= cyClient / cyChar,iVSPos = HIWORD(wParam);,注意1:还需要限制iVSPos的范围,iVSPos = max(0, min(iVSPos, NUMLINES - 1);,注意2:还需重绘滑块位置 if (iVSPos != GetScrollPos (hwnd, SB_VERT) SetScrollPos (hwnd, SB_VERT, iVscrollPos, TRUE) ;,InvalidateRect(hwnd, NULL, TRUE);,游戏程序设计绘制基础,5、滚动条滚动后的重绘问题。,加入垂直滚动条后的

36、绘制和没有滚动条的绘制大体上没有区别,唯一需要改变的是y坐标。,没有滚动条的时候:,有滚动条的时候:,注意:实际上滚动条重绘仅仅只做了将当前窗口不应该显示的信息,显示到窗口外而已。,练习1.4:请为自己的程序1.3加上垂直滚动条,游戏程序设计绘制基础,效果更好的滚动条:,SCROLLINFO结构体的引入,SCROLLINFO是一个代表了滚动条的结构体,其定义如下,我们可以使用GetScrollInfo和SetScrollInfo函数来获取和设置滚动条的相关信息。,SIF_TRACKPOS只能用在GetScrollInfo中,游戏程序设计绘制基础,效果增强1:滑块大小的动态改变,滑块大小 页面大

37、小 文档显示数量 = = 滚动条长度 范围 文档的总大小,效果增强2:限制滚动的范围,iVscrollMax = max(0, NUMLINES cyClient / cyChar); SetScrollRange(hwnd, SB_VERT, 0, iVscrollMax, TRUE); /in WM_SIZE,练习1.4存在的问题:,引入了SCROLLINFO后,可以很方便做到上述事情:,SCROLLINFO si; si.cbSize = sizeof(SCROLLINFO); si.cbMask = SIF_RANGE | SIF_PAGE; si.nMin = 0; si.nMax

38、= NUMLINES;,si.nPage = cyClient / cyChar; SetScrollInfo(hwnd, SB_VERT, ),这时,WINDOWS会限定滚动条的范围为:si.nMax si.nPage + 1。,效果增强3:会自动隐藏的滚动条,游戏程序设计绘制基础,示例:,1、水平滚动条的加入,2、确定水平范围的最大范围,/IN WM_CREATE,3、设定SCROLLINFO,/IN WM_SIZE,游戏程序设计绘制基础,4、消息的处理,比较滑块位置是否发生改变,此函数会产生一条WM_PAINT消息,因此不需要再使用InvalidateRect。,/水平滚动为例,游戏程序

39、设计绘制基础,5、优化后的WM_PAINT,滚动后,实际需要重绘的是当前屏幕需要显示的内容,而不需要重绘显示不了的内容。,垂直滚动重绘:,起始位置,终止位置,假设iVertPos存放的是当前滑块的位置,当移动滚动条的时候,存放在PAINTSTRUCT结构体中,iPaintBeg =,iPaintEnd =,起始位置,终止位置,文字输出和前例类似,游戏程序设计绘制基础,深入:关于WM_PAINT消息的更多解释,WM_PAINT是一个重要的绘制消息,但并不是一个高优先级的消息。在调用诸如:InvalidRect函数的时候,WINDOWS像消息队列发送了一条WM_PAINT消息,但并不意味着窗口过程

40、函数会处理该消息。,如果需要立即重绘窗口,可以在发送WM_PAINT消息后,立即使用以下函数:,UpdateWindow(hwnd);,这时,窗口过程会立即收到WM_PAINT消息,并根据代码开始重绘。,练习1.5:请为程序1.4加入水平滚动条,并使用新的滚动条方法和绘制方法。,游戏程序设计绘制基础,设备无关的程序设计基础:,关键函数一:GetDeviceCaps,由于每个用户的使用环境均由不同,因此,需要根据用户的具体使用环境来确定程序可以完成的功能。,常用的nIndex:,HORZSIZE和VERTSIZE:屏幕的宽度和高度(mm) HORZRES和VERTRES:屏幕的宽度和高度(像素)

41、 LOGPIXELSX和LOGPIXELSY:屏幕宽度或高度没逻辑英寸的像素数(即屏幕分辨率) BITSPIXEL:颜色位数 VREFRESH:显示设备的垂直分辨率,游戏程序设计绘制基础,关键函数二:EnumDisplaySettins(),当前显示设备的设置,注册表中的系统设置,Struct DEVMODE,或者单纯的数字索引信息。,每像素颜色 宽度 高度 显示标志 刷新率,当能获取信息的时候,这个函数返回TRUE,否则返回FALSE。,游戏程序设计绘制基础,关键函数三:ChangeDisplaySettings(),dwFlags的常用值: 0: 表示显示模式要动态的改变。 CDS_UPD

42、ATEREGISTRY:表示当前改变是永久的 CDS_FULLSCREEN:表示改变是暂时的,返回值:,游戏程序设计绘制基础,示例:枚举当前全部显示模式,DEVMODE devMode; int modeNum = 0; BOOL done = FALSE; TCHAR s20, str4000;,while(!done) EnumDisplaySettings(NULL, modeNum, ,_stprintf(s, “%dbit, %d*%dt”. devMode.dmBitsPerPel, dmPelsWidth, devmode.dmPelsHeight;) modeNum+; lst

43、rcat(str, s);,游戏程序设计绘制基础,示例:更改显示模式,DEVMODE dMode; ZeroMemory(,if(EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, ,游戏程序设计绘制基础,练习1.6:请写一个程序,左键点击时显示所有的显示模式,右键点击时,更改当前显示模式为800*600, 32位色,提示:所需处理的消息WM_LBUTTONDOWNWM_RBUTTONDOWN需要使用的函数:,游戏程序设计绘制基础,点、线、矩形和圆的绘制:,Windows GDI的所有绘制实际上都用到了一对函数:,SetPixel(hdc, x,

44、y, crcolor); color = GetPixel(hdc, x, y);,这里的color/crcolor实际上表示的是一个颜色,对于大部分GDI函数来说,该类型都为COLORREF,一个32位整数:,RGB(255, 0, 0);,当所有三个参数设定为0时,色彩为黑色;当所有参数设定为255 时,色彩为白色。 可以使用GetRValue、GetGValue和GetBValue 从COLORREF 值中抽取出原色值,游戏程序设计绘制基础,线的绘制:,LineTo : Polyline 和PolylineTo: PolyPolyline : Arc: PolyBezier 和PolyB

45、ezierTo : ArcTo 和AngleArc : PolyDraw:,画直线。 画一系列相连的直线。 画多组相连的线。 画圆弧线。 画贝塞尔曲线。 画椭圆线。 画一系列相连的线以及贝塞尔曲线。,有关函数:,游戏程序设计绘制基础,示例1:基本网格绘制,示例2:矩形绘制,POINT apt5 = 100, 100, 200, 100, 200, 200, 100, 200, 100, 100 ; MoveToEx (hdc, apt0.x, apt0.y, NULL) ; for ( i = 1 ; i 5 ; i+)LineTo (hdc, apti.x, apti.y) ;,游戏程序设计

46、绘制基础,示例3:利用Polyline绘制,POINT apt5 = 100, 100, 200, 100, 200, 200, 100, 200, 100, 100 ;,Polyline (hdc, apt, 5) ;,MoveToEx(hdc, apt0.x, apt0.y, NULL); PolyLineTo(hdc, apt+1, 4);,区别:带To的版本将以当前起始位置为起始点,并在返回前将当前位置设为最后一根线的终点,而不带To版本不改变当前位置。,游戏程序设计绘制基础,综合示例:正弦曲线的绘制,0,PI,2PI,游戏程序设计绘制基础,综合示例关键代码:,1、关键数字,2、坐标系

47、绘制,3、确定坐标位置,4、绘制,练习1.7:请参考代码绘制一个周期为2PI的余弦函数,游戏程序设计绘制基础,边框的绘制:,1、矩形,Rectangle (hdc, xLeft, yTop, xRight, yBottom) ;,Rectangle (hdc, 1, 1, 5, 4) ;,游戏程序设计绘制基础,2、椭圆以及圆角矩形,Ellipse (hdc, xLeft, yTop, xRight, yBottom) ;,RoundRect ( hdc, xLeft, yTop, xRight, yBottom,xCornerEllipse, yCornerEllipse) ;,xCorner

48、Ellipse = (xRight - xLeft) / 4 ; yCornerEllipse = (yBottom- yTop) / 4 ;,根据需要我们可以单纯的让xCornerEllipse = yCornerEllipse,游戏程序设计绘制基础,3、特殊形状绘制,Arc (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; Chord (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ; Pie (hdc, xLeft, yTop, xRight, yBottom, xStart, yStart, xEnd, yEnd) ;,Arc,Chord,Pie,游戏程序设计绘制基础,练习1.8:请参考绘制出以下图形,游戏程序设计绘制基础,画笔HPEN:,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报