Cocos2D 學習筆記 (6) - 整合練習2

萬箭齊發 Demo 2

萬箭齊發2 前一版本是利用 CCMoveTo 來移動火箭,現在我們要用另一個方法來移動火箭,這個方法會有一個遊戲主迴圈,這個迴圈會以影格的速度被呼叫,假如是 1 秒顯示 60 個影格,那這個迴圈就是 1 秒被呼叫 60 次,我們將利用這個迴圈來達成元件的移動。
程式碼可利用前一版加以修改來練習,首先打開 RocketSprite.h 加入一個速度變數 speed,接著加入兩個方法,如下:
@property (nonatomic, assign) NSInteger speed;
...

- (id)initWithStartPosition:(CGPoint)start andSpeed:(NSInteger)speed;
- (void)move;
原程式碼不動。speed 被用來指定這個火箭要在一個影格中移動多少像素 (pixel) ,initWithStartPosition: andSpeed: 方法用來初始化火箭生成的位置及速度,move 方法則是讓火箭移動 speed 的距離,在主迴圈中被逐個影格呼叫此方法,火箭就會不斷的以 speed 的值來移動一段距離,當連續呼叫時,火箭就會一直移動。

RocketSprite.m
- (id)initWithStartPosition:(CGPoint)start andSpeed:(NSInteger)pspeed
{
    self = [super init];
    if (self != nil) {
        self.startPosition = start;
        self.speed = pspeed;

        [self setPosition:ccp(startPosition.x, startPosition.y)];
        [self rocketAnimation];
    }

    return self;
}

- (void)move
{
    CGPoint position = self.position;
    position.y += speed;
    self.position = position;
}
以上是新增加的方法。
接著到 GameLayer.m 增加一個火箭的成員變數
RocketSprite *aRocket;
修改 init 中的部份程式碼如下
//[self schedule:@selector(rocketFactory:) interval:2.0f];
[self schedule:@selector(gameLoop:)];
[self addRocket2];
原本每隔 2 秒發射火箭的部份註解掉,增加一個新的 schedule ,這個方法會在每個影格呼叫一次指定的方法 gameLoop: 。假設 1 秒執行 60 個影格 (這是預設值),那 gameLoop: 在 1 秒中就會被呼叫 60 次。
- (void)addRocket2
{
    CGSize size = [[CCDirector sharedDirector] winSize];
    int screenW = size.width;
    int screenH = size.height;
    int rndX = arc4random() % screenW;
    int rndY = arc4random() % screenH;
    CGPoint start = CGPointMake(rndX, rndY * -1);

    aRocket = [[RocketSprite alloc] initWithStartPosition:start andSpeed:7];
    [self addChild:aRocket];
}
這和之前建立火箭的方式差不多,只是這次是呼叫新的 init 方法。
接著就是在 gameLoop: 中移動火箭
- (void)gameLoop:(ccTime)dt
{
    [aRocket move];

    CGSize size = [[CCDirector sharedDirector] winSize];
    if (aRocket.position.y > size.height + aRocket.contentSize.height/2) {
        [aRocket removeFromParentAndCleanup:YES];
        [self addRocket2];
    }
}
當火箭跑出螢幕範圍時,要把它清除,同時建立下一火箭。這樣螢幕上就會有一個火箭不斷朝上發射。

最後我們要讓火箭被觸碰時,結束遊戲,所以在觸碰方法中加入
- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSLog(@">>> touch");

    UITouch *touch = [touches anyObject];
    CGPoint point = [self convertTouchToNodeSpace:touch];

    if (CGRectContainsPoint([aRocket boundingBox], point)) {
        [self stopSound];
        [[CCDirector sharedDirector] replaceScene:[GameOverScene node]];
    }
}
當觸碰點發生在火箭的矩形範圍內時,就結束遊戲,並切換到 GameOver 場景。
本文網址:http://blog.tonycube.com/2013/11/cocos2d-6-2.html
Tony Blog 撰寫,轉載時請註明出處及文章連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。