Bonjour,
Voilà je travaille sur un projet de jeu vidéo mais je n'arrive pas a gérer les collisions entre mon personnage et les mur et les objets de ma map. Mon jeu est vue de dessus et je ne voulais pas faire comme les rpg ou l'on peut se déplacer que case par case mais mon personnage se déplace que dans 4 directions. Pour éviter d'avoir d'avoir trop de différentes tiles, j'ai un calque qui rassembles les murs, un calque qui rassemble les objets inertes, un calque pour les objets avec des animations, etc... Or c'est la que survient mon problème, je n'arrive pas a gérer les collision. Voici mon main.lua, mon joueur.lua et mon fichier map.lua

main.lua :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
require ("map")
require ("joueur")
 
function love.load()
end
 
function love.update(dt)
 
    function updateSprite (player, dt)
 
        local collide = false
        --droite
        if player.x == player.x + 1 then
            collide = CollideRight(player, dt)
        end
        --gauche
        if player.x == player.x - 1 then
            collide = CollideLeft(player, dt)
        end
        --bas
        if player.y ==player.y + 1 then
            collide = CollideDown(player, dt)
        end
        --haut
        if player.y == player.y - 1 then
            collide = CollideUp(player, dt)
        end
        --Collision
        if collide then
            player.v = 0
        end
        collide = false
    end
 
    function isSolid (id)
        if id == map.imgSol then return false end
        if id == map.imgMur then return true end
        if id == map.imgObjet then return true end
    end
 
    function CollideRight(player)
        local id = getTileAt(player.x + 1)
        return isSolid(id)
    end
 
    function CollideLeft(player)
        local id = getTileAt(player.x - 1)
        return isSolid(id)
    end
 
    function CollideUp(player)
        local id = getTileAt(player.y - 1)
        return isSolid(id)
    end
 
    function CollideDown(player)
        local id = getTileAt(player.y + 1)
        return isSolid(id)
    end
end
 
function love.draw()
    love.graphics.draw(map.imgSol)
    love.graphics.draw(map.imgMur)
    love.graphics.draw(map.imgObjet)
    love.graphics.draw(player.img, player.x, player.y, math.rad(player.angle),1,1,player.img:getWidth()/2, player.img:getHeight()/2)
end
joueur.lua :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
player = {}
player.x = 500
player.y = 500
player.v = 0.7
player.frame = 0
player.run = false
player.angle = 0
player.img = love.graphics.newImage("pistolet/rechargement stoïque/sprite_0.png")
 
function updatePlayer (player, dt)
    -- clavier
 
    if love.keyboard.isDown("right") then
        player.x = player.x + player.v
        player.angle = 90
        player.run = true
    end
 
    if love.keyboard.isDown("left") then
        player.x = player.x - player.v
        player.angle = -90
        player.run = true
    end
 
    if love.keyboard.isDown("up") then
        player.y = player.y - player.v
        player.angle = 0
        player.run = true
    end
 
    if love.keyboard.isDown("down") then
        player.y = player.y + player.v
        player.angle = 180
        player.run = true
    end
end
et map.lua :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
map = {}
map.imgSol = love.graphics.newImage("Nouveau dossier/Chambre/sol.png")
map.imgMur = love.graphics.newImage("Nouveau dossier/Chambre/mur collision.png")
map.imgObjet = love.graphics.newImage("Nouveau dossier/Chambre/objet de collisions.png")
le code actuel montre mon personnage qui ne peut pas bouger, j'ai beau appuyez sur les flèches directionnelles, il ne bouge pas.
Si quelqu'un pourrait m'aidez rapidement ce serait génial, sinon je vais devoir me remettre au case par case mais sa va ralentir un max mon jeu et il va aussi perdre de sa jouabilité.

Merci d'avance pour votre aide