使用WINDOWS的GDI開發遊戲(5)

來源:互聯網
上載者:User

 

第五篇

 

前面的架構已經構建出了一個雛形了,只是沒有加入遊戲控制邏輯而已,所以不能說是有意義的遊戲,但相信同學們已經有所收穫了。

這篇我們就來給遊戲加上靈魂,賦予遊戲生命,形形色色的遊戲都是依靠這部分的精彩編寫,

這裡面涉及的知識也是最多的,什麼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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.