📄 gamedev.cpp
字号:
#include<windows.h>
#include<stdio.h>
#include <conio.h>
#include "stdafx.h"
#include"room.h"
#include"level.h"
#include"boxr.h"
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);
void RoomInst(void);
void PicInst(void);
void Show(HDC dc);
void Next(int n);
void SetRoom(void);
CRoom room;
CLevel level;
int m_level=0;
bool IsOver=false;
PAINTSTRUCT ps;
HBITMAP picBMP,bufferBMP,backBMP;
HDC windowDC,bufferDC,picDC,backDC,hdc;
int roomWidth=0,roomHeight=0,roomPointNum=0;
DWORD nowTick,showTick=0;
int ScreenW,ScreenH;
int WINAPI WinMain(HINSTANCE hCurrentInst,HINSTANCE hPrevInstance,PSTR lpszCmdLine,int nCmdShow)
{
WNDCLASS wndClass;
HWND hWnd;
MSG msg;
UINT width;
UINT height;
ScreenW=GetSystemMetrics(SM_CXSCREEN);
ScreenH=GetSystemMetrics(SM_CYSCREEN);
PicInst();
RoomInst();
wndClass.style=CS_HREDRAW|CS_VREDRAW;
wndClass.lpfnWndProc=WndProc;
wndClass.cbClsExtra=0;
wndClass.cbWndExtra=0;
wndClass.hInstance=hCurrentInst;
wndClass.hIcon=LoadIcon(NULL,MAKEINTRESOURCE(IDI_MAIN));
wndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
wndClass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
wndClass.lpszMenuName=NULL;
wndClass.lpszClassName="BasicApp";
RegisterClass(&wndClass);
width=GetSystemMetrics(SM_CXSCREEN);
height=GetSystemMetrics(SM_CYSCREEN);
hWnd=CreateWindow(
"BasicApp",
"Basic Applicaton",
WS_POPUP|WS_MAXIMIZE,
0,0,
width,height,
NULL,NULL,
hCurrentInst,NULL);
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
nowTick=GetTickCount();
if(nowTick-showTick>33&&!IsOver)
{
Show(bufferDC);
BitBlt(windowDC,0,0,ScreenW,ScreenH,bufferDC,0,0,SRCCOPY);
showTick=nowTick;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_PAINT:
return 0;
case WM_SETCURSOR:
SetCursor(NULL);
return 0;
case WM_KEYDOWN:
switch(wParam)
{
case VK_NUMPAD0:
break;
case VK_ESCAPE:
PostMessage(hWnd,WM_CLOSE,0,0);
break;
case VK_UP:
room.MovePeople(B_NORTH);
if(room.IsDone()) Next(0);
break;
case VK_DOWN:
room.MovePeople(B_SOURTH);
if(room.IsDone()) Next(0);
break;
case VK_LEFT:
room.MovePeople(B_WEST);
if(room.IsDone()) Next(0);
break;
case VK_RIGHT:
room.MovePeople(B_EAST);
if(room.IsDone()) Next(0);
break;
case VK_SPACE:
Next(0);
break;
}
return 0;
case WM_DESTROY:
ReleaseDC(hWnd,picDC);
ReleaseDC(hWnd,bufferDC);
ReleaseDC(hWnd,backDC);
ReleaseDC(hWnd,windowDC);
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
void SetRoom(void)
{
int i,j;
roomWidth=level.GetRoom(m_level)->GetRoomWidth();
roomHeight=level.GetRoom(m_level)->GetRoomHeight();
room.SetRoomRange(roomWidth,roomHeight);
for(i=0;i<roomHeight;i++)
for(j=0;j<roomWidth;j++)
room.SetRoom(j,i,level.GetRoom(m_level)->GetRoomData()[j][i]);
roomPointNum=level.GetRoom(m_level)->GetPointNum();
room.SetPointNum(roomPointNum);
for(i=0;i<roomPointNum;i++)
room.SetBox(i,level.GetRoom(m_level)->GetBoxData(i)->x,
level.GetRoom(m_level)->GetBoxData(i)->y);
room.SetPeople(level.GetRoom(m_level)->GetPeopleData()->x,
level.GetRoom(m_level)->GetPeopleData()->y);
}
void RoomInst(void)
{
level.LoadFile("level.fok");
SetRoom();SetRoom();
}
void PicInst(void)
{
windowDC=GetDC(0);
bufferDC=CreateCompatibleDC(NULL);
picDC=CreateCompatibleDC(NULL);
backDC=CreateCompatibleDC(NULL);
bufferBMP=CreateCompatibleBitmap(windowDC,ScreenW,ScreenH);
picBMP=(HBITMAP)LoadImage(NULL,"map.bmp",IMAGE_BITMAP,256,128,LR_LOADFROMFILE);
backBMP=CreateCompatibleBitmap(windowDC,ScreenW,ScreenH);
SelectObject(picDC,picBMP);
SelectObject(bufferDC,bufferBMP);
SelectObject(backDC,backBMP);
BitBlt(backDC,0,0,ScreenW,ScreenH,windowDC,0,0,BLACKNESS);
}
void Show(HDC dc)
{
int **data,i,j,k,x,y;
SPoint *box,*people;
BitBlt(bufferDC,0,0,ScreenW,ScreenH,backDC,0,0,SRCCOPY);
data=room.GetRoomData();
for(i=0;i<roomHeight;i++)
{
for(j=0;j<roomWidth;j++)
{
switch(data[i][j])
{
case AIM:
BitBlt(dc,ScreenW/2-32+(j-i)*32,ScreenH/2-32-roomHeight*16+(j+i)*16,64,32,picDC,192,96,SRCPAINT);
BitBlt(dc,ScreenW/2-32+(j-i)*32,ScreenH/2-32-roomHeight*16+(j+i)*16,64,32,picDC,64,96,SRCAND);
break;
case SPACE:
BitBlt(dc,ScreenW/2-32+(j-i)*32,ScreenH/2-32-roomHeight*16+(j+i)*16,64,32,picDC,192,0,SRCPAINT);
BitBlt(dc,ScreenW/2-32+(j-i)*32,ScreenH/2-32-roomHeight*16+(j+i)*16,64,32,picDC,64,0,SRCAND);
break;
}
}
}
for(i=0;i<roomHeight;i++)
{
for(j=0;j<roomWidth;j++)
{
for(k=0;k<roomPointNum;k++)
{
box=room.GetBoxData(k);
x=box->x;y=box->y;
if(box->x==j&&box->y==i)
{
BitBlt(dc,ScreenW/2-32+(y-x)*32,ScreenH/2-32-roomHeight*16+(y+x)*16-32,64,64,picDC,128,0,SRCPAINT);
BitBlt(dc,ScreenW/2-32+(y-x)*32,ScreenH/2-32-roomHeight*16+(y+x)*16-32,64,64,picDC,0,0,SRCAND);
}
}
people=room.GetPeopleData();
x=people->x;y=people->y;
if(people->x==j&&people->y==i)
{
BitBlt(dc,ScreenW/2-32+(y-x)*32+8,ScreenH/2-32-roomHeight*16+(y+x )*16-24,38,50,picDC,192,32,SRCPAINT);
BitBlt(dc,ScreenW/2-32+(y-x)*32+8,ScreenH/2-32-roomHeight*16+(y+x)*16-24,38,50,picDC,64,32,SRCAND);
}
}
}
}
void Next(int n)
{
if(m_level<level.GetLevel()-1)
{
Show(bufferDC);
BitBlt(windowDC,0,0,ScreenW,ScreenH,bufferDC,0,0,SRCCOPY);
++m_level;
SetRoom();
}
else
{
Show(bufferDC);
BitBlt(windowDC,0,0,ScreenW,ScreenH,bufferDC,0,0,SRCCOPY);
TextOut(windowDC,ScreenW/2-10,ScreenH/2+60,"Game Over!",10);
IsOver=true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -