




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验一:游戏地图的创建与显示一、实验目的学习VC+下游戏地图的创建与显示二、实验仪器电脑VirturalStudio6.0三、实验原理及过程菱形地图通常前一个坐标轴为X坐标,后一个坐标轴为Y坐标当X坐标值增大时,对应的菱形水平位置右移n*菱形小地图长度/2,竖直位置下移n*菱形小地图高度/2当Y坐标值增大时,对应的菱形水平位置左移n*菱形小地图长度/2,竖直位置下移n*菱形小地图高度/2菱形地图算法实现int MapDraw(HDC hdc)int i,j;int lim=MAXSCREENX/TILEWIDE; /所需绘制地图的范围for (i=-lim; ilim; i+)for (j=-lim; jlim; j+)int sx=MAXSCREENX/2-(TILEWIDE/2)+(i*TILEWIDE/2)-(j*TILEWIDE/2);int sy=MAXSCREENY/2-(TILEHIGH/2)+(i*TILEHIGH/2)+(j*TILEHIGH/2);if(sxMAXSCREENX) & (sy0) & (sy+TILEHIGH0) & (playerx+i=0) & (playery+j=0) )/边界判断TransparentBlt(hdcMem,sx,sy,TILEWIDE,TILEHIGH,hdcTilesDataplayerx+iplayery+j,0,0,TILEWIDE,TILEHIGH,RGB(0,255,0); /贴图BitBlt(hdc,0,0,MAXSCREENX,MAXSCREENY,hdcMem,0,0,SRCCOPY);/画到窗口return 0;描述菱形地图显示的算法原理加载地图:for (int i=0; i4;i+)_tcscpy(szName,TEXT(MAP);_itot(i,tempChar,10);_tcscat(szName,tempChar);hdcTilesi=CreateCompatibleDC(hdc);hBitmapTilesi=LoadBitmap( hInstance,szName);SelectObject(hdcTilesi,hBitmapTilesi);其中文件夹中有4张地图图片,运用for循环语句分别把四张地图MAP0,MAP1,MAP2,MAP3加载进来。在窗口铺满地图:for (int yi=0; yiSIZE; yi+)for (int xi=0; xihInstance ;hdc=GetDC(hwnd);hdcMem=CreateCompatibleDC(hdc);hBitmapMem=CreateCompatibleBitmap(hdc,1024*2,768*2);SelectObject(hdcMem,hBitmapMem);for (int i=0; i4;i+)_tcscpy(szName,TEXT(MAP);_itot(i,tempChar,10);_tcscat(szName,tempChar);hdcTilesi=CreateCompatibleDC(hdc);hBitmapTilesi=LoadBitmap( hInstance,szName);SelectObject(hdcTilesi,hBitmapTilesi);InitMap();playerx=playery=SIZE/2;break;注:playerx=playery=SIZE/2的意思是将开始的位置定在地图的中心3.InitMap()函数相关代码:int InitMap()srand( (unsigned)time( NULL ) );for (int yi=0; yiSIZE; yi+)for (int xi=0; xiSIZE; xi+)Datayixi=rand()%4;return 0;执行InitMap函数,即在地图的每一个格子随机添上贴图。在读取文件之后执行WM_PAINT,即可以在地图上画出附上图片。4.MapDraw(hdc)函数MapDraw是建立整个地图的核心,在输出图像时,使用MapDraw(hdc)中的TransparentBlt()函数将绿色作为透明关键色,即裁去4个角,从而实现菱形图形效果。实现方法为:TransparentBlt(hdcMem,sx,sy,TILEWIDE,TILEHIGH,hdcTilesDataplayerx+iplayery+j,0,0,TILEWIDE,TILEHIGH,RGB(0,255,0)相关代码:case WM_PAINT:hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; MapDraw(hdc);EndPaint (hwnd, &ps) ;return 0 ;其中MapDraw(hdc)是建立整个地图的核心,代码为:int MapDraw(HDC hdc)TCHAR strOut7;TCHAR strTemp4=,0,0,0;int i,j;int lim=MAXSCREENX/TILEWIDE;for (i=-lim; ilim; i+)for (j=-lim; jlim; j+)int sx=MAXSCREENX/2-(TILEWIDE/2)+(i*TILEWIDE/2)-(j*TILEWIDE/2);int sy=MAXSCREENY/2-(TILEHIGH/2)+(i*TILEHIGH/2)+(j*TILEHIGH/2);if(sxMAXSCREENX) & (sy0) & (sy+TILEHIGH0) & (playerx+i=0) & (playery+j=0) )TransparentBlt(hdcMem,sx,sy,TILEWIDE,TILEHIGH,hdcTilesDataplayerx+iplayery+j,0,0,TILEWIDE,TILEHIGH,RGB(0,255,0);加载自己制作的地图 先添加图片资源,然后对程序中的代码进行相应的修改,改变相应的数据即可。四、实验结果原代码结果:加载自己制作的图片的结果:五、实验心得(需包括有何不足如何改进)本次实验目的在于了解菱形地图的加载与显示,并能够做到在原来程序的基础上加载自己的图片,制作新的地图。由于对相关知识的不熟悉,导致在实验的一开始不知所措,在参考了上课所用幻灯片上的内容以及所提供的参考程序上知识慢慢开始对菱形地图的加载等问题有了一定的了解,并开始明白了其中的程序实现的思路,虽然期间也遇到了一些问题,如在加载自己制作的地图方面,但都基本解决。通过本次实验,了解了游戏程序设计中图片的加载方法,并知道了如何控制地图的移动,明白了菱形地图创建和显示的原理。总之,获益匪浅,也为之后的实验打下了良好的基础。目前的菱形地图显示结果地什么不足之处:菱形地图的图片加载都是统一的,所以地形都是重复出现的,没有真实感。改进方法:可以根据实际情况进行地形图片的加载。六、主要代码#include #include #include #include #include resource.h#define SIZE 200#define TILEWIDE 64#define TILEHIGH 32#pragma comment (lib,msimg32)HDC hdcTiles4,hdcMem;HBITMAP hBitmapTiles4,hBitmapMem;int DataSIZESIZE;int playerx,playery;int MAXSCREENX,MAXSCREENY;int InitMap();int MapDraw(HDC);LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;/回掉函数int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)static TCHAR szAppName = TEXT (Diamond) ;HWNDhwnd ;MSGmsg ;WNDCLASSwndclass ; wndclass.style = CS_HREDRAW | CS_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.lpszMenuName= NULL ;wndclass.lpszClassName= szAppName ;if (!RegisterClass (&wndclass) MessageBox (NULL, TEXT (This program requires Windows NT!), szAppName, MB_ICONERROR) ;return 0 ; MAXSCREENX=640;MAXSCREENY=480;hwnd = CreateWindow( szAppName,/ window class nameTEXT (Diamond Demo),/ window captionWS_OVERLAPPEDWINDOW,/ window styleCW_USEDEFAULT,/ initial x positionCW_USEDEFAULT,/ initial y positionMAXSCREENX,/ initial x sizeMAXSCREENY,/ initial y sizeNULL,/ parent window handle NULL, / window menu handle hInstance, / program instance handle NULL) ; / creation parametersShowWindow (hwnd, iCmdShow) ;UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ; DispatchMessage (&msg) ; return msg.wParam ;LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)HDChdc ;PAINTSTRUCT ps ;RECTrect ;TCHAR szName10; TCHAR tempChar2; HINSTANCE hInstance;switch (message) case WM_CREATE:/读取地图文件hInstance= (LPCREATESTRUCT) lParam)-hInstance ;hdc=GetDC(hwnd);hdcMem=CreateCompatibleDC(hdc);hBitmapMem=CreateCompatibleBitmap(hdc,1024*2,768*2);SelectObject(hdcMem,hBitmapMem);for (int i=0; i4;i+)/读取地图信息_tcscpy(szName,TEXT(MAP);_itot(i,tempChar,10);_tcscat(szName,tempChar);hdcTilesi=CreateCompatibleDC(hdc);hBitmapTilesi=LoadBitmap( hInstance,szName);SelectObject(hdcTilesi,hBitmapTilesi);InitMap();playerx=playery=SIZE/2;/将开始的位置定在地图的中心break;case WM_KEYDOWN:/根据键盘按钮移动int lim=MAXSCREENX/TILEWIDE;switch(wParam)case VK_ESCAPE:PostMessage(hwnd,WM_CLOSE,0,0);break;case VK_UP:if (playerySIZE-1-lim) break;playery+;InvalidateRect(hwnd,NULL,NULL);break;case VK_LEFT:if (playerxSIZE-1-lim) break;playerx+;InvalidateRect(hwnd,NULL,NULL);break;break;case WM_SIZE:/确定大小MAXSCREENX = LOWORD(lParam);MAXSCREENY = HIWORD(lParam); SelectObject(hdcMem,GetStockObject(WHITE_BRUSH);Rectangle(hdcMem,0,0,1024*2,768*2);InvalidateRect(hwnd,NULL,TRUE);break;case WM_PAINT:/在地图上画出附上图片hdc = BeginPaint (hwnd, &ps) ;GetClientRect (hwnd, &rect) ; MapDraw(hdc);EndPaint (hwnd, &ps) ;return 0 ; caseWM_DESTROY:for (int i=0; i4; i+)DeleteDC(hdcTilesi);DeleteObject(hBitmapTilesi);DeleteDC(hdcMem);DeleteObject(hBitmapMem);PostQuitMessage (0) ;return 0 ; return DefWindowProc (hwnd, message, wParam, lParam) ;int InitMap()/在地图的每一个格子随机添上贴图srand( (unsigned)time( NULL ) );for (int yi=0; yiSIZE; yi+)for (int xi=0; xiSIZE; xi+)Datayixi=rand()%4;return 0;int MapDraw(HDC hdc)/输出图像时实现菱形效果TCHAR strOut7;TCHAR strTemp4=,0,0,0;int i,j;int lim=MAXSCREENX/TILEWIDE; /所需绘制地图的范围for (i=-lim; ilim; i+)fo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025银行岗位全真模拟模拟题及答案详解(名校卷)
- 考研英语听力备考中如何提高听力速度
- 中小学纪律与惩戒体系建设报告
- 职业健康安全体系实施细则
- 公司风险管控体系建设
- 幼儿健康教育课程实施方案
- 温室大棚钢结构施工安全管理方案
- 农业生产中的无公害食品生产技术探讨
- 油井勘查规划方案
- 物理教师教学工作总结与案例
- 妊娠合并贫血课件
- 手术室感染监测课件
- 抖音:短视频与直播运营全套教学课件
- 拍卖行业发展趋势PPT
- 【监理公司】市政工程(道路及排水)质量评估报告范本(WORD档)
- 中国特色社会主义思想概论 课件 第四章 坚持以人民为中心
- 退役士兵求职简历模板+自荐书
- 湘菜湖南美食文化介绍PPT
- 外科学外科休克PPT
- 浙人美2011版四年级美术上册《水资源》教案及教学反思
- 全桥LLC自动计算表格
评论
0/150
提交评论