📄 tankwar.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 + -