1
resposta

Heroi nao movimenta ao encostar na porta

Olá, terminei a Aula 4. Mas depois que o heroi encosta na porta ele nao se movimenta mais. Se eu pego a chave, parece que está tudo normal. Pode me ajudar?

jogador = {
 sprite = 260,
 x = 80,
 y = 68,
 corDeFundo = 6,
 quadroDeAnimacao = 1,
 chaves = 0
}

Constantes = {
 LARGURA_DA_TELA = 240,
 ALTURA_DA_TELA = 138,
 VELOCIDADE_JOGADOR = 0.1,
 SPRITE_CHAVE = 364,
 SPRITE_PORTA = 366    
}

objetos = {}

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},        
}

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

        meuDeslocamentoX = delta.deltaX
        meuDeslocamentoY = delta.deltaY

    local superiorEsquerdo = {
        x = jogador.x - 8 + meuDeslocamentoX,
        y = jogador.y - 8 + meuDeslocamentoY
    }

    local superiorDireito = {
        x = jogador.x + 7 + meuDeslocamentoX,
        y = jogador.y - 8 + meuDeslocamentoY
    }                

     local inferiorDireito = {
          x = jogador.x + 7 + meuDeslocamentoX,
          y = jogador.y + 7 + meuDeslocamentoY
       }
     local inferiorEsquerdo = {
          x = jogador.x - 8 + meuDeslocamentoX,
          y = jogador.y + 7 + meuDeslocamentoY
       }                

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

            jogador.quadroDeAnimacao = jogador.quadroDeAnimacao + Constantes.VELOCIDADE_JOGADOR
            if jogador.quadroDeAnimacao >= 3 then
                jogador.quadroDeAnimacao = 1
            end
            jogador.y = jogador.y + meuDeslocamentoY
            jogador.x = jogador.x + meuDeslocamentoX
        end
        end


function atualiza()

    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.LARGURA_DA_TELA, -- quanto desenhar x
            Constantes.ALTURA_DA_TELA, -- quanto desenhar y
            0, -- 
            0)
end


function desenhaJogador()

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

end

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

function fazColisaoDoJogadorComAPorta(indice)
        if jogador.chaves > 0 then
                jogador.chaves = jogador.chaves - 1
                table.remove(objetos,indice)
                print(2222)
                return false
        end
        print(3333,0,8)
     return true
end

function verificaColisaoComObjetos()
  for indice, objeto in pairs(objetos) do
        if temColisao(jogador, 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 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 TIC()
        atualiza()
        desenha()
end

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

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

function inicializa()

  local chave = criaChave(3,3)
        table.insert(objetos, chave)

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

end

inicializa()

1 resposta
O post foi fechado por inatividade. Para continuar o assunto, recomendamos criar um novo tópico. Bons Estudos!

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