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

📄 tankwar.cpp

📁 一个另类的坦克大战源程序
💻 CPP
字号:
//==================================================================
//TankWar.cpp :
//	该文件由Window Games Engine SDK向导生成
//------------------------------------------------------------------

#include "stdafx.h"	//引用预编译头文件,注意每个CPP文件都应该引用它
#include "TankWar.h"
#include "TWorld.h"
#include "TBonus.h"
#include "TObstacle.h"
#include "TTank.h"
#include "TBullet.h"
#include "TExplode.h"


///////////定义公共变量////////////////

/////////////////////////////
//WGE公共变量

LPSTR TITLE		=	"坦克大战II";			//游戏窗口标题

LPSTR ICON		=	(LPSTR)IDI_TANKWAR;		//游戏窗口的图标

LPSTR NAME		=	"TANKWAR";				//游戏窗口类名

//////////////////////////
//全局共公变量

EMusic g_back_music;			//背景音乐

GAME_STATUS g_game_status;		//游戏状态

EDataFile * g_pData=NULL;		//数据包文件指针

EPG g_epg_msg;					//GAME OVER 和 任务完成

//////////////////////////////
//主菜单资源

ESurface surfaceBack;	//菜单背景
EPG epgMenu,epgInfo;	//菜单项和游戏介绍图像
ESound soundSelect;		//选择菜单的音效

//////////////////////////////////////////////////////
//主菜单

void MainMenu()
{
	static BOOL bLoaded=FALSE;	//已经加载资源标志

	//如果没有加载菜单资源,则现在加载
	if(bLoaded==FALSE)
	{
		VERIFY(g_back_music.LoadMidi(MEDIA("加载.mid"),g_pData));
		g_back_music.SetRepeats(99999);
		g_back_music.Play();

		VERIFY(surfaceBack.LoadBMP(MEDIA("背景.bmp"),NULL,g_pData));
		VERIFY(epgMenu.Load(MEDIA("主菜单.epg"),g_pData));
		VERIFY(epgInfo.Load(MEDIA("游戏介绍.epg"),g_pData));

		VERIFY(soundSelect.LoadWave(MEDIA("菜单选择.wav"),1,NULL,g_pData));

		bLoaded = TRUE;
	}

	//画背景
	WGE_Surface.Blt(surfaceBack,0,0);
	
	if(g_game_status == GAME_MAINMENU)
	{
		//选择菜单

		INT nItemIndex[3]={3,4,5};	//菜单项在EPG文件中的索引值

		static int nCurSel = 0;		//当前选择的菜单项

		nItemIndex[nCurSel] -= 3;	//修改选择项的索引值

		//计算菜单显示位置,然后显示菜单

		int x ,y;
		x = (400-110)/2;
		y = (300-30)/2;

		WGE_Surface.Blt(epgMenu,nItemIndex[0],x,y-32);
		WGE_Surface.Blt(epgMenu,nItemIndex[1],x,y);
		WGE_Surface.Blt(epgMenu,nItemIndex[2],x,y+32);


		//处理按键

		if(WGE_Input.Key()[DIK_DOWN])
		{
			//播放音效
			soundSelect.Play();

			//等待0.2秒
			DWORD dwTick = GetTickCount();
			while(GetTickCount()-dwTick < 200);

			//然后改变当前选择项
			++nCurSel%=3;
		}
		else if(WGE_Input.Key()[DIK_UP])
		{
			//播放音效
			soundSelect.Play();

			//等待0.2秒
			DWORD dwTick = GetTickCount();
			while(GetTickCount()-dwTick < 200);

			//然后改变当前选择项
			--nCurSel;
			if(nCurSel<0)
				nCurSel = 2;

		}else if(WGE_Input.Key()[DIK_RETURN])
		{
			//播放音效
			soundSelect.Play();

			//等待0.2秒
			DWORD dwTick = GetTickCount();
			while(GetTickCount()-dwTick < 200);
			
			//处理选择
			if(nCurSel == 0){
				//选择了 - 开始游戏,则删除菜单资源
				while(soundSelect.Playing());
				surfaceBack.Destroy();
				epgMenu.Destroy();
				epgInfo.Destroy();
				soundSelect.Destroy();

				//设置菜单资源加载标志
				bLoaded = FALSE;

				//然后开始加载游戏资源
				g_game_status = GAME_LOADING;

			}else if(nCurSel == 1)
			{
				//选择了 - 游戏介绍,则进入游戏介绍
				g_game_status = GAME_SHOWINFO;

			}else if(nCurSel == 2)
			{
				//选择了 - 退出游戏
				g_game_status=GAME_QUIT;
			}
		}
	}else if(g_game_status == GAME_SHOWINFO)
	{
		//显示游戏介绍
		
		//让alpha值从0变到256
		static int a=0;
		a++;
		if(a>256) a = 256;

		//显示游戏介绍
		WGE_Surface.Blt(epgInfo,0,0,0,a);

		//如果按了回车键,则返回主菜单
		if(WGE_Input.Key()[DIK_RETURN])
		{
			//等待0.2秒
			DWORD dwTick = GetTickCount();
			while(GetTickCount()-dwTick < 200);

			//返回主菜单
			g_game_status = GAME_MAINMENU;
			
			//为下一次显示游戏介绍恢复alpha值为0
			a = 0;
		}
	}
}

////////////////////////////////////
//显示加载信息
void ShowLoading(LPSTR msg)
{
	//清屏
	WGE_Surface.Clear(0,0,0);

	//显示信息
	WGE_Surface.SetDrawColor(0,255,0);
	WGE_Surface.OutTextXY(120,100,msg);

	//调用EScreen的Update()函数把WGE_Surface中的图像显示到屏幕上
	WGE_pScreen->Update();

	//然后等待0.3秒,不然看不到加载信息
	DWORD dwCurrentTick = GetTickCount();
	while(GetTickCount()-dwCurrentTick<300);
}

BOOL GameLoading()
{
	//加载汉字"任务完成"和"任务失败"
	VERIFY(g_epg_msg.Load(MEDIA("文字.epg"),g_pData));

	//加载地形和图标文件
	ShowLoading("Loading terrain resources");
	VERIFY(TWorld::LoadTerrainPicture(MEDIA("terrains.grp"),g_pData));
	VERIFY(TWorld::LoadIconPicture(MEDIA("坦克图标.epg"),0,g_pData));
	VERIFY(TWorld::LoadIconPicture(MEDIA("金钱图标.epg"),1,g_pData));
	VERIFY(TWorld::LoadIconPicture(MEDIA("防护图标.epg"),2,g_pData));


	//加载奖励图像和声音
	ShowLoading("Loading bonus resources");
	VERIFY(TBonus::LoadPicture(MEDIA("金钱.epg"),BONUS_MONEY,g_pData));
	VERIFY(TBonus::LoadPicture(MEDIA("经验物品.epg"),BONUS_EXPER,g_pData));
	VERIFY(TBonus::LoadPicture(MEDIA("恢复物品.epg"),BONUS_RECOVER,g_pData));
	VERIFY(TBonus::LoadSound(MEDIA("获得物品.wav"),0,g_pData));

	//加载障碍物图像
	ShowLoading("Loading obstacle resources");
	VERIFY(TObstacle::LoadPicture(MEDIA("木箱.epg"),OBSTACLE_BOX,g_pData));
	VERIFY(TObstacle::LoadPicture(MEDIA("邪恶源.epg"),OBSTACLE_END,g_pData));

	//加载玩家坦克图像
	ShowLoading("Loading player resources");
	VERIFY(TPlayerTank::LoadPicture(MEDIA("青铜坦克.epg"),GREEN_TANK,g_pData));
	VERIFY(TPlayerTank::LoadPicture(MEDIA("白银坦克.epg"),WHITE_TANK,g_pData));
	VERIFY(TPlayerTank::LoadPicture(MEDIA("黄金坦克.epg"),GOLD_TANK,g_pData));

	//加载NC坦克图像
	ShowLoading("Loading NC tank resources");
	VERIFY(TEnemyTank::LoadPicture(MEDIA("双弹坦克.epg"),DOUBLE_MISSILE_TANK,g_pData));
	VERIFY(TEnemyTank::LoadPicture(MEDIA("单弹坦克.epg"),SINGLE_MISSILE_TANK,g_pData));
	VERIFY(TEnemyTank::LoadPicture(MEDIA("火坦克.epg"),FIRE_TANK,g_pData));

	//加载子弹图像和音效
	ShowLoading("Loading bullet resources");
	VERIFY(TBullet::LoadPicture(MEDIA("双导弹.epg"),DMISSILE,g_pData));
	VERIFY(TBullet::LoadPicture(MEDIA("单导弹.epg"),SMISSILE,g_pData));
	VERIFY(TBullet::LoadPicture(MEDIA("光弹.epg"),LIGHT,g_pData));
	VERIFY(TBullet::LoadPicture(MEDIA("火弹.epg"),FIRE,g_pData));

	VERIFY(TBullet::LoadSound(MEDIA("导弹.wav"),0,g_pData));
	VERIFY(TBullet::LoadSound(MEDIA("火弹.wav"),1,g_pData));
	VERIFY(TBullet::LoadSound(MEDIA("光弹.wav"),2,g_pData));

	//加载爆炸效果图像和音效
	ShowLoading("Loading explode resources");
	VERIFY(TExplode::LoadPicture(MEDIA("坦克爆炸.epg"),0,g_pData));
	VERIFY(TExplode::LoadPicture(MEDIA("导弹爆炸.epg"),1,g_pData));
	VERIFY(TExplode::LoadPicture(MEDIA("火弹爆炸.epg"),2,g_pData));
	VERIFY(TExplode::LoadPicture(MEDIA("木箱爆炸2.epg"),3,g_pData));

	VERIFY(TExplode::LoadSound(MEDIA("爆炸1.wav"),0,g_pData));
	VERIFY(TExplode::LoadSound(MEDIA("爆炸2.wav"),1,g_pData));

	//创建游戏世界
	if(g_world.CreateWorld(g_pData)==FALSE)
		return FALSE;

	return TRUE;
}

void ExitGame()
{
	//在此加入游戏代码
	g_epg_msg.Destroy();

	surfaceBack.Destroy();
	epgMenu.Destroy();
	epgInfo.Destroy();
	soundSelect.Destroy();

	TBonus::Destroy();
	TObstacle::Destroy();
	TPlayerTank::Destroy();
	TEnemyTank::Destroy();
	TBullet::Destroy();
	TExplode::Destroy();

	g_back_music.Destroy();
	g_world.DestroyWorld();
	TWorld::DestroyResource();

	//关闭数据包资源
	if(g_pData) 
		delete g_pData;

	//以下内容不要删除
	EAudio::Destroy();
	WGE_Input.Destroy();
}

BOOL InitGame()
{

	int width = 400;		//屏幕宽度

	int height = 300;		//屏幕高度
	
	//设置游戏屏幕显示模式

	if(WGE_pScreen->CreateScreenDisplay(width,height,TV_MODE))
		TRACE(0,"SELECT TV_MODE");
	else if(WGE_pScreen->CreateScreenDisplay(width,height,GDI_MODE))
		TRACE(0,"SELECT GDI_MODE");
	else
	{
		MessageBox(NULL,"设置显示模式错误","错误",MB_OK);
		return FALSE;
	}
	

	//初始化声音
	EAudio::Init();

	//初始化键盘和鼠标设备
	WGE_Input.Init(IDF_NONEXCLUSIVE|IDF_FOREGROUND,NULL);

	//以下加入游戏初始化代码

	//用黑色清除屏幕
	WGE_Surface.Clear(0,0,0);

	//打开数据包文件
	TRACE(0,"打开数据包文件gamedata.gdp");
	g_pData = NEW EDataFile;
	if(g_pData->Open("gamedata.gdp")==FALSE)
	{
		MessageBox(NULL,"打开gamedata.gdp错误","错误",MB_OK);
		delete g_pData;
		return FALSE;
	}

	//设置游戏状态为主菜单
	g_game_status = GAME_MAINMENU;
	return TRUE;
}

BOOL GameLoop()
{
	WGE_Input.GetKeyboardState();	//读取键盘状态

	//以下加入游戏代码
	
	if(g_game_status == GAME_PLAY)
	{
		g_world.Move();
		g_world.DrawWorld();
	}else if(g_game_status == GAME_QUIT){
		//退出游戏
		return FALSE;
	}else if(g_game_status == GAME_LOADING){
		//加载游戏资源
		return GameLoading();
	}else if(g_game_status == GAME_OVER){

		//游戏结束
		g_world.Move();
		g_world.DrawWorld();
		static int i=0;
		if(i>255) i=255;
		WGE_Surface.Blt(g_epg_msg,1,0,0,i+=2);

		//等待10秒然后回到主菜单
		static DWORD dwTick ;
		if(dwTick==0) dwTick = GetTickCount();
		if(GetTickCount()-dwTick > 10000)
		{
			g_world.DestroyWorld();
			g_game_status = GAME_MAINMENU;
			dwTick = 0;
		}
	}else if(g_game_status==GAME_STAGECLEAR)
	{
		//过关,进入下一关
		g_world.Move();
		g_world.DrawWorld();
		
		static int i=0;
		if(i>255) i=255;
		WGE_Surface.Blt(g_epg_msg,0,0,0,i+=2);
		//等待10秒然后回到主菜单
		static DWORD dwTick ;
		if(dwTick==0) dwTick = GetTickCount();
		if(GetTickCount()-dwTick > 10000)
		{
			if(g_world.NextStage(g_pData)==FALSE)
				return FALSE;
			dwTick = 0;
		}
	}else if(g_game_status == GAME_MAINMENU||g_game_status==GAME_SHOWINFO)
	{
		//进入主菜单
		MainMenu();
	}
	return TRUE;
}

⌨️ 快捷键说明

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