天天看點

《Cocos2D權威指南》——2.3 玩家互動

2.3.1 添加加速計移動

在cocos2d世界裡添加加速計支援非常簡單,隻需在目前運作的cclayer的init方法傳回之前,添加代碼清單2-14所示代碼。

代碼清單2-14 添加加速計支援

為了讓玩家能夠使用加速計非常平滑地控制飛機的飛行,這裡提供一種通用的方法。因為遊戲是垂直射擊遊戲,是以我們隻關心裝置垂直放置時home按鍵左右擺動方向的加速計值即可。

步驟1 打開helloworldlayer.h檔案,添加一個cgpoint _playervelocity執行個體變量。

步驟2 打開helloworldlayer.m檔案,在私有分類裡添加-(void) updateplayerposition: (cctime)dt方法,如圖2-8所示。

步驟3 在init方法傳回之後,緊跟代碼清單2-14所示代碼後添加方法調用,如代碼清單2-15所示。

代碼清單2-15 緊跟代碼清單2-14所示代碼後添加方法調用

此方法是本遊戲的主循環。任何遊戲都包含一個遊戲主循環,此主循環類用來更新遊戲世界的狀态、碰撞處理邏輯和玩家狀态等,這裡主要更新玩家的位置資訊。

步驟4 定義一個update方法,調用更新玩家位置資訊的方法,如代碼清單2-16所示。

代碼清單2-16 定義update方法

在讨論updateplayerpositoin方法之前,我們先看看如何操作加速計,同時儲存加速計的資料。在update方法之後,添加代碼清單2-17所示代碼。

代碼清單2-17 操作加速計

這裡主要做兩件事:

通過“濾波”方式,從加速計x軸方向取得資料,計算得到一個“合理”的速度值;

限制飛機飛行的最大速度。

注意 如果想擷取其他方向的值,相應地計算acceleration的其他兩個分量的值就可以了。

最後,看看實際更新玩家飛機位置資訊的方法實作,如代碼清單2-18所示。

代碼清單2-18 更新玩家飛機位置資訊的方法實作

這段代碼根據之前計算出來的加速計的速度值,加上玩家飛機的x軸方向的速度,同時限制玩家飛機隻能在螢幕範圍之内飛行。

好了,現在編譯并運作,我們就可以通過加速計來控制飛機的移動了!

2.3.2 添加子彈并射擊

目前來說,一切看起來還不錯。但是,假如不能開槍打死這些敵機,那麼遊戲會非常乏味。話不多說,給玩家飛機添加子彈射擊功能吧!為了玩家操作的友善性,我們希望實作在遊戲開始時隻要輕輕單擊螢幕就可以自動發射子彈了,這樣玩家隻需要專心控制飛機的飛行就可以了,當然,子彈是無限的。

步驟1 在helloworldlayer.h中添加兩個成員變量,如代碼清單2-19所示。

代碼清單2-19 在helloworldlayer.h中添加兩個成員變量

步驟2 在helloworldlayer()的@end之前添加一個新方法,如代碼清單2-20所示。

代碼清單2-20 在helloworldlayer()的@end之前添加新方法

-(void) bulletfinishedmoving:(id)sender;

步驟3 為了能接收玩家的觸摸消息,我們在init方法傳回之前添加代碼清單2-21所示代碼。

代碼清單2-21 在init方法傳回之前添加代碼

其他self.istouchenabled設定為yes之後,就可以在cclayer裡處理觸摸消息了。

步驟4 架構自動調用cctouchesended方法,實作代碼如代碼清單2-22所示。

代碼清單2-22 cctouchesended方法的實作

在init方法最後初始化子彈精靈。

注意 這裡我們沒有采用敵機那種方式用數組儲存一系列精靈圖檔,因為這裡要設計子彈消失了才可以發射下一顆子彈,這樣可以給遊戲添加一些難度和趣味性。

步驟5 在update方法底部添加發射子彈的方法。

[self updateplayershooting:dt]方法的作用就是讓玩家飛機不斷地發射子彈,具體實作如代碼清單2-23所示。

代碼清單2-23 在update方法底部添加[self updateplayershooting:dt]方法

這段代碼很簡單,主要判斷子彈目前是否可見。如果可見或者玩家還沒有觸摸螢幕,則直接傳回。接下來就是計算子彈的起始坐标,然後讓子彈運作一個action往上飛行就ok了。等子彈到達螢幕頂端時,我們再把子彈的可見性重新設定為no,這樣下一顆子彈又可以從玩家飛機上空發射出來了。

編譯并運作,然後輕輕觸摸螢幕,是不是有真實的射擊遊戲的感覺了呢?

繼續閱讀