Plateformer en lua, collisions

a marqué ce sujet comme résolu.

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.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte