第五篇
前面的架構已經構建出了一個雛形了,只是沒有加入遊戲控制邏輯而已,所以不能說是有意義的遊戲,但相信同學們已經有所收穫了。
這篇我們就來給遊戲加上靈魂,賦予遊戲生命,形形色色的遊戲都是依靠這部分的精彩編寫,
這裡面涉及的知識也是最多的,什麼AI、粒子系統、碰撞檢測、物理系統、行走系統等等。不同的遊戲也主要體現在這部分的不同。
當然我們這個遊戲不需要應用這些了,我們只需要作簡單的碰撞檢測和行走動畫就可以了。這裡面只是應用了簡單的碰撞檢測。
前面的版本我們已經構建起了畫面,並做了簡單的碰撞檢測,例如我們看到坦克不會進入障礙物裡去,但那隻是粗略的檢測,並不能使用,
我們現在就來改進它。
正如我們看到前一版本,這裡面有兩個地方需要注意,一是碰撞檢測和坦克行進方向有關,另外是坦克在轉彎時會涉及到軌道的切合問題。
我們這樣檢測,在坦克前進的方向,判斷坦克前面的兩個端點是否可通過前面的道路,即可判斷是否碰撞了。但有時細微的像素,玩家是不可能注意到的,
所以有時可能會出現看起來能通過,卻出現坦克無法通過的情形,特別是在單個軌道通道口的情況下,這就是細微的像素導致了碰撞。
所以我們有必要對這種情況加以修正,以使坦克緊貼軌道運行,這樣在做坦克之間的碰撞時也有利。
我們先來按坦克前進方向來做碰撞檢測。
坦克前進方向分四個方向,所以只需要針對具體的方向,做對應的是否重疊的判斷就可以知道前面是否碰撞上。
這裡碰撞分為對地圖障礙物的碰撞和跟移動物體的碰撞。對地圖的障礙物判斷很簡單。直接針對地圖座標判斷是否可通行物體就可以了。
代碼如下
// 障礙物判斷
bool CGameMap::IsCanWalk( int nX, int nY, const CSpirit &spirit )
{
int nBoxX = nX / C_TILE_W;
int nBoxY = nY / C_TILE_H;
if( ENUM_WALL == m_pMap[nBoxY][nBoxX] )
{
return TestWall( nX, nY, spirit );
}
else if( ENUM_IRON == m_pMap[nBoxY][nBoxX] || ENUM_WATER == m_pMap[nBoxY][nBoxX] || ENUM_EAGER == m_pMap[nBoxY][nBoxX] )
return false;
return true;
}
只需要判斷障礙物是否可通行,但這裡需要對磚牆做特殊處理,因為磚牆是可擊打物件,對於擊打的狀態做分別的處理。
首先將坦克的位置座標轉換為地圖座標,
int nBoxX = nX / C_TILE_W;
int nBoxY = nY / C_TILE_H;
這樣nBoxX,nBoxY就是地圖格子的座標了,然後找出該位置所放的障礙物,再進行判斷。
我們在遊戲邏輯函數裡,只需要移動玩家坦克,如果遇到障礙物就做退回處理,使坦克不能逾越障礙物。
代碼也很簡單
POINT ptOldPlayer;
ptOldPlayer = m_oPlayer.GetPos();
POINT ptNew = m_oPlayer.Move( dwTime );
if( !m_oGameMap.TestCanWalk( ptNew.x, ptNew.y, m_oPlayer ) )
{
m_oPlayer.SetPos( ptOldPlayer.x, ptOldPlayer.y );
}
遊戲邏輯是最複雜的部分,遊戲創意也大都體現在這裡,需要製作者有很高的技巧或經驗。大家平時可以多留意別人的遊戲製作,多玩玩遊戲,
並在生活中積累,也許靈感就在不經意間誕生。
在坦克大戰遊戲中,邏輯基本上是圍繞碰撞檢測來展開的。例如子彈碰到了磚牆,要對磚牆做處理,子彈碰到了對方坦克,要產生爆炸並使對方消失的處理。
在這個遊戲中,我們把邏輯列一下,主要有:
1、坦克遇到地圖障礙物。
2、坦克遇到對方坦克。
3、子彈遇到對方坦克。
4、子彈遇到子彈(這個可選,就是子彈是否可消耗對方子彈,為了好玩點,還是需要加上,我在遊戲中並沒處理)
5、子彈遇到鷹(玩家大本營)
6、坦克遇到隨機獎品。
7、子彈遇到地圖障礙物,子彈和坦克的障礙物不同,體現在對河流的處理上。子彈應該是可以越過河流的。
8、移動物體的移動。
9、對鍵盤輸出的反應處理。
所以我們必須在每一幀裡,對以上所有的邏輯做一個判斷,並據此修改畫面的顯示並展現給玩家。
例如,坦克遇到障礙物我們已經在前面用代碼說明了處理辦法。
子彈遇到對方坦克,則需要展示一幅爆炸的畫面,然後讓對方坦剋死亡。
我們輸入方向鍵,則修改玩家坦克的行進方向。
switch( wKey )
{
case VK_UP:
m_oPlayer.SetDirection( ENUM_UP );
break;
}
對於這些邏輯的處理,大家可以參考隨附的原始碼,對照著來看。代碼裡都有注釋,應該很容易看的明白。
在這篇章節裡,我們已經完成了大部分的遊戲處理了。一個基本可操作的遊戲已經將近完成。但還不是可玩的作品。
因為我們還缺乏關卡的設計、遊戲分數的處理已經過關等邏輯做處理。我們只是完成了技術上的邏輯實現。
遊戲故事邏輯還需要我們去完成,那麼下一篇我們就介紹遊戲分數、通過流程、遊戲失敗的處理。
但我們已經距離成功不遠了,下一篇,將誕生一個真正意義上的遊戲,至少讓你可以讓你哄哄你的表弟或侄子了。
配套代碼下載
http://download.csdn.net/source/1794657