티스토리 뷰

가로 60, 세로 60의 이펙트 애니메이션 5개가 모여있는 그림 파일 입니다.
(Image\attackeffect.png) 



cocos2d-x에서 중요한 점은 상속관계가 어떻게 되어 있고 그 관계 속에서 유연하게 생각하는 것이라고 생각합니다.
cocos2d-x에서 애니메이션(CCAnimate)은 액션에 속합니다.
기본적인 플로우는 이렇습니다.
1. 그림파일을 텍스쳐로 로드
2. CCSpriteFrame을 만드는데 텍스쳐 파일 속의 애니메이션(각각의 그림)을 Rect로 뜯어서 SpriteFrame에 삽입
3. CCSprite를 하나 생성하고 (보통) 애니메이팅의 첫번째 애니메이션을 그림으로 삽입
4. CCSpriteFrame의 MutableArray를 생성하고 거기에 아까 만들었던 SpriteFrame을 넣음
5. SpriteFrame의 MutableArray로 하나의 애니메이션을 생성
6. 그 애니메이션을 바탕으로 액팅을 하는 CCAnimate 클래스를 생성하고
    이것을 CCSpriteFrame의 MutableArray로 액팅할 수 있도록 만들었던 MutableArray를 넣어줌
7. 만든 Animate를 만든 Sprite에서 runAction 해줌

직접 소스로 보시는게 낫겠죠?

//pos는 애니메이션을 재생할 위치

void MonsterLayer::AttackEffectDraw(CCPoint pos)

{

// 애니메이팅이 들어 있는 그림파일을 텍스쳐로 로드

CCTexture2D *texture = CCTextureCache::sharedTextureCache()->addImage("Image\\attackeffect.png");

// CCSpriteFrame을 만드는데 텍스쳐 파일 속의 애니메이션(각각의 그림)을 Rect로 뜯어서 SpriteFrame에 삽입

CCSpriteFrame *frame0 = CCSpriteFrame::frameWithTexture(texture, CCRectMake(60*0, 60*0, 60, 60));

CCSpriteFrame *frame1 = CCSpriteFrame::frameWithTexture(texture, CCRectMake(60*1, 60*0, 60, 60));

CCSpriteFrame *frame2 = CCSpriteFrame::frameWithTexture(texture, CCRectMake(60*2, 60*0, 60, 60));

CCSpriteFrame *frame3 = CCSpriteFrame::frameWithTexture(texture, CCRectMake(60*3, 60*0, 60, 60));

CCSpriteFrame *frame4 = CCSpriteFrame::frameWithTexture(texture, CCRectMake(60*4, 60*0, 60, 60));


//CCSpriteFrame을 만드는데 텍스쳐 파일 속의 애니메이션(각각의 그림)을 Rect로 뜯어서 SpriteFrame에 삽입

CCSprite* sprite = CCSprite::spriteWithSpriteFrame(frame0);

sprite->setPosition( pos );

addChild(sprite);


//5개의 SpriteFrame으로 이루어진 MutableArray를 만듬(내 이펙트 파일이 5개의 애니메이팅으로 만들어져 있으니까!)

CCMutableArray<CCSpriteFrame*> *animFrames = new CCMutableArray<CCSpriteFrame*>(5);

animFrames->addObject(frame0);

animFrames->addObject(frame1);

animFrames->addObject(frame2);

animFrames->addObject(frame3);

animFrames->addObject(frame4);


CCAnimation *animation = CCAnimation::animationWithFrames(animFrames, 0.2f);

//첫번째 방법 : 한번에 시간, 애니메이션을 다 넣어준다.

//CCAnimate *animate = CCAnimate::actionWithDuration(0.2, animation, true);

//두번째 방법 : 애니메이션을 먼저 넣고 setDuration으로 재생시간을 조절한다.

CCAnimate *animate = CCAnimate::actionWithAnimation(animation, true);

animate->setDuration(0.2);

//애니메이션이 끝나고 끝난 애니메이션을 삭제해 줄 함수를 등록

CCFiniteTimeAction * actionDone = CCCallFuncN::actionWithTarget( this, callfuncN_selector(MonsterLayer::SpriteAnimateFinished));


//액션을 실행!

sprite->runAction( CCSequence::actions(animate, actionDone, NULL)  );

}

void MonsterLayer::SpriteAnimateFinished(CCNode* sender)

{

CCSprite * pSprite = (CCSprite*)sender;

this->removeChild(pSprite, true);

}



-수정 사항-
이렇게 애니메이션을 만들다보니 꽤 거추장스러운 부분도 많고 무엇보다 미관상(!) 좋지 못해서
따로 객체를 만들었습니다.
요청시 오픈하도록 하겠습니다. 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday