美文网首页程序员
CocosCreator的ScrollView优化

CocosCreator的ScrollView优化

作者: 72990febb415 | 来源:发表于2020-05-06 18:20 被阅读0次

    效果图

    xx.gif

    新建一个预制件

    image1.jpg

    预制件代码

    Item.ts

    const {ccclass, property} = cc._decorator;
    
    @ccclass
    export default class Item extends cc.Component {
    
        @property(cc.Label) label: cc.Label = null;
    
        index: number = 0
    
        getIndex(): number {
            return this.index
        }
    
        init(index: number) {
            this.label.string = `${index}`
            this.index = index
        }
    
        itemShow() {
            this.node.opacity = 255
        }
    
        itemHide() {
            this.node.opacity = 0
        }
    }
    

    主文件代码

    Main.ts

    import Item from "./Item";
    
    const {ccclass, property} = cc._decorator;
    
    @ccclass
    export default class Main extends cc.Component {
    
        @property(cc.ScrollView) scrollView: cc.ScrollView = null
        @property(cc.Prefab) itemPrefab: cc.Prefab = null
        @property(cc.Button) startBtn: cc.Button = null
        @property(cc.EditBox) editBox: cc.EditBox = null
    
        needItem: number = 0
        index: number = 0
        viewRect: cc.Rect = null
        needCulling = false
        // onLoad () {}
    
        start() {
            this.startBtn.node.on('click', () => {
                this.needItem +=  parseInt(this.editBox.string)
            })
            let pos = this.scrollView.node.parent.convertToNodeSpace(
                this.scrollView.node.position
            )
            // 构造碰撞盒子 需要有预留
            this.viewRect = cc.rect(pos.x - 125, pos.y - 125, this.scrollView.node.width + 250, this.scrollView.node.height + 300 )
            this.scrollView.node.on('scroll-began', () => {
                this.needCulling = true
                console.log('scroll-began')
            })
            this.scrollView.node.on('scroll-ended', () => {
                this.culling()
                this.needCulling = false
                console.log('scroll-ended')
            })
            this.scrollView.node.on(cc.Node.EventType.TOUCH_CANCEL, () => {
                this.culling()
                // this.needCulling = false
                console.log('TOUCH_CANCEL')
            })
        }
    
        frameCreator(dt: number) {
            if (this.needItem < 1) {
                return
            } else if(this.needItem === 1) {
                this.culling()
            }
            this.needItem--
            this.index++
            let itemNode = cc.instantiate(this.itemPrefab)
            itemNode.getComponent(Item).init(this.index)
            itemNode.color = cc.color(~~(Math.random() * 255), ~~(Math.random() * 255), ~~(Math.random() * 255))
            this.scrollView.content.addChild(itemNode)
        }
    
        culling() {
            this.scrollView.content.children.forEach((node) => {
                if(this.viewRect.containsRect(node.getBoundingBoxToWorld())){
                    node.getComponent(Item).itemShow()
                } else {
                    node.getComponent(Item).itemHide()
                }
            })
        }
    
        update(dt) {
            this.frameCreator(dt)
            if (this.needCulling) {
                console.log('is culling')
                this.culling()
            }
        }
    }
    

    简单分析

    • 将预制件实例化的操作分到每一帧, 每一帧生成实体
    • 在每一帧16ms的时间内,生成一个或者多个实体
    • 当item的位置超出view的位置时就设置透明度为0(减少drawCall)

    相关文章

      网友评论

        本文标题:CocosCreator的ScrollView优化

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