すくまりのメモ帳すくまりのメモ帳
← 記事一覧に戻る

【Egret Engine】DragonBones を使用したアニメーションの作成と読み込み

2019-01-20
【Egret Engine】DragonBones を使用したアニメーションの作成と読み込み

はじめに

DragonBonesエディタを使用して、簡単なアニメーションの作成と読み込みを行います。

DoragonBonesのボーンを使用すれば、Animate CC や Blender などと同じようにアニメーションが構築できます。

準備

前回の記事を読んで、適当なモデルを作成しておいてください。

【Egret Engine】DragonBones の基本操作と使い方

DragonBones を使用したアニメーションの作成

Animationの準備

エディタ左上のAnimationをクリック。

Timelineが現れます。

エディタ右下のAnimationタブの「animation0」をダブルクリックして名前を適当に変更してください。今回は「TestAnimation」にします。

エディタ左下のTimelineタブのAuto keyをクリックすると、アニメーションの自動記録が始まります。

Animationの作成

Animationはモデルを移動させるか、以下のフラグをクリックすると、ひし形のキーが打たれます。

基本的にはボーンを移動させるといいでしょう。

試しに、10フレーム目に適当なポーズのキーを打ってみました。

ここで、Auto keyをクリックしてアニメーションを保存。

再生ボタンを押すと、キーフレーム間を滑らかに補間したアニメーションが再生されます。

AnimationのExport

AnimationをExportするにはログインしている必要があります。

File > Exportをクリック。

以下の設定でFinishをクリック。

Output Pathのフォルダに保存されるので場所を覚えておいてください。

保存したフォルダ内にある、

・DragonTest_ske.json

・DragonTest_tex.json

・DragonTest_tex.png

を作成中のプロジェクト内にあるresourceフォルダに入れてください。今回はresourceフォルダ内に「DBAnimation」というフォルダを作成し、そこにjsonを入れました。

Animation の実行

プロジェクトをEgret Wingで開くと、アイテムを更新するよう求められるのでSave。

resource内にあるdefault.res.jsonを開くと、DBAnimationが追加されていると思います。

以下のコードを入力してください。

Main.ts
 class Main extends eui.UILayer {
 
    /**
     * ステージ追加時に一度発生する
     * (UILayerクラスの継承元(Groupクラス)のメソッド)
     */
    protected createChildren(): void {
        super.createChildren();
        
        this.runGame().catch(e => {
            console.log(e);
        })
    }
 
    /** 
     *  リソース準備後にゲームシーンを作成する
    */
    private async runGame() {
        await this.loadResource()
        this.createGameScene();
    }
 
    /** 
     * リソース読み込み準備
     * default.res.jsonから画像データを取得する為のRES設定を行う
    */
    private async loadResource() {
        try {
            await RES.loadConfig("resource/default.res.json", "resource/");
            await RES.loadGroup("preload");
        }
        catch (e) {
            console.error(e);
        }
    }
 
    /**
     * 引数のnameからBitmapデータを取得する。name属性の参考:resources/resource.json
     */
    private createBitmapByName(name: string): egret.Bitmap {
        let result = new egret.Bitmap();
        let texture: egret.Texture = RES.getRes(name);
        result.texture = texture;
        return result;
    }
 
    /**
     * ゲームシーンの作成
     */
    protected createGameScene(): void {
        //アニメーションファイルのロード
        const dragonbonesData = RES.getRes( "DragonTest_ske_json" );
        const textureData = RES.getRes( "DragonTest_tex_json" );
        const texture = RES.getRes( "DragonTest_tex_png" );
 
        //モデルのインスタンス化
        const dragonbonesFactory:dragonBones.EgretFactory = new dragonBones.EgretFactory();
        dragonbonesFactory.addDragonBonesData(dragonBones.DataParser.parseDragonBonesData(dragonbonesData));
        dragonbonesFactory.addTextureAtlas(new dragonBones.EgretTextureAtlas(texture,textureData));  
        const armature: dragonBones.Armature = dragonbonesFactory.buildArmature("TestModel");  
        this.addChild(armature.display);  
 
        //モデルの移動
        armature.display.x = 200;  
        armature.display.y = 300;  
        armature.display.scaleX = 0.5;  
        armature.display.scaleY = 0.5;  
 
        //アニメーションの再生
        dragonBones.WorldClock.clock.add( armature );  
        armature.animation.play("TestAnimation",1);  
 
        egret.Ticker.getInstance().register(  
        function(frameTime:number){dragonBones.WorldClock.clock.advanceTime(0.01)},  
        this  
        );  
 
       
    }
}

アニメーションファイルのロード
const dragonbonesData = RES.getRes( "DragonTest_ske_json" );
const textureData = RES.getRes( "DragonTest_tex_json" );
const texture = RES.getRes( "DragonTest_tex_png" );

defoult.res.jsonを参考にして、先ほど追加したファイルに対応する名前を入力してください。

モデルのインスタンス化
const dragonbonesFactory:dragonBones.EgretFactory = new dragonBones.EgretFactory();
dragonbonesFactory.addDragonBonesData(dragonBones.DataParser.parseDragonBonesData(dragonbonesData));
dragonbonesFactory.addTextureAtlas(new dragonBones.EgretTextureAtlas(texture,textureData));  
const armature: dragonBones.Armature = dragonbonesFactory.buildArmature("TestModel");  
this.addChild(armature.display);  

4行目のdragonbonesFactory.buildArmature("モデル名");のモデル名には、DragonBonesに用いたモデル名を使用してください。

Animationの再生
dragonBones.WorldClock.clock.add( armature );  
armature.animation.play("TestAnimation",1);  
 
egret.Ticker.getInstance().register(  
function(frameTime:number){dragonBones.WorldClock.clock.advanceTime(0.01)},  
this  
);  

DragonBonesで使用しているアニメーションの時間(WorldClock)を追加して、armature.animation.play("アニメーション名", 実行回数);でアニメーションを実行してください。

アニメーション名はDragonBonesを参照してください。

armature.animation.play("TestAnimation", -1);にすればアニメーションがループします。

参考URL

Egret Developer DragonBones

https://developer.egret.com/cn/docs/page/364

HTML5 Egret Engine入門講座へ戻る