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 |