วิธีเล่นภาพเคลื่อนไหวใน Cocos2d-x


คำตอบ:


9

ภาพเคลื่อนไหว Sprite นั้นค่อนข้างเรียบง่าย คุณเพียงแค่สร้าง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 () คืออะไร? ฉันได้รับความเสียหายในโปรแกรมจำลองการ iPhone ในการเพิ่ม runAction (laanim); รหัสของฉัน
26.00 น.

คุณสามารถใช้สไปรต์หรือโหนดอื่น ๆ ที่คุณต้องการฉันมีวิธีที่ส่งกลับสไปรต์แบบคงที่ที่เรียกว่า _player ที่ฉันได้เริ่มต้นก่อนหน้านี้
MLProgrammer-CiM

ฉันแก้ไขมันเพื่อความชัดเจนแล้ว :) ยินดีต้อนรับ
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); ไม่ทำงานกับ cocos2d-x รุ่นปัจจุบัน สิ่งที่จะต้องมีการเปลี่ยนแปลง?
เบ็น

น่าจะเป็นพวกเขาปรับปรุงสิ่งต่าง ๆ มากมายเมื่อเร็ว ๆ นี้ 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และต้องการทำตามคำตอบของEf Esต่อ cocos2d-x รุ่นปัจจุบันเพียงแค่เปลี่ยนบางบรรทัดดังนี้

    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 (จริง) ดูเหมือนจะไม่ทำ ...
Kaizer Sozay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.