프로그래밍/Cocos2D2010. 7. 2. 17:57
비록 예제를 위한 게임이지만 3단계까지 진행한 상태에서는 별반 감흥이 없다. 이유는 바로 소리(배경음악, 효과음)가 없기 때문이다. 지금까지 게임 개발의 문외한 이었지만 "게임은 종합 예술"이라는 말을 자주 들었었다. 정말 그렇다. 아주 간단한 게임조차 그래픽과 사운드는 필수 요소이다.

사운드 샘플은 원문의 샘플을 그대로 사용하기로 한다. 아니면 Cocos2D에서 소개하는 게임 관련 리소스(Game Resources)를 이용해도 좋을 것 같다.

배경 음악과 효과음 추가
다음 두 개의 파일을 다운 받아 Xcode 프로젝트의 Resources 폴더에 추가한다.
우선 MammothHuntingScene.h에 다음 임포트 문을 추가한다.

#import "SimpleAudioEngine.h"


init 메소드에 다음과 같이 배경음악을 시작하는 코드를 추가하자. 마지막 부분에 추가하면 된다.

[[SimpleAudioEngine sharedEngineplayBackgroundMusic:@"background-music-aac.caf"];


그리고 ccTouchesEnded 메소드에 총알 발사 효과음을 추가한다.

[[SimpleAudioEngine sharedEngineplayEffect:@"pew-pew-lei.caf"];


빌드앤런! 이제 배경 음악과 효과음을 들을 수 있다.

게임 진행 로직 추가
다음은 간단한 게임 진행 로직을 추가할 것이다. 프로젝트에 GameOverScene 이라고 새로운 클래스를 추가하자. 그리고 다음과 같이 GameOverScene.h와 GameOverScene.m을 수정한다.

[GameOverScene.h]

@interface GameOverLayer : CCColorLayer {

CCLabel *_label;

}


@property (nonatomicretain) CCLabel *label;


@end




@interface GameOverScene : CCScene {

GameOverLayer *_layer;

}


@property (nonatomicretain) GameOverLayer *layer;


@end



[GameOverScene.m]

#import "GameOverScene.h"

#import "MammothHuntingScene.h"



@implementation GameOverLayer


@synthesize label = _label;



-(id) init {

if ((self=[super initWithColor:ccc4(255,255,255,255)])) {

CGSize winSize = [[CCDirector sharedDirectorwinSize];

self.label = [CCLabel labelWithString:@"" fontName:@"Arial" fontSize:32];

_label.color = ccc3(0,0,0);

_label.position = ccp(winSize.width/2, winSize.height/2);

[self addChild:_label];

[self runAction:[CCSequence actions:

 [CCDelayTime actionWithDuration:3],

 [CCCallFunc actionWithTarget:self selector:@selector(gameOverDone)],

 nil]];

}

return self;

}



- (void)gameOverDone {

[[CCDirector sharedDirectorreplaceScene:[MammothHuntingScene scene]];

}



- (void)dealloc {

[_label release];

_label = nil;

[super dealloc];

}



@end



@implementation GameOverScene


@synthesize layer = _layer;



- (id)init {

if ((self = [super init])) {

self.layer = [GameOverLayer node];

[self addChild:_layer];

}

return self;

}



- (void)dealloc {

[_layer release];

_layer = nil;

[super dealloc];

}



@end


위 소스에서 한 가지 주목할 것은 하나의 파일에 두 개의 서로 다른 객체, 즉 Layer와 Scene이 있다는 점이다. 보통 하나의 Scene은 여러 개의 Layer를 포함할 수 있다. 그러나 본 예제에서는 오직 하나의 Layer만 사용한다. 화면의 중앙에 라벨을 그리는 Layer이다.

마지막으로, 단순한 게임 진행 로직 추가를 위해, MammothHuntingScene.h에 다음의 멤버 변수를 추가하자. 

int _projectilesDestroyed;


MammothHuntingScene.m에는 다음 임포트 구문을 추가한다.

#import "GameOverScene.h"


그리고 게임의 승리 조건을 판단하기 위해 update 메소드의 targetsToDelete 루프에 다음 코드를 추가한다.

_projectilesDestroyed++;

if (_projectilesDestroyed > 30) {

GameOverScene *gameOverScene = [GameOverScene node];

[gameOverScene.layer.label setString:@"You Win!"];

[[CCDirector sharedDirectorreplaceScene:gameOverScene];

}


다음 spriteMoveFinished 메소드의 sprite.tag == 1 조건 부분에 아래의 코드를 추가한다.

GameOverScene *gameOverScene = [GameOverScene node];

[gameOverScene.layer.label setString:@"You Lose :["];

[[CCDirector sharedDirectorreplaceScene:gameOverScene];


드디어 아주 아주 간단한 게임 개발이 끝이 났다. 다시 빌드앤런! 추가된 게임 로직이 제대로 작동될 것이다.

MammothHunting 프로젝트 소스
Posted by windship