龍骨動(dòng)畫--控制骨骼運(yùn)動(dòng)

  在實(shí)際項(xiàng)目制作過(guò)程中基协,***有時(shí)候僅僅播放預(yù)先設(shè)置的骨骼動(dòng)畫是不夠的,還需要角色具有動(dòng)態(tài)可控的動(dòng)作。DragonBones提供了訪問(wèn)并控制骨骼框架里的每一根骨頭的方法十拣,可以讓角色能夠有豐富多樣的交互效果叙身。***

  在示例中渔扎,通過(guò)鼠標(biāo)拖拽方塊,小龍人根據(jù)與方塊的距離去播放stand或者walk的動(dòng)畫信轿,根據(jù)與方塊的角度問(wèn)題晃痴,小龍人的頭部與手部會(huì)有一個(gè)角度的變化。

本需求的重點(diǎn)就是:獲取頭部與手部的骨骼财忽,然后設(shè)置骨骼的旋轉(zhuǎn)角度倘核。

本示例的關(guān)鍵代碼如下:

private head: dragonBones.Bone;
private armL: dragonBones.Bone;
private armR: dragonBones.Bone;
//獲取骨骼
this.head = this.armature.getBone("head");
this.armL = this.armature.getBone("armUpperL");
this.armR = this.armature.getBone("armUpperR");

通過(guò)dragoneBones.Armature.getBone("骨骼名字")來(lái)獲取某個(gè)骨骼,骨骼對(duì)象中的offset屬性是一個(gè)DBTranform對(duì)象即彪,是專門用于給開發(fā)者設(shè)置疊加的變換信息的紧唱,包括平移,旋轉(zhuǎn)隶校,縮放等漏益。

this.head.offset.rotation = _r *0.3       
this.armR.offset.rotation = _r *0.8;
this.armL.offset.rotation = _r * 1.5;

ps:這里的offset的值是疊加到骨骼現(xiàn)有的變化上,并不是取代骨骼的現(xiàn)有變換深胳。

下面是整個(gè)示例的完整代碼:

/**
 * 該類主要是用來(lái)學(xué)習(xí) 如何控制骨骼動(dòng)畫中骨骼的運(yùn)動(dòng)
 */
class DBTestScene2  extends egret.Sprite{
    // private factory:dragonBones.EgretFactory;
    // private armature:dragonBones.Armature;//骨架
    // private armatureDisplay:dragonBones.EgretArmatureDisplay;//骨架顯示對(duì)象
    // private head:dragonBones.Bone;//頭骨骼
    // private armL:dragonBones.Bone;//左臂骨骼
    // private armR:dragonBones.Bone;//右臂骨骼
    // private bird:egret.Shape;

    public constructor() {
        super();
        this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onStage,this);

    }

    private onStage(){
        this.graphics.beginFill(0xff0000,0.3);
        this.graphics.drawRect(0,0,this.stage.stageWidth,this.stage.stageHeight);
        this.graphics.endFill();

        this.initGame();

    }

    private factory:dragonBones.EgretFactory = new dragonBones.EgretFactory();
    private armature: dragonBones.Armature;
    private armatureClip:egret.DisplayObject;
    private head: dragonBones.Bone;
    private armL: dragonBones.Bone;
    private armR: dragonBones.Bone;
    private lark: egret.Bitmap;
    private initGame(): void 
    {
        // 獲取骨骼數(shù)據(jù)
        var skeletonData = RES.getRes("Dragon_ske_json");
        // 獲取紋理數(shù)據(jù)
        var textureData = RES.getRes("Dragon_tex_json");
        var texture = RES.getRes("Dragon_tex_png");
        // 解析骨骼數(shù)據(jù)與紋理數(shù)據(jù)
        this.factory.parseDragonBonesData(skeletonData);
        this.factory.parseTextureAtlasData(textureData,texture);
        
        // 獲取骨架
        this.armature = this.factory.buildArmature("Dragon");
        // 注意4掳獭!3硗馈B退!這里要獲取骨架上的display 才可以在骨架移動(dòng)的時(shí)候貼圖一起移動(dòng)
        this.armatureClip = this.armature.getDisplay();
        // 如果這樣子獲取armatureDisplay 骨骼移動(dòng)之后 貼圖并不會(huì)動(dòng)
        // this.armatureClip = this.factory.buildArmatureDisplay("Dragon");
        this.armatureClip.x = 200;
        this.armatureClip.y = 450;
        this.addChild(this.armatureClip);
        
        dragonBones.WorldClock.clock.add(this.armature);

        this.armature.animation.play("stand");

        this.head = this.armature.getBone("head");
        this.armL = this.armature.getBone("armUpperL");
        this.armR = this.armature.getBone("armUpperR");
     
        egret.startTick(this.onTicker, this);

        this.stage.addEventListener(egret.TouchEvent.TOUCH_MOVE,this.onTouchMove,this);
        this.lark = new egret.Bitmap(RES.getRes("button_down_png"));
        this.addChild(this.lark);
    }

    private _time:number;

    private onTicker(timeStamp:number) {

        if(!this._time) {
            this._time = timeStamp;
        }

        var now = timeStamp;
        var pass = now - this._time;
        this._time = now;

        this.checkDist();
        this.updateMove();
        this.updateBones();

        dragonBones.WorldClock.clock.advanceTime(pass / 1000);

        return false;
    }

    
    private mouseX: number = 0;
    private mouseY: number = 0;
    private dist: number = 0;
    private moveDir: number = 0;
    private speedX: number = 0;
    private onTouchMove(evt: egret.TouchEvent): void
    {
        this.mouseX = evt.stageX;
        this.mouseY = evt.stageY;
        this.lark.x=this.mouseX - 39;
        this.lark.y=this.mouseY - 34;
    }
    private checkDist():void
    {
        this.dist = this.armatureClip.x-this.mouseX;
        if(this.dist<150)
        {
            this.updateBehavior(1);
        }
        else if(this.dist>190)
        {
            this.updateBehavior(-1)
        }
        else
        {
            this.updateBehavior(0)
        }
                    
    }
    private updateBehavior(dir:number):void
    {
        if(this.moveDir == dir) {
            return;
        }
        this.moveDir=dir;
        if (this.moveDir == 0)
        {
            this.speedX = 0;
            this.armature.animation.gotoAndPlay("stand");
        }
        else
        {
            this.speedX=6*this.moveDir;
            this.armature.animation.gotoAndPlay("walk");
        }
    }
    private updateMove():void
    {
        if (this.speedX != 0) 
        {
            this.armatureClip.x += this.speedX;
            if (this.armatureClip.x < 0) 
            {
                this.armatureClip.x = 0;
            }
            else if (this.armatureClip.x > 800) 
            {
                this.armatureClip.x = 800;
            }
        }
    }
    private updateBones():void
    {
        //update the bones' pos or rotation
        var _r = Math.PI + Math.atan2(this.mouseY - this.armatureClip.y+this.armatureClip.height/2, this.mouseX - this.armatureClip.x);
        if (_r > Math.PI)
        {
            _r -= Math.PI * 2;
        }
        this.head.offset.rotation = _r *0.3       
        this.armR.offset.rotation = _r *0.8;
        this.armL.offset.rotation = _r * 1.5;
        this.lark.rotation=_r*0.2;
    }


   

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末权埠,一起剝皮案震驚了整個(gè)濱河市榨了,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌攘蔽,老刑警劉巖龙屉,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡转捕,警方通過(guò)查閱死者的電腦和手機(jī)作岖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)五芝,“玉大人痘儡,你說(shuō)我怎么就攤上這事∈嗖剑” “怎么了沉删?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)醉途。 經(jīng)常有香客問(wèn)我矾瑰,道長(zhǎng),這世上最難降的妖魔是什么隘擎? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任殴穴,我火速辦了婚禮,結(jié)果婚禮上货葬,老公的妹妹穿的比我還像新娘采幌。我一直安慰自己,他們只是感情好宝惰,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布植榕。 她就那樣靜靜地躺著,像睡著了一般尼夺。 火紅的嫁衣襯著肌膚如雪尊残。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天淤堵,我揣著相機(jī)與錄音寝衫,去河邊找鬼。 笑死拐邪,一個(gè)胖子當(dāng)著我的面吹牛慰毅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扎阶,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼汹胃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了东臀?” 一聲冷哼從身側(cè)響起着饥,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惰赋,沒(méi)想到半個(gè)月后宰掉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年轨奄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了孟害。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡挪拟,死狀恐怖挨务,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舞丛,我是刑警寧澤耘子,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站球切,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绒障。R本人自食惡果不足惜吨凑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望户辱。 院中可真熱鬧鸵钝,春花似錦、人聲如沸庐镐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)必逆。三九已至怠堪,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間名眉,已是汗流浹背粟矿。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留损拢,地道東北人陌粹。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像福压,于是被迫代替她去往敵國(guó)和親掏秩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容