Cocos2dx-lua ScrollView[二]进阶篇

一.概述

本文缩写说明:sv = ScrollView, item代表ScrollView的一个子节点

如果对sv熟系程度还不够,请阅读基础篇:

Cocos2dx-lua ScrollView[一]基础篇-CSDN博客

本文介绍sv的一种封装类库,来实现快速创建sv,有如下几个优点:

1.item的位置通过参数控制,提高开发效率

2.免去了调用sv的API,提高开发效率

3.分帧创建,提高性能

4.可通过参数控制,复用item类似tableview,提高性能

二.效果演示

2.1 item不复用

2.2 item复用

三.代码实现

3.1 说明

a.下面2个模块需要require

b.svUtil是比较复杂的,有必要阅读代码掌握运行原理

c.item数量较多时才有必要用need_dynamic参数

d.代码原封不动搬到工程里基本可以正常运行(当然哪里出了问题读者得会排查,本文基本喂饭喂到嘴里了)

3.2 辅助定时器模块:GlobalTimeTicket

GlobalTimeTicket = GlobalTimeTicket or {}

auto_id = auto_id or 0
function autoId()
    auto_id = auto_id + 1
    return auto_id
end
-- 获取单例
-- New和不New只是一层一层调用__init和__delete,对于单例没有影响
function GlobalTimeTicket:getInstance()
    if not self.is_init then 
        self.scheduler = cc.Director:getInstance():getScheduler()
        self.schedulers = {}
        self.is_init = true
        self.is_stop = nil
    end
    return self
end

-- 定时回调 通用版
-- call_back : function     回调函数    必填
-- interval  : int          时间间隔    默认1 秒
-- limit_time: int          限制次数    默认0 无限
-- with_name : any          定时器标识  默认自增id
-- 返回用于删除的标识
-- simple    : local id = GlobalTimeTicket:getInstance():add(fun) ; GlobalTimeTicket:getInstance():remove(id)
--           : GlobalTimeTicket:getInstance():add(fun, 0.1, 1)              -- 次数达到自动删除
--           : GlobalTimeTicket:getInstance():add(fun, 0.1, 3, "name")      
function GlobalTimeTicket:add(call_back, interval, limit_time, with_name)
    if self.is_stop then return end
    with_name = with_name or autoId()
    if nil == call_back or self.schedulers == nil or nil ~= self.schedulers[with_name] then return end    -- 已经有定义了,不能重复

    limit_time = limit_time or 0
    interval = interval or 1
    local schedul_hander = self.scheduler:scheduleScriptFunc(function(dt)
        if self.is_stop then return end
        if call_back ~= nil then
            if limit_time == 1 then 
                self:remove(with_name)
            elseif limit_time > 1 then 
                limit_time = limit_time - 1
            end
            call_back(dt)
        end
    end, interval, false)
    self.schedulers[with_name] = schedul_hander
    return with_name
end

-- 删除一个定时器
function GlobalTimeTicket:remove(with_name)
    if with_name == nil then return end
    local schedul_hander = self.schedulers[with_name] 
    if schedul_hander ~= nil then
        self.scheduler:unscheduleScriptEntry(schedul_hander)
        self.schedulers[with_name] = nil 
    end
end

-- 清除所有定时器
function GlobalTimeTicket:removeAll()
    for _, v in pairs(self.schedulers) do 
        self.scheduler:unscheduleScriptEntry(v)
    end
    self.schedulers = {}
end

function GlobalTimeTicket:hasTicket(with_name)
    local schedul_hander = self.schedulers[with_name] 
    if schedul_hander ~= nil then
        return true
    end
    return false
end

function GlobalTimeTicket:getSchedulers()
    return self.schedulers
end

-- 停止定时器
function GlobalTimeTicket:stop()
    self.is_stop = true
    self:removeAll()
end

3.3 sv封装模块:svUtil

----------------------------------------------------------------------------------- example -----------------------------------------------------------------------------------
--[[
    self.scr_lyt = AM.getNode(self.midPanel, "scr_lyt")
	local setting = {
		item_class = moonActivityPanelItem,
		start_x = 24.5, space_x = 0,
		start_y = 5, space_y = 10,
		item_width = 621, item_height = 126,
		row = 0, col = 1,
		--need_dynamic = true
	}
	self.item_scrollview = svUtil.new(self.scr_lyt, cc.p(0,0) , ScrollViewDir.vertical, ScrollViewStartPos.top, self.scr_lyt:getContentSize(), setting)
	local svData = {}
	self.item_scrollview:setData(svData)
]]
----------------------------------------------------------------------------------- example -----------------------------------------------------------------------------------
display.DEFAULT_FPS = 60
ScrollViewDir = ScrollViewDir or {
    vertical = 1,
    horizontal = 2,
}

ScrollViewStartPos = ScrollViewStartPos or {
    top = 1,
    bottom = 2
}

function tableLen(table)
    local len = 0
    if table then
        for _ in pairs(table) do
            len = len + 1
        end
    end
    return len
end

function createScrollView(width,height,x,y,parent_wnd,type)
    local scroll_view = ccui.ScrollView:create()
    scroll_view:setBounceEnabled(true)
    scroll_view:setScrollBarEnabled(false)
    if type == ccui.ScrollViewDir.horizontal then
        scroll_view:setDirection(ccui.ScrollViewDir.horizontal)
    else
        scroll_view:setDirection(ccui.ScrollViewDir.vertical)
    end
    
    scroll_view:setTouchEnabled(true)
    scroll_view:setContentSize(cc.size(width, height))
    scroll_view:setInnerContainerSize(scroll_view:getContentSize())
    scroll_view:setPosition(cc.p(x, y))
    if not tolua.isnull(parent_wnd) then
        parent_wnd:addChild(scroll_view)
    end
    return scroll_view
end

svUtil = class("svUtil", function()
    return ccui.Layout:create()
end)

function svUtil:ctor(parent, pos, dir, start_pos, size, setting, ap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/447188.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

virtualbox下centos安装增强工具没反应

virtualbox下centos安装增强工具没反应 标签:linux 可能原因猜想 virtualbox下最小化安装CentOS,由于最小化安装时,没有选择Development Tools组,导致没有kernel-devel,而后安装的kernel-devel与kernel版本不一致,导…

【linux进程信号】信号的产生

【Linux进程信号】信号的产生 目录 【Linux进程信号】信号的产生信号概念生活中的信号技术应用角度的信号注意信号概念用kill -l命令可以察看系统定义的信号列表信号处理常见方式概览 产生信号通过终端按键产生信号调用系统函数向进程发信号由软件条件产生信号由硬件异常产生信…

基于java(springboot+mybatis)汽车信息管理系统设计和实现以及文档

基于java(springbootmybatis)汽车信息管理系统设计和实现以及文档 博主介绍:多年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐…

【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…

Vue ECharts line3D点击空白处重置图表视角- 附完整示例

ECharts:一个基于 JavaScript 的开源可视化图表库。 目录 效果 一、介绍 1、官方文档:Apache ECharts 2、官方示例 二、准备工作 1、安装依赖包 2、示例版本 三、使用步骤 1、在单页面引入 echarts 2、指定容器并设置容器宽高 3、数据处理&…

mysql 优化——磁盘空间优化

前言 有的时候,表的数据太多,为了提高查询以及存储,就把历史数据放到一个历史表里,在把历史数据删除,发现虽然历史数据删除,表的大小并没有发生改变。 Innodb 表有两部分,即:表结构…

【Emgu CV教程】9.1、形态学常用操作之腐蚀

文章目录 一、相关概念1.什么叫形态学2.形态学操作的目的3.形态学都包含哪些操作4.结构元素StructuringElement 二、腐蚀1.什么叫腐蚀2.腐蚀的作用3.腐蚀的函数 三、演示1.原始素材2.代码3.运行结果 一、相关概念 1.什么叫形态学 形态学,英文名称morphology&#…

【C++】了解一下STL

个人主页 : zxctscl 如有转载请先通知 STL 1. 什么是STL2. STL的版本3. STL的六大组件4. STL的重要性5. 如何学习STL6. STL的缺陷 1. 什么是STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件…

C语言:基于单链表实现的泊车管理系统

一、需求 (1)管理员方账号登录; (2)车位管理显示:车位状态; (3)收费管理:小轿车 5元/小时,面包车6元/小时,大货车或客车7元/小时&a…

vulhub中Weblogic 管理控制台未授权远程命令执行漏洞复现(CVE-2020-14882,CVE-2020-14883)

Weblogic是Oracle公司推出的J2EE应用服务器。在2020年10月的更新中,Oracle官方修复了两个长亭科技安全研究员voidfyoo 提交的安全漏洞,分别是CVE-2020-14882和CVE-2020-14883。 CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台&#x…

【Flutter 面试题】dart是值传递还是引用传递?

【Flutter 面试题】dart是值传递还是引用传递? 文章目录 写在前面解答补充说明值传递示例引用传递示例总结 写在前面 关于我 ,小雨青年 👉 CSDN博客专家,GitChat专栏作者,阿里云社区专家博主,51CTO专家博主…

vs2022的下载及安装教程(Visual Studio 2022)

vs简介 Visual Studio在团队项目开发中使用非常多且功能强大,支持开发人员编写跨平台的应用程序;Microsoft Visual C 2022正式版(VC2022运行库),具有程序框架自动生成,灵活方便的类管理,强大的代码编写等功能,可提供编…

信息系统项目管理师008:两化融合与智能制造(1信息化发展—1.3现代化创新发展—1.3.2两化融合与智能制造)

文章目录 1.3.2 两化融合与智能制造1.两化融合2.智能制造 记忆要点总结 1.3.2 两化融合与智能制造 “坚持自主可控、安全高效,推进产业基础高级化、产业链现代化,保持制造业比重基本稳定,增强制造业竞争优势,推动制造业高质量发展…

[云原生] k8s配置资源管理

一、Secret的资源配置 1.1 Secret配置的相关说明 Secret 是用来保存密码、token、密钥等敏感数据的 k8s 资源,这类数据虽然也可以存放在 Pod 或者镜像中,但是放在 Secret 中是为了更方便的控制如何使用数据,并减少暴露的风险。 Secret 有…

钉钉如何通过AppLink快速连接仓储系统

一、什么是APPlink? APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台,为业务流程提供自动化的解决方案,将企业内部的核心系统以及第三方应用程序和云服务等进行集成。无论是开发人员还是业务人员,都可以使用APPlink…

HTML静态网页成品作业(HTML+CSS)——阜阳剪纸介绍设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…

打破界限,释放创新:一键将HTML转化为PDF

在互联网时代,HTML作为网页的标准语言,承载着无数的信息与创意。然而,有时我们需要将这些在线内容转化为可打印、可分享的PDF格式。这时,一款高效、便捷的转换工具就显得尤为重要。 首先,我们要进入首助编辑高手主页面…

《IEEE Transactions on Robotics》发表!北京大学研究团队推出具有多种运动模态的软体两栖机器人

两栖机器人以其在复杂水陆混合环境中的卓越适应性而脱颖而出,成为非结构化场景下信息监测、资源勘探和灾难救援等多元化任务的理想选择。凭借能够在水生和陆生环境中自如切换的优势,两栖机器人在如上任务执行过程中展现出对多变环境的惊人适应能力。 在…

springboot实现国际化

引言 今天在开发过程中,遇到国外客户,要求项目一些返回msg中,不能再有中文,于是便有了国际化需求。 How to do 1.在项目resources下创建i18n文件夹以及messages.properties文件 messages.properties 国际化主文件 phoneErr.ms…

easyexcel文件上传

easyexcel文件上传 前言&#xff1a;功能开发中&#xff0c;难免碰到数据上传下载功能&#xff0c;excel上传常见用于报表上传&#xff0c;绩效上传&#xff0c;考勤上传… 使用步骤&#xff1a; 1&#xff0c;编写业务层&#xff1a; 1&#xff0c;添加easyexcel依赖 <…