聲明:
這筆記是來自cocos2d-x官網(wǎng)扔罪,各位不要噴娇掏!我只是給我自己使用的,未來一系列的游戲文章都是這樣空执。因本人平時(shí)使用手機(jī)簡(jiǎn)書較多浪箭,故寫在簡(jiǎn)書上方便本人使用而已。
Spine是一款針對(duì)游戲的2D骨骼動(dòng)畫編輯工具,它具有良好的UI設(shè)計(jì)和完整的功能辨绊,是一個(gè)比較成熟的骨骼動(dòng)畫編輯器奶栖。Spine旨在提供更高效和簡(jiǎn)潔的工作流程,以創(chuàng)建游戲所需的動(dòng)畫邢羔。
使用Spine創(chuàng)建骨骼動(dòng)畫分兩大步驟:
在SETUP模式下,組裝角色部件桑孩,為其綁定骨骼拜鹤;
在ANIMATE模式下,基于綁定好的骨骼創(chuàng)建動(dòng)畫流椒。
非常棒的教程:http://zh.esotericsoftware.com/spine-quickstart#Character-Images
1)在SETUP模式下敏簿,選中Images屬性,導(dǎo)入所需圖片資源所在文件夾,其中路徑名和資源名中不能出現(xiàn)中文惯裕,否則解析不了温数;
2)拖動(dòng)Images下的圖片到場(chǎng)景,對(duì)角色進(jìn)行組裝(把各個(gè)身體部位拼在一起)蜻势,可通過Draw Order屬性調(diào)整圖片所在層的順序撑刺;
3)創(chuàng)建骨骼,并綁定圖片到骨骼上握玛,要注意各骨骼的父子關(guān)系够傍。
4)切換到ANIMATE模式,選中要“動(dòng)”的骨骼挠铲,對(duì)其進(jìn)行旋轉(zhuǎn)冕屯、移動(dòng)、縮放等操作拂苹,每次改動(dòng)后要記得打關(guān)鍵幀安聘。
5)在菜單欄找到Texture Packer項(xiàng),對(duì)角色紋理進(jìn)行打包瓢棒,資源文件后綴為atlas(而非Cocos2d-x常用的plist)浴韭。打包后將生成兩個(gè)文件,即:png 和 atlas音羞。
6)導(dǎo)出動(dòng)畫文件Json囱桨。
Spine動(dòng)畫的使用
Cocos2d-x程序中,使用Spine動(dòng)畫首先需要包含spine的相關(guān)頭文件嗅绰。
#include <spine/spine-cocos2dx.h>
#include "spine/spine.h"
using namespace spine;
其常用方法如下:
創(chuàng)建一個(gè)Spine動(dòng)畫對(duì)象舍肠,將動(dòng)畫文件和資源文件導(dǎo)入。
auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");
骨骼動(dòng)畫往往是不止一個(gè)動(dòng)畫的?
例如:當(dāng)人物需要行走時(shí)窘面,就設(shè)置播放動(dòng)畫為行走翠语;當(dāng)要發(fā)動(dòng)攻擊時(shí),就設(shè)置播放動(dòng)畫為攻擊财边。下面方法可以設(shè)置當(dāng)前播放動(dòng)畫肌括,其中參數(shù)false表示不循環(huán)播放,true表示循環(huán)播放酣难。
skeletonNode->setAnimation(0, "walk", true);
setAnimation方法只能播放一種動(dòng)畫谍夭,所以當(dāng)要連續(xù)播放不同的動(dòng)畫時(shí),需要使用addAnimation方法來實(shí)現(xiàn)憨募,它可以一條一條的播放不同的動(dòng)畫紧索。
skeletonNode->addAnimation(0, "walk", true);//行走動(dòng)畫
skeletonNode->addAnimation(0, "attack", false);//攻擊動(dòng)畫
設(shè)置動(dòng)畫的播放快慢可通過設(shè)置它的timeScale值來實(shí)現(xiàn)。
設(shè)置是否顯示骨骼通過設(shè)置debugBones菜谣,true表示顯示珠漂,false表示隱藏晚缩。
skeletonNode->debugBones = true;
最后:例子:創(chuàng)建一個(gè)player行走和攻擊的動(dòng)畫, 并且循環(huán)播放。
- 希望你自己跟著寫一遍媳危,不要直接復(fù)制進(jìn)去荞彼。
auto skeletonNode = new SkeletonAnimation("enemy.json", "enemy.atlas");
skeletonNode->setMix("walk", "attack", 0.2f);
skeletonNode->setMix("attack", "walk", 0.4f);
skeletonNode->setAnimation(0, "walk", false);
skeletonNode->setAnimation(0, "attact", false);
skeletonNode->addAnimation(0, "walk", false);
skeletonNode->addAnimation(0, "attact", true);
skeletonNode->debugBones = true;
Size windowSize = Director::getInstance()->getWinSize();
skeletonNode->setPosition(Point(windowSize.width / 2, windowSize.height / 2));
addChild(skeletonNode);
效果圖: