cocos2d study #10

다양한 액션


액션 예제

액션은 매우 많으므로 모두 기억하는 것은 어렵다.

주요 부분을 주석으로 설명한다.

-(void)testAction
{
    CCSprite *ball1;
    CCSprite *ball2;
    CCSprite *ball3;
 
    ball1 = [CCSprite spriteWithFile:@"ball.png"];
    ball2 = [CCSprite spriteWithFile:@"ball.png"];
    ball3 = [CCSprite spriteWithFile:@"ball.png"];
 
    ball1.position=ccp(50,50);
    ball2.position=ccp(50,150);
    ball3.position=ccp(50,250);
 
    [self addChild:ball1];
    [self addChild:ball2];
    [self addChild:ball3];
    
    // CCEaseIn은 점점 빠르게. rate는 비율(얼마나 잘 일어나게 할 것인가)
    id rightMove1 = [CCMoveBy actionWithDuration:4 position:ccp(400,0)];
    id fasterBall = [CCEaseIn actoinWithAction:rightMove1 rate:3.0];        
    [ball1 runAction:fasterBall];
 
    // CCEaseOut 점점 느리게
    id rightMove2 = [CCMoveBy actionWithDuration:4 position:ccp(400,0)];
    id slowerBall = [CCEaseOut actoinWithAction:rightMove2 rate:3.0];        
    [ball2 runAction:slowerBall];
 
    // CCEaseInOut 빨라지다가 느려지게
    id rightMove3 = [CCMoveBy actionWithDuration:4 position:ccp(400,0)];
    id totalSpeed = [CCEaseInOut actoinWithAction:rightMove3 rate:3.0];    
    [ball3 runAction:totalSpeed];
 
    // CCEaseElastic 뒤로 살짝 갔다가 튕겨서 앞으로 이동
    id rightMove4 = [CCMoveBy actionWithDuration:4 position:ccp(400,0)];
    id test4 = [CCEaseElasticIn actoinWithAction:rightMove4 period:1.0];    
    [ball1 runAction:test4];
 
    // CCEaseBounceIn 튕기면서 이동, Out형태도 있음
    id rightMove5 = [CCMoveBy actionWithDuration:4 position:ccp(400,0)];
    id test5 = [CCEaseBounceIn actionWithAction:rightMove4];
    [ball1 runAction:test5];
 
    // CCScale 액션과 CCEaseBounce 액션과 섞기
    id scale = [CCScaleBy actionWithDuration:4 scale:3.0];
    id test6 = [CCEaseBounceOut actionWithAction:scale];
    [ball1 runAction:test6];
 
    // fadeout 점점 사라짐 | fadein 점점 나타남
    id fadeOut = [CCFadeOut actionWithDuration:3.0];
    [ball1 runAction:fadeOut];
 
    // fadein일 때 처음 스프라이트가 깜빡이거나 또는
    // 나타났다가 사라질 수 있기 때문에 애초부터 투명하게 시작한다.
    ball1.opacity = 0;
    id fadeIn = [CCFadeIn actionWithDuration:3.0];
    [ball1 runAction:fadeIn];
 
    // CCFadeTo 원하는 투명도 0부터 투명도 100까지 변화
    ball1.opacity = 0;
    id fadeTo = [CCFadeIn actionWithDuration:3.0 opacity:100];
    [ball1 runAction:fadeTo];
 
    // CCRepeat 액션을 반복 
    // right는 오른쪽 이동, left는 왼쪽 이동
    // total에 right와 left를 넣어 순차 실행, 세 번 반복 (repeat)
    id right  = [CCMoveBy actionWithDuration:2 position:ccp(400,0)];
    id left   = [CCMoveBy actionWithDuration:2 position:ccp(-400,0)];
    id total  = [CCSequence actions:right,left,nil];
    id repeat = [CCRepeat actionWithAction:total times:3];
    [ball1 runAction:repeat];
 
    // CCRepeatForever 액션을 무한 반복
    id right = [CCMoveBy actionWithDuration:2 position:ccp(400,0)];
    id left  = [CCMoveBy actionWithDuration:2 position:ccp(-400,0)];
    id total = [CCSequence actions:right,left,nil];
    id repeatForever = [CCRepeatForever actionWithAction:total];
    [ball1 runAction:repeatForever];
}
 
// 버튼 누르면 액션을 멈추는 예제
// 위의 CCRepeatForever 예제를 조금 더 확장한 것
-(id)init
{
    if ( (self=[super init]) )
    {
        // 터치 이벤트를 받기 위해 넣어야 하는 코드 (반드시!)
        self.isTouchEnabled = YES;    
 
        CCSprite *ball1;
        CCSprite *ball2;
        CCSprite *ball3;
 
        ball1 = [CCSprite spriteWithFile:@"ball.png"];
        ball2 = [CCSprite spriteWithFile:@"ball.png"];
        ball3 = [CCSprite spriteWithFile:@"ball.png"];
 
        ball1.position = ccp(50,50);
        ball2.position = ccp(50,150);
        ball3.position = ccp(50,250);
 
        [self addChild:ball1];
        [self addChild:ball2];
        [self addChild:ball3];
 
        // CCRepeatForever 액션을 무한 반복!
        id right = [CCMoveBy actionWithDuration:2 position:ccp(400,0)];
        id left  = [CCMoveBy actionWithDuration:2 position:ccp(-400,0)];
        id total = [CCSequence actions:right,left,nil];    //순차적으로 액션
        CCRepeatForever *repeatForever = [CCRepeatForever actionWithAction:total];
        // 액션도 CCNode를 상속받은 클래스이므로 tag를 쓸 수 있다.
        repeatForever.tag = 1;
        [ball1 runAction:repeatForever];
    }
    return self;
}
 
// 터치 이벤트가 발생하면 실행되는 메소드
-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)withEvent
{
    // tag 1인 액션을 중지한다.
    // 위에서 repeatForever의 태그를 1로 설정했으므로
    // 최종적으로, 무한 반복하는 액션을 중지시킨다.
    [ball1 stopActionByTag:1];
    
    NSLog("Touch!");
}


여러 개의 스프라이트

지금까지는 1개의 스프라이트에 액션을 주어 동작을 하게 만들었다. 그런데 여러 개의 스프라이트를 동시에 움직이게 하려면 어떻게 해야 할까?

예제

id move = [CCMoveBy actionWithDuration:3 position:ccp(400,0)];

[ball1 runAction:move];
[ball2 runAction:move];
[ball3 runAction:move]; // 동작하지 않는다. ball1만 움직임

스프라이트를 여러 개 만들어 각각 액션을 주어 보았다.

그런데, 실제로 동작을 확인해보면 첫 번째 스프라이트만 움직인다.

수정한 코드

id move = [CCMoveBy actionWithDuration:3 position:ccp(400,0)];

[ball1 runAction:move];
[ball2 runAction:[move copy]];
[ball3 runAction:[move copy]]; // NSCopying을 이용!

move 액션에 copy 메시지를 보내 해결할 수 있다.



PS

XCode는 Visual Studio처럼 자동 완성 기능이 있는데, 보통 메소드를 입력할 때 사용 가능한 메소드가 뜨는 것을 볼 수 있다. 그런데 한 번 입력한 후 메소드 목록을 다시 보고 싶을 때가 있다. 이 때 ESC 키를 누르면 사용 가능한 수많은 메소드를 보여준다. 이 기능을 잘 활용하자.

'개발 > Cocos2d' 카테고리의 다른 글

cocos2d study #12  (0) 2012.10.26
cocos2d study #11  (0) 2012.10.26
cocos2d study #09  (0) 2012.10.26
cocos2d study #08  (0) 2012.10.25
cocos2d study #07  (0) 2012.10.25

+ Recent posts