?? 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 + -