|
|
我正在用WIN32做游戏,可是在地图滚动的时候遇到了问题,代码如下
// pepolewalk.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "resource.h"
#include <ddraw.h>
#include <windows.h>
#include <windowsx.h>
LPDIRECTDRAW dp;
LPDIRECTDRAWSURFACE lpsur;
HINSTANCE hInst;
HDC hdc,mdc,fdc;
HBITMAP bg,people[4],people1[4],bmp;
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
void MyPaint(HDC hdc);
BOOL InitDraw(void);
void FreeDraw(void);
HWND hWnd;
int x,y,dir,num,ht,wh;
DWORD tNow,tPre,tCheck;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
MSG msg;
MyRegisterClass(hInstance);
if (!InitInstance (hInstance, nCmdShow))
{
return FALSE;
}
if (!InitDraw())
{
MessageBox(GetActiveWindow(),"程序错误","DRAW初始化错误",MB_OK);
FreeDraw();
DestroyWindow(GetActiveWindow());
return FALSE;
}
hdc=GetDC(hWnd);
while (msg.message != WM_QUIT)
{
if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
tNow = GetTickCount();
if(tNow - tPre >= 100)
MyPaint(hdc);
}
}
return msg.wParam;
}
ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = 0;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0;
wcex.hInstance = hInstance;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = "people";
wcex.hIconSm = NULL;
return RegisterClassEx(&wcex);
}
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
//HWND hWnd;
hInst = hInstance; // Store instance handle in our global variable
hWnd = CreateWindow("people", "hg", WS_POPUP,
0, 0, GetSystemMetrics( SM_CXSCREEN ), GetSystemMetrics(SM_CYSCREEN),
NULL, NULL, hInst, NULL);
if (!hWnd)
{
return FALSE;
}
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hWnd);
hdc = GetDC(hWnd);
mdc = CreateCompatibleDC(hdc);
fdc = CreateCompatibleDC(hdc);
bg = (HBITMAP)LoadImage(NULL,"map/bg.bmp",IMAGE_BITMAP,2048,1536,LR_LOADFROMFILE);
people[0] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mawenbo1.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people[1] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mawenbo2.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people[2] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mawenbo3.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people[3] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mawenbo4.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people1[0] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mab1.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people1[1] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mab2.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people1[2] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mab3.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
people1[3] = (HBITMAP)LoadImage(NULL,"people/mawenbo/mab4.bmp",IMAGE_BITMAP,200,75,LR_LOADFROMFILE);
bmp = CreateCompatibleBitmap(hdc,1024,768);
SelectObject(mdc,bmp);
x = 300;
y = 200;
dir = 3;
num = 0;
ht = 0;
wh = 0;
//MyPaint(hdc);
return TRUE;
}
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
//HDC hdc;
// RECT a;
switch (message)
{
case WM_KEYDOWN:
switch(wParam)
{
case VK_ESCAPE:
PostMessage(hWnd,WM_CLOSE,0,0);
break;
case VK_UP:
switch(dir)
{
case 0:
y -= 10;
break;
case 1:
//x -= 1;
//y -= 8;
break;
case 2:
//x += 2;
//y -= 10;
break;
case 3:
//x += 2;
//y -= 10;
break;
}
if(y < 0)
y = 0;
dir = 0;
if(y < 30)
{
ht -= 10;
if( ht < 0)
ht = 0;
}
break;
case VK_DOWN:
switch(dir)
{
case 0:
//x += 1;
//y += 8;
break;
case 1:
y += 10;
break;
case 2:
//x += 3;
//y += 6;
break;
case 3:
//x += 3;
//y += 6;
break;
}
if(y > 1490)
y = 1490;
dir = 1;
if(y > 1490)
{
ht += 10;
if( ht > 600)
ht = 600;
}
break;
case VK_LEFT:
switch(dir)
{
case 0:
//y -= 12;
break;
case 1:
//x -= 13;
//y += 4;
break;
case 2:
x -= 10;
break;
case 3:
//y -= 5;
break;
}
if(x < 10)
x = 0;
dir = 2;
if(x < 30)
{
wh -= 10;
if( wh < 0)
wh = 0;
}
break;
case VK_RIGHT:
switch(dir)
{
case 0:
//x += 8;
break;
case 1:
//x += 7;
//y += 4;
break;
case 2:
// x += 10;
break;
case 3:
x += 10;
break;
}
if(x > 970)
x = 970;
dir = 3;
if(x > 940)
{
wh += 10;
if( wh > 500)
wh = 500;
}
break;
}
/* a.top=0;
a.bottom=768;
a.left=0;
a.right=1024;
InvalidateRect(hWnd,&a,FALSE);
break;
*/
case WM_PAINT:
BeginPaint(hWnd, &ps);
// MyPaint(hdc);
EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
int i;
DeleteDC(mdc);
DeleteDC(fdc);
for(i = 0;i < 4;i++)
{
DeleteObject(people);
DeleteObject(people1);
}
ReleaseDC(hWnd,hdc);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}
BOOL InitDraw()
{
DDSURFACEDESC dds;
if(DirectDrawCreate(NULL,&dp,NULL) != DD_OK)
return FALSE;
if(dp->SetCooperativeLevel(GetActiveWindow(),
DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN )!= DD_OK)
return FALSE;
if(dp->SetDisplayMode(1024,768,16) != DD_OK)
return FALSE;
dds.dwSize = sizeof(dds);
dds.dwFlags = DDSD_CAPS;
dds.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if(dp->CreateSurface(&dds,&lpsur,NULL) != DD_OK)
return FALSE;
// if(lpsur->GetDC(&hdc) != DD_OK)
// return FALSE;
//MyPaint(hdc);
//MessageBox(hWnd,"dd","dd",MB_OK);
lpsur->ReleaseDC(hdc);
return TRUE;
}
void FreeDraw()
{
if(dp != NULL)
{
if(lpsur != NULL)
{
lpsur->Release();
lpsur = NULL;
}
dp->Release();
dp = NULL;
}
}
void MyPaint(HDC hdc)
{
int w, h;
SelectObject(fdc,bg);
BitBlt(mdc,0,0,1024,768,fdc,wh,ht,SRCCOPY);
SelectObject(fdc,people1[dir]);
//SelectObject(cdc,people[dir]);
switch(dir)
{
case 0:
w = 50;
h = 75;
break;
case 1:
w = 50;
h = 75;
break;
case 2:
w = 50;
h = 75;
break;
case 3:
w = 50;
h = 75;
break;
}
BitBlt(mdc,x,y,w,h,fdc,num*w,0,SRCAND);
SelectObject(fdc,people[dir]);
BitBlt(mdc,x,y,w,h,fdc,num*w,0,SRCPAINT);
BitBlt(hdc,0,0,1024,768,mdc,0,0,SRCCOPY);
tPre = GetTickCount();
Sleep(70);
num ++;
if(num == 4)
num = 0;
}
我想在地图上设置一些不能走动的地方,我设置了一个二维数组,但是在画面滚动后却不能将滚动过来的画面设置一些不能走动的地方,一位人物到屏幕边缘后坐标就不发生变化了,很难用坐标进行判断,请各位高手赐教啊,现在急用!!!
如有需要我可以上传原程序~~~ |
|