1

ゲーム用のボタン クラスを作成しようとしています。背景は白、文字は黒です。押したときに反転させたい。

問題は、描画イベントが色を設定し、enterFrame ごとに描画イベントを呼び出すため、描画イベントがタッチ イベントに干渉することです。画面がタッチされているかどうか、および enterFrame イベント内でタッチされている場所をテストできれば問題は解決しますが、これらをテストする唯一の方法は touch イベント内です。

どうすれば反転できますか?

これが私のコードです:

--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 に答える