Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro com objetoA nulo

Quando terminei de realizar o código no final e fui rodar apareceu este erro ":158:attempt to index a nil value (local 'objetoA')"

function temColisaoComMapa(ponto) 
            blocoX = ponto.x / 8
            blocoY = ponto.y / 8
            blocoId = mget(blocoX, blocoY)
            if blocoId >= 128 then
                    return true
            else 
                    return false
            end
    end

    function tentaMoverPara(delta)

            local novaPosicao = {
          x = jogador.x + delta.deltaX,
          y = jogador.y + delta.deltaY
         }

         if verificaColisaoComObjetos(novaPosicao) then
                  return
         end

            local superiorEsquerdo = {
                    x = jogador.x - 8 + delta.deltaX,
                    y = jogador.y - 8 + delta.deltaY
            }
            local superiorDireito = {
                    x = jogador.x + 7 + delta.deltaX,
                    y = jogador.y - 8 + delta.deltaY
            }
            local inferiorDireito = {
                    x = jogador.x + 7 + delta.deltaX,
                    y = jogador.y + 7 + delta.deltaY
            }
            local inferiorEsquerdo = {
                    x = jogador.x - 8 + delta.deltaX,
                    y = jogador.y + 7 + delta.deltaY
            }

            if not    (temColisaoComMapa(inferiorDireito) or
                        temColisaoComMapa(inferiorEsquerdo) or
                        temColisaoComMapa(superiorDireito) or
                        temColisaoComMapa(superiorEsquerdo)) then

                jogador.quadroDeAnimacao = jogador.quadroDeAnimacao + Constantes.velocidadeAnimacaoJogador
                if jogador.quadroDeAnimacao >= 3 then
                        jogador.quadroDeAnimacao = 1
                end
                jogador.y = jogador.y + delta.deltaY
                jogador.x = jogador.x + delta.deltaX            
            end        
    end

    function atualizaJogo() 
            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
                            quadros = animacaoJogador[tecla + 1]
                            quadro = math.floor(jogador.quadroDeAnimacao) 
                            jogador.sprite = quadros[quadro]
                            tentaMoverPara(direcao[tecla + 1])
                    end
            end
    end

    function desenhaMapa()
                map(0, -- posicao x no mapa
                    0, -- posicao y no mapa
                    Constantes.larguraDaTela, -- quanto desenhar x
                    Constantes.alturaDaTela, -- quanto desenhar y
                    0, -- em qual ponto colocar o x inicial
                    0) -- em qual ponto colocar p y inicial

    end

    function desenhaPlayer()
            spr(jogador.sprite, 
                    jogador.x - 8, 
                    jogador.y - 8, 
                    jogador.corDeFundo, -- cor de fundo
                    1, -- escala
                    0, -- espelhar
                    0, -- rotacionar
                    2, -- quantos blocos para a direita
                    2)    -- quantos blocos para a esquerda
    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 desenhar() 
            cls()
            desenhaMapa()
            desenhaPlayer()
            desenhaObjetos()
    end

function fazColisaoDoJogadorComAChave(indice)
 jogador.chaves = jogador.chaves + 1
 table.remove(Objetos, indice) 
 return false
end

function temColisao(objetoA, objetoB)

    local esquerdaDeB = objetoB.x - 8
    local direitaDeB = objetoB.x + 7
    local baixoDeB = objetoB.y + 7
    local cimaDeB = objetoB.y - 8

    local direitaDeA = objetoA.x + 7
    local esquerdaDeA = objetoA.x - 8
    local baixoDeA = objetoA.y + 7
    local cimaDeA = objetoA.y - 8

    if esquerdaDeB > direitaDeA or
        direitaDeB < esquerdaDeA or
        baixoDeA < cimaDeB or
        cimaDeA > baixoDeB then
        return false
    end
    return true
end

function fazColisaoDoJogadorComAPorta(indice)
 if jogador.chaves > 0 then
  jogador.chaves = jogador.chaves - 1
  table.remove(Objetos, indice)
  return false
 end
 return true
end

function verificaColisaoComObjetos(novaPosicao)
 for indice, objeto in pairs(Objetos) do
  if temColisao(novaPosicao, objeto) then
   if objeto.sprite == Constantes.SPRITE_CHAVE then
    return fazColisaoDoJogadorComAChave(indice)
   elseif objeto.sprite == Constantes.SPRITE_PORTA then
    return fazColisaoDoJogadorComAPorta(indice)
   end
  end
 end
 return false
end

function TIC()
    atualizaJogo()
    verificaColisaoComObjetos()
    desenhar()
end
1 resposta
solução!

percebi que esqueci de remover a da função TIC a fução verificaColisaoComObjetos()

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software