개발Q&A / 2010.01.19 21:55 / drkhero79 / http://cafe.naver.com/mcbugi/27576
코코스2D엔진에서 스프라이트 애니메이션 할때 스프라이트에 애니메이션 등록해놓고 사용하잖아요
근데 CCRepeatForever actionWithAction을 이용하면 모든 프레임을 전부다 처음부터 끝까지 반복재생해주잖아요..
[sprite runAction:[CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO] ]];
그렇게 하지않고 특정 한 프레임 만 계속 띄워놓는 다든지 첫번째 프레임만 선택해서 계속 보이게 한다던지 혹은 2~5번째 만 선택적으로 재생한다던지 하는 선택 재생 방법은 없는 건가요?
또다른 질문은 aniframe으로 프레임을 만들고 aniframe2를 만들어서..
처음엔 aniframe으로 애니를 재생하다가 특정 이벤트가 발생되면 aniframe2로 교체해서 애니메이션을 재생해주는
그런 방법은 없는것 인가요?
제가 테스트 해볼라고 간단히 작성해본것 입니다.
CGSize size = [[CCDirector sharedDirector] winSize];
//애니메이션에 필요한 이미지 파일로딩
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage:@"walk.png"];
CCTexture2D *texture1 = [[CCTextureCache sharedTextureCache] addImage:@"dive.png"];
// manually add frames to the frame cache
//걷는 그림 프레임 세팅
CCSpriteFrame *frame0 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake( 25*0, 0, 25, 66 ) offset:CGPointZero];
CCSpriteFrame *frame1 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake( 25*1, 0, 25, 66 ) offset:CGPointZero];
CCSpriteFrame *frame2 = [CCSpriteFrame frameWithTexture:texture rect:CGRectMake( 25*2, 0, 25, 66 ) offset:CGPointZero];
//다이빙하는 그림 프레임 세팅
CCSpriteFrame *frame_0 = [CCSpriteFrame frameWithTexture:texture1 rect:CGRectMake( 0, 0, 25, 40 ) offset:CGPointZero];
CCSpriteFrame *frame_1 = [CCSpriteFrame frameWithTexture:texture1 rect:CGRectMake( 45, 0, 25, 40 ) offset:CGPointZero];
CCSpriteFrame *frame_2 = [CCSpriteFrame frameWithTexture:texture1 rect:CGRectMake( 80, 0, 25, 40 ) offset:CGPointZero];
CCSpriteFrame *frame_3 = [CCSpriteFrame frameWithTexture:texture1 rect:CGRectMake( 118, 0, 25, 40 ) offset:CGPointZero];
//기본으로 걷는 첫번째 프레임이미지으로 스프라이트 세팅한다.
CCSprite *sprite = [CCSprite spriteWithSpriteFrame:frame0];
sprite.position = ccp( size.width/2-80, size.height/2);
[self addChild:sprite];
//걷는 프레임으로 세팅한 이미지를 에니메이션으로 할당한다.
NSMutableArray *animFrames = [NSMutableArray array];
[animFrames addObject:frame0];
[animFrames addObject:frame1];
[animFrames addObject:frame2];
//다이빙하는 프레임으로 세팅한 이미지를 애니메이션으로 할당한다.
NSMutableArray *animFrames1 = [NSMutableArray array];
[animFrames1 addObject:frame_0];
[animFrames1 addObject:frame_1];
[animFrames1 addObject:frame_2];
[animFrames1 addObject:frame_3];
//애니메이션 변수 할당
CCAnimation *animation;
switch([(CCMenuItemFont*)sender tag]) // callBack에 들어온 sender를 위에 아이템과 같은 형으로 변환을 한다.
{
case 0: //걷는 프레임 재생
animation = [CCAnimation animationWithName:@"run" delay:0.2f frames:animFrames];
[sprite runAction:[CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO] ]];
break;
case 2: //다이빙하는 프레임 재생
animation = [CCAnimation animationWithName:@"dive" delay:0.2f frames:animFrames1];
[sprite runAction:[CCRepeatForever actionWithAction: [CCAnimate actionWithAnimation:animation restoreOriginalFrame:NO] ]];
break;
}
작동 방식좀 알아볼겸 해서 이렇게 간단히 작성해봤네요..
당연히 구조 변경할거구요..어떻게 동작하는지 보려고 대충 작성해본거니까 머라고 욕은 마세요^^;;;
암튼 위의 소스를 보면 저의 질문이 파악될지 모르겠네요.
이렇게 하니까 0일경우 걷는 프레임을 재생하고 2일경우는 다이빙을 재생하지만..
메모리에서 헤제를 안하고 계속 이전 애니메이션이 재생됩니다. 걷는것도 계속나오고 다이빙하는것도 계속나옵니다.
걷기를 하다가 중간에 다이빙동작으로 바꾼다는지 하는 방법이 무엇이며..
혹은 걷거나 다이빙 하는 프레임중 1~2프레임만 반복한다든지 1번프레임만 정지상태로 계속 보이게 하고도 싶습니다.
어떻게 하면될까요? 화면상에서 지워지지 않는 문제도 있네요..어떻게 하면되는지요^^
고수님들의 좋은 답변 부탁드려요~
에어조단(ckw0507) / 2010.01.19 23:43
애니 메이션 등록을
CCAnimation *aniWaitRight = [[CCAnimation alloc] initWithName:@"waitRight" delay:0.1];
[aniWaitRight addFrameWithFilename:@"0r.png"];
[aniWaitRight addFrameWithFilename:@"9r.png"];
[self addAnimation:aniWaitRight];
[aniWaitRight release];
이런식으로 하시고 사용하실때는 아래처럼..하시면 될꺼에요.
[self stopAllActions];
[self setDisplayFrame:@"waitRight" index:waitFrame%2];
waitFrame++;
if(waitFrame > 1) waitFrame = 0;
schedule 을 등록하여 위에방법대로 count 를 이용하여 사용하는 방법이 있을것 같네요.
---
GTekna Corp(gtekna) / 2010.01.20 08:42
Animation 변수를 하나만 사용하지 마시고, 걷는 것과 다이빙에 쓰일 것으로 두 개를 만드세요. Animation은 미리 만들어 놓고 재 사용하는 것이 좋습니다. 안 그러면, performance에 조금 지장이 있지요.
'프로그래밍 > Cocos2D' 카테고리의 다른 글
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 2 (0) | 2010.07.02 |
---|---|
[MammothHunting] - Cocos2D를 사용한 아이폰 게임 개발 튜토리얼 1 (0) | 2010.07.02 |
cocos2d 이미지 메모리 사용 절약 (0) | 2009.11.07 |
Cocos2D - 각종 레퍼런스 (0) | 2009.11.06 |
cocos2D로 시작해보자 (0) | 2009.11.06 |