5
respostas

Estou com um erro nesta parte do meu codigo e nao consigo achalo

function temcolisaocomobjetos(objeto1, objeto2)
    local esquerdade1 = objeto1.x - 8
    local direitade1 = objeto1.x + 7
    local baixode1 = objeto1.y + 7
    local cimade1 = objeto1.y - 8

    local direitade2 =    objeto2.x + 7
    local esquerdade2 = objeto2.x - 8
    local baixode2 = objeto2.y + 7
    local cimade2 = objeto2.y - 8
5 respostas

Oi Daniel,

Vi aqui o seu código mas não consegui encontrar nenhum problema nesse trecho do código. Qual é o erro que está aparecendo quando você tenta rodar o seu jogo?

O erro que aparece e este: attempt to index a number value (local 'objeto2') stack traceback E tem esse outro erro na mesma linha: in function 'temcolisaocomobjetos'

Oi Daniel,

Consegue postar aqui o seu código completo aqui, por favor? O que o erro tá indicando é que o objeto2 não é um objeto e sim um número. Provavelmente o local que está invocando a função temcolisaocomobjetos tá passando um número no segundo parâmetro ao invés de um objeto.

-- title:  fuga das sombras
-- author: jefersson
-- desc:   RPG em 2D
-- script: lua

jogador = {
    sprite = 260,
    x = 120,
    y = 68,
    cordefundo = 6,
    quadro = 1
}

constantes = {
    largura_tela = 240,
    altura_tela = 138,
    velocidade_sprites_player = 0.1
}

objetos = {

}

function tentamover(delta)

        meudeslocamentox = delta.deltax
        meudeslocamentoy = delta.deltay

        superioresquerdo  = {
     x = jogador.x - 8 + meudeslocamentox,
     y = jogador.y - 8 + meudeslocamentoy
        }
     superiordireito = {
     x = jogador.x + 7 +    meudeslocamentox,
     y = jogador.y - 8 + meudeslocamentoy
     }
     inferiordireito = {
     x = jogador.x + 7 + meudeslocamentox,
     y = jogador.y + 7 + meudeslocamentoy
     }
     inferioresquerdo = {
     x = jogador.x - 8 + meudeslocamentox,
  y = jogador.y + 7 + meudeslocamentoy
  }
        if not (temcolisaocommapa(inferioresquerdo) or
           temcolisaocommapa(inferiordireito) or
           temcolisaocommapa(superioresquerdo) or
     temcolisaocommapa(superiordireito)) then

                    jogador.quadro = jogador.quadro + constantes.velocidade_sprites_player    
      if jogador.quadro >= 3 then
                        jogador.quadro = 1
            end
             jogador.y = jogador.y + meudeslocamentoy
          jogador.x = jogador.x + meudeslocamentox
        end
end

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 atualiza()

    direcao = {
     {deltax = 0, deltay = -1},
        {deltax = 0, deltay = 1},
        {deltax = -1, deltay = 0},
        {deltax = 1, deltay = 0}
    }


    animacoeplayer = {
        {256, 258}, 
        {260,    262},
     {264, 266},
        {268, 270}
    }

    for tecla = 0, 3 do
        if btn(tecla) then
            quadros = animacoeplayer[tecla + 1]
            quadro = math.floor(jogador.quadro)   
            jogador.sprite = quadros[quadro]

            tentamover(direcao[tecla + 1])
        end
    end
end

function desenhaplayer()

    spr(jogador.sprite,
    jogador.x - 8,
    jogador.y - 8,
 jogador.cordefundo,
    1, -- escala
    0, -- espelhar
    0,    -- rotacionar
    2,    -- quantos blocos para direita
    2)    -- quantos blocos para baixo

end

function desenhamap()

    map(0, -- posicao x no mapa
                    0, -- posicao y no mapa
                    constantes.largura_tela,    -- quanto desenhar x
                    constantes.altura_tela,    -- quanto desenhar y
                    0, -- em qual ponto colocar o x inicial
                    0) -- em qual ponto colocar o y inicial

end

function desenhaobjetos()
    for indice,objeto in pairs(objetos) do 
        spr(objeto.sprite,
                        objeto.x,
                        objeto.y,
                        objeto.cordefundo,
                        1,
                        0,
                        0,
                        2,
                        2)    
    end
end

function colisaojogadorchave(indice)
    table.remove(objetos, indice)
end

function temcolisaocomobjetos(objeto1, objeto2)
    local esquerdade1 = objeto1.x - 8
    local direitade1 = objeto1.x + 7
    local baixode1 = objeto1.y + 7
    local cimade1 = objeto1.y - 8

    local direitade2 =    objeto2.x + 7
    local esquerdade2 = objeto2.x - 8
    local baixode2 = objeto2.y + 7
    local cimade2 = objeto2.y - 8

    if esquerdade2 > direitade1 or
                direitade2 < esquerdade1 or
                baixode1 < cimade2 or
                cimade1 > baixode2 then
        return false
    end
    return true
end

function    verificacolisaoobjeto ()
    for indice, objeto in pairs(objetos) do
        if temcolisaocomobjetos(jogador, indice) then
            colisaojogadorchave(indice)
        end
    end
end

function desenha()
    cls()
    desenhamap()
    desenhaplayer()
                desenhaobjetos()
end

function TIC()    
    atualiza()
    verificacolisaoobjeto()
    desenha()
end

function criachave(coluna, linha)
    local chave = {
        sprite = 364,
        x = coluna * 8,
        y = linha * 8,
        cordefundo = 6
    }
    return chave
end

function inicializa()
    local chave = criachave(25, 8)
    table.insert(objetos, chave)
end

inicializa()

Oi Daniel,

Me parece que faltou fazer a correção que eu tinha sugerido no seu outro post. Copiando aqui o que escrevi na ocasião:

Na linha onde a funçãotemcolisaocomobjetos é chamada, os parâmetros que são passados são: jogador que é um objeto representando o jogador e indice que é o número da posição onde o objeto está guardado na lista objetos. Acontece que a a função temcolisaocomobjetos precisa receber dois objetos justamente pra verificar se eles estão colidindo. Então ao invés de passar o indice como segundo parâmetro, você deve passar o objeto.

A linha que está assim:

if temcolisaocomobjetos(jogador, indice) then

Tem que ficar assim:

if temcolisaocomobjetos(jogador, objeto) then