美文网首页
Cocos creator使用JavaScript。实现通用帧动

Cocos creator使用JavaScript。实现通用帧动

作者: 洒一地阳光_217d | 来源:发表于2020-09-22 08:46 被阅读0次

    一个通用帧动画组件:循环替换图片,代替Animation。

    基类:
    /**
     * 通用帧动画组件基类
     * 播放一次,或者循环播放
     * 可自定义设置:自动播放或者手动调用播放
     */
    cc.Class({
        extends: cc.Component,
    
        properties: {
            // 是否自动播放,若为true,只要显示就会自动播放
            autoPlay: {
                default: true,
                displayName: "自动播放",
            },
    
            // 是否循环
            loop: {
                default: false,
                displayName: "循环",
            },
    
            // 播放结束是否隐藏
            hideWithPlayEnd: {
                default: false,
                displayName: "播放结束隐藏",
            },
    
            // 播放结束是否销毁节点
            destroyWithPlayEnd: {
                default: false,
                displayName: "播放结束销毁",
            },
    
            // 间隔时间
            interval: {
                default: 0.06,
                displayName: "间隔时间",
            },
    
            _curIndex: {
                default: 0,
                serializable: false,
            },
    
            _timer: {
                default: 0,
                serializable: false,
            },
    
            _started: {
                default: false,
                serializable: false,
            },
    
            _endCallback: {
                default: null,
                serializable: false,
            },
        },
    
        onEnable: function () {
            if (this.autoPlay) {
                this.startPlayAnim(true);
            }
        },
    
        onDisable: function () {
            this.stopPlayAnim(false);
        },
    
        update: function (dt) {
            if (!this._started) {
                return;
            }
    
            let index = Math.floor(this._timer / this.interval);
            if (index < 0) {
                index = 0;
            }
            this._timer += dt;
    
            if (this._curIndex != index) {
                this._curIndex = index;
    
                if (index < this.getTotalLength()) {
                    this.show(index);
                } else {
                    // 播放结束
                    if (this.hideWithPlayEnd) {
                        // 隐藏
                        if (this._endCallback) {
                            this._endCallback();
                            this._endCallback = null;
                        }
    
                        this.node.active = false;
                    } else if (this.destroyWithPlayEnd) {
                        // 销毁
                        if (this._endCallback) {
                            this._endCallback();
                            this._endCallback = null;
                        }
    
                        this.node.destroy();
                    } else if (this.loop) {
                        // 继续循环
                        this.startPlayAnim(true);
                    } else {
                        // 停止
                        if (this._endCallback) {
                            this._endCallback();
                            this._endCallback = null;
                        }
    
                        this.stopPlayAnim(false);
                    }
                }
            }
        },
    
        // 可外部调用
        /**
         * 开始播放动画
         * @param {boolean} isReset 是否重置,重置会变成第1张图片
         * @param endCallback 结束回调,只使用于播放一次的模式
         */
        startPlayAnim: function (isReset, endCallback = null) {
            this._started = true;
    
            if (isReset) {
                this.reset();
            }
    
            this._endCallback = endCallback;
        },
    
        // 可外部调用
        /**
         * 停止播放动画
         * @param {boolean} isReset 是否重置,重置会变成第1张图片
         */
        stopPlayAnim: function (isReset) {
            this._started = false;
    
            if (isReset) {
                this.reset();
            }
        },
    
        // 重置
        reset: function () {
            this._endCallback = null;
            this._timer = 0;
            this._curIndex = 0;
            this.show(0);
        },
    
        setLoop: function (loop) {
            this.loop = loop;
        },
    
        isPlaying() {
            return this._started;
        },
    
        // 子类重写
        // 显示对应的
        show: function (index) { },
    
        // 子类重写
        // 获得总长度
        getTotalLength: function () { },
    });
    
    子类继承:间隔替换图(也可以扩展成,间隔显示节点):
    /**
     * 间隔替换图片,继承BaseSheetAnimation.js
     * 通用帧动画组件:播放一次,或者循环播放
     * 可自定义设置:自动播放或者手动调用播放
     */
    cc.Class({
        extends: require("BaseSheetAnimation"),
    
        properties: {
    
            sprite: cc.Sprite,
    
            spriteFrames: [cc.SpriteFrame],
        },
    
        // 显示对应的
        show: function (index) {
            if (index < 0 || index >= this.getTotalLength()) {
                return;
            }
    
            this.sprite.spriteFrame = this.spriteFrames[index];
        },
    
        // 获得总长度
        getTotalLength: function () {
            if (!this.spriteFrames) {
                return -1;
            }
    
            return this.spriteFrames.length;
        },
    
        setSpriteFrames: function (spriteFrames) {
            this.spriteFrames = spriteFrames;
        },
    });
    

    相关文章

      网友评论

          本文标题:Cocos creator使用JavaScript。实现通用帧动

          本文链接:https://www.haomeiwen.com/subject/agkvyktx.html