7. 推進游戲
游戲一旦啟動,就會進入一個循環(huán),其中游戲狀態(tài)將連續(xù)地進行更新,例如:所有飛船將移動,玩家的角色會改變位置;會創(chuàng)建新的對象,而一些已有的對象要被銷毀。為了使所有這些事情都能夠發(fā)生,我們將調(diào)用Advance函數(shù)(參見程序清單4-5)。
該函數(shù)不負責直接執(zhí)行這些更新,而是觸發(fā)這些更新的發(fā)生。我們既需要將游戲作為一個整體進行更新(這樣可以檢測游戲結(jié)束狀態(tài)是否被觸發(fā)),也需要對游戲中所有的單獨對象進行更新(不論使用什么方法,都要允許每個對象可以按照要求的方式移動并且可以同其他對象進行交互)。
程序清單4-5 Advance 函數(shù)
/// <summary>
/// Virtual function to allow the game itself and all objects within
/// the game to be updated.
/// </summary>
public virtual void Advance()
{
// Update the game itself
Update();
// Update all objects that are within our object collection
foreach (CGameObjectGDIBase gameObj in _gameObjects)
{
// Ignore objects that have been flagged as terminated
if (!gameObj.Terminate)
{
// Update the object's last position
gameObj.UpdatePreviousPosition();
// Perform any update processing required upon the object
gameObj.Update();
}
}
// Now that everything is updated, render the scene
Render();
// Remove any objects that have been flagged for termination
RemoveTerminatedObjects();
// Update the Frames Per Second information
UpdateFPS();
}
這段代碼為游戲本身調(diào)用了其Update函數(shù)(正如我們前面所討論的),然后對游戲?qū)ο罅斜碇械拿總€對象進行循環(huán)。對每個對象,它首先檢測該對象是否已經(jīng)終止;當對象從游戲中被刪除,并等待被銷毀時更新就會發(fā)生,所以我們不需要對這些對象做更進一步的處理。當所有對象都仍然為激活狀態(tài)時,我們可以做兩件事情:
● 將對象的位置復(fù)制到它上一個位置變量中。我們將在本章后文中介紹CgameObject-
Base類時對其原因進行解釋。
● 調(diào)用每個對象的Update方法,使對象可以執(zhí)行自己所需要的任何操作。