卷轴式游戏地图实现

来源:互联网 发布:js filter() 编辑:程序博客网 时间:2024/05/16 18:25

运行效果:


完整工程下载地址:http://download.csdn.net/detail/qq2399431200/6267291 0积分

以下是完整程序代码:

#include "stdafx.h"//全局变量HINSTANCE hInst;HBITMAP map;HDChdc,mdc;HWNDhWnd;DWORDtPre,tNow;intx=730,y=340;//函数声明ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);voidMyPaint(HDC hdc);//主函数int APIENTRY WinMain(HINSTANCE hInstance,                     HINSTANCE hPrevInstance,                     LPSTR     lpCmdLine,                     int       nCmdShow){MSG msg;MyRegisterClass(hInstance);//初始化if (!InitInstance (hInstance, nCmdShow)) {return FALSE;}//游戏循环    do//while( msg.message!=WM_QUIT )    {        if( PeekMessage( &msg, NULL, 0,0 ,PM_REMOVE) )        {            TranslateMessage( &msg );            DispatchMessage( &msg );        }else{tNow = GetTickCount();if(tNow-tPre >= 40)MyPaint(hdc);}    }while( msg.message!=WM_QUIT );return msg.wParam;}//定义及注册视窗类别函数ATOM MyRegisterClass(HINSTANCE hInstance){WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= NULL;wcex.hCursor= NULL;wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= NULL;wcex.lpszClassName= "seek";   //窗口类名称wcex.hIconSm= NULL;return RegisterClassEx(&wcex);  //注册窗口类别}//创建窗体以及加载背景BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){hInst = hInstance;hWnd = CreateWindow("seek", "卷轴-世界地图查看器V1.1" , WS_OVERLAPPED|WS_SYSMENU|WS_MINIMIZEBOX,  //禁用最大化按钮CW_USEDEFAULT, 0, CW_USEDEFAULT,0, NULL, NULL, hInstance, NULL);if (!hWnd){return FALSE;}MoveWindow(hWnd,100,80,640,480,true);ShowWindow(hWnd, nCmdShow);UpdateWindow(hWnd);hdc = GetDC(hWnd);mdc = CreateCompatibleDC(hdc);map = (HBITMAP)LoadImage(NULL,"map.bmp",IMAGE_BITMAP,2792,1831,LR_LOADFROMFILE);SelectObject(mdc,map);MyPaint(hdc);return TRUE;}//自定义绘图函数void MyPaint(HDC hdc){BitBlt(hdc,0,0,640,480,mdc,x,y,SRCCOPY);tPre = GetTickCount();}//消息处理过程函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam){switch (message){//鼠标左键单击按下事件case WM_LBUTTONDOWN:   x += ( LOWORD(lParam) - /*320*/240 );y += ( HIWORD(lParam) - 240 );//坐标矫正if( (y < 27 && (y = 27)) || (y > 1350 && (y = 1350)) );//noneif( (x < 27 && (x = 27)) || (x > 2158 && (x =2158)) );//nonebreak;    //鼠标滑轮事件case WM_MOUSEWHEEL:          if( ((short)HIWORD(wParam) )> 0 ) //滑轮向上滚  (这个short强制转换非常重要,不然出问题)         { y -= 20; if( y < 27 ) y = 27; } else //滑轮向下滚 { y += 20; if(y>1350)y=1350; }break;//键盘消息处理case WM_KEYDOWN:switch (wParam) {case VK_UP: //龄y -= 20;if( y < 27 )y = 27;break;case VK_DOWN: //龄y += 20;if(y>1350)y=1350;break;case VK_LEFT: //オ龄x -= 20;if( x < 27 )x = 27;break;case VK_RIGHT: //龄x += 20;if( x > 2158)x = 2158;break;}break;//销毁窗体及退出程序case WM_DESTROY:DeleteDC(mdc);DeleteObject(map);ReleaseDC(hWnd,hdc);PostQuitMessage(0);  //退出程序break;//其它消息默认处理default:return DefWindowProc(hWnd, message, wParam, lParam);}   return 0;}

警告:
如果用VC6(用VS2010没有次编译错误)编译可能出现:WM_MOUCEWHEEL没有定义的错误提示。

解决方法:添加如下宏定义

#define WM_MOUSEWHEEL 0x020A(编译通过)


有的网友说添加:#define _WIN32_WINNT 0x0400 可以解决,但是我尝试后没有解决这个问题,但是上面方案可以解决。