Dealing with Touch

In my game right now, im controlling the gravity just by tapping. i want to change the controls so that when i swipe up the physics.gravity is -physics.gravity() and when i swipe down its regular gravity. i will post my code if anyone asks for more help. i just can’t get the touch.deltaY down. any help? i tried referrring to @ruilov’s pacman example but couldn’t find that code snippet

What determines what constitutes a ‘vertical swipe’? Is it where the touch ends compared to where it started? For example:


function setup()
end

function draw()
    background(0)
end

function touched(touch)
    local id = touch.id
    local state = touch.state
    local x = touch.x
    local y = touch.y
    if state == BEGAN then
        swipeId = id  -- Preserve the id
        swipeX = x    -- Preserve the position
        swipeY = y
        return
    end
    if state == ENDED and id == swipeId then
        swipeId = nil
        if math.abs(x - swipeX) < 100 then -- Within tolerance?
            if swipeY - y > 100 then       -- Long enough?
                print("Swipe down")
            end
            if y - swipeY > 100 then       -- Long enough?
                print("Swipe up")
            end
        end
    end
end

thanks @mpilgrem. just a quick question is there any way to detect with a user swipes up twice. For example, right now when you swipe up or down in my game, the gravity changes and you lose a point. Is there any way to detect if a person swiped up twice and ignore the function to print swipe up twice. it’s just a little bug in my game and I’m not sure how to fix it.

You’ll need to track whether the user has already made a swipe and need to allow them a certain amount of time to get a second one in. The following adapts @mpilgrem’s example for the up swipe only. If you add more interactions the logic will become more complex and you may want to spend more time thinking out a more elegant solution (e.g. What happens with an up and down swipe. Or an up swipe and a short tap), but this rough solution should work. Note the locations of the print statements this represents where the decision on a single or double swipe is met.

function setup()
    firstswipe=0
    timer=0
    timeout=20
end

function draw()
    background(0)
    if firstswipe==1 then 
        timer = timer + 1
        if timer>timeout then --time limit for user to get a second swipe in
            timer=0
            firstswipe=0
            print("Swipe up")
        end
    end
end

function touched(touch)
    local id = touch.id
    local state = touch.state
    local x = touch.x
    local y = touch.y
    if state == BEGAN then
        swipeId = id  -- Preserve the id
        swipeX = x    -- Preserve the position
        swipeY = y
        return
    end
    if state == ENDED and id == swipeId then
        swipeId = nil
        if math.abs(x - swipeX) < 100 then -- Within tolerance?
            if swipeY - y > 100  then       -- Long enough?
                print("Swipe down")
            end
            if y - swipeY > 100 and firstswipe==0 then       -- Long enough?
           
                firstswipe=1
            elseif y - swipeY > 100 and firstswipe==1 then       -- Long enough?
                print("Double Swipe up")
                firstswipe=0
            end            
        end
    end
end

I detected horizontal and vertical swipes in my program (I don’t have access to the code now, but I might post it later) by checking if the length of the swipe is greater than a certain number, then checking which direction it is closest to. This makes the swipe length the same, even if the user swipes at a slight angle. I found this more comfortable than checking just the x or y length, which would require the user to swipe longer if they are swiping at an angle, providing less consistency.