Thẻ

, , ,

Giả sử bạn đã có file .png và file .plist, sau đây chúng ta sẽ sử dụng chúng để tạo animation!

Bước 1: Nạp file .plist vào SpriteFrameCache

SpriteFrameCache::getInstance()->addSpriteFramesWithFile("z.plist");

Bước 2: Tạo đối tượng SpriteBatchNode.

Đối tượng chính thực hiện animation ở đây là SpriteBatchNode.
Nó được tạo từ file png và được trực tiếp add vào scene.
Nhớ add ngay vào luôn sau khi tạo không lại quên! :v
Và những gì muốn hiển thị qua đều được add làm child của cái batch này!

auto spriteSheet = SpriteBatchNode::create("z.png");
this->addChild(spriteSheet);

Bước 3: Tạo Animation

Hàm tạo của animation cần 2 tham số, 1 là chuỗi các SpriteFrame, thứ hai là thời gian giữa các frame.
Đoạn này có một chỗ khó nhớ đó là SpriteFrame không được tạo từ SpriteFrame::create(), mà được tạo từ cache ở trên ra với cái frameName tương ứng.

Vector<SpriteFrame*> animFrames(4);
char str[50] = { 0 };
for (int i = 1; i <= 4; i++)
{
	sprintf(str, "z%d.png", i);
	auto frame = SpriteFrameCache::getInstance()->getSpriteFrameByName(str);
	animFrames.pushBack(frame);
}
auto animation = Animation::createWithSpriteFrames(animFrames, 0.8f);

Ngoài cách trên dãy các SpriteFrame còn có thể tạo được từ các ảnh riêng lẻ như sau! Cách này người ta không dùng, chỉ nói ra cho biết thôi!

Vector<SpriteFrame*> animFrames;
animFrames.pushBack(SpriteFrame::create("Blue_Front1.png", Rect(0,0,65,81)));
animFrames.pushBack(SpriteFrame::create("Blue_Front2.png", Rect(0,0,65,81)));
animFrames.pushBack(SpriteFrame::create("Blue_Front3.png", Rect(0,0,65,81)));
animFrames.pushBack(SpriteFrame::create("Blue_Left1.png", Rect(0,0,65,81)));
// create the animation out of the frames
Animation* animation = Animation::createWithSpriteFrames(animFrames, 0.1f);

Bước 4: Chuyển Animation vào action Animate

Để chạy được animation ta cần một action tên là Animate, để chạy liên tục ta cũng cần dùng cả RepeatForever.
Đặc biệt action này không được gán trực tiếp vào cái SpriteBatchNode đã tạo ở bước 2.
Ta cần tạo 1 spire mới, sau đó nhét animate vào nó, rồi gán nó làm child của batchNote.
Chú ý là phải gán nó là child của batch node nó mới hiển thị và chạy được.
Chứ gán nó vào child của scene cũng ko chạy được đâu!

Sprite* spriteAnimate = Sprite::createWithSpriteFrameName("z1.png");
spriteAnimate->runAction(RepeatForever::create(Animate::create(animation)));
spriteSheet->addChild(spriteAnimate);

Chú ý:
Thông thường cần khởi tạo sprire mới bằng chính cái frame name đã tạo trong cache.
Animation sử dụng phương thức createWithSpriteFrames chứ ko dùng create.
Animate action phải gắn cho sprite mới chứ không phải gắn cho cái sprite batch node.

Tham khảo: http://laptrinhgamecocos2dx.blogspot.com/2014/05/bai-19-sprite-sheet-animation-trong-cocos2d-x-3.html
[2] http://www.cocos2d-x.org/wiki/Sprite_Sheet_Animation

Advertisements