- (void) createPrinceAndAnimation {
// 위치정보 파일을 읽어들여 바로 CCSpriteFrame을 만들어 캐시에 저장합니다.
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"prince_walk_trim.plist"];
// 프레임을 담을 Array를 만듭니다.
NSMutableArray *aniFrames = [NSMutableArray array];
// 아주 간단히 프레임을 만들어 배열에 저장할 수 있습니다. 스프라이트 시트를 만들 때 사용된
// 개별 이미지의 파일 이름을 사용하여 개별 프레임을 읽어들입니다.
for(NSInteger idx = 1; idx <= 15; idx++) {
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"prince_walk_%02d.png", idx]];
[aniFrames addObject:frame];
}
// 프레임으로 CCAnimation을 만듭니다. 각 프레임당 시간을 0.05초로 정해줍니다.
CCAnimation *animation = [CCAnimation animationWithName:@"prince_walk" delay:0.05f frames:aniFrames];
// CCAnimation에 action을 줄 CCAnimate를 만듭니다.
CCAnimate *animate = [[CCAnimate alloc] initWithAnimation:animation restoreOriginalFrame:NO];
self.princeWalkAnimate = animate;
[animate release];
// 첫번째 프레임을 만들 때 사용했던 이미지 파일 이름을 사용하여 주인공 sprite를 만듭니다.
CCSprite *sprite = [CCSprite spriteWithSpriteFrameName:@"prince_walk_01.png"];
self.princeSprite = sprite;
[self addChild:self.princeSprite z:kTag_Prince tag:kTag_Prince];
// 위치계산이 편하도록 주인공의 anchorPoint를 가운데 맨 아래로 잡습니다.
self.princeSprite.anchorPoint = ccp(0.5, 0);
// 주인공을 화면 가운데 맨 아래에서 13픽셀 위에 위치시킵니다.
self.princeSprite.position = ccp(winSize.width / 2, 13);
[sprite release];
// 발차기 애니메이션에 쓰일 스프라이트 시트의 위치정보 파일을 읽어들인다.
[[CCSpriteFrameCache sharedSpriteFrameCache] addSpriteFramesWithFile:@"prince_kick_notrim.plist"];
[aniFrames removeAllObjects];
for(NSInteger idx = 1; idx <= 15; idx++) {
CCSpriteFrame *frame = [[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:[NSString stringWithFormat:@"prince_kick_%02d.png", idx]];
[aniFrames addObject:frame];
}
// 프레임으로 CCAnimation을 만듭니다. 각 프레임당 시간을 0.04초로 정해줍니다.
animation = [CCAnimation animationWithName:@"prince_kick" delay:0.04f frames:aniFrames];
// CCAnimation에 action을 줄 CCAnimate를 만듭니다.
animate = [[CCAnimate alloc] initWithAnimation:animation restoreOriginalFrame:NO];
self.princeKickAnimate = animate;
[animate release];
}
- (void) createArrowButtons {
// 왼쪽 화살표
CCSprite *sprite = [[CCSprite alloc] initWithFile:@"arrow_left.png"];
self.leftSprite = sprite;
// 기본 anchorPoint가 가운데, 즉 (0.5, 0.5)이므로 이미지의 가로 세로 크기의 반에 5픽셀의
// 여유를 두고 화면 아래에 표시합니다.
self.leftSprite.position = ccp(10 + self.leftSprite.contentSize.width / 2,
self.leftSprite.contentSize.height / 2 + 5);
[self addChild:self.leftSprite z:kTag_ControlButton];
[sprite release];
// 눌렸을 때 쓰일 왼쪽 화살표
sprite = [[CCSprite alloc] initWithFile:@"arrow_left_s.png"];
self.leftPressedSprite = sprite;
// self.leftSprite와 똑같은 위치에 표시합니다.
self.leftPressedSprite.position = self.leftSprite.position;
// 눌렸을 때의 화살표를 하위 z-order로 넣습니다. 그럼, 위에 같은 크기의 화살표가
// 똑같은 위치에 있으니까 가려서 화면상에 보이지 않게됩니다.
[self addChild:self.leftPressedSprite z:kTag_ControlButtonPressed];
[sprite release];
// 오른쪽 화살표
sprite = [[CCSprite alloc] initWithFile:@"arrow_right.png"];
self.rightSprite = sprite;
// 왼쪽 화살표에서 15픽셀 오르쪽에 위치시킵니다.
self.rightSprite.position = ccp(self.leftSprite.position.x + self.rightSprite.contentSize.width + 15,
self.leftSprite.position.y);
[self addChild:self.rightSprite z:kTag_ControlButton];
[sprite release];
// 눌렸을 때 쓰일 오른쪽 화살표
sprite = [[CCSprite alloc] initWithFile:@"arrow_right_s.png"];
self.rightPressedSprite = sprite;
// self.rightSprite와 똑같은 위치에 표시합니다.
self.rightPressedSprite.position = self.rightSprite.position;
// 눌렸을 때의 화살표를 하위 z-order로 넣습니다. 그럼, 위에 같은 크기의 화살표가
// 똑같은 위치에 있으니까 가려서 화면상에 보이지 않게됩니다.
[self addChild:self.rightPressedSprite z:kTag_ControlButtonPressed];
[sprite release];
// 발차기 버튼
sprite = [[CCSprite alloc] initWithFile:@"kick.png"];
self.kickSprite = sprite;
self.kickSprite.position = ccp(winSize.width - self.kickSprite.contentSize.width / 2 - 5, self.leftSprite.position.y);
[self addChild:self.kickSprite z:kTag_ControlButton];
[sprite release];
// 발차기 버튼 눌렸을 때
sprite = [[CCSprite alloc] initWithFile:@"kick_s.png"];
self.kickPressedSprite = sprite;
self.kickPressedSprite.position = self.kickSprite.position;
[self addChild:self.kickPressedSprite z:kTag_ControlButtonPressed];
[sprite release];
}
// 손가락이 닫는 순간 호출됩니다.
- (void) ccTouchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
// 발차기를 하고 있는 동안에는 움직일 수 없도록 합니다.
// 또한 발차기 애니메이션이 진행되는 동안에는 다시 발차기를 할 수 없습니다.
if(isAnimating == YES) {
NSLog(@"Touch Began ignored");
return;
}
UITouch *touch = [touches anyObject];
// 발차기 버튼이 터치되었는지 검사
if([self isTouchInside:self.kickSprite withTouch:touch] == YES) {
self.kickSprite.visible = NO;
isAnimating = YES; // 발차기 애니메이션이 진행 중
[self.princeSprite runAction:[CCSequence actions:
self.princeKickAnimate,
[CCCallFunc actionWithTarget:self selector:@selector(kickAnimateCompleteHandler)],
nil]];
}
// 아래 Boolean 변수 대신에 leftSprite와 rightSprite의 visible의 값을 직접 사용해도 무방합니다.
isLeftPressed = NO;
isRightPressed = NO;
// 터치가 왼쪽 또는 오른쪽 화살표 안에 들어왔는지 확인합니다.
if([self isTouchInside:self.leftSprite withTouch:touch] == YES) {
// 왼쪽 화살표를 안보이게 합니다. 그럼 그 아래에 있던 눌릴 때 보여지는 이미지가 나타날 것입니다.
self.leftSprite.visible = NO;
isLeftPressed = YES;
}else if([self isTouchInside:self.rightSprite withTouch:touch] == YES) {
// 오른쪽 화살표를 안보이게 합니다.
self.rightSprite.visible = NO;
isRightPressed = YES;
}
// 버튼이 눌려졌으면 화면을 움직입니다.
if(isLeftPressed == YES || isRightPressed == YES)
[self startMovingBackground];
}
- (void) kickAnimateCompleteHandler {
// 버튼을 다시 보이도록 합니다.
self.kickSprite.visible = YES;
[self.princeSprite stopAllActions];
isAnimating = NO;
}