在cocos2dx lua 加密的lua中 怎么添加CCTableView

推荐这篇日记的豆列
······cocos2dx 3.2之Lua打飞机项目
创建lua打飞机项目
cocos new T32Lua -dE:\Installed\cocos2d-x-3.2\cocos2d-x-3.2\projects -l lua
Common.lua
--用于打印日志信息
function cclog(...)
print(string.format(...))
function createBackMenu(node, callback)
-- 获得窗口的大小
local winSize = cc.Director:getInstance():getWinSize()
-- 创建菜单
local menu = cc.Menu:create()
-- node中加入菜单
node:addChild(menu)
--local function startGame()
cc.Director:getInstance():replaceScene(SceneMenu())
-- 加菜单项
local menuItem = cc.MenuItemImage:create("btn_back_normal.png", "btn_back_press.png")
-- 菜单中添加菜单项
menu:addChild(menuItem)
-- 注册处理函数
menuItem:registerScriptTapHandler(callback) -- 注册处理函数
-- menu的锚点默认是在屏幕正中间的,将它设置在屏幕右下角
menuItem:setAnchorPoint(cc.p(1, 0))
-- 重新设置菜单项的位置
menuItem:setPosition(winSize.width/2, -winSize.height/2);
-- 设置缩放,在2.3中x方向和y方向上的缩放比例必须相同,但是在3.2中没有限制
menuItem:setScale(2)
-- 设置触摸事件
function regTouch(node, onTouchBegan, onTouchEnded, onTouchMoved)
local evListen = cc.EventListenerTouchOneByOne:create()
evListen:registerScriptHandler(onTouchBegan, cc.Handler.EVENT_TOUCH_BEGAN)
-- 如果onTouchEnded不为空
if onTouchEnded ~= nil then
evListen:registerScriptHandler(onTouchEnded, cc.Handler.EVENT_TOUCH_ENDED)
-- 如果onTouchMoved不为空
if onTouchMoved ~= nil then
evListen:registerScriptHandler(onTouchMoved, cc.Handler.EVENT_TOUCH_MOVED)
local evDisp = node:getEventDispatcher()
evDisp:addEventListenerWithSceneGraphPriority(evListen, node)
LayerScrollBackground.lua
滚动的背景
require "Common"
function LayerScrollBackground()
local layer = cc.Layer:create()
-- 获得屏幕的大小
local winSize = cc.Director:getInstance():getWinSize()
local bg = cc.Sprite:create("background.png")
-- 层中添加作为背景的精灵
layer:addChild(bg)
-- 设置精灵的锚点
bg:setAnchorPoint(0, 0)
-- 需要两个动作,一个动作向下移动,一个动作设置位置
local action1 = cc.MoveBy:create(10, {x=0, y=-winSize.height})
local action2 = cc.Place:create({x=0, y=0})
local action = cc.Sequence:create(action1, action2)
-- 执行动作
bg:runAction(cc.RepeatForever:create(action))
return layer
SceneMenu.lua 菜单
require "Common"
require "LayerScrollBackground"
require "SceneGame"
function SceneMenu()
local scene = cc.Scene:create()
local winSize = cc.Director:getInstance():getWinSize()
-- 滚动的背景
local bgLayer = LayerScrollBackground()
scene:addChild(bgLayer)
-- ScrollView
cc.SpriteFrameCache:getInstance():addSpriteFrames("chooselevel.plist")
local node = cc.Node:create()
for i = 1, 5 do
local spriteName = "ChooseLevel" .. i ..
local spriteFrame = cc.SpriteFrameCache:getInstance():getSpriteFrame(spriteName)
local sprite = cc.Sprite:createWithSpriteFrame(spriteFrame)
node:addChild(sprite)
sprite:setPosition(winSize.width/2 + winSize.width*(i-1), winSize.height/2)
sprite:setTag(1000+i)
local scrollView = cc.ScrollView:create(winSize, node)
scene:addChild(scrollView)
scrollView:setContentSize(winSize.width*5, winSize.height)
scrollView:setDirection(0)
-- 增加Touch处理
local function onTouchBegan(touch, event)
return true
local function onTouchEnded(touch, event)
local sLoc = touch:getStartLocation()
local dLoc = touch:getLocation()
local d = {x=sLoc.x - dLoc.x, y=sLoc.y-dLoc.y}
local pt = node:convertToNodeSpace(sLoc)
if d.x*d.x&#43;d.y*d.y < 25 then
for i=1, 5 do
local sprite = node:getChildByTag(1000&#43;i)
local rc = sprite:getBoundingBox()
if cc.rectContainsPoint(rc, pt) then
cc.Director:getInstance():replaceScene(SceneGame(i))
cclog("start new game " .. i)
regTouch(scene, onTouchBegan, onTouchEnded)
local function Back()
cc.Director:getInstance():replaceScene(SceneStart())
createBackMenu(scene, Back)
return scene
SceneStart.lua
require "SceneMenu"
require "Common"
function SceneStart()
local scene = cc.Scene:create()
local winSize = cc.Director:getInstance():getWinSize()
cclog(winSize.width .. winSize.height)
-- 加背景图片
local bg = cc.Sprite:create("background.png")
scene:addChild(bg)
bg:setPosition(winSize.width/2, winSize.height/2)
-- 加菜单按钮
local menu = cc.Menu:create()
scene:addChild(menu)
local function startGame()
cc.Director:getInstance():replaceScene(SceneMenu())
-- 加菜单项
local menuItemStart = cc.MenuItemImage:create("btn1_normal.png", "btn1_push.png")
menu:addChild(menuItemStart)
menuItemStart:registerScriptTapHandler(startGame) -- 注册处理函数
return scene
SceneGame.lua
require "Common"
require "LayerScrollBackground"
function SceneGame(idx)
local scene = cc.Scene:create()
local winSize = cc.Director:getInstance():getWinSize()
-- 滚动的背景
local bgLayer = LayerScrollBackground()
-- 场景中加上层
scene:addChild(bgLayer)
-- 数据结构,子弹的数组和敌机的数组
local bullets = {}
-- 添加敌机
local enemys = {}
-- 创建英雄战机
local plane = cc.Sprite:create("Player" .. idx .. ".png")
-- 场景中添加飞机
scene:addChild(plane)
-- 设置飞机的位置
plane:setPosition(winSize.width/2, plane:getBoundingBox().height)
-- 设置plane的ZOrder
plane:setLocalZOrder(100)
----- 加载战斗机的属性
local vm =
cc.FileUtils:getInstance():getValueMapFromFile("planeinfo.xml");
plane.damage = tonumber(vm["planedamageamount" .. idx])
plane.hp = tonumber(vm["plane" .. idx .. "_hp"])
plane.cd = tonumber(vm["planeshootspeedrate" .. idx])
plane.curCD = 0;
cclog(plane.damage .. " " .. plane.hp .. " " .. plane.cd)
-- 显示分数和血的Label
local labelScore = nil
local labelHP = nil
local function createLabels()
-- 设置label
labelHP = cc.Label:createWithSystemFont("" .. plane.hp, "Arial", 50)
-- 设置Label的锚点
labelHP:setAnchorPoint(cc.p(1, 1))
-- 设置锚点的位置
labelHP:setPosition(winSize.width, winSize.height)
scene:addChild(labelHP)
labelHP:setLocalZOrder(1010)
labelScore = cc.Label:createWithSystemFont("0", "Arial", 50)
labelScore:setAnchorPoint(cc.p(0, 1))
labelScore:setPosition(0, winSize.height)
scene:addChild(labelScore)
labelScore:setLocalZOrder(1010)
createLabels()
-- 移动飞机
-- 增加Touch处理
local function onTouchBegan(touch, event)
return true
local function onTouchMoved(touch, event)
local x, y = plane:getPosition()
local d = touch:getDelta()
plane:setPosition(x&#43;d.x, y&#43;d.y)
local function onTouchEnded(touch, event)
regTouch(scene, onTouchBegan, onTouchEnded, onTouchMoved)
------------------- shoot
-- angle参数代表的发射角度,delta表示子弹发射的起始位置和英雄战机的位置的偏移
local function shootOne(angle, delta)
cc.SimpleAudioEngine:getInstance():playEffect("m/bullet.wav")
local bullet = cc.Sprite:create("Bullet.png")
scene:addChild(bullet)
local x, y = plane:getPosition()
bullet:setPosition(x&#43;delta.x, y&#43;delta.y)
bullet:setRotation(angle)
-- math.rad(角度) 把角度转换成弧度
local dx = math.sin( math.rad(angle) ) * winSize.height
local dy = math.cos( math.rad(angle) ) * winSize.height
local moveBy = cc.MoveBy:create(5, cc.p(dx, dy))
bullet:runAction(moveBy)
-- 子弹保存在数组里
table.insert(bullets, bullet)
local function Shoot()
local sizePlane = plane:getContentSize()
if idx == 1 then
shootOne(0, cc.p(0, sizePlane.height/2))
elseif idx == 2 then
shootOne(0, cc.p(0, sizePlane.height/2))
shootOne(0, cc.p(-sizePlane.width/4, sizePlane.height/4))
shootOne(0, cc.p(sizePlane.width/4, sizePlane.height/4))
elseif idx == 3 then
shootOne(0, cc.p(0, sizePlane.height/2))
shootOne(-30, cc.p(0, sizePlane.height/2))
shootOne(30, cc.p(0, sizePlane.height/2))
elseif idx == 4 then
shootOne(0, cc.p(0, sizePlane.height/2))
shootOne(180, cc.p(0, -sizePlane.height/2))
shootOne(90, cc.p(sizePlane.width/2, 0))
shootOne(270, cc.p(-sizePlane.width/2, 0))
elseif idx==5 then
shootOne(45, cc.p(0, 0))
shootOne(45&#43;90, cc.p(0, 0))
shootOne(45&#43;180, cc.p(0, 0))
shootOne(45&#43;270, cc.p(0, 0))
local function tickShoot()
plane.curCD = plane.curCD &#43; 1
if plane.curCD >= plane.cd then
plane.curCD = 0
local tickShootID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(tickShoot, 0, false)
-- 检查子弹是否飞出窗口外
local function checkBulletAndEnemy()
-- 得到子弹数量
local n = table.getn(bullets)
for i = n, 1, -1 do
local bullet = bullets[i]
-- 判断bullet是不是出了窗口
local x, y = bullet:getPosition()
if x<0 or ywinSize.width or y > winSize.height then
bullet:removeFromParent()
table.remove(bullets, i) -- 从bullets数组中,删除下标为i的元素
cclog("bullet is out of window")
n = table.getn(enemys)
for i = n, 1, -1 do
local enemy = enemys[i]
-- 判断enemy是不是出了窗口
local x, y = enemy:getPosition()
if y < -enemy:getContentSize().height/2 then
enemy:removeFromParent()
table.remove(enemys, i) -- 从enemys数组中,删除下标为i的元素
local tickCheckBullet = cc.Director:getInstance():getScheduler():scheduleScriptFunc(checkBulletAndEnemy, 0, false)
-- 产生敌机的定时器
local function genEnemy(type)
-- 创建敌机精灵,加入到数组,加入渲染树
-- 增加敌机属性
-- 随机设置位置
local enemy = cc.Sprite:create("Enemy" .. type .. ".png")
table.insert(enemys, enemy)
scene:addChild(enemy)
-- 敌军飞机的额外属性
local hp = {10, 30, 100}
enemy.hp = hp[type]
local score = {, 10000}
enemy.score = score[type]
local speed = {150, 100, 50}
enemy.speed = speed[type]
enemy.type = type
-- 设置初始位置
local sizePlane = enemy:getContentSize()
math.randomseed(os.time())
local x = math.random(sizePlane.width/2, winSize.width-sizePlane.width/2)
local y = winSize.height &#43; sizePlane.height/2
enemy:setPosition(x, y)
-- 设置飞机飞行动作
local distance = winSize.height &#43; sizePlane.height &#43; 5
local moveBy = cc.MoveBy:create(distance*1.0/enemy.speed, cc.p(0, -distance))
enemy:runAction(moveBy)
local function genEnemy1()
genEnemy(1)
local function genEnemy2()
genEnemy(2)
local function genEnemy3()
genEnemy(3)
local tickGenEnemy1 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy1, 1, false)
local tickGenEnemy2 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy2, 3, false)
local tickGenEnemy3 = cc.Director:getInstance():getScheduler():scheduleScriptFunc(genEnemy3, 10, false)
local function loadBoomAnimation()
local spriteFrameCache = cc.SpriteFrameCache:getInstance()
spriteFrameCache:addSpriteFrames("PFBoom.plist")
-- CCArray* arr = CCArray:create()
local spriteFrames = {}
for i = 1, 18 do
local spriteFrame = spriteFrameCache:getSpriteFrame("Boom_" .. i .. ".png")
table.insert(spriteFrames, spriteFrame)
local animation = cc.Animation:createWithSpriteFrames(spriteFrames, 0.05)
cc.AnimationCache:getInstance():addAnimation(animation, "ENEMYBOOM")
loadBoomAnimation()
local function removeEnemy(node, tab)
node:removeFromParent()
local function enemyBoom(idx)
local enemy = enemys[idx]
cc.SimpleAudioEngine:getInstance():playEffect("m/enemy" .. enemy.type .. "_down.wav")
-- 增加分数
local score = labelScore:getString()
score = tonumber(score) &#43; enemy.score
labelScore:setString("" .. score)
table.remove(enemys, idx)
-- 执行爆炸动画,然后再调用removeFromParent
local animation = cc.AnimationCache:getInstance():getAnimation("ENEMYBOOM")
local animate = cc.Animate:create(animation)
local callfunc = cc.CallFunc:create(removeEnemy)
local seq = cc.Sequence:create(animate, callfunc)
enemy:runAction(seq)
-- enemy:removeFromParent()
local function collision()
local nEnemy = table.getn(enemys)
local rcPlane = plane:getBoundingBox()
for i = nEnemy, 1, -1 do
local enemy = enemys[i]
local rcEnemy = enemy:getBoundingBox()
local bEnemyBoom = false
-- 如果敌机和英雄战机碰撞, rcEnemy, rcPlane
if cc.rectIntersectsRect(rcEnemy, rcPlane) then
plane.hp = plane.hp - enemy.hp
labelHP:setString("" .. plane.hp)
if plane.hp <= 0 then
cc.Director:getInstance():replaceScene(SceneMenu())
enemyBoom(i)
bEnemyBoom = true
-- 跟子弹进行碰撞检测
if bEnemyBoom == false then
local nBullet = table.getn(bullets)
for j = nBullet, 1, -1 do
local bullet = bullets[j]
-- 如果子弹和敌机碰撞
local ptBullet = cc.p( bullet:getPosition() )
if cc.rectContainsPoint(rcEnemy, ptBullet) then
bullet:removeFromParent()
table.remove(bullets, j)
enemy.hp = enemy.hp - plane.
if enemy.hp <= 0
enemyBoom(i)
-- 表示这个敌机不再和下一个子弹做碰撞检测
local tickCollisionID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(collision, 0, false)
local function Back()
cc.Director:getInstance():replaceScene(SceneMenu())
createBackMenu(scene, Back)
-- 注销定时器
local function onNodeEvent(event)
if "enter" == event then
cclog("OnEnter")
cc.SimpleAudioEngine:getInstance():playMusic("m/game_music.wav", true)
if "exit" == event then
cc.SimpleAudioEngine:getInstance():stopMusic()
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickShootID)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickCheckBullet)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy1)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy2)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickGenEnemy3)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(tickCollisionID)
scene:registerScriptHandler(onNodeEvent)
return scene
--引入lua的方式是通过require
require "Cocos2d"
require "Cocos2dConstants"
-- cclog 打印日志的方式
cclog = function(...)
print(string.format(...))
-- for CCLuaEngine traceback
lua中连接字符串的方式是通过 .. 实现的
function __G__TRACKBACK__(msg)
cclog("----------------------------------------")
cclog("LUA ERROR: " .. tostring(msg) .. "\n")
cclog(debug.traceback())
cclog("----------------------------------------")
return msg
local function main()
collectgarbage("collect")
-- avoid memory leak
collectgarbage("setpause", 100)
collectgarbage("setstepmul", 5000)
-- initialize director
lua中定义局部变量的是通过local的方式
local director = cc.Director:getInstance()
local glview = director:getOpenGLView()
if nil == glview then
glview = cc.GLView:createWithRect('HelloLua', cc.rect(0,0,768/2,1280/2))
director:setOpenGLView(glview)
-- 设置设计分辨率,这个就是图片的实际大小
glview:setDesignResolutionSize(768, 1280, cc.ResolutionPolicy.NO_BORDER)
--turn on display FPS
director:setDisplayStats(true)
--set FPS. the default value is 1.0/60 if you don't call this
director:setAnimationInterval(1.0 / 60)
-- 设置加载的文件包
cc.FileUtils:getInstance():addSearchPath("src")
cc.FileUtils:getInstance():addSearchPath("res")
local targetPlatform = cc.Application:getInstance():getTargetPlatform()
if (cc.PLATFORM_OS_IPHONE == targetPlatform) or (cc.PLATFORM_OS_IPAD == targetPlatform) or
(cc.PLATFORM_OS_ANDROID == targetPlatform) or (cc.PLATFORM_OS_WINDOWS == targetPlatform) or
(cc.PLATFORM_OS_MAC == targetPlatform) then
cclog("result is ")
--require('debugger')()
-----------------------------------------------
-- 自定义的文件的require必须在 addSearchPath之后,2.2.3没有这个问题
require "SceneStart"
cc.Director:getInstance():runWithScene(SceneStart())
local status, msg = xpcall(main, __G__TRACKBACK__)
if not status then
error(msg)
运行结果:
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'代码用的是&&中的代码.&
在上篇的基础上进行扩充.
local function process_packet(user_data)
if user_data then
user_data = tolua.cast(user_data, "user_data");
print (user_data:uid());
print (user_data:uname());
local ghall = hall:get_singleton_ptr();
ScriptHandlerMgr:getInstance():registerScriptHandler(tolua.cast(ghall, "cc.Ref"), process_packet, cc.Handler.CALLFUNC);
在C++添加对此函数的调用
void hall::process_packet()
auto engine = cocos2d::LuaEngine::getInstance();
ud("kukudi", 10001);
cocos2d::BasicScriptData
scriptdata(this, &ud);
cocos2d::ScriptEvent
eve(cocos2d::ScriptEventType::kCallFuncEvent, &scriptdata);
engine-&sendEvent(&eve);
执行结果, 输出1001 kukudi
我遇到一些问题在此记录一下1. user_data, 这个要传到lua函数中的数据对象必须继续自cocos2d::Ref类, (当然了, 继续自Ref的子类也可以的), 否则程序会崩溃, 因为在int LuaEngine::handleCallFuncActionEvent(void* data)里面有这样一句话:Ref* target = static_cast&Ref*&(basicScriptData-&value);可以看出来, 它的父类必须是Ref类.2. user_data, 想要直接使用成员对象是不行的, 我之前将成员对象设置成public, 想在脚本中直接对成员对象直接操作, 后来发现lua_hall_auto.cpp文件中根本没有对这些成员对象进行转换, 所以得把它封装起来, 用成员函数对其成员对象进行操作.3. 如果要调用多个脚本函数怎么办呢? 我发现cc.Handler.CALLFUNC只能指定一个脚本函数, 再指定其它的脚本函数必须得用另一个handletype值, 还有就是这个cc.Handler.CALLFUNC这个对象的脚本函数只能使用一个参数或者不使用参数, 关于这方面的应用我还没有研究很深, 就目前看来, 只能调用一个函数, 并且函数只能有一个参数, 这就够用了, 在此lua函数中做分支来分派给其它的脚本函数来处理数据, 至于传入到lua函数中的数据只要继承自Ref这个类, 多写几个不同的对象也是可以的, 这个没有什么大的问题;4. 有一个比较困惑,&int ScriptHandlerMgr::getObjectHandler(void* object,ScriptHandlerMgr::HandlerType handlerType)在这个函数,&每个lua_function对应一个唯一的handletype, 那为什么这个里面还要使用for循环来遍历呢?&为什么不将handletype & lua_function作map映射呢?
5. 在lua中调用tolua.cast(obj, "hall"); 转换成自定义的类型时会出现Cast name user_data doesn't include modular name which it belongs to,please add the modular name这样的信息, 不用理它; 如果你跟踪源代码会发现像Ref这样的类是这样对应的Ref:cc.Ref, 我自己定义的类没有这些模块, 所以不用理它, 它也就是一个提示信息, 而已
阅读(...) 评论()3129人阅读
游戏开发(19)
在手机游戏的开发中,滚动是一项非常重要的操作,而cocos2dx中使用的最广泛的就属于TableView了,不过由于cocos2dx的接口比较晦涩,所以需要一个熟悉的过程。本文主要讲解如何使用TableView。 首先当然是创建一个TableView,这比较简单,和其他控件差不多。看看示例代码:
self._skillView = cc.TableView:create(cc.size(winSize.width / 3 - 50, winSize.height - 140))
self._skillView:setDirection(cc.SCROLLVIEW_DIRECTION_VERTICAL)
self._skillView:setVerticalFillOrder(cc.TABLEVIEW_FILL_TOPDOWN)
self._skillView:setPosition(cc.p(50, 10))
self._skillView:setDelegate()
skill_bg:addChild(self._skillView) 需要注意的是setDirection的参数,cc.SCROLLVIEW_DIRECTION_VERTICAL表示在垂直方向滚动,cc.SCROLLVIEW_DIRECTION_HORIZONTAL则表示在水平方向滚动。 其次为TableView设置一些回调函数。主要有4个回调函数。先看看示例代码:
self._skillView:registerScriptHandler(SkillBoard.tableCellTouched, cc.TABLECELL_TOUCHED)
self._skillView:registerScriptHandler(SkillBoard.cellSizeForTable, cc.TABLECELL_SIZE_FOR_INDEX)
self._skillView:registerScriptHandler(SkillBoard.tableCellAtIndex, cc.TABLECELL_SIZE_AT_INDEX)
self._skillView:registerScriptHandler(SkillBoard.numberOfCellsInTableView, cc.NUMBER_OF_CELLS_IN_TABLEVIEW) TABLECELL_TOUCHED:TableView被触摸的时候的回调,主要用于选择TableView中的Cell。 TABLECELL_SIZE_FOR_INDEX:此回调需要返回TableView中Cell的尺寸大小。 TABLECELL_SIZE_AT_INDEX:此回调需要为TableView创建在某个位置的Cell。 NUMBER_OF_CELLS_IN_TABLEVIEW:此回调需要返回TableView中Cell的数量。 然后,我们先看最简单的两个回调函数的示例:function SkillBoard.cellSizeForTable(view, idx)
return 200, 200
function SkillBoard.numberOfCellsInTableView(view)
return table.size(local_skills)
end 参数中的view表示TableView对象,idx表示Cell的索引。 再次,我们看看触摸函数,参数cell表示哪一个cell被触摸到了。function SkillBoard.tableCellTouched(view, cell)
local self = GUI.GetGUI(&SkillBoard&)
if self:isOpened() then
for cl, sitem in pairs(self._skillItems) do
local issel = (cl == cell)
sitem:select(issel)
if issel then
self:onClickSkill(sitem:getSkill())
& 最后,看看最重要的函数,就是映射cell的接口,idx表示cell的索引。function SkillBoard.tableCellAtIndex(view, idx)
local self = GUI.GetGUI(&SkillBoard&)
local cell = view:dequeueCell()
if not cell then
cell = cc.TableViewCell:new()
return cell
& 是不是特别简单呢?如果需要多样化的cell,比如物品栏,技能栏这些功能,只需要在cell上扩展,创建一些精灵或者按钮,作为cell的子节点加到cell上即可。例如:
cell = cc.TableViewCell:new()
local image1 = CHOOSE_SERVER_AREA_NORMAL
local sprite1 = cc.Sprite:createWithSpriteFrameName(image1)
sprite1:setAnchorPoint(cc.p(0, 0))
sprite1:setPosition(cc.p(0, 0))
sprite1:setTag(1)
cell:addChild(sprite1)
local image2 = CHOOSE_SERVER_AREA_SELECTED
local sprite2 = cc.Sprite:createWithSpriteFrameName(image2)
sprite2:setAnchorPoint(cc.p(0, 0))
sprite2:setPosition(cc.p(0, 0))
sprite2:setTag(2)
cell:addChild(sprite2)
local label = cc.Label:createWithSystemFont(strValue, DEFAULT_FONT_TTF, 20)
label:setAnchorPoint(cc.p(0.5, 0.5))
label:setPosition(cc.p(77, 30))
label:setTag(3)
cell:addChild(label)
& 好了,基本的使用方法就如此了,但是。。但是,还有最重要的一点,需要大家注意的。 numberOfCellsInTableView返回的个数和TableView创建的cell数量通常是不一样的,这是因为cocos2dx设计上为了节省资源,创建的cell数量 = tabview的高度 / 单个cell的高度 + 1。所以在触摸和选中等逻辑处理的时候,一定不能使用cell来标识。因为同一个cell物理对象,可能会映射N个逻辑对象。 通常我的做法是在tableCellAtIndex中把当前cell对应的逻辑对象存起来,这样在tableCellTouched就可以直接找到物理cell对应的逻辑对象来处理了。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:189354次
积分:2715
积分:2715
排名:第9860名
原创:59篇
评论:249条
文章:25篇
阅读:76369
文章:17篇
阅读:70942
(3)(1)(1)(2)(3)(1)(2)(6)(2)(5)(3)(2)(1)(2)(5)(2)(3)(1)(2)(1)(4)(7)(1)

我要回帖

更多关于 cocos2dx lua 热更新 的文章

 

随机推荐