原生平台加载远程骨骼动画 demo

github:
https://github.com/Jno1995/dragonBone-spine_Dome/tree/native_load_remote_bones

核心代码:

// Learn TypeScript:
//  - https://docs.cocos.com/creator/manual/en/scripting/typescript.html
// Learn Attribute:
//  - https://docs.cocos.com/creator/manual/en/scripting/reference/attributes.html
// Learn life-cycle callbacks:
//  - https://docs.cocos.com/creator/manual/en/scripting/life-cycle-callbacks.html

const {ccclass, property} = cc._decorator;

@ccclass
export default class NewClass extends cc.Component {
    mySpineJsonUrl: string = "http://192.168.50.106:8000/assets/remoteRes/spineRaptor/raptor.json";

    mySpineTextureUrl: string = "http://192.168.50.106:8000/assets/remoteRes/spineRaptor/raptor.png";

    mySpineAtlasUrl: string = "http://192.168.50.106:8000/assets/remoteRes/spineRaptor/raptor.atlas";

    myDragonBonesJsonUrl: string = "http://192.168.50.106:8000/assets/remoteRes/dragonbones/CoreElement.json";

    myDragonBonesTextureUrl: string = "http://192.168.50.106:8000/assets/remoteRes/dragonbones/CoreElement_texture_1.png";

    myDragonBonesAtlasUrl: string = "http://192.168.50.106:8000/assets/remoteRes/dragonbones/CoreElement_texture_1.json";

    @property(cc.Label)
    myLabel: cc.Label = null;

    _downloader: any;
    _spineJsonDownloadTask: any;
    _spineTextureDownloadTask: any;
    _spineAtlasDownloadTask: any;

    _dragonbonesJsonDownloadTask: any;
    _dragonbonesTextureDownloadTask: any;
    _dragonbonesAtlasDownloadTask: any;

    _storagePath: string;
    _inited: any;

    _localSpineJsonUrl: string;
    _localSpineAtlasUrl: string;
    _localSpineTextureUrl: string;

    _localDragonbonesJsonUrl: string;
    _localDragonbonesAtlasUrl: string;
    _localDragonbonesTextureUrl: string;

    start () {
        if (cc.sys.isNative) {
            this.node.on("downloadBonesAssetsFinish", ()=>{
                this.myLabel.string = "download bonesAssets finish!";
                this.loadSpine();
                this.loadDragonBones();
            });
            this.downloadAssets();
        }
    }

    downloadAssets () {
        this.myLabel.string = "download start...";
        this._downloader = new jsb.Downloader();
        this._downloader.setOnFileTaskSuccess(this.onSucceed.bind(this));
        this._downloader.setOnTaskProgress(this.onProgress.bind(this));
        this._downloader.setOnTaskError(this.onError.bind(this));
        this._storagePath = jsb.fileUtils.getWritablePath() + 'dragonBone-spine_Dome/downloader/';

        this._inited = jsb.fileUtils.createDirectory(this._storagePath);
        if (!this._inited) {
            this.myLabel.string = 'Failed to create storage path, downloader won\'t work correctly';
        }

        this._spineJsonDownloadTask = this._downloader.createDownloadFileTask(this.mySpineJsonUrl, this._storagePath + 'raptor.json');
        this._spineTextureDownloadTask = this._downloader.createDownloadFileTask(this.mySpineTextureUrl, this._storagePath + 'raptor.png');
        this._spineAtlasDownloadTask = this._downloader.createDownloadFileTask(this.mySpineAtlasUrl, this._storagePath + 'raptor.atlas');

        this._dragonbonesJsonDownloadTask = this._downloader.createDownloadFileTask(this.myDragonBonesJsonUrl, this._storagePath + 'CoreElement.json');
        this._dragonbonesTextureDownloadTask = this._downloader.createDownloadFileTask(this.myDragonBonesTextureUrl, this._storagePath + 'CoreElement_texture_1.png');
        this._dragonbonesAtlasDownloadTask = this._downloader.createDownloadFileTask(this.myDragonBonesAtlasUrl, this._storagePath + 'CoreElement_texture_1.json');
    }

    onSucceed (task) {
        switch (task.requestURL) {
            case this.mySpineJsonUrl:
                this._localSpineJsonUrl = task.storagePath;
                break;
            case this.mySpineAtlasUrl:
                this._localSpineAtlasUrl = task.storagePath;
                break;
            case this.mySpineTextureUrl:
                this._localSpineTextureUrl = task.storagePath;
                break;
            case this.myDragonBonesJsonUrl:
                this._localDragonbonesJsonUrl = task.storagePath;
                break;
            case this.myDragonBonesAtlasUrl:
                this._localDragonbonesAtlasUrl = task.storagePath;
                break;
            case this.myDragonBonesTextureUrl:
                this._localDragonbonesTextureUrl = task.storagePath;
                break;
        }
        if (this._localSpineJsonUrl !== undefined && this._localSpineAtlasUrl !== undefined && this._localSpineTextureUrl !== undefined
            && this._localDragonbonesJsonUrl !== undefined && this._localDragonbonesAtlasUrl !== undefined && this._localDragonbonesTextureUrl !== undefined) {
            this.node.emit("downloadBonesAssetsFinish");
        }
    }

    onProgress (task, bytesReceived, totalBytesReceived, totalBytesExpected) {
        this.myLabel.string = "downloading..."
    }

    onError () {
        this.myLabel.string = "download error!";
    }

    loadSpine () {
        var spineNode = this.node.getChildByName("spine");
        var skeleton = spineNode.addComponent(sp.Skeleton);
        var imageUrl = this._localSpineTextureUrl;
        var skeUrl = this._localSpineJsonUrl;
        var atlasUrl = this._localSpineAtlasUrl;
        cc.loader.load(imageUrl, (error, texture) => {
            cc.loader.load({ url: atlasUrl, type: 'txt' }, (error, atlasJson) => {
                cc.loader.load({ url: skeUrl, type: 'txt' }, (error, spineJson) => {
                    var asset = new sp.SkeletonData();
                    asset._uuid = skeUrl;
                    asset.skeletonJson = spineJson;
                    asset.atlasText = atlasJson;
                    asset.textures = [texture];
                    asset.textureNames = ['raptor.png'];
                    skeleton.skeletonData = asset;
                    skeleton.animation = 'walk';
                });
            });
        });
    }

    loadDragonBones () {
        var dragonbonesNode = this.node.getChildByName("dragonBones");
        var dragonDisplay = dragonbonesNode.addComponent(dragonBones.ArmatureDisplay);

        var imageUrl = this._localDragonbonesTextureUrl;
        var skeUrl = this._localDragonbonesJsonUrl;
        var atlasUrl = this._localDragonbonesAtlasUrl;
        cc.loader.load(imageUrl, (error, texture) => {
            cc.loader.load({ url: atlasUrl, type: 'txt' }, (error, atlasJson) => {
                cc.loader.load({ url: skeUrl, type: 'txt' }, (error, dragonBonesJson) => {
                    var atlas = new dragonBones.DragonBonesAtlasAsset();
                    atlas._uuid = atlasUrl;
                    atlas.atlasJson = atlasJson;
                    atlas.texture = texture;

                    var asset = new dragonBones.DragonBonesAsset();
                    asset._uuid = skeUrl;
                    asset.dragonBonesJson = dragonBonesJson;

                    dragonDisplay.dragonAtlasAsset = atlas;
                    dragonDisplay.dragonAsset = asset;

                    dragonDisplay.armatureName = 'mecha_1502b';
                    dragonDisplay.playAnimation('walk', 0);
                });
            });
        });
    }
}

已经在原生平台测试通过。

mark…

把demo的代码放到2.0.9中在原生平台上崩溃了,


麻烦大佬给看下呢

补充

你好,spine远程加载json格式的数据测试过没问题了, 但是我skel格式的数据就会闪退,很多使用了二进制数据格式的,这该如何解决