Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Porque estou coletando a chave juntamente com a porta?

Minha dúvida consta na parte da colisão do 'jogador' com a 'chave', quando o jogador coleta a chave a mesma some, o problema é que a porta vai junto, e o 'print' me demonstra que o jogador possui '2' chaves. Ao tentar somente passar pela porta não ocorre colisão, normal.


jogador = {
    chaves = 0
}
Constantes = {
    SPRITE_DA_CHAVE = 364,
    SPRITE_DA_PORTA = 366
}
    objetos = {}

function atualiza()

        animacaoJogador = {
            {256, 258},
            {260, 262},
            {264, 266},
            {268, 270}
        }        
        Direcao = {
            {deltaX = 0,deltaY = -1},
            {deltaX = 0,deltaY = 1},
            {deltaX = -1,deltaY = 0},
            {deltaX = 1,deltaY = 0}            
        }

        for tecla = 0, 3 do
                if btn(tecla) then
                    quadro = math.floor(jogador.quadroDeAnimacao)
                    quadros = animacaoJogador[tecla + 1]
                    jogador.sprite =quadros[quadro]
                    tentaMoverPara(Direcao[tecla+1])
                end
        end
end    
function desenhaMapa()
            map(0, -- posicao x no mapa
                            0, -- posicao y "   "
                            Constantes.LARGURA_DA_TELA, -- quanto desenhar x
                            Constantes.ALTURA_DA_TELA, -- quanto desenhar y
                            0, -- em qual ponto colocar o x
                            0) -- em qual ponto colocar o y    
end        

function desenhaObjetos()
        for indice,objeto in pairs(objetos) do
                spr(objeto.sprite,
                objeto.x - 8,
                objeto.y - 8,
                objeto.corDeFundo,
                1,
                0,
                0,
                2,
                2)
        end    
end
function desenha()
            cls()
            desenhaMapa()
            desenhaJogador()
            desenhaObjetos()
            print(jogador.chaves)            
end
function fazColisaoJogadorComChave(objeto)
        jogador.chaves = jogador.chaves + 1
        table.remove(objetos, indice)
end

function fazColisaoJogadorComPorta(indice)
        if jogador.chaves > 0 then
                jogador.chaves = jogador.chaves - 1
                table.remove(objetos, indice)
        end
end
function verificaColisaoComObjetos()
        for indice, objeto in pairs(objetos) do
                if temColisao(jogador, objeto) then
                    if objeto.sprite == Constantes.SPRITE_DA_CHAVE then
                                        fazColisaoJogadorComChave(indice)

                    elseif objeto.sprite == Constantes.SPRITE_DA_PORTA then
                                        fazColisaoJogadorComPorta(indice)
                    end
                end                        
        end
end

function TIC()

            atualiza()
            verificaColisaoComObjetos() 
            desenha()

end

function criaPorta(coluna, linha)
        local porta = {
                    sprite = Constantes.SPRITE_DA_PORTA,
                    x    = coluna * 8 + 8,
                    y = linha * 8 + 8,
                    corDeFundo = 6
            }
            return porta
end

function criaChave(coluna, linha)
        local chave = {
            sprite = Constantes.SPRITE_DA_CHAVE,
            x = coluna * 8 + 8,
            y = linha * 8 + 8,
            corDeFundo = 6 
        }
        return chave
end

function inicializa()

        local chave = criaChave(8, 7)
        table.insert(objetos, chave)

        local porta = criaPorta(18,7)
        table.insert(objetos, porta)

end

inicializa()
2 respostas
solução!

Na sua função de fazColisaoJogadorComChavevocê está recebendo um parâmetro chamado "objeto" só que você nunca usa ele. Esse parâmetro deveria representar o índice que você quer remover da lista, certo?

function fazColisaoJogadorComChave(objeto)
       jogador.chaves = jogador.chaves + 1
       table.remove(objetos, indice)
end

function verificaColisaoComObjetos()
    ...
    fazColisaoJogadorComChave(indice)
end

Caramba, verdade. Pelo visto não prestei muita atenção, isso resolveu o problema, o jogador coleta apenas a chave. Obrigado