表示グループを作成してそこにいくつかのアイテムを入れ、表示グループをスライドして画面外のアイテムに到達して戻ってくるスライド機能のリスナーを追加しました。また、アイテムをドラッグする関数を呼び出すアイテムのタッチ リスナーを追加したいと考えています。では、これらのリスナーを互いに干渉させずにそれを達成するにはどうすればよいでしょうか?
これが写真です:
これらすべての円と数字を青い四角形に表示グループに配置し、そのグループにタッチ イベント リスナーを追加しました。
ballGroup.touch=slide
ballGroup:addEventListener("touch", ballGroup)
また、ボール用の別のタッチ イベント リスナーを追加できるようにしたいと考えています。
function createBall()
local ball = display.newCircle(x, H/2-25, 50)
local label = display.newText(""..count, ball.x, ball.y, nil , 35)
label:setTextColor ( 255, 0, 0 )
ball.no = count
ball.touch=chooseBall
ball:addEventListener("touch", ball)
ballGroup:insert(ball)
ballGroup:insert(label)
count=count+1
x=x+120
end
ただ、最初に書いた関数のイベントを聞いているだけです。私が望むものを達成するために私に何を提案しますか? ボールをスライドさせようとすると、スライドイベントをリッスンしたいだけで、ボールをドラッグしようとすると、ドラッグイベントをリッスンしたい. どうやってやるの?
わかりました、ロブの提案の後に思いついたコード全体を共有していますが、それでも機能せず、アウトロー IDE で次のエラーが発生します。
x0(nil 値) で演算を実行しようとすると、線は移動したフェーズがスライド関数内にある場所になります。
コード全体は次のとおりです。
W=display.contentWidth
H=display.contentHeight
local ballGroup = display.newGroup()--balls and numbers will be added
local x=50 --for ball's locating
local count=1 -- little ball's number starting from 1
local rect --background rect for balls
--big circle at the bottom
local circle = display.newCircle(W/2, H-90, 70)
local circleTxt = display.newText("", 0, 0, nil, 50 )
circleTxt:setTextColor ( 255, 0, 0 )
circleTxt.x=circle.x; circleTxt.y = circle.y
--Dragging ball and checking if it is inside big circle if it is so, remove ball and show the number of ball on big circle
function dragBall(self, event)
if event.phase=="began" then
display.getCurrentStage ( ):setFocus(self, event.id)
self.isFocus=true
self.x0= self.x; self.y0=self.y
elseif event.phase=="moved" then
local dx = math.abs( event.x - event.xStart ) -- Get the x- transition of the touch-input
local dy = math.abs( event.y - event.yStart ) -- Get the y-transition of the touch-input
if dy < 5 then --I changed it to less than, because if y is bigger,then focus should stay on the ball which will be dragged
display.getCurrentStage():setFocus( nil )
event.target.isFocus = false
return false
end
self.x = self.x0+(event.x-event.xStart); self.y = self.y0+(event.y-event.yStart) --drag ball
elseif event.phase=="cancelled" or event.phase=="ended" then
checkArea(self)
display.getCurrentStage():setFocus(self,nil)
end
return true
end
function createBall()
local ball = display.newCircle(x, H/2-25, 50)
local label = display.newText(""..count, ball.x, ball.y, nil , 35)
label:setTextColor ( 255, 0, 0 )
ball.no = count
ball.touch=dragBall
ball:addEventListener("touch", ball)
ballGroup:insert(ball)
ballGroup:insert(label)
count=count+1
x=x+120
end
for i=1,8 do
createBall()
end
rect = display.newRect(0,0, ballGroup.width, ballGroup.height); rect.y=H/2-25
rect:setFillColor(0,0,255)
rect:toBack()
function slide(self, event)
if event.phase=="began" then
self.x0=self.x
self.y0=self.y
display.getCurrentStage():setFocus(self, event.id)
self.isFocus=true
elseif event.phase=="moved" then
local dif = event.x-event.xStart
self.x = self.x0+dif
if ballGroup.contentBounds.xMax < W then
ballGroup.x = ballGroup.x+(W-ballGroup.contentBounds.xMax)
elseif ballGroup.contentBounds.xMin > 0 then
ballGroup.x = 0
end
elseif event.phase=="cancelled" or event.phase=="ended" then
display.getCurrentStage():setFocus(nil)
self.isFocus=false
end
return true
end
ballGroup.touch=slide
ballGroup:addEventListener("touch", ballGroup)
local bounds = circle.contentBounds
local xMax = bounds.xMax
local xMin = bounds.xMin
local yMax = bounds.yMax
local yMin = bounds.yMin
function checkArea(self)
if self.x>xMin and self.x<xMax and self.y>yMin and self.y<yMax then
circleTxt.text=""..self.no
self:removeSelf()
self=nil
end
end