美文网首页
Cocos 2.x 自定义扩展组件

Cocos 2.x 自定义扩展组件

作者: 合肥黑 | 来源:发表于2021-10-29 09:29 被阅读0次

参考
张晓衡 Cocos Creator基础教程(12)—精灵变身

//SpriteEx.js

let SpriteEx = cc.Class({    
    extends: cc.Sprite,    //继承自cc.Sprite

    properties: {        
        spriteFrames: [cc.SpriteFrame],        
        _index: 0,        
        index: {            
        type: cc.Integer,
            set(value) {                
                if (value < 0) {                    
                    return;
                } 
                //直接访问spriteFrame属性,因为this就是cc.Sprite
                this._index = value % this.spriteFrames.length;
                this.spriteFrame = this.spriteFrames[this._index];
            },
            get() {                
                return this._index;
            }
        }
    },

    next() {        this.index++
    }
});


//下面是控制SpriteEx组件在属性检查器中的属性显示

//不显示spriteFrame属性
cc.Class.Attr.setClassAttr(SpriteEx, 'spriteFrame', 'visible', false);
//不显示Atlas属性
cc.Class.Attr.setClassAttr(SpriteEx, '_atlas', 'visible', false);
//根据函数返回值控制属性显示、隐藏
cc.Class.Attr.setClassAttr(SpriteEx, 'fillType', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});

cc.Class.Attr.setClassAttr(SpriteEx, 'fillCenter', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillStart', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillEnd', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'fillRange', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'srcBlendFactor', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class.Attr.setClassAttr(SpriteEx, 'dstBlendFactor', 'visible', function() {    
    return this._type === cc.Sprite.Type.FILLED;
});

可以参考使用 TypeScript 脚本,改造成TS版本:

/*
 * @Descripttion: 
 * @Author: cuixu
 * @Date: 2021-07-08 09:27:48
 */
const { ccclass, property } = cc._decorator;

@ccclass
export default class SpriteEx extends cc.Sprite {

    @property(cc.SpriteFrame)
    spriteFrames: cc.SpriteFrame[] = [];

    @property
    _index = 0;

    @property
    get index() {
        return this._index;
    }

    set index(value) {
        if (value < 0) {
            return;
        }
        this._index = value % this.spriteFrames.length;
        this.spriteFrame = this.spriteFrames[this._index];
    }

}

cc.Class["Attr"].setClassAttr(SpriteEx, 'spriteFrame', 'visible', false);
cc.Class["Attr"].setClassAttr(SpriteEx, '_atlas', 'visible', false);

cc.Class["Attr"].setClassAttr(SpriteEx, 'fillType', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});

cc.Class["Attr"].setClassAttr(SpriteEx, 'fillCenter', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class["Attr"].setClassAttr(SpriteEx, 'fillStart', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class["Attr"].setClassAttr(SpriteEx, 'fillEnd', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class["Attr"].setClassAttr(SpriteEx, 'fillRange', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});

cc.Class["Attr"].setClassAttr(SpriteEx, 'srcBlendFactor', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});
cc.Class["Attr"].setClassAttr(SpriteEx, 'dstBlendFactor', 'visible', function () {
    return this._type === cc.Sprite.Type.FILLED;
});

做成prefab后,可以使用getComponent

    _emmitNode() {
        let node = cc.instantiate(this.prefab);
        let v: SpriteEx = node.getComponent("SpriteEx");
        v.index = 2;

        node.position = this.node.position;
        node.x += this.offsetX;
        node.parent = this.node.parent;

        let distance = ((cc.winSize.height / 2) - this.node.y);
        let duration = distance / this.speed;
        let moveBy = cc.moveBy(duration, cc.v2(0, distance));
        let removeSelf = cc.removeSelf();
        let sequence = cc.sequence(moveBy, removeSelf);
        node.runAction(sequence);
    }

相关文章

  • Cocos 2.x 自定义扩展组件

    参考张晓衡 Cocos Creator基础教程(12)—精灵变身[https://mp.weixin.qq.com...

  • 微信小程序-自定义组件

    一、自定义组件介绍 微信小程序提供了自定义组件扩展机制,允许我们使用自定义组件的方式来构建页面。 自定义组件可以使...

  • vue自定义日期组件

    vue-datepicker 基于 vuejs 2.x 可自定义主题的日期组件 github DMOE Insta...

  • vue第三天

    组件(Component) -组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vu...

  • 1-2 vue组件-全局注册和局部注册

    组件可以扩展HTML元素,封装可重用的HTML代码,我们可以将组件看作自定义的HTML元素 1、注册全局组件:(所...

  • 5--vue组件 props传参 soft插槽

    一. 组件 a. 定义 组件就是扩展自定义 的html标签 组件是一个功能的集合,可以重复的使用 组件能使一个复杂...

  • 移动端dialog组件

    移动端dialog组件 dialogView是满足移动端下,用户自定义的dialog组件,API可扩展性强,使用便...

  • Vue.js可复用的组件

    什么是Vue组件 组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的...

  • CreatorPrimer|飞机大战(一)

    前两天在Cocos官方公众号上学习了「大掌教」的Cocos Creator 2.x Camera教程,总算是对摄像...

  • Cocos2d-x 2.x 和 3.x 的渲染流程区别以及Sha

    1.渲染流程的区别 1.cocos2d-x 2.x的Sprite的draw方法找个2.x的CCSprite,你看看...

网友评论

      本文标题:Cocos 2.x 自定义扩展组件

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