1

我正在尝试为我的游戏制作一个按钮类。它具有白色背景和黑色文本。我希望它在按下时反转。

问题是绘图事件干扰了触摸事件,因为绘图事件设置了颜色,并且我在每个 enterFrame 调用绘图事件。如果我可以测试屏幕是否被触摸以及在 enterFrame 事件中被触摸的位置可以解决我的问题,但据我所知,测试这些东西的唯一方法是在触摸事件中。

我将如何完成反转?

这是我的代码:

--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;

编辑:好的,我到了某个地方,但现在你的手指必须移动才能保持倒立

现在差不多明白了。按钮反转并变回,但如果您触摸按钮并且不松开手指,将手指滑离按钮,它会保持反转状态。

4

1 回答 1

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
于 2012-12-21T12:29:31.300 回答