-- create object
local myObject = display.newRect( 0, 0, 100, 100 )
myObject:setFillColor( 255 )
-- touch listener function
function myObject:touch( event )
if event.phase == "began" then
self.markX = self.x -- store x location of object
self.markY = self.y -- store y location of object
elseif event.phase == "moved" then
local x = (event.x - event.xStart) + self.markX
local y = (event.y - event.yStart) + self.markY
self.x, self.y = x, y -- move object based on calculations above
end
return true
end
-- make 'myObject' listen for touch events
myObject:addEventListener( "touch", myObject )
実際に動かしてみるとわかるのですが、タッチ操作(指の動き)にオブジェクトが追従してきません。最初はfpsが低いのかなとも思ったのですが、60fpsに設定しても変わりませんでした。ソース的には何も間違っていないような印象があったのですが、別のサンプルコードを見つけて納得しました。上記のコードでは指の動きが少しでも早くなると、オブジェクトに対するイベントがすぐに外れてしまうため、操作に対する追従が悪かったのです。
実践的というか使えるコードとしては以下の様になります。
-- create object
local myObject = display.newRect( 0, 0, 100, 100 )
myObject:setFillColor( 255 )
-- touch listener function
function myObject:touch( event )
local t = event.target
local phase = event.phase
if("began" == phase) then
display.getCurrentStage():setFocus(t)
t.isFocus = true
t.x0 = event.x - t.x
t.y0 = event.y - t.y
elseif(t.isFocus) then
if("moved" == phase) then
t.x = event.x - t.x0
t.y = event.y - t.y0
elseif("ended" == phase or "cancelled" == phase) then
display.getCurrentStage():setFocus(nil)
t.isFocus = false
end
end
return true
end
-- make 'myObject' listen for touch events
myObject:addEventListener( "touch", myObject )
オブジェクトに対する操作(イベント)が終わるまでフォーカスが外れないようになっています。これで指をグリグリ動かしてもオブジェクトが追従してくれるようになりました。
せっかくタッチパネル向けにアプリをつくるなら、ボタンをタップするだけじゃなくて、指で操作させたい(したい)ですよね。

0 件のコメント:
コメントを投稿