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 + 1return 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 = trueself.is_stop = nilendreturn 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 endwith_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 0interval = interval or 1local schedul_hander = self.scheduler:scheduleScriptFunc(function(dt)if self.is_stop then return endif call_back ~= nil thenif limit_time == 1 then self:remove(with_name)elseif limit_time > 1 then limit_time = limit_time - 1endcall_back(dt)endend, interval, false)self.schedulers[with_name] = schedul_handerreturn with_name
end-- 删除一个定时器
function GlobalTimeTicket:remove(with_name)if with_name == nil then return endlocal schedul_hander = self.schedulers[with_name] if schedul_hander ~= nil thenself.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)endself.schedulers = {}
endfunction GlobalTimeTicket:hasTicket(with_name)local schedul_hander = self.schedulers[with_name] if schedul_hander ~= nil thenreturn trueendreturn false
endfunction GlobalTimeTicket:getSchedulers()return self.schedulers
end-- 停止定时器
function GlobalTimeTicket:stop()self.is_stop = trueself: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 = 0if table thenfor _ in pairs(table) dolen = len + 1endendreturn len
endfunction 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 thenscroll_view:setDirection(ccui.ScrollViewDir.horizontal)elsescroll_view:setDirection(ccui.ScrollViewDir.vertical)endscroll_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) thenparent_wnd:addChild(scroll_view)endreturn scroll_view
endsvUtil = class("svUtil", function()return ccui.Layout:create()
end)function svUtil:ctor(parent, pos, dir, start_pos, size, setting, ap

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Java自带的VisualVM监控远程服务器部署在Docker容器中的Java项目并使用Mat在线工具排查服务器内存泄露或内存溢出的原因

事情是这样的,我们项目最近应业主的要求迁移到了新的服务器,起初一切正常,部署、上线、测试都没有问题,项目大概运行了一周的工作日时间都没出现问题,直到周六那天,项目经理打电话过来说服务器崩了&#xf…

鼠标不动了怎么办?4招帮你解决问题!

“我在使用鼠标时,用着用着鼠标就动不了了,这是为什么呢?怎么才能让鼠标恢复正常呢?” 鼠标作为电脑使用中最常用的输入设备之一,其正常运行对于我们的工作效率至关重要。然而,有时我们可能会遇到鼠标突然不…

深入学习React开发:从基础到实战

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交流的小伙伴,请点击【全栈技术交流群】 引言 React是一款流行的JavaScript库&#xf…

C#重新认识笔记_ FixUpdate + Update

C#重新认识笔记_ FixUpdate Update Update: 刷新频率不一致,非物理对象的移动,简单的刷新可用, FixedUpdate: 刷新频率一致,按照固定频率刷新,一般调用FixedUpdate之后,会立即进入必要的物理计算中,因此,任何影响刚…

Union和union导致的数据不一致

平时工作中经常用到union,可以自带去重的操作,今天有个汇总的SQL也用了这个,需求是统计多张表的余额字段,看着就很简单union再sum或者sum再union。 第一种每张表先汇总,使用 UNION ALL 合并后最外层再汇总 SELECT SUM(…

【CSP试题回顾】201803-1-跳一跳

CSP-201803-1-跳一跳 解题代码 #include <iostream> using namespace std;int score, s, last_s -1;int main() {while (true){cin >> s;if (s 0) break;else if (s 1) {score s;last_s s;}else if (s 2) {if (last_s>2){score last_s;last_s 2;}else…

Python 界面逻辑分离示例

本示例使用的发卡设备&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.6cc85700Robi3x 一、Python 安装PyQt5&#xff0c;运行 Qt Designer 新建窗体文件&#xff0c;在窗体中拖放控件 完成界面设计&#xff0c;保存为…

克隆图00

题目链接 克隆图 题目描述 注意点 节点数不超过100每个节点值 Node.val 都是唯一的&#xff0c;1 < Node.val < 100无向图是一个简单图&#xff0c;这意味着图中没有重复的边&#xff0c;也没有自环图是连通图&#xff0c;可以从给定节点访问到所有节点 解答思路 本…

活动图高阶讲解-03

1 00:00:00,000 --> 00:00:06,260 刚才我们讲了活动图的历史 2 00:00:06,260 --> 00:00:11,460 那我们来看这个活动图 3 00:00:11,460 --> 00:00:15,260 如果用来建模的话怎么用 4 00:00:15,260 --> 00:00:20,100 按照我们前面讲的软件方法的工作流 5 00:00:20…

【网络安全】手机不幸被远程监控,该如何破解,如何预防?

手机如果不幸被远程监控了&#xff0c;用三招就可以轻松破解&#xff0c;再用三招可以防范于未然。 三招可破解可解除手机被远程监控 1、恢复出厂设置 这一招是手机解决软件故障和系统故障的终极大招。只要点了恢复出厂设置&#xff0c;你手机里后装的各种APP全部将灰飞烟灭…

STM32中断和外部中断

NVIC&#xff1a;嵌套中断向量控制器&#xff1a;用于统一分配中断优先级和管理中断 响应式优先级&#xff1a;也可以称为插队式优先级哪个优先级高优先处理哪个 抢占式优先级&#xff1a;优先级高的可以优先被处理&#xff0c;相当于CPU可以暂时中断当前处理的程序&#xff0c…

深入理解对话框管理器:自定义 TAB 按键行为

有人想开发这样一个功能,说界面上有一个多行文本编辑框,他希望用户按下 TAB 按键后可以将输入焦点导航至其他控件,而不是在文本框里默认地输入一个 TAB 字符。 如果是你,你觉得应该怎样做呢? 他琢磨了一下,觉得应该使用子类化的方式来实现这项功能,代码如下: >&g…

报文解析模块模型

一、引言 报文解析模块是信息系统中关键的一环&#xff0c;它负责接收、验证、解码、提取、处理报文数据&#xff0c;并输出结果。一个高效且稳定的报文解析模块对于确保数据传输的准确性、及时性以及系统的可靠性至关重要。本文档将详细介绍报文解析模块的主要组成部分及其功…

opencv install

安装 opencv 版本为 4.2 一、前置条件 1. gcc安装 yum install gcc2. 安装cmake 注意安装 opencv-4.2 版本&#xff0c;需要 cmake-3.5.1 及其以上&#xff0c;安装脚本如下&#xff1a; #!/bin/bash# 设置下载和安装目录 DOWNLOAD_DIR"/tmp/cmake_download" IN…

提升大模型解释性:新型解释性方法的研究与实践

提升大模型解释性&#xff1a;新型解释性方法的研究与实践 摘要&#xff1a; 随着深度学习技术的快速发展&#xff0c;大模型在各个领域取得了显著成果。然而&#xff0c;这些模型往往缺乏解释性&#xff0c;导致其决策过程难以理解。本文旨在探讨新型解释性方法的研究与实践…

Python算法(列表排序)

一。冒泡排序&#xff1a; 列表每两个相邻的数&#xff0c;如果前面比后面大&#xff0c;则交换这两个数 一趟排序完成后&#xff0c;则无序区减少一个数&#xff0c;有序区增加一个数 时间复杂度&#xff1a;O(n*n) 优化后&#xff1a;已经排序好后立马停止&#xff0c;加快…

【力扣 - 合并区间】

题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [start_i, end_i] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 示例 1&#xff1a; 输入&#xff1a;int…

Github 2024-03-14 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-03-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4Rust项目2Go项目2TypeScript项目2非开发语言项目1C++项目1免费API集合 创建周期:2900 天开发语言:Python协议类型:MIT LicenseSt…

环形缓冲区在stm32上的使用

目录 环形缓冲区在stm32上的使用前言实验目的环形缓冲区的定义和初始化写入数据到环形缓冲区从环形缓冲区读取数据实验结果本文中的实践工程 环形缓冲区在stm32上的使用 本文目标&#xff1a;环形缓冲区在stm32上的使用 按照本文的描述&#xff0c;应该可以跑通实验并举一反三…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&…