Cocos2d-x에서 애니메이션을 재생하는 방법?


답변:


9

스프라이트 애니메이션은 매우 간단합니다. 당신은 방금 생성 CCAnimation한 후 사용하여 작업을 생성, 루프에 이미지를 추가, 노드 CCAnimate::actionWithDuration(float, CCAnimation, bool)와 스프라이트를 실행합니다.

예:

CCAnimation * anim = CCAnimation::animation();
// There are other several ways of storing + adding frames, 
// this is the most basic using one image per frame.
anim->addFrameWithFileName("bear1.png");
anim->addFrameWithFileName("bear2.png");
anim->addFrameWithFileName("bear3.png");
anim->addFrameWithFileName("bear4.png");
anim->addFrameWithFileName("bear5.png");
anim->addFrameWithFileName("bear6.png");
anim->addFrameWithFileName("bear7.png");
anim->addFrameWithFileName("bear8.png");

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); 
// Duration, animation action and bool to return to frame 1 after finishing.

CCSprite *bear = CCSprite::spriteWithFile("bear1.png");
addChild(bear,0); //Don't forget to add any sprite you use as a child to the CCLayer!
bear->runAction(theAnim);   

고맙지 만 HelloWorld :: getPlayer () 무엇입니까? runAction (laanim)을 추가하면 iPhone 시뮬레이터에서 충돌이 발생합니다. 내 코드에.
2600 년

스프라이트 또는 원하는 다른 노드를 사용할 수 있습니다. 이전에 초기화 한 _player라는 정적 스프라이트를 반환하는 메서드가 있습니다.
MLProgrammer-CiM

나는 명확성을 위해 그것을 지금 편집했다 :) 당신은 환영합니다.
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); 현재 버전의 cocos2d-x에서는 작동하지 않습니다. 무엇을 변경해야합니까?
Ben

아마, 그들은 최근에 많은 것들을 개조했습니다. Dunno 지금, 단지 설명서를 확인하십시오. 어쩌면 하나 이상의 매개 변수가 필요합니다.
MLProgrammer-CiM

5

CoCos2dx (2.1.1)의 새 버전에서는 사용할 수 있습니다 (작동 중)

CCSpriteFrameCache* cache = CCSpriteFrameCache::sharedSpriteFrameCache();
cache->addSpriteFramesWithFile("numbers.plist","numbers.png");

CCSprite* sprite = CCSprite::createWithSpriteFrame(CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName("slice2_0_0.png"));
sprite->setPosition(ccp(GameScene::windowSize.width/2,GameScene::windowSize.height/3));

CCSpriteBatchNode* spriteBatchNode = CCSpriteBatchNode::create("numbers.png");
spriteBatchNode->addChild(sprite);
addChild(spriteBatchNode);

CCArray* animFrames = CCArray::createWithCapacity(10);

char str[100] = {0};
for(int i = 0; i < 10; ++i)
{
    sprintf(str, "slice2_0_%d.png", i);
    CCSpriteFrame* frame = cache->spriteFrameByName( str );
    animFrames->addObject(frame);
}
CCAnimation* animation = CCAnimation::createWithSpriteFrames(animFrames,1.f);
sprite->runAction(CCAnimate::create(animation) );

리뷰 검토 대기열에이 질문에 대한 이름이 spriteWithSpriteFrame으로 수정 되었습니다 createWithSpriteFrame. Cocos2D가 개선인지 알 수있을만큼 잘 모르겠습니다. 수정으로이 답변이 개선 되나요?
Anko

2

.plist 파일 을 사용하지 않고 현재 버전의 cocos2d-x로 Ef Es 의 답변 을 계속하려면 다음과 같이 몇 줄을 변경하십시오.

    CCSprite * sprite  = CCSprite::create("bear1.png"); // NEW - create a sprite here
    CCAnimation * anim = CCAnimation::animation();
    // There are other several ways of storing + adding frames, 
    // this is the most basic using one image per frame.
    anim->addSpriteFrameWithFileName("bear1.png");
    anim->addSpriteFrameWithFileName("bear2.png");
    anim->addSpriteFrameWithFileName("bear3.png");
    anim->addSpriteFrameWithFileName("bear4.png");
    anim->addSpriteFrameWithFileName("bear5.png");
    anim->addSpriteFrameWithFileName("bear6.png");
    anim->addSpriteFrameWithFileName("bear7.png");
    anim->addSpriteFrameWithFileName("bear8.png");

    anim->setLoops(-1); // for infinit loop animation
    anim->setDelayPerUnit(0.1f); //Duration per frame
    //CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); // this wont work in newer version..

    sprite->runAction(CCAnimate::create(anim) );
    sprite->setPosition(ccp(200,200)); //set position of sprite in some visible area

    this->addChild(sprite, 1); // cross check the Z index = 1 with your code

의 질문에 대한 해결책이 될 수 있다고 생각합니다 .


0

cocos2dx-v3의 경우 다음과 같은 것이 필요합니다.

auto cache = SpriteFrameCache::getInstance();
Vector<SpriteFrame*> frames = Vector<SpriteFrame*>();

frames.pushBack(cache->getSpriteFrameByName("open.png"));
frames.pushBack(cache->getSpriteFrameByName("closed.png"));
frames.pushBack(cache->getSpriteFrameByName("closed.png"));
cocos2d::Animation* anim = cocos2d::Animation::createWithSpriteFrames(frames, 0.1f, 1);

cocos2d::Animate* anim_action = cocos2d::Animate::create(anim);
//sprite is already added to scene elsewhere and ready to go
this->sprite->runAction(RepeatForever::create(anim_action));

다른 방법으로는 갈 수 없었습니다. 일시 정지를 위해 동일한 프레임을 반복해서 다시 추가 할 수도 있지만 다른 방법도 있습니다.


동일한 애니메이션을 어떻게 실행하지만 스프라이트를 수평으로 뒤집 었는지 말해 줄 수 있습니까? 나는 지금 이것으로 한동안 고투 해왔고, setFlippedX (true)는 그렇게하지 않는 것 같다 ...
Kaizer Sozay
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.