Tutorial:Physics (Français)
Dans cet exemple, nous allons créer une balle rouge qui roule sur un sol vert.
L'exemple fini est à la fin de cette page. Toutes ces fonctions peuvent être placées dans un fichier: main.lua
Nous commencerons dans la function love.load().
love.load()
Premièrement, il nous faut mettre en place un monde(world) dans lequel pourrons exister les corps physiques.
function love.load() love.physics.setMeter(64) -- la taille d'un mètre dans notre monde sera de 64px world = love.physics.newWorld(0, 9.81*64, true) -- créer un monde avec une gravité horizontale de 0 et une gravité verticale de 9.81
Maintenant que notre monde(world) a été créé, on peut y ajouter des corps(bodies), formes(shapes), et des attaches(fixtures).
objects = {} -- table pour contenir tous nos objets physiques -- création du sol objects.ground = {} objects.ground.body = love.physics.newBody(world, 650/2, 650-50/2) -- souvenez vous, la forme (le rectangle qu'on crée juste après) s'encre au corps depuis son centre, donc il faut le déplacer à (650/2, 650-50/2) objects.ground.shape = love.physics.newRectangleShape(650, 50) -- créer un rectangle de largeur 650 et de hauteur 50 objects.ground.fixture = love.physics.newFixture(objects.ground.body, objects.ground.shape) -- attacher la forme au corps -- création d'une balle objects.ball = {} objects.ball.body = love.physics.newBody(world, 650/2, 650/2, "dynamic") -- on place le corps au centre du monde et on le rend dynamique, pour qu'il puisse se déplacer objects.ball.shape = love.physics.newCircleShape( 20) -- la forme de la balle à un rayon de 20 objects.ball.fixture = love.physics.newFixture(objects.ball.body, objects.ball.shape, 1) -- on attache la forme au corps et on donne à la fixture une densité de 1 objects.ball.fixture:setRestitution(0.9) -- Une restitution proche de 1 la fait rebondir -- création de quelque blocs pour s'amuser objects.block1 = {} objects.block1.body = love.physics.newBody(world, 200, 550, "dynamic") objects.block1.shape = love.physics.newRectangleShape(0, 0, 50, 100) objects.block1.fixture = love.physics.newFixture(objects.block1.body, objects.block1.shape, 5) -- Une densité plus élevée lui donne plus de masse. objects.block2 = {} objects.block2.body = love.physics.newBody(world, 200, 400, "dynamic") objects.block2.shape = love.physics.newRectangleShape(0, 0, 100, 50) objects.block2.fixture = love.physics.newFixture(objects.block2.body, objects.block2.shape, 2)
Enfin, pour terminer la fonction love.load(), on va définir la taille de l'écran et la couleur de fond.
-- initialisation graphique love.graphics.setBackgroundColor(104, 136, 248) -- mettre le fond en un joli bleu love.window.setMode(650, 650) -- mettre les dimensions de la fenêtre en 650 par 650 (par défaut sans plein-écran ni antialiasing et avec le vsync activé) end
Okay, c'est assez pour la configuration initiale du moteur de physique. Maintenant, on doit éditer la fonction love.update().
love.update()
function love.update(dt) world:update(dt) -- cela met le monde en mouvement --ici, on va créer quelques entrées clavier if love.keyboard.isDown("right") then -- si on appuie sur la flèche de droite, on pousse la balle vers la droite objects.ball.body:applyForce(400, 0) elseif love.keyboard.isDown("left") then -- si on appuie sur la flèche de gauche, on pousse la balle vers la gauche objects.ball.body:applyForce(-400, 0) elseif love.keyboard.isDown("up") then -- si on appuie sur la flèche du haut, on réinitialise la position de la balle dans les airs objects.ball.body:setPosition(650/2, 650/2) objects.ball.body:setLinearVelocity(0, 0) -- on doit mettre la vélocité à 0 pour éviter que le fait d'avoir changé la position génère une vélocité énorme end end
Maintenant que le monde se met à jour à chaque tick, on peut définir comment on va dessiner le sol et la balle dans la fonction love.draw().
love.draw()
Premièrement, le sol.
function love.draw() love.graphics.setColor(72, 160, 14) -- on met la couleur en vert pour le sol love.graphics.polygon("fill", objects.ground.body:getWorldPoints(objects.ground.shape:getPoints())) -- dessiner un polygone "remplis" en utilisant les coordonnées des points du sol
Et enfin, on peut dessiner le cercle qui représente la balle, et les blocks.
love.graphics.setColor(193, 47, 14) --on met la couleur en rouge pour la balle love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius()) -- on peut dessiner directement un cercle pour la balle love.graphics.setColor(50, 50, 50) -- on met la couleur en gris pour les blocs love.graphics.polygon("fill", objects.block1.body:getWorldPoints(objects.block1.shape:getPoints())) love.graphics.polygon("fill", objects.block2.body:getWorldPoints(objects.block2.shape:getPoints())) end
Et voilà ! Mettez tout ça dans votre main.lua, et lancez le selon votre système d'exploitation. Vous aurez une balle roulant dans un environnement vert luxuriant, comme promis.
Le main.lua
function love.load() love.physics.setMeter(64) -- la taille d'un mètre dans notre monde sera de 64px world = love.physics.newWorld(0, 9.81*64, true) -- créer un monde avec une gravité horizontale de 0 et une gravité verticale de 9.81 objects = {} -- table pour contenir tous nos objets physiques -- création du sol objects.ground = {} objects.ground.body = love.physics.newBody(world, 650/2, 650-50/2) -- souvenez vous, la forme (le rectangle qu'on crée juste après) s'encre au corps depuis son centre, donc il faut le déplacer à (650/2, 650-50/2) objects.ground.shape = love.physics.newRectangleShape(650, 50) -- créer un rectangle de largeur 650 et de hauteur 50 objects.ground.fixture = love.physics.newFixture(objects.ground.body, objects.ground.shape) -- attacher la forme au corps -- création d'une balle objects.ball = {} objects.ball.body = love.physics.newBody(world, 650/2, 650/2, "dynamic") -- on place le corps au centre du monde et on le rend dynamique, pour qu'il puisse se déplacer objects.ball.shape = love.physics.newCircleShape( 20) -- la forme de la balle à un rayon de 20 objects.ball.fixture = love.physics.newFixture(objects.ball.body, objects.ball.shape, 1) -- on attache la forme au corps et on donne à la fixture une densité de 1 objects.ball.fixture:setRestitution(0.9) -- Une restitution proche de 1 la fait rebondir -- création de quelque blocs pour s'amuser objects.block1 = {} objects.block1.body = love.physics.newBody(world, 200, 550, "dynamic") objects.block1.shape = love.physics.newRectangleShape(0, 0, 50, 100) objects.block1.fixture = love.physics.newFixture(objects.block1.body, objects.block1.shape, 5) -- Une densité plus élevée lui donne plus de masse. objects.block2 = {} objects.block2.body = love.physics.newBody(world, 200, 400, "dynamic") objects.block2.shape = love.physics.newRectangleShape(0, 0, 100, 50) objects.block2.fixture = love.physics.newFixture(objects.block2.body, objects.block2.shape, 2) -- initialisation graphique love.graphics.setBackgroundColor(104, 136, 248) -- mettre le fond en un joli bleu love.window.setMode(650, 650) -- mettre les dimensions de la fenêtre en 650 par 650 (par défaut sans plein-écran ni antialiasing et avec le vsync activé) end function love.update(dt) world:update(dt) -- cela met le monde en mouvement --ici, on va créer quelques entrées clavier if love.keyboard.isDown("right") then -- si on appuie sur la flèche de droite, on pousse la balle vers la droite objects.ball.body:applyForce(400, 0) elseif love.keyboard.isDown("left") then -- si on appuie sur la flèche de gauche, on pousse la balle vers la gauche objects.ball.body:applyForce(-400, 0) elseif love.keyboard.isDown("up") then -- si on appuie sur la flèche du haut, on réinitialise la position de la balle dans les airs objects.ball.body:setPosition(650/2, 650/2) objects.ball.body:setLinearVelocity(0, 0) -- on doit mettre la vélocité à 0 pour éviter que le fait d'avoir changé la position génère une vélocité énorme end end function love.draw() love.graphics.setColor(72, 160, 14) -- on met la couleur en vert pour le sol love.graphics.polygon("fill", objects.ground.body:getWorldPoints(objects.ground.shape:getPoints())) -- dessiner un polygone "remplis" en utilisant les coordonnées des points du sol love.graphics.setColor(193, 47, 14) --on met la couleur en rouge pour la balle love.graphics.circle("fill", objects.ball.body:getX(), objects.ball.body:getY(), objects.ball.shape:getRadius()) -- on peut dessiner directement un cercle pour la balle love.graphics.setColor(50, 50, 50) -- on met la couleur en gris pour les blocs love.graphics.polygon("fill", objects.block1.body:getWorldPoints(objects.block1.shape:getPoints())) love.graphics.polygon("fill", objects.block2.body:getWorldPoints(objects.block2.shape:getPoints())) 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