目前玩家只能發射一次,攝像頭會跟着企鵝飛,但不會回滾到彈射器,接下來咱們嘗試完成這些功能。該規則將執行如下操做:若是一個企鵝從Level的左側或右側離開,或者若是它以很是慢的速度移動,咱們將觸發下一個(企鵝)嘗試啓動。ide
實現更新方法函數
在咱們實際執行的更新方法以前咱們在Gameplay.m中添加一個常數定義,咱們將用它來 檢查是否有企鵝以很慢的最低速度來結束(移動):學習
static const float MIN_SPEED = 5.f;
該值爲'5'能在咱們的物理環境中良好的工做。若是您更改了對象的物理屬性,你可能想試驗一下這個值。如今咱們能夠實現update方法。此方法由cocos2d的每一幀自動調用:測試
- (void)update:(CCTime)delta { // if speed is below minimum speed, assume this attempt is over if (ccpLength(_currentPenguin.physicsBody.velocity) < MIN_SPEED){ [self nextAttempt]; return; } int xMin = _currentPenguin.boundingBox.origin.x; if (xMin < self.boundingBox.origin.x) { [self nextAttempt]; return; } int xMax = xMin + _currentPenguin.boundingBox.size.width; if (xMax > (self.boundingBox.origin.x + self.boundingBox.size.width)) { [self nextAttempt]; return; } }
首先當這可能看起來有點複雜的時候,這其實只是數學的一點點。咱們將檢查速度是否低於咱們定義的限制。所以,咱們使用ccpLength函數計算平方長度咱們的點(基本上在x和速度相結合的y份量)。再者,咱們檢查企鵝是否已經出了Level的左或右邊界,若是出界,則當即調用nextAttempt方法並當即返回(以免nextAttempt被屢次調用)。優化
實現nextAttempt方法ui
咱們須要作的最重要的事情是在nextAttempt方法中滾動回彈射器。然而,由於咱們已經在運行一個動做跟隨企鵝,咱們須要在啓動另外一個滾動的動做以前中止這個動做(不然cocos2d會混淆這兩個相互矛盾的指示)。this
Cocos2D中提供了一個可被任何的CCNode調用的名爲stopAction的方法。然而,咱們須要一個引用(變量)來中止動做。因此,第一步應該建立一個新的成員變量:atom
@implementation Gameplay { ... CCAction *_followPenguin; }
而後修改releaseCatapult的代碼將滾動動做分配給這個新建立的變量:spa
// follow the flying penguin _followPenguin = [CCActionFollow actionWithTarget:_currentPenguin worldBoundary:self.boundingBox]; [_contentNode runAction:_followPenguin];
如今,咱們已經準備好實現nextAttempt方法!將此方法添加到Gameplay.m中:.net
- (void)nextAttempt { _currentPenguin = nil; [_contentNode stopAction:_followPenguin]; CCActionMoveTo *actionMoveTo = [CCActionMoveTo actionWithDuration:1.f position:ccp(0, 0)]; [_contentNode runAction:actionMoveTo]; }
首先,咱們重置_currentPenguin引用,由於一旦嘗試完成後,咱們認爲當前沒有企鵝。而後咱們中止滾動動做。最後,咱們建立一個新的動做往回滾動到彈射器。
如今咱們幾乎已經完成了,你應該已經可以使用測試功能了。運行你的遊戲,並確認一切都如預期。
更多的只是一個優化
你可能已經意識到,當前存在一個須要解決的潛在問題:假設玩家拉回彈射器很是慢,那麼下一個嘗試能夠會在當前企鵝發射以前被觸發。
爲了不這種狀況發生,咱們將爲企鵝添加一個標誌來存儲它是否已經被髮射。打開Penguin.h並添加這個屬性:
@property (nonatomic, assign) BOOL launched;
要在Gameplay.m訪問這個新的屬性咱們須要加入這一行到文件的頂部來導入企鵝頭:
#import "Penguin.h"
並改變成員變量_currentPenguin爲企鵝類型代替CCNode:
Penguin *_currentPenguin;
如今,您還必須更改在touchBegan方法那裏的企鵝的加載,由於CCBReader只返回CCNodes,因此這裏須要進行類型轉換:
_currentPenguin = (Penguin*)[CCBReader load:@"Penguin"];
如今咱們已經接收了發射企鵝的屬性,咱們能夠添加一個檢查到更新方法中,使得在企鵝已經發射的狀況下才執行:
- (void)update:(CCTime)delta { if (_currentPenguin.launched) { ... // <- all previous content of this method belongs inside of this if-statement } }
如今,全部的檢查只會在企鵝發射後進行。
做爲最後一步,咱們須要在企鵝被髮射後設置launched標誌爲TRUE。所以,在releaseCatapult方法中添加如下代碼:
_currentPenguin.launched = TRUE;
這樣咱們的優化就完成了!!
原文:
https://www.makegameswith.us/tutorials/getting-started-with-spritebuilder/improve-gameplay/
此致,咱們的教程也所有講完了。但願你們在學習的時候多多交流與分享!轉載請說明出處,wealpan將和您一塊兒學習Spritebuilder,一塊兒學習cocos2D!謝謝你們!