⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamedev.cpp

📁 vc++经典的仿3D的推箱子游戏
💻 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 + -