使用SpriteBuilder製做Cocos2D遊戲徹底中文教程(九)

打磨咱們的遊戲(Polish Gameplay)

目前玩家只能發射一次,攝像頭會跟着企鵝飛,但不會回滾到彈射器,接下來咱們嘗試完成這些功能。該規則將執行如下操做:若是一個企鵝從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!謝謝你們!

相關文章
相關標籤/搜索