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