Làm cách nào để chơi hoạt hình trong Cocos2d-x?


Câu trả lời:


9

Hoạt hình Sprite khá đơn giản. Bạn chỉ cần tạo một CCAnimationnút, thêm hình ảnh vào vòng lặp, sau đó tạo một hành động bằng cách sử dụng CCAnimate::actionWithDuration(float, CCAnimation, bool)và làm cho sprite chạy nó.

Thí dụ:

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);   

Cảm ơn nhưng HelloWorld :: getPlayer () là gì? Tôi đang gặp sự cố với trình giả lập iPhone khi thêm runAction (laanim); mã của tôi
2600

Bạn có thể sử dụng một sprite hoặc bất kỳ nút nào khác mà bạn muốn, tôi có một phương thức trả về một sprite tĩnh được gọi là _player mà tôi đã khởi tạo trước đó.
MLProgrammer-CiM

Tôi đã chỉnh sửa nó cho rõ ràng bây giờ :) Bạn được chào đón.
MLProgrammer-CiM

CCAnimate *theAnim = CCAnimate::actionWithDuration(1.8f,anim,true); không hoạt động với phiên bản hiện tại của cocos2d-x. Điều gì phải thay đổi?
Ben

Có lẽ, họ đã tân trang rất nhiều thứ gần đây. Bây giờ, chỉ cần kiểm tra tài liệu của họ và có thể bạn cần một tham số nhiều hơn / ít hơn.
MLProgrammer-CiM

5

Trong phiên bản mới của CoCos2dx (2.1.1), bạn có thể sử dụng (nó đang hoạt động)

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) );

Có một chỉnh sửa cho câu hỏi này trong hàng đánh giá chỉnh sửa đổi tên spriteWithSpriteFramethành createWithSpriteFrame. Tôi không biết đủ Cocos2D để biết đó có phải là một cải tiến hay không. Chỉnh sửa sẽ cải thiện câu trả lời này?
Anko

2

Nếu bạn không muốn sử dụng tệp .plist và muốn tiếp tục với câu trả lời của Ef Es với phiên bản hiện tại của cocos2d-x, chỉ cần thay đổi một số dòng như dưới đây:

    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

Tôi nghĩ rằng đây cũng có thể là giải pháp cho câu hỏi của Ben .


0

Đối với cocos2dx-v3, bạn sẽ cần một cái gì đó như thế này:

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));

Không thể có cách nào khác đi. Bạn cũng có thể thêm lại nhiều khung hình giống nhau để giới thiệu tạm dừng, nhưng tôi chắc chắn cũng có một cách khác để làm điều đó.


Bạn có thể cho tôi biết làm thế nào bạn sẽ chạy cùng một hình ảnh động, nhưng với các họa tiết được lật theo chiều ngang? Tôi đã vật lộn với điều này được một thời gian và setFlippedX (đúng) dường như không làm điều đó ...
Kaizer Sozay
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.