想写好Cocos2dx-Lua,不过还是想用封装版本的来写,省去了更多的代码,所以用了Quick-x。至于Cocos2dx的C++版本给我的感觉就是代码太冗余,不适合敏捷开发。(也许是我的C++太菜的原因 = =)
学习Quick-x,先把大神的samples学一遍。至少开发过程中不会走弯路。
如题:
EditBox学习。
local MainScene = class("MainScene", function()
return display.newScene("MainScene")
end)
function newButton(imageName, listener, setAlpha)
local sprite = display.newScale9Sprite(imageName) --创建9patch图片
if setAlpha == nil then setAlpha = true end
sprite:setTouchEnabled(true) --设置精灵可触摸
sprite:addTouchEventListener(function(event, x, y) --给精灵添加触摸事件
if event == "began" then
print("began~")
if setAlpha then sprite:setOpacity(128) end --触摸时,将透明度设成128范围[0-255]
return true
end
local touchInSprite = sprite:getCascadeBoundingBox():containsPoint(CCPoint(x, y))
if event == "moved" then
if touchInSprite then
if setAlpha then sprite:setOpacity(128) end
else
sprite:setOpacity(255)
end
elseif event == "ended" then
if touchInSprite then listener() end
sprite:setOpacity(255)
else
sprite:setOpacity(255)
end
end)
return sprite
end
function MainScene:ctor()
local btn = newButton("EditBoxBg.png", function ( )
print("button pressed")
end):addTo(self):pos(display.cx - 100, display.cy)
btn:setContentSize(cc.size(120, 160))
local editBox2 = ui.newEditBox({
image = "EditBoxBg.png", --editBox的图片资源(96x96)
size = CCSize(400, 96), --editBox大小
x = display.cx, --x坐标
y = display.cy, --y坐标
listener = function(event, editbox) --监听事件
if event == "began" then --点击editBox时触发(触发顺序1)
self:onEditBoxBegan(editbox)
elseif event == "ended" then --输入结束时触发 (触发顺序3)
self:onEditBoxEnded(editbox)
elseif event == "return" then --输入结束时触发(触发顺序4)
self:onEditBoxReturn(editbox)
elseif event == "changed" then --输入结束时触发(触发顺序2)
self:onEditBoxChanged(editbox)
else
printf("EditBox event %s", tostring(event))
end
end
})
editBox2:setReturnType(kKeyboardReturnTypeSend)
self:addChild(editBox2)
local btn = newButton("EditBoxBg.png", function ( )
print("button pressed")
end):addTo(self):pos(display.cx + 100, display.cy)
btn:setContentSize(cc.size(120, 160))
end
--获取editBox中的内容 getText()
function MainScene:onEditBoxBegan(editbox)
printf("editBox1 event began : text = %s", editbox:getText())
end
function MainScene:onEditBoxEnded(editbox)
printf("editBox1 event ended : %s", editbox:getText())
end
function MainScene:onEditBoxReturn(editbox)
printf("editBox1 event return : %s", editbox:getText())
end
function MainScene:onEditBoxChanged(editbox)
printf("editBox1 event changed : %s", editbox:getText())
end
function MainScene:onEnter()
if device.platform ~= "android" then return end
-- avoid unmeant back 避免偶然的返回事件,所以将函数的执行推后0.5S
self:performWithDelay(function()
-- keypad layer, for android
local layer = display.newLayer()
layer:addKeypadEventListener(function(event) --添加键盘事件监听
if event == "back" then game.exit() end --back键的消息
end)
self:addChild(layer) --场景上添加Layer。
layer:setKeypadEnabled(true) --设置键盘监听事件可用
end, 0.5)
end
return MainScene
效果图如下:
总结:给精灵添加事件以后的触摸机制问题,点击精灵时,触发began方法,然后按住鼠标不放,在拖拽的过程中不停的调用moved方法,在鼠标在释放的时候,调用了一次ended方法。这个就是触摸的调用相关。只要你点击了精灵,必定触发began事件。只要你释放了点击,必定调用一次ended方法。
然后就是需要注意began里面的return true、这个的作用是让触摸事件继续被moved、ended方法监听。如果不加return true,触摸的监听会只执行began,而moved和ended方法是进不去的,更别说在moved和ended方法中处理什么事件了。
回顾一下,如何让精灵启动监听,首先创建精灵,setTouchEnabled(),addTouchEventListener(),然后就可以启动精灵的触摸点击监听了。
editBox的大小影响着字体的大小,使用setFontSize()无效、目前我的解决方法是,使用一层透明的image加载上去,调整大小,让Size小点,然后就可以让字体小点了。