1.精灵
(1) 异步加载、切图
local textureDog = cc.Director:getInstance():getTextureCache():addImage("dog.png")
local frame0 = cc.SpriteFrame:createWithTexture(textureDog,rect)
local spriteDog = cc.Sprite:createWithSpriteFrame(frame0)
local frameCrop = cc.SpriteFrame:create("crop.png", cc.rect(0,0,105,95)) 切图
local spriteCrop = cc.Sprite:createWithSpriteFrame(frameCrop)
(2)例子
local function addSprite(img, posx, posy, scale, zorder, parent, tag)
local sprite = cc.Sprite:create(img)
sprite:setScale(scale)
sprite:setPosition(posx, posy)
parent:addChild(sprite, zorder)
if tag then
sprite:setTag(tag)
end
return sprite
end
2.图片按钮还有其他按钮
local function addMenu(imgn, imgs, imgd, callback, posx, posy, parent, zorder)
local sNormal = cc.Sprite:createWithTexture(cc.TextureCache:sharedTextureCache():addImage(imgn))
local sSelected = cc.Sprite:createWithTexture(cc.TextureCache:sharedTextureCache():addImage(imgs));
local sDisabled = cc.Sprite:createWithTexture(cc.TextureCache:sharedTextureCache():addImage(imgd));
local item = cc.MenuItemSprite:create(sNormal, sSelected, sDisabled)
item:registerScriptTapHandler(callback)
item:setPosition(posx, posy)
local menu = cc.Menu:create()
menu:addChild(item)
menu:setPosition(0, 0)
parent:addChild(menu, zorder)
return item
end
定时
local function schduleT(tt) --约等于1
print(tt)
end
local schedulerID = cc.Director:getInstance():getScheduler():scheduleScriptFunc(schduleT, 1, false)
cc.Director:getInstance():getScheduler():unscheduleScriptEntry(schedulerID)
不用plist的贞动画
local function aniFrame(bimg, rectTab, times, posx, posy, layerFarm)
local textureDog = cc.Director:getInstance():getTextureCache():addImage(bimg)
local tab = {}
local spriteDog = nil
for i=1, #rectTab do
local frame = cc.SpriteFrame:createWithTexture(textureDog, rectTab[i])
table.insert(tab, i, frame)
print(' 222 '..i)
if i == 1 then
spriteDog = cc.Sprite:createWithSpriteFrame(frame)
spriteDog:setPosition(posx, posy)
layerFarm:addChild(spriteDog)
end
end
local animation = cc.Animation:createWithSpriteFrames(tab, times)
local animate = cc.Animate:create(animation);
spriteDog:runAction(cc.RepeatForever:create(animate))
return spriteDog
end
local tab = {cc.rect(0, 0, frameWidth, frameHeight), cc.rect(frameWidth, 0, frameWidth, frameHeight)}
aniFrame("dog.png", tab, 0.25, origin.x, origin.y + visibleSize.height / 4 * 3, layerFarm)
触屏事件
touch:getLocation() 整个屏幕坐标
target:convertToNodeSpace(touch:getLocation()) 触摸对象坐标,根据对象大小和坐标可以判断是否触摸到此精灵
local function onTouchBegan(touch, event)
local location = touch:getLocation()
local target = event:getCurrentTarget()
local tlocation = target:convertToNodeSpace(touch:getLocation())
-- local location = touches[1]:getLocation() --多点触摸
return true --只有true才会触发 move end
end
local function onTouchMoved(touch, event)
local delta = touch:getDelta() --delta.x delta.y
end
local function onTouchEnded(touch, event)
end
-- cc.EventListenerTouchAllAtOnce:create() --多点触摸
local listener = cc.EventListenerTouchOneByOne:create()
listener:setSwallowTouches(true) --ture不会向下传递触摸
listener:registerScriptHandler(onTouchBegan,cc.Handler.EVENT_TOUCH_BEGAN )
listener:registerScriptHandler(onTouchMoved,cc.Handler.EVENT_TOUCH_MOVED )
listener:registerScriptHandler(onTouchEnded,cc.Handler.EVENT_TOUCH_ENDED )
local eventDispatcher = bg:getEventDispatcher()
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, bg)
屏蔽层
(1)只触发按钮不触发屏蔽层
按钮里的 :setSwallowTouches(true) 默认的 事件不想下传递
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layerFarm)
根据在scene层级(zorder)高低,设置触摸事件的优先级,按钮没有想 2.x 哪样设置了 -128 的优先级,
3.x 依靠scene 的渲染先后,设置触摸事件的优先级。
如果 layerFarm 是一个sprite,sprite 的层(zorder)比按钮高,切 :setSwallowTouches(true) 则不会相应按钮事件。
如果 layerFarm 是一个sprite,通过方法 target:convertToNodeSpace(touch:getLocation()) sprite的左小脚是触摸的 (0,0)点。
(2)按钮和屏蔽层都触发
没有绑定触摸对象,设置触摸的优先级,猜测可能是设置了 精灵的 zorder层级
listener:setSwallowTouches(false)
eventDispatcher:addEventListenerWithFixedPriority(listener,-10)
(3)只触发屏蔽层
listener:setSwallowTouches(true)
eventDispatcher:addEventListenerWithFixedPriority(listener,-10)
(4)lua下不行
绑定对象设置精灵的层级。
eventDispatcher:addEventListenerWithSceneGraphPriority(listener, layerFarm)
eventDispatcher:setPriority(listener,-1000)
个人理解加载和释放调用
local function onNodeEvent(event)
if "exit" == event then
cclog('exit')
end
if "enter" == event then
cclog('enter')
end
end
bg:registerScriptHandler(onNodeEvent)