Shooting left and right?

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.
Post Reply
worldaway
Prole
Posts: 44
Joined: Thu Sep 08, 2011 2:22 am

Shooting left and right?

Post by worldaway »

I have made a smiley face shoot a smaller smileyface upwards, but can't figure out how to make it shoot left and right.
here's the code:

Code: Select all

function love.load()
   world = love.physics.newWorld(0, 0, 650, 650) --create a world for the bodies to exist in with width and height of 650
   world:setGravity(0, 700) --the x component of the gravity will be 0, and the y component of the gravity will be 700
   world:setMeter(64) --the height of a meter in this world will be 64px

   objects = {} -- table to hold all our physical objects

   --let's create the ground
   objects.ground = {}
   --we need to give the ground a mass of zero so that the ground wont move
   objects.ground.body = love.physics.newBody(world, 650/2, 625, 0, 0) --remember, the body anchors from the center of the shape
   objects.ground.shape = love.physics.newRectangleShape(objects.ground.body, 0, 0, 650, 50, 0) --anchor the shape to the body, and make it a width of 650 and a height of 50

   --let's create a ball
   objects.ball = {}
   objects.ball.body = love.physics.newBody(world, 650/2, 650/2, 15, 0) --place the body in the center of the world, with a mass of 15
   objects.ball.shape = love.physics.newCircleShape(objects.ball.body, 0, 0, 20) --the ball's shape has no offset from it's body and has a radius of 20
   objects.ball.shots = {} -- holds shots
   
   --initial graphics setup
   love.graphics.setBackgroundColor(104, 136, 248) --set the background color to a nice blue
   love.graphics.setMode(650, 650, false, true, 0) --set the window dimensions to 650 by 650
   
   HappyFace = love.graphics.newImage("HappyFace.png")
   shotb = love.graphics.newImage("shotb.png")
end


function love.update(dt)
   world:update(dt) --this puts the world into motion

   --here we are going to create some keyboard events
   if love.keyboard.isDown("right") then --press the right arrow key to push the ball to the right
      objects.ball.body:applyForce(400, 0)
   elseif love.keyboard.isDown("left") then --press the left arrow key to push the ball to the left
      objects.ball.body:applyForce(-400, 0)
   elseif love.keyboard.isDown("up") then --press the up arrow key to set the ball in the air
      objects.ball.body:applyForce(0,-410)
	elseif love.keyboard.isDown("down") then --down
      	objects.ball.body:applyForce(0,1000)
   end
   -- update the shots
   for i,v in ipairs(objects.ball.shots) do
      -- move them up up up
      v.y = v.y - dt * 500
	  
   end
end


function love.draw()
   love.graphics.setColor(72, 160, 14) -- set the drawing color to green for the ground
   love.graphics.polygon("fill", objects.ground.shape:getPoints()) -- draw a "filled in" polygon using the ground's coordinates

   love.graphics.setColor(255,255,0) --set the drawing color to yellow for the ball
   local b = objects.ball.body
   love.graphics.draw(HappyFace, b:getX(), b:getY(), b:getAngle(), 1, 1, HappyFace:getWidth()/2, HappyFace:getHeight()/2)

   -- let's draw our balls shots
   love.graphics.setColor(255,255,255,255)
   for i,v in ipairs(objects.ball.shots) do
      love.graphics.draw(shotb, v.x, v.y, 0, 1, 1, shotb:getWidth()/2, shotb:getHeight()/2)
   end
end


function love.keyreleased(key)
   if key == "w" then
      shoot()
   elseif key == "d" then
	  shoot()
   elseif key == "a" then
      shoot()   
   end
end

function shoot()
   local shot = {}
   shot.x, shot.y = objects.ball.body:getPosition()
   table.insert(objects.ball.shots, shot)
end
you can see I have set the controls wad (w up, a left, and d right) But currently they all relate back to shooting up.
I have tried different methods but none seem to work. help?

thanks
matt
User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Shooting left and right?

Post by Robin »

If you are using love.physics, why do you update the position of the "shots" manually? If you create a body and shape for them, and give them an initial speed and direction, you can let love.physics do all the work.
Help us help you: attach a .love.
User avatar
felix24
Party member
Posts: 163
Joined: Tue Jul 26, 2011 4:51 pm
Contact:

Re: Shooting left and right?

Post by felix24 »

you could do as Robin suggests and use love.physics to fire your bullets.
but if you want to do it manually you could do something like this:

use a value to check what the direction is (let's say: 1 = up, 2 = left and 3 = right

then in love.keyreleased have:

Code: Select all

   if key == "w" then
    shoot(1)
   elseif key == "d" then
     shoot(3)
   elseif key == "a" then
     shoot(2)   
   end
then change shoot() to:

Code: Select all

function shoot(dir)
    local shot = {}
    shot.x, shot.y = objects.ball.body:getPosition()
    shot.dir = dir
    table.insert(objects.ball.shots, shot)
end
and finally in love.update have:

Code: Select all

-- update the shots
   for i,v in ipairs(objects.ball.shots) do
      -- move them up up up
     if v.dir == 1 then
         v.y = v.y - dt * 500
     elseif v.dir == 2 then
          v.x = v.x - dt * 500
     else
          v.x = v.x + dt * 500
     end
   end
good luck :)
worldaway
Prole
Posts: 44
Joined: Thu Sep 08, 2011 2:22 am

Re: Shooting left and right?

Post by worldaway »

Thanks guys, I've got it fixed.
Post Reply

Who is online

Users browsing this forum: Ahrefs [Bot] and 54 guests