0

タッチ入力に基づいて観覧車のように多数のボックスを回転させようとしています

画面上に観覧車があり、カートの 1 つを下にドラッグすると観覧車が一方向に回転し、上にドラッグすると車輪が逆方向に回転することを想像してください。

観覧車の各ボックスまたは「カート」は回転しません。観覧車とまったく同じように、円運動でのみ移動します

これでほとんど機能していますが、ボックスが最初のグラブポイントから離れているため、ボックスの1つに触れるとすぐに別の場所に表示されますが、通常どおり回転します。最初のグラブポイントからスムーズに回転し続けたい

ここに私の現在のコードがあります

local squares = display.newGroup()

local square = display.newRect(0,0,200,200)
square.x, square.y = 320, 320
square:setFillColor(100,255,55)
squares:insert(square)

local square2 = display.newRect(0,0,200,200)
square2.x, square2.y = 320, 320
square2:setFillColor(999,255,55)
squares:insert(square2)

local function onTouch( event )
local t = event.target

local phase = event.phase
if "began" == phase then

    local parent = t.parent
    parent:insert( t )
    display.getCurrentStage():setFocus( t )
    t.isFocus = true

    -- Store initial position
    t.x0 = event.x - t.x
    t.y0 = event.y - t.y

elseif t.isFocus then
    if "moved" == phase then

   local degrees = event.y

        local rads = degrees * (math.pi / 360.0)
            square.x = 300 * math.cos(rads) + 500
            square.y = 300 * math.sin(rads)+ 500
            degrees = degrees + 100
           print (square.x, square.y)

         local rads2 = degrees * (math.pi / 360.0)
            square2.x = 300 * math.cos(rads2)+ 500
            square2.y = 300 * math.sin(rads2)+ 500
            degrees = degrees - 100

           print (square.x, square.y)




    elseif "ended" == phase or "cancelled" == phase then
        display.getCurrentStage():setFocus( nil )
        t.isFocus = false
    end
end
return true
end


squares:addEventListener( "touch", onTouch )

私が犯したばかげた間違いを自由に指摘してください。また、ポイントではなく別のオブジェクトの周りで同じ効果を得る方法を教えていただければ、本当に感謝しています。

4

2 に答える 2

2

これは完全な動作例です。

local squares = display.newGroup()

local wheelX =  display.contentCenterX
local wheelY =  display.contentCenterY

local radius = 220
local degrees = -180
local squareH = 150

local square = display.newRect(0,0,squareH,squareH)
square:setFillColor(255,255,255)
square.degStart = 100
squares:insert(square)

local square2 = display.newRect(0,0,squareH,squareH)
square2:setFillColor(999,255,55)
square2.degStart = -10
squares:insert(square2)


local function drawRects(degrees)
    local rads = (square.degStart + degrees) * (math.pi / 180.0)
    square.x = radius * math.cos(rads) + wheelX
    square.y = radius * math.sin(rads) + wheelY

    local rads2 = (square2.degStart + degrees) * (math.pi / 180.0)
    square2.x = radius * math.cos(rads2) + wheelX
    square2.y = radius * math.sin(rads2) + wheelY
end

local function getDegrees(square)
    local x = square.x
    local y = square.y

    local degrees = math.atan2((y - wheelY) , (x - wheelX)) * (180 / math.pi)

    return degrees
end


local function onTouch( event )
    local t = event.target

    local phase = event.phase
    local parent = t.parent

    if "began" == phase then
        print("began")
        parent:insert( t )
        display.getCurrentStage():setFocus( t )
        t.isFocus = true

        square.degStart = getDegrees(square)
        square2.degStart = getDegrees(square2)
    elseif t.isFocus then
        if "moved" == phase then
            degrees = math.atan2((event.yStart - wheelY) , (event.xStart - wheelX)) * (180 / math.pi)

            degrees2 = math.atan2((event.y - wheelY) , (event.x - wheelX)) * (180 / math.pi)

            diffDegrees = degrees2 - degrees
            drawRects(diffDegrees)

            print("diffDegrees: " .. diffDegrees)
        elseif "ended" == phase or "cancelled" == phase then
            display.getCurrentStage():setFocus( nil )
            t.isFocus = false
        end
    end
return true
end

squares:addEventListener( "touch", onTouch )

drawRects(degrees)

かなり時間がかかりました。

于 2013-05-23T15:54:51.020 に答える
1

event.y と event.x を取得してから、次の式で度数を取得してください。

degrees = Math.atan(event.y / event.x)
于 2013-05-24T20:47:23.317 に答える