2012-12-20 63 views
1

好吧,我刚刚获得了Corona SDK的免费试用版,所以我是Corona的新手。 我想为我的游戏制作一个按钮类。 它有一个白色的背景和黑色的文字。 我希望它按下时反转。 问题在于绘图事件会干扰触摸事件,因为绘图事件会设置颜色,我会在每个enterFrame中调用绘图事件。 如果我可以测试以查看屏幕是否被触摸以及它在enterFrame事件内部被触摸的位置能够解决我的问题,但是据我所知,测试这些东西的方法是在触摸屏内事件。Corona SDK反转按钮

我将如何完成反转?

这里是我的代码:

--Button Class 
local button = {} 
local button_mt = { __index = button } -- metatable 

--button.new function 
function button.new (x, y, width, height, text) -- constructor 

    local newButton = { 
    x = x, 
    y = y, 
    width = width, 
    height = height, 
    text = text, 
    rect = display.newRoundedRect (x-width/2, y-height/2, width, height, 10), 
    displayText = display.newText (text, x, y, native.systemFont, 16), 
    inverted = false, 
    timer = 5 
    }; 

    return setmetatable(newButton, button_mt); 
end 

--Button activate function 
function button:activate() 
self.rect:addEventListener ("touch", self); 
self.displayText:setTextColor (0, 0, 0); 
end 

--Button touch event 
function button:touch (event) 
if event.phase == "ended" or event.phase == "cancelled" then 
    self.inverted = false; 
else 
    self.inverted = true; 
end 
end 

--Button draw function 
function button:draw() 
self.displayText.x = self.x; 
self.displayText.y = self.y; 
self.rect.x = self.x; 
self.rect.y = self.y; 
self.rect.width = self.width; 
self.rect.height = self.height; 
self.displayText.text = self.text; 
if self.inverted then 
    self.displayText:setTextColor (255, 255, 255); 
    self.rect:setFillColor (0, 0, 0); 
else 
    self.displayText:setTextColor (0, 0, 0); 
    self.rect:setFillColor (255, 255, 255); 
end 
end 

return button; 

感谢,

〜耶

编辑:更新的代码注释

编辑:好吧,我取得了一些进展,但现在你的手指必须移动它保持倒置

编辑:Almo圣现在得到了它。该按钮反转并返回,但如果您触摸该按钮并且不松开手指,则将手指从按钮上滑下即可保持倒置。

回答

1

试试这个,setFocus使系统将所有触摸事件放在焦点上。当您在点击或触摸按钮后将焦点设置在按钮上时,焦点将被“劫持”,从现在开始,按钮将跟踪触摸,并且在屏幕上移动手指的任何位置都会继续跟踪它。

只要你抬起你的手指,它将触发“结束”阶段。

请注意,在屏幕上任意提起手指会触发“结束”阶段,因此我建议您使用event.target.contentBounds来跟踪按钮的位置,检查手指是否在里面,并且适当地考虑它一个真正的“结束”事情或“取消”你自己的事情。

function button:touch (event) 
if event.phase == "ended" or event.phase == "cancelled" then 
    display.getCurrentStage():setFocus(nil) 
    self.inverted = false; 
else 
    display.getCurrentStage():setFocus(event.target) 
    self.inverted = true; 
end 
end