본문 바로가기

프로그래밍/cocos2d

CCAnimate (2)




- (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;

}