cocos2d study #09

액션


1. CCActionTo/By 클래스

스프라이트를 움직이려면 액션을 사용해야 한다.

대표적인 액션 클래스에는 다음과 같은 것들이 있다.

CCMoveTo, CCMoveBy: 이동

CCRotateTo, CCRotateBy: 회전

CCScaleTo, CCScaleBy: 크기 변화

액션 클래스의 접미사로 To와 By가 붙어있는 것을 알 수 있는데, To와 By의 차이점은 다음과 같다.

To는 절대좌표를 기준으로, By는 현재 위치를 기준으로 움직인다.

예를 들어 현재 위치가 (80,80)이라고 하자. 이 때 좌표를 (180,80)으로 즉, 현재 위치에서 우측으로 100만큼 이동하고 싶다면 By를 이용하여 x 좌표에 100을 더하면 된다. (x+100)

현재 위치에서 바로 (0,0)으로 이동하고 싶다면 To를 써서 ccp(0,0) 하면 된다.

2. 기본 코드

(1) 액션 사용하기

[실행할노드객체 runAction:액션];

(2) 순서가 있는 액션 실행하기

id totalAction = [CCSequenece actions:액션1, 액션2, nil];

(3) 액션을 동시 실행하기

id totalAction = [CCSpawn actions: 액션1, 액션2, nil];

CCSequence와 CCSpawn은 마지막에 nil을 넣어야 하는 것을 잊지 말자.

(4) 콜백 함수

액션을 실행한 후에 무엇인가를 하려고 할 때 사용한다.

① 콜백 함수를 호출하는 CCCallFunc 클래스

콜백 함수 클래스에는 CCCallFunc와 N이 붙은 CCCallFuncN이 있는데, 차이점은 노드의 전달 유무이다. 액션 직후에 노드를 다른 함수로 넘겨서 복잡한 무엇인가를 처리하기 위해서는 CCCallFunC을 사용해야 한다. 노드를 넘길 필요가 없는 단순한 동작은 CCCallFunc로도 충분하다.

② 콜백 함수 사용 예제 코드
-(void)sampleFunction
{
// 코드...

// CCCallFuncN으로 selector를 이용하여 afterAction을 호출
id callback1 = [CCCallFuncN actionWithTarget:self selector:@selector(afterAction:)];
}

// 노드를 전달하여 무엇인가(NSLog)를 한다!
-(void)afterAction:(CCNode *)node {
	NSLog("전달된 노드: %@", node);	
}

3. 액션 사용 예제

-(void)buttonPushed {
 
    // 기본 스프라이트 설정 - 생성, 위치 설정, 자식으로 추가
    CCSprite *sprite = [CCSprite spriteWithFile:@"ball.png"];
    sprite.position = ccp(50,50);
    [self addChild:sprite];
 
    // ********** move 액션
    // 시간(duration)은 초 단위, position은 움직일 위치
    CCMoveTo *action = [CCMoveTo actionWithDuration:3 position:ccp(440,50)];
    
    // 액션을 실행한다.
    [sprite runAction:action];    
 
 
    // ********** 여러 가지 액션 **********
 
    // CCMoveTo는 position 좌표로 바로 이동한다.
    CCMoveTo *action = [CCMoveTo actionWithDuration:3 position:ccp(440,50)];
 
    // CCMoveBy는 현재의 위치를 기준으로 x+440,y+50으로 이동시킨다.
    CCMoveBy *action = [CCMoveBy actionWithDuration:3 position:ccp(440,50)];
 
    // CCRotateBy
    // 회전 액션, angle은 각도를 뜻하며 360은 시계 방향으로 한 바퀴
    // 720도는 시계 방향으로 두 바퀴를 회전한다.
    CCRotateBy *action = [CCRotateBy actionWithDuration:3 angle:360];
    CCRotateBy *action = [CCRotateBy actionWithDuration:3 angle:720];
 
    // CCRotateTo
    // 자동으로 자신이 판단해서 빠른 쪽으로 회전한다.
    // 회전할 필요가 없으면 회전하지 않는다.
    // 360도는 액션 후의 결과가 제자리이므로, 회전을 하지 않는다.
    // angle:90은 시계 방향으로 90도 회전하게 된다.
    CCRotateTo *action = [CCRotateTo actionWithDuration:3 angle:360];
    CCRotateTo *action = [CCRotateTo actionWithDuration:3 angle:90];
    
    // CCScaleTo
    // 크기를 2배로 확대한다.
    // 위의 액션들과 다르게 여기서는 액션의 결과를
    // id 타입의 action 변수로 받았다.
    // CCScaleTo *action = [CCScaleTo actionWithDuration:2 scale:2.0];
    id action = [CCScaleTo actionWithDuration:2 scale:2.0];
    
    [sprite runAction:action];
 
 
    // ********** 2가지 이상의 액션 처리 **********
    // move, rotate, scale을 CCSpawn으로 받아 total에 넣어 액션을 실행한다.
    // CCSpawn은 여러 가지 액션을 동시에 실행한다. nil 주의!
    id move     = [CCMoveBy actionWithDuration:3 position:ccp(400,0)];
    id rotate   = [CCRotateBy actionWithDuration:3 angle:360*4];
    id scale    = [CCScaleBy actionWithDuration:3 scale:3.0];
    id total    = [CCSpawn actions:move, rotate, scale, nil];
    [sprite runAction:total];
 
    // move, rotate, scale을 CCSequence로 받아 total에 넣어 액션을 실행한다.
    // CCSequence는 액션을 차례대로 하나씩 실행한다. nil 주의!
    id move     = [CCMoveBy actionWithDuration:3 position:ccp(400,0)];
    id rotate   = [CCRotateBy actionWithDuration:3 angle:360*4];
    id scale    = [CCScaleBy actionWithDuration:3 scale:3.0];
    id total    = [CCSequence actions:move, rotate, scale, nil];
    [sprite runAction:total];
 
 
    // ********** 콜백 함수 이용하기 **********
    // 함수를 이용하여 액션 후에 무엇인가를 명령할 수 있다.
    // callback에 after1Action 메소드를 연결해 total에 넣었다.
    // 콜백 함수 after1Action의 역할은, move가 끝나면 NSLog를 실행한다.
    // CCCallFuncN은 노드를 함께 전달하는 클래스이며,
    // afterAction2 뒤에 콜론을 넣어야 한다. (주의)
    id move         = [CCMoveBy actionWithDuration:3 position:ccp(400,0)];
    id callback1    = [CCCallFunc actionWithTarget:self selector:@selector(after1Action)];
    id callback2    = [CCCallFuncN actionWithTargetself selector:@selector(after2Action:)];
    id total        = [CCSequence actions:move, callback1, nil];
    [sprite runAction:total];
}
 
// callback1이 호출하는 콜백 함수
-(void)after1Action {    
    NSLog("move 액션이 종료됨");
}
 
// node를 전달받는 콜백 함수, callback2가 이것을 호출한다.
-(void)after2Action:(CCNode *)_node {
    NSLog("전달된 노드: %@", _node); // 노드를 LSLog로 출력
}



PS

이제 스프라이트를 확실하게 움직이게 되었다.

By와 To의 개념이 처음에는 어려웠지만, 현재 스프라이트 자신의 위치를 기준으로 생각하면 쉽다. (By는 자신 기준, To는 절대 좌표)

그 외에 여러 가지 액션이 많지만, 종류만 여러 가지일 뿐이므로 외울 필요까지는 없고 필요할 때마다 찾아서 사용하면 된다.

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

cocos2d study #11  (0) 2012.10.26
cocos2d study #10  (0) 2012.10.26
cocos2d study #08  (0) 2012.10.25
cocos2d study #07  (0) 2012.10.25
cocos2d study #06  (0) 2012.10.23

+ Recent posts