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

📄 main.cpp

📁 一个小游戏源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <windows.h>
#include <ddraw.h>
#include "ddutil.h"
#include "stdio.h"
#include "resource.h"

//函数声明
INT UpdateFrame();
LRESULT CALLBACK WindowFunc(HWND,UINT,WPARAM,LPARAM);
BOOL InitDDraw( void );
void GetRect(RECT* rect, long left, long top, long width, long height);
void Flip(void);
void DrawAll();
void InitData();
void CheckHit();
void StepAll();
void StartGame();
void DrawNumber(LPDIRECTDRAWSURFACE dd,LPDIRECTDRAWSURFACE ss,int num,int x,int y,int width,int height);

//全局变量
char szClassName[] = "ForEpork";
HWND hwnd;
HINSTANCE hInst;
BOOL bActive;
DWORD delay;							//延时
DWORD dwTickCount,dwLastTickCount;

//关于游戏的全局变量
BOOL	hit,get;
POINT	pos;				//木锤位置
int		forewidth, foreheight;//前台页面的宽度和高度
RECT	backrect;			//后台页面映射矩形
int		backwidth, backheight;//后台页面的宽度和高度
int		mouse[9];			//老鼠洞出现东东的纪录
POINT	holepos[9];			//老鼠洞的位置
POINT	mousepos[9];		//老鼠头的位置
int		status[9];			//老鼠状态,0-4
int		behit[9];			//老鼠各个被打的纪录
int		mousewidth;
int		mouseheight;
POINT pt;
int		time;				//剩余时间
int		score;				//分数
int		GameStatus;			//游戏状态

//DirectDraw变量
LPDIRECTDRAW lpDD;
LPDIRECTDRAWCLIPPER lpClipper;
LPDIRECTDRAWSURFACE     lpDDSFront; //以下均为DirectDrawSurface对象
LPDIRECTDRAWSURFACE     lpDDSBack;   
LPDIRECTDRAWSURFACE     lpDDSMouse[3];
LPDIRECTDRAWSURFACE     lpDDSHammer;
LPDIRECTDRAWSURFACE     lpDDSBk;
LPDIRECTDRAWSURFACE     lpDDSLogo;
LPDIRECTDRAWSURFACE     lpDDSBow;
LPDIRECTDRAWSURFACE     lpDDSFig;
LPDIRECTDRAWSURFACE     lpDDSHamfig;
LPDIRECTDRAWSURFACE     lpDDSTime;
LPDIRECTDRAWSURFACE     lpDDSScore[3];


INT WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nMode)
{
	MSG msg;
	WNDCLASSEX wcl;

	wcl.cbClsExtra = 0;
	wcl.cbSize = sizeof(WNDCLASSEX);
	wcl.cbWndExtra = 0;
	wcl.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
	wcl.hCursor = LoadCursor(NULL,IDC_ARROW);
	wcl.hIcon = LoadIcon(hInstance,"IDI_ICON1");
	wcl.hIconSm = LoadIcon(NULL,IDI_WINLOGO);
	wcl.hInstance = hInstance;
	wcl.lpfnWndProc = WindowFunc;
	wcl.lpszClassName = szClassName;
	wcl.lpszMenuName = NULL;
	wcl.style = 0;

	if (!RegisterClassEx(&wcl)) return 0;

	hwnd = CreateWindow(
		szClassName,
		"打老鼠",
		WS_SYSMENU|WS_CAPTION|WS_MINIMIZEBOX|WS_POPUP,
		180,
		80,
		433,
		348,
		HWND_DESKTOP,
		NULL,
		hInstance,
		NULL);

	ShowWindow(hwnd,nMode);
	UpdateWindow(hwnd);

	if (!InitDDraw())
	{
		MessageBox(GetActiveWindow(), "初始化DirectDraw过程中出错!请检查你是否正确的安装了DirectX。", "Error", MB_OK );
		return 0;
	}
	hInst = hInstance;

	InitData();
	SetTimer(hwnd,1,200,NULL);
	SetTimer(hwnd,2,1000,NULL);

	while(1)
	{
		if( PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
		{
			if (!GetMessage(&msg,NULL,0,0))
			{
				return msg.wParam;
			}
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else if( bActive)
		{
			UpdateFrame();
		}
		else
		{
			WaitMessage();
		}
	}

	KillTimer(hwnd,1);
	return msg.wParam;
}

LRESULT CALLBACK WindowFunc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch(message)
	{
	case WM_ACTIVATEAPP://
		bActive = wParam;
		break;
	case WM_CREATE:
		//写入注册表
		HKEY hRegKey;
		unsigned long result;
		char version[10];
		sprintf(version,"1.00");
		RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Raynor Game\\For Epork",0,"Epork",0,KEY_ALL_ACCESS,
			NULL,&hRegKey,&result);
		if (result == REG_CREATED_NEW_KEY)
		{
			RegSetValueEx(hRegKey,"Version",0,REG_SZ,(LPBYTE)version,4);
		}
		else
		{
			RegSetValueEx(hRegKey,"Version",0,REG_SZ,(LPBYTE)version,4);
		}
		RegCloseKey(hRegKey);
		break;
	case WM_SETCURSOR:
		SetCursor(NULL);
		break;
	case WM_KEYDOWN:
		switch (char(wParam))
		{
		case VK_SUBTRACT:
			delay += 2;
			break;
		case VK_ADD:
			if (delay>2)	delay -= 2;
			break;
		case VK_ESCAPE:
			MessageBox(hwnd,"送给你的...:)\n              From:\n               耗子\nhttp://rpg.3322.net\n   Raynor@ah163.com","关于这个游戏",MB_OK);
			PostQuitMessage(0);
			break;
		}
		break;
	case WM_LBUTTONDOWN:
		if (GameStatus == 1)
		{
			hit = true;
			get = false;
		}
		else
		{
			StartGame();
		}
		break;
	case WM_LBUTTONUP:
		hit = false;
		break;
	case WM_DESTROY:
		MessageBox(hwnd,"送给你的...:)\n              From:\n               耗子\nhttp://rpg.3322.net\n   Raynor@ah163.com","关于这个游戏",MB_OK);
		PostQuitMessage(0);
		break;
	case WM_MOUSEMOVE:
		pos.x = LOWORD(lParam);
		pos.y = HIWORD(lParam);
		break;
	case WM_TIMER:
		if (bActive)
		{
			switch (wParam)
			{
			case 1:
				StepAll();
				break;
			case 2:
				time --;
				break;
			}
		}
		break;
	default:
		return DefWindowProc(hwnd,message,wParam,lParam);
		break;
	}
	return 0;
}

INT UpdateFrame()
{
	if (bActive)
	{
		dwTickCount = GetTickCount();
		if ((dwTickCount - dwLastTickCount) <= delay)
		{
			return 0;
		}
		dwLastTickCount = dwTickCount;
		//Here to add my code...
		DrawAll();
		CheckHit();
		Flip();
	}
	return 1;
}

BOOL InitDDraw()
{
	DWORD dwFlags;
	DDSURFACEDESC ddsd;

	//创建DirectDraw对象
	DirectDrawCreate(NULL, &lpDD, NULL);

	//设置协作级别为窗口模式
	dwFlags = DDSCL_NORMAL;
	lpDD->SetCooperativeLevel(hwnd, dwFlags);

	//创建主页面
	ZeroMemory(&ddsd, sizeof(ddsd));
	ddsd.dwSize = sizeof(ddsd);
	ddsd.dwFlags = DDSD_CAPS;
	ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
	lpDD->CreateSurface(&ddsd, &lpDDSFront, NULL);

	//创建离屏页面
	ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;    
	ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
		RECT rect;
		GetClientRect(hwnd, &rect);
		forewidth=rect.right-rect.left;	
		foreheight=rect.bottom-rect.top;
		GetRect(&backrect, 0, 0, 433,348);
	ddsd.dwWidth = backwidth=forewidth;
	ddsd.dwHeight = backheight=foreheight;
	lpDD->CreateSurface( &ddsd, &lpDDSBack, NULL );

	//创建老鼠页面
	ddsd.dwWidth = 124;
	ddsd.dwHeight = 425;
	lpDD->CreateSurface( &ddsd, &lpDDSMouse[0], NULL );
	lpDD->CreateSurface( &ddsd, &lpDDSMouse[1], NULL );
	lpDD->CreateSurface( &ddsd, &lpDDSMouse[2], NULL );

	DDReLoadBitmap(lpDDSMouse[0], "MOUSE00.BMP");
	DDReLoadBitmap(lpDDSMouse[1], "MOUSE01.BMP");
	DDReLoadBitmap(lpDDSMouse[2], "MOUSE02.BMP");

	DDSetColorKey(lpDDSMouse[0],RGB(0,0,255));
	DDSetColorKey(lpDDSMouse[1],RGB(0,0,255));
	DDSetColorKey(lpDDSMouse[2],RGB(0,0,255));

	//创建木锤
	ddsd.dwWidth = 68;
	ddsd.dwHeight = 136;
	lpDD->CreateSurface( &ddsd, &lpDDSHammer, NULL );
	DDReLoadBitmap(lpDDSHammer, "HAM.BMP");
	DDSetColorKey(lpDDSHammer,RGB(0,0,255));

	//创建火花
	ddsd.dwWidth = 68;
	ddsd.dwHeight = 24;
	lpDD->CreateSurface( &ddsd, &lpDDSBow, NULL );
	DDReLoadBitmap(lpDDSBow, "Bow.BMP");
	DDSetColorKey(lpDDSBow,RGB(255,0,127));

	//创建标题
	ddsd.dwWidth = 319;
	ddsd.dwHeight = 56;
	lpDD->CreateSurface( &ddsd, &lpDDSLogo, NULL );
	DDReLoadBitmap(lpDDSLogo, "logo.BMP");
	DDSetColorKey(lpDDSLogo,RGB(0,0,255));

	//创建背景
	ddsd.dwWidth = 433;
	ddsd.dwHeight = 348;
	lpDD->CreateSurface( &ddsd, &lpDDSBk, NULL );
	DDReLoadBitmap(lpDDSBk, "BK.BMP");

	//创建时间
	ddsd.dwWidth = 45;
	ddsd.dwHeight = 13;
	lpDD->CreateSurface( &ddsd, &lpDDSTime, NULL );
	DDReLoadBitmap(lpDDSTime, "Time.BMP");
	DDSetColorKey(lpDDSTime,RGB(255,0,127));

	//创建数字
	ddsd.dwWidth = 260;
	ddsd.dwHeight = 38;
	lpDD->CreateSurface( &ddsd, &lpDDSHamfig, NULL );
	DDReLoadBitmap(lpDDSHamfig, "Hamfig.BMP");
	DDSetColorKey(lpDDSHamfig,RGB(255,0,127));

	//创建数字
	ddsd.dwWidth = 160;
	ddsd.dwHeight = 23;
	lpDD->CreateSurface( &ddsd, &lpDDSFig, NULL );
	DDReLoadBitmap(lpDDSFig, "fig.BMP");
	DDSetColorKey(lpDDSFig,RGB(255,0,127));

	//创建分数页面
	ddsd.dwWidth = 43;
	ddsd.dwHeight = 25;
	lpDD->CreateSurface( &ddsd, &lpDDSScore[0], NULL );
	lpDD->CreateSurface( &ddsd, &lpDDSScore[1], NULL );
	lpDD->CreateSurface( &ddsd, &lpDDSScore[2], NULL );

	DDReLoadBitmap(lpDDSScore[0], "Score01.BMP");
	DDReLoadBitmap(lpDDSScore[1], "Score02.BMP");
	DDReLoadBitmap(lpDDSScore[2], "Score03.BMP");

	DDSetColorKey(lpDDSScore[0],RGB(255,0,127));
	DDSetColorKey(lpDDSScore[1],RGB(255,0,127));
	DDSetColorKey(lpDDSScore[2],RGB(255,0,127));

	//创建Clipper裁剪器
	lpDD->CreateClipper(0, &lpClipper, NULL);
	lpClipper->SetHWnd(0, hwnd);
	lpDDSFront->SetClipper(lpClipper);

	return TRUE;
}

//******************
//填充一个RECT结构
void GetRect(RECT* rect, long left, long top, long width, long height)
{
	rect->left=left;
	rect->top=top;
	rect->right=left+width;
	rect->bottom=top+height;
	return;
}

//*****************************************************

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -