Difference between revisions of "Tutorial:Physics"
m (Other languages (fix)) |
(Redid physics tutorial to use shape:getPoints instead of stupid bounding box thing) |
||
Line 18: | Line 18: | ||
<source lang="lua"> | <source lang="lua"> | ||
− | + | objects = {} -- table to hold all our physical objects | |
− | |||
--let's create the ground | --let's create the ground | ||
+ | objects.ground = {} | ||
--we need to give the ground a mass of zero so that the ground wont move | --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 shape anchors to the body from its center | |
− | + | 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 | --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 | ||
</source> | </source> | ||
Line 36: | Line 37: | ||
--initial graphics setup | --initial graphics setup | ||
love.graphics.setBackgroundColor(104, 136, 248) --set the background color to a nice blue | 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 | + | love.graphics.setMode(650, 650, false, true, 0) --set the window dimensions to 650 by 650 with no fullscreen, vsync on, and no antialiasing |
end | end | ||
</source> | </source> | ||
Line 51: | Line 52: | ||
--here we are going to create some keyboard events | --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 | 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 | 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 | elseif love.keyboard.isDown("up") then --press the up arrow key to set the ball in the air | ||
− | + | objects.ball.body:setY(650/2) | |
end | end | ||
end | end | ||
Line 63: | Line 64: | ||
=== love.draw() === | === love.draw() === | ||
+ | |||
+ | First, the ground. | ||
<source lang="lua"> | <source lang="lua"> | ||
function love.draw() | 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(72, 160, 14) --set the drawing color to green for the ground | ||
− | love.graphics. | ||
</source> | </source> | ||
− | And finally, we can draw the circle that represents the ball | + | And finally, we can draw the circle that represents the ball. |
<source lang="lua"> | <source lang="lua"> | ||
love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball | love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball | ||
− | love.graphics.circle("fill", | + | love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- we want 20 line segments to form the "circle" |
end | end | ||
</source> | </source> | ||
Line 116: | Line 93: | ||
world:setMeter(64) --the height of a meter in this world will be 64px | 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 | --let's create the ground | ||
+ | objects.ground = {} | ||
--we need to give the ground a mass of zero so that the ground wont move | --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 | --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 | ||
--initial graphics setup | --initial graphics setup | ||
Line 139: | Line 117: | ||
--here we are going to create some keyboard events | --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 | 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 | 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 | elseif love.keyboard.isDown("up") then --press the up arrow key to set the ball in the air | ||
− | + | objects.ball.body:setY(650/2) | |
end | end | ||
end | end | ||
function love.draw() | 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(72, 160, 14) --set the drawing color to green for the ground | ||
− | |||
− | |||
− | love.graphics. | ||
love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball | love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball | ||
− | + | love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- we want 20 line segments to form the "circle" | |
− | |||
− | love.graphics.circle("fill", | ||
end | end | ||
</source> | </source> |
Revision as of 00:06, 24 June 2011
In this example we will create a red ball that rolls around on a green ground.
The finished example is at the end of this page. All of these functions may be placed in one file: main.lua
We'll start in the love.load function.
love.load()
First we need to set up a world for the physics bodies to exist in.
function love.load()
world = love.physics.newWorld(-650, -650, 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
Now that a world has been created, we can add bodies to it.
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 shape anchors to the body from its center
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
Now to wrap up the love.load function, let's set up the screen size and background color.
--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 with no fullscreen, vsync on, and no antialiasing
end
Okay, that's enough for the initial set up of the physics engine. Now we need do edit the love.update() function.
love.update()
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:setY(650/2)
end
end
Now that the world is updating, we can draw the ground and ball.
love.draw()
First, the ground.
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
And finally, we can draw the circle that represents the ball.
love.graphics.setColor(193, 47, 14) --set the drawing color to red for the ball
love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- we want 20 line segments to form the "circle"
end
There you have it! Put this file in a zip file, rename it to physics.love (or whatever), run it. And you'll have a ball rolling around in a lush green environment like I promised.
The main.lua
function love.load()
world = love.physics.newWorld(-650, -650, 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
--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
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:setY(650/2)
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(193, 47, 14) --set the drawing color to red for the ball
love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius(), 20) -- we want 20 line segments to form the "circle"
end
Other languages
Dansk –
Deutsch –
English –
Español –
Français –
Indonesia –
Italiano –
Lietuviškai –
Magyar –
Nederlands –
Polski –
Português –
Română –
Slovenský –
Suomi –
Svenska –
Türkçe –
Česky –
Ελληνικά –
Български –
Русский –
Српски –
Українська –
עברית –
ไทย –
日本語 –
正體中文 –
简体中文 –
Tiếng Việt –
한국어
More info