trying to make a click and drag curling rock demo

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

trying to make a click and drag curling rock demo

Post by Sp1k3 »

I feel like a total n00b but the debugger freaks on line 26 and I can't seem to make a draggable curling rock. I want zero gravity with some friction which I think that I got right but any help on the user interaction would AWESOME! :)

Code: Select all

function love.load()
--initial graphics setup
  love.graphics.setMode(1280, 720, false, true, 8) --set the window dimensions to 720p
  love.physics.setMeter(64)
  world = love.physics.newWorld(0, 0, true)
  objects = {}
  objects.rock = {}
  objects.rock.body = love.physics.newBody(world, 608, 650, "dynamic")
  objects.rock.shape = love.physics.newCircleShape(32)
  objects.rock.fixture = love.physics.newFixture(objects.rock.body, objects.rock.shape, 1)
  objects.rock.fixture:setRestitution(0.9)
  rock = love.graphics.newImage("rock.png")
  love.graphics.setBackgroundColor(25, 25, 25)
  mouse = love.mouse

end

function love.update(dt)
  world:update(dt)
if drag then
      objects.rock.body:setPosition(mouse.getPosition())
   end
end

function love.mousepressed(x,y,button)
   if button == "l" then
      if objects.rock.shape:testPoint(mouse.getPosition()) then
         drag = true
         objects.rock.body:setMass(0,0,0,0)
      end
   end
end
function love.mousereleased()
   if drag then
      drag = false
      ojects.rock.body:setLinearVelocity(0,0)
      objects.rock.body:setMassFromShapes()
   end
end


function love.draw()
  love.graphics.draw(rock, objects.rock.body:getX(), objects.rock.body:getY(), objects.rock.shape:getRadius())
end
User avatar
Yell0w
Prole
Posts: 28
Joined: Wed Nov 21, 2012 7:40 am
Location: Norway
Contact:

Re: trying to make a click and drag curling rock demo

Post by Yell0w »

In the wiki there is a comment that the property you are trying to use is not possible in love 0.8.0
(https://love2d.org/wiki/Shape:testPoint)
maybe you can solve it differently? for example when you click the stone you can select an angle with the mouse, and the power applied is increased the further away from the stone your mouse pointer is?
I added a bit of .love to help you a bit further
Attachments
rock.love
(12.12 KiB) Downloaded 296 times
You can learn anything, but you cannot learn everything!
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

Awesome man that really helped and I've made a bit more progress, which I've attached below. So basically now I think that I should be able to set the ice as physics variable to apply a friction joint between it and the rock(s), which will eventually be entities. :)


Code: Select all

function love.load()
--initial graphics and physics setup
  love.graphics.setMode(1280, 720, false, true, 8) --sets the window dimensions to 720p
  love.physics.setMeter(64)
  world = love.physics.newWorld(0, 0, true)
  objects = {}
  objects.ice = {}
  objects.ice.body = love.physics.newBody(world, 0, 0, "static")
  objects.rock = {}
  objects.rock.body = love.physics.newBody(world, 64, 310, "dynamic")
  objects.rock.shape = love.physics.newCircleShape(32)
  objects.rock.fixture = love.physics.newFixture(objects.rock.body, objects.rock.shape, 1)
  objects.rock.fixture:setRestitution(0.9)
  rock = love.graphics.newImage("rock.png")
  ice = love.graphics.newImage("ice.png")
  mouse = love.mouse
  stonepower = 0
  love.graphics.setCaption ("Love Curl Tech Demo")
  curl = 0 --going to make this a sine or cosine (depending on in or out turn) function with a period of 1280
  joint = love.physics.newFrictionJoint( objects.ice.body, objects.rock.body, 0, 0, 1280, 720, true )
  force = joint:setMaxForce(1)
  torque = joint:setMaxTorque(1)

end

function love.update(dt)
  world:update(dt) --updates every frame (important)
	if drag then
      objects.rock.body:setPosition(love.mouse.getX()-32,love.mouse.getY()-64)
   end
   if love.mouse.isDown("l") then
        stonepower = stonepower + (dt*600)  -- increases the variable by 60 for every second the button is held down
    end 
end

function love.mousepressed(x,y,button)
   if button == "l" then
		if drag == false then
			MousePositionSaved = { x= love.mouse.getX(), y=love.mouse.getY() }
		end
	drag = true
	
    --  if objects.rock.shape:testPoint(mouse.getPosition()) then
     --    objects.rock.body:setMass(0,0,0,0)
   --   end
   end
end
function love.mousereleased()
	if drag then
		drag = false
		--	ojects.rock.body:setLinearVelocity(0,0)
		--	objects.rock.body:setMassFromShapes()
	   objects.rock.body:setLinearVelocity(0, 0)
	   objects.rock.body:setAngularVelocity(curl)
	   objects.rock.body:applyForce((stonepower*10)*1, 0 )
	   stonepower = 0
	end
end


function love.draw()
  love.graphics.draw(ice, 0, 0, 0)
  love.graphics.draw(rock, objects.rock.body:getX(), objects.rock.body:getY(), objects.rock.shape:getRadius()) --eventually I want to set a shader to change the colour warmness of the rock based on stonepower
end
Attachments
lovecurl.love
(1.13 MiB) Downloaded 312 times
Last edited by Sp1k3 on Tue Jan 15, 2013 12:13 am, edited 1 time in total.
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

I'm not sure if I'm using that friction joint correctly, the velocity of the rock doesn't slow
User avatar
Yell0w
Prole
Posts: 28
Joined: Wed Nov 21, 2012 7:40 am
Location: Norway
Contact:

Re: trying to make a click and drag curling rock demo

Post by Yell0w »

Another crude way of doing it is to deaccelerate it over time by applying a force in the opposite direction untill it reaches zero or something.
You can learn anything, but you cannot learn everything!
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

Yell0w wrote:Another crude way of doing it is to deaccelerate it over time by applying a force in the opposite direction untill it reaches zero or something.

The problem I've had with that is detecting if the stone is in motion, if I do it on l_mouse release it just cancels out some of the force and I'm assuming if I apply it after that function it will keep applying the force until the rock reverses on go past 0 on the x-axis.

*edit*

also if I do force = joint:setMaxForce(50) when I release the mouse the rock then starts to move + or - along the y-axis

friction doesn't seem to work

Code: Select all

function love.load()
--initial graphics and physics setup
  love.graphics.setMode(1280, 720, false, true, 8) --sets the window dimensions to 720p
  love.physics.setMeter(64)
  world = love.physics.newWorld(0, 0, 1280, 720, 100, 100, true )
  objects = {}
  objects.ice = {}
  objects.ice.body = love.physics.newBody(world, 0, 0, "dynamic")
  objects.ice.shape = love.physics.newRectangleShape(1280, 720)
  objects.rock = {}
  objects.rock.body = love.physics.newBody(world, 64, 310, "dynamic")
  objects.rock.shape = love.physics.newCircleShape(32)
  objects.rock.fixture = love.physics.newFixture(objects.rock.body, objects.rock.shape, 1)
  objects.rock.fixture:setRestitution(0)
  rock = love.graphics.newImage("rock.png")
  ice = love.graphics.newImage("ice.png")
  mouse = love.mouse
  stonepower = 0
  love.graphics.setCaption ("Love Curl Tech Demo")
  curl = 0 --going to make this a sine or cosine (depending on in or out turn) function
  joint = love.physics.newFrictionJoint( objects.ice.body, objects.rock.body, 0, 0, 1280, 720, true )
  force = joint:setMaxForce(1)
end

function love.update(dt)
  world:update(dt) --updates every frame (important)
	if drag then
      objects.rock.body:setPosition(love.mouse.getX()-32,love.mouse.getY()-64)
   end
   if love.mouse.isDown("l") then
        stonepower = stonepower + (dt*1000)  -- increases the variable by 100 for every second the button is held down
    end 
end

function love.mousepressed(x,y,button)
   if button == "l" then
		if drag == false then
			MousePositionSaved = { x= love.mouse.getX(), y=love.mouse.getY() }
		end
	drag = true
	
    --  if objects.rock.shape:testPoint(mouse.getPosition()) then
     --    objects.rock.body:setMass(0,0,0,0)
   --   end
   end
end
function love.mousereleased()
	if drag then
		drag = false
		--	ojects.rock.body:setLinearVelocity(0,0)
		--	objects.rock.body:setMassFromShapes()
	   objects.rock.body:setLinearVelocity(0, 0)
	   objects.rock.body:setAngularVelocity(0)
	   objects.rock.body:applyForce((stonepower*10), 0 )
	   stonepower = 0
	end
end  


function love.draw()
  love.graphics.draw(ice, 0, 0, 0)
  love.graphics.draw(rock, objects.rock.body:getX(), objects.rock.body:getY(), objects.rock.shape:getRadius()) --eventually I want to set a shader to change the colour warmness of the rock based on stonepower
end
User avatar
Yell0w
Prole
Posts: 28
Joined: Wed Nov 21, 2012 7:40 am
Location: Norway
Contact:

Re: trying to make a click and drag curling rock demo

Post by Yell0w »

maybe you could do a check on the stones velocity before allowing to drag it (a second time)
https://love2d.org/wiki/Body:getLinearVelocity might be of help
You can learn anything, but you cannot learn everything!
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

Yell0w wrote:maybe you could do a check on the stones velocity before allowing to drag it (a second time)
https://love2d.org/wiki/Body:getLinearVelocity might be of help

So something like this:

Code: Select all

function love.load()
--initial graphics and physics setup
  love.graphics.setMode(1280, 720, false, true, 8) --sets the window dimensions to 720p
  love.physics.setMeter(64)
  world = love.physics.newWorld(0, 0, 1280, 720, 100, 100, true )
  objects = {}
  objects.ice = {}
  objects.ice.body = love.physics.newBody(world, 0, 0, "dynamic")
  objects.ice.shape = love.physics.newRectangleShape(1280, 720)
  objects.rock = {}
  objects.rock.body = love.physics.newBody(world, 64, 310, "dynamic")
  objects.rock.shape = love.physics.newCircleShape(32)
  objects.rock.fixture = love.physics.newFixture(objects.rock.body, objects.rock.shape, 1)
  objects.rock.fixture:setRestitution(0)
  rock = love.graphics.newImage("rock.png")
  ice = love.graphics.newImage("ice.png")
  mouse = love.mouse
  stonepower = 0
  love.graphics.setCaption ("Love Curl Tech Demo")
  curl = 0 --going to make this a sine or cosine (depending on in or out turn) function
  joint = love.physics.newFrictionJoint( objects.ice.body, objects.rock.body, 0, 0, 1280, 720, true )
  force = joint:setMaxForce(1)
end

function love.update(dt)
  world:update(dt) --updates every frame (important)
	if drag then
      objects.rock.body:setPosition(love.mouse.getX()-32,love.mouse.getY()-64)
   end
   if love.mouse.isDown("l") then
        stonepower = stonepower + (dt*1000)  -- increases the variable by 100 for every second the button is held down
    end 
end

function love.mousepressed(x,y,button)
   if button == "l" then
		if drag == false then
			MousePositionSaved = { x= love.mouse.getX(), y=love.mouse.getY() }
		end
	drag = true
	
    --  if objects.rock.shape:testPoint(mouse.getPosition()) then
     --    objects.rock.body:setMass(0,0,0,0)
   --   end
   end
end
function love.mousereleased()
	if drag then
		drag = false
		--	ojects.rock.body:setLinearVelocity(0,0)
		--	objects.rock.body:setMassFromShapes()
	   objects.rock.body:setLinearVelocity(0, 0)
	   objects.rock.body:setAngularVelocity(0)
	   objects.rock.body:applyForce((stonepower*10), 0 )
	   stonepower = 0
	end
  velocity = objects.rock.body:getLinearVelocity(x)
  while velocity > 0 do
	 objects.rock.body:applyForce(-(stonepower*10), 0 )
end
end  


function love.draw()
  love.graphics.draw(ice, 0, 0, 0)
  love.graphics.draw(rock, objects.rock.body:getX(), objects.rock.body:getY(), objects.rock.shape:getRadius()) --eventually I want to set a shader to change the colour warmness of the rock based on stonepower
end
if it worked?
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

also, if I set

Code: Select all

  objects.ice.fixture = love.physics.newFixture(objects.ice.body, objects.ice.shape, 1)
the rock will spawn 2/3 down the screen and friction still doesn't work
Sp1k3
Prole
Posts: 20
Joined: Mon Jan 14, 2013 7:32 am

Re: trying to make a click and drag curling rock demo

Post by Sp1k3 »

okay so if I set the mass of the rock and apply a tiny bit of force it will slow down VERY slowly
Post Reply

Who is online

Users browsing this forum: Google [Bot] and 206 guests