Bonjour,
Je me suis lancé dans des essais pour un potentiel jeu et surtout pour comprendre et tester la mécanique de ce type de jeu.
Je fais face à deux problèmes que deux après-midi de travail n’ont pu résoudre. J’arrive à faire sauter et atterrir sur une plateforme mon personnage ainsi qu’a le faire percuter le dessous de la plateforme pour l’empêcher de la traverser.
Néanmoins, je n’arrive pas à le bloquer sur les côtés. c’est assez étrange, il se "téléporte" tout de suite sur la plateforme ou reste bloqué collé à cette dernière.
Autre petit soucis, lorsque le personnage est sur la plateforme, si je l’en écarte sur l’axe x, il reste au même niveau, ne chute pas malgré mes efforts pour l’attirer vers le sol.
Je vous laisse le code, il n’y a pas grand chose étant donné que ce n’est qu’un prototype.
Mon main
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | require("fonctions") local player -- table du joueur local bloc -- platerforme function love.load() player = initPlayer() -- charge le joueur bloc = initBloc() --charge la plateforme love.window.getMode(windowWidth, windowHeight) -- taille de l'écran end function love.update(dt) if love.keyboard.isDown('right') and player.x+ player.width < windowWidth and Collide(player, bloc) == false then -- déplacement vers la droite et bloque la sortie de l'écran player.x = player.x + player.speed*dt elseif love.keyboard.isDown('left') and player.x > 0 and Collide(player, bloc) == false then --déplacement gauche et bloque sortie écran + gestion collision player.x = player.x - player.speed*dt elseif love.keyboard.isDown('space') then if player.ground == true then--si le joueur est au sol player.yVelocity = player.jumpHeight player.ground = false end end if player.ground == false then -- si est en saut player.y = player.y + player.yVelocity * dt player.yVelocity = player.yVelocity - player.gravity * dt end if player.y + player.height >= windowHeight then -- empeche la sortie de l'écran à la réception du saut player.yVelocity = 0 player.ground = true player.y = windowHeight - player.height end plateforme(player, bloc, dt) --collision plateforme end function love.draw() love.graphics.draw(player.img, player.x, player.y)--place le joueur à l'écran love.graphics.rectangle('fill', bloc.x, bloc.y, bloc.width, bloc.height) --place la plateforme à l'écran end |
Mon module fonctions
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | windowWidth = 800 -- largeur ecran windowHeight = 600 -- hauteur ecran SPEED = 200 -- vitesse déplacement joueur local player = {} --table représentant le joueur function initPlayer() player.img = love.graphics.newImage("mario.png") -- image du joueur player.width, player.height = player.img:getDimensions() -- taille du joueur player.x = windowWidth / 2 -player.width -- position horizontale de départ player.y = windowHeight -player.height-- position verticale de départ player.speed = SPEED -- vitesse du joueur player.yVelocity = 0 -- vitesse ascendante player.jumpHeight = -400 -- hauteur du saut player.gravity = - 500 -- gravité player.ground = true --le joueur est au sol return player end local bloc= {} --plateforme function initBloc() bloc.width = windowWidth / 10 --largeur bloc bloc.height = windowHeight / 30 -- hauteur bloc.x = windowWidth * 0.85 - bloc.width -- emplacement bloc bloc.y = windowHeight * 0.85 - bloc.height return bloc end function Collide(player, bloc) if player.x < bloc.x + bloc.width and bloc.x < player.x + player.width and player.y < bloc.y + bloc.height and bloc.y < player.y + player.height then return true --collision end return false --pas de collision end function plateforme(player, bloc, dt) if Collide(player, bloc) then if player.y <= bloc.y +1 and (player.x >= bloc.x or player.width <= bloc.width) then -- permet de laisser le joueur sur le bloc s'il atterrit dessus player.yVelocity = 0 -- vitesse ascendante player.ground = true --permet de savoir si le joueur est sur un sol player.y = bloc.y - player.height -- replace le joueur sur la palteforme if player.x + player.width < bloc.x or player.x > bloc.x + bloc.width then -- fais tomber le perso s'il s'écarte du bloc player.ground = false player.yVelocity = player.gravity player.y = player.y - player.yVelocity * dt end elseif (player.y + player.height == bloc.y + bloc.height) and (player.x + player.width > bloc.x) then--cote gauche bloc player.x = player.x - player.speed*dt elseif player.y <= bloc.y + bloc.height then -- collision sous la plateforme player.yVelocity = - player.yVelocity end end end |
Selon moi l’erreur doit se trouver dans la deuxième partie, le module fonction, au niveau de ma gestion des collisions.
Je vous remercie d’avance si vous pouvez ou pas m’aider à avancer.