[iOS] TileMap使用教學(7) 紀錄得分和設置音效

像我本身一直都不知道要怎樣去紀錄分數,感謝這份教學提供了一個簡單的方法,一起來學吧。另外,還會增添一些音效在裡面,順便看一下簡單的加入音效的code吧。

另外,雖然之前沒有申明過,但這些系列的教學,是我為了讓自己真的去思考過這些code的內容,自己看code內容去說明的,當然有時候不太懂還是會看原文和翻譯是怎麼講的,畢竟我都懶的放圖了,也沒那閒功夫去換句話說。希望看過的人如果有意見,都可以留言交流一下。

開始


這一次我們要新增一個類別,但不需要新開檔案,直接在HelloWorldLayer.h裡面,於@import和@interface HelloWorldLayer之間增加一個新的@interface HelloWorldHud。

在這個新的類別內:

@interface HelloWorldHud : CCLayer
{
CCLabelTTF
*label;
}
- (void)numCollectedChanged:(int)numCollected;
@end
然後在HelloWorldLayer.h裡面增加變數:
int _numCollected;
HelloWorldHud
*_hud;
以及特性:
@property (nonatomic, assign) int numCollected;
@property (nonatomic, retain) HelloWorldHud
*hud;

然後到實作檔裡面新增:

@implementation HelloWorldHud
-(id) init
{
if ((self = [super init])) {
CGSize winSize
= [[CCDirector sharedDirector] winSize];
label
= [CCLabelTTF labelWithString:@"0"

                                  dimensions:CGSizeMake(50, 20)
                                    alignment:UITextAlignmentRight

                                   fontName:@"Verdana-Bold"
                                      fontSize:
18.0];
label.color
= ccc3(0,0,0);int margin =10;
label.position
= ccp(winSize.width - (label.contentSize.width/2) - margin,

                               label.contentSize.height/2+ margin);
[self addChild:label];
}
return self;
}
- (void)numCollectedChanged:(int)numCollected {
[label setString:[NSString stringWithFormat:
@"%d", numCollected]];
}

@end


這邊我稍微改了一下,因為好像沒有CCLabel類別了。然後他主要在init方法裡面實作了會出現在畫面上的label。以及增加一個方法,可以改變Label的內容。

再回到HelloWorldLayer.m裡面:

一開頭實作這兩個特性:
@synthesize numCollected = _numCollected;
@synthesize hud
= _hud;
dealloc裡面新增:
self.hud = nil;
加到+(id) scene方法裡面的return那一行前面:
HelloWorldHud *hud = [HelloWorldHud node];
[scene addChild: hud];

layer.hud
= hud;
加在setPlayerPosition方法裡面,於collectable那部份裡面,也就是刪除meta層該位置上的方塊那行下面:

self.numCollected++;
[_hud numCollectedChanged:_numCollected];


這樣就好了,編譯之後去吃你放置的好東西吧。

放置音效


這部分很簡單,只要增加這些code:

表頭檔中導入這個類別:
#import "SimpleAudioEngine.h"
在HelloWorldLayer的init方法的最上面加入:

[[SimpleAudioEngine sharedEngine] preloadEffect:@"pickup.caf"];
[[SimpleAudioEngine sharedEngine] preloadEffect:
@"hit.caf"];
[[SimpleAudioEngine sharedEngine] preloadEffect:
@"move.caf"];
[[SimpleAudioEngine sharedEngine] playBackgroundMusic:
@"TileMap.caf"];
在尋找碰撞那邊增加碰撞音效:

[[SimpleAudioEngine sharedEngine] playEffect:@"hit.caf"];
在尋找可以吃的東西的那邊增加吃東西的音效:[[SimpleAudioEngine sharedEngine] playEffect:@"pickup.caf"];
在設定player位置的地方增加移動的音效:

[[SimpleAudioEngine sharedEngine] playEffect:@"move.caf"];

所以真正的重點在於,要在什麼地方放置音效?比方說player移動,你一定是要在確切移動player的sprite的那一步要聽到音效,對吧?所以設定player位置那一行後面就要放音效。或是吃到東西移除Foreground層的該方塊也要產生音效。如果音效不如預期,你可以依照code的邏輯去思考看看。


編譯吧!是不是有音樂了呢?記得要先把那些檔案都加進去。

留言