Max Williams
Max Williams

Reputation: 32943

Corona SDK - change a variable for the duration of a drag event

I have a "seed" object which has an instance method seed:fall() which is called by my update function (which runs every frame). I've got a "touch" event listener on it so the user can drag it around. When it's being dragged, however, it's still trying to fall, which makes the drag interaction glitchy.

I've added an instance variable to my seed "class" called seed.falling. The fall() function now checks that seed.falling is true before moving the seed down the screen. The next step is to set seed.falling to false when the drag starts, and then set it back to true when the drag stops. I can't figure out this last part though.

Any ideas anyone? Is there a "stop dragging" event i could set a listener for, to switch seed.falling back on? Is there a nicer way of achieving what i want?

Upvotes: 0

Views: 490

Answers (2)

Max Williams
Max Williams

Reputation: 32943

Just for the record, here's how i solved this.

Basically i have an attribute "seed.falling" which the seed:fall method checks before moving the seed. And i set that attribute to false if we're not at the "ended" phase of the drag event, which stops the seed falling.

function Seed:new(x,y)
  print("Seed:new, x = " .. (x or nil) .. ", y = " .. (y or nil) )
  local seed = display.newImage("seed_icon.png")
  seed.x =    x
  seed.y =    y
  seed.name = 'seed'   
  seed.falling = true

  function seed:fall()
    if(self.falling) then
      self.y = self.y + 1
    end
  end

  function seed:drag(event)
    seed.x = event.x
    seed.y = event.y
    if(event.phase == "ended") then
      seed.falling = true
    else 
      seed.falling = false
    end
  end    

  seed:addEventListener("touch", drag)

  return seed
end      

function drag(event)
  seed = event.target
  seed:drag(event)
end    

It's not a very good solution i think as it leaves the seed stranded on the screen sometimes - possibly when you drag a seed over another falling seed.

Upvotes: 1

cctan
cctan

Reputation: 2023

physics.start()
physics.setGravity(0,1)
local dd = display.newRect(400,100,200,200)
physics.addBody(dd,"dynamic")
dd:addEventListener("touch", function(event)
    if event.phase == "began" then
        dd.bodyType = "static"
    elseif event.phase == "moved" then
        dd.x,dd.y = event.x,event.y
    elseif event.phase == "ended" then
        dd.bodyType = "dynamic"
    end
end)

I think this case is what you want?

Upvotes: 2

Related Questions