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

Função unica para movimentar os carros

Olá, bom dia! Estou com uma grande dúvida, pensando em diminuir o código criei a função mover e coloquei tentei substitui-la pelas outras funções de mover os carros.

Não funcionou, desconfio que quando eu coloco ela como parâmetro, é usado o valor dela na função e o código não entende o que quero fazer. Existe algum jeito dessa função mover substituir as funções moverCarro1 e moverCarro2 ?

Desde já, muito obrigada!!

PS: Deixei no código apenas as partes que fazem parte dessas três funções, mas se precisar, coloco o código inteiro.

//função para os desenhos
function draw() {
   moverCarro1 (2)
   moverCarro2 (4)
  // mover(xCarro1,2)
  // mover(xCarro2, 5)
}

// mover o Carro1
const moverCarro1 = (y) => {
  if (xCarro1 < -50) {xCarro1 += 750}
  else {xCarro1 -= y}
}

// mover o Carro2
const moverCarro2 = (y) => {
  if (xCarro2 < -50) {xCarro2 += 750}
  else {xCarro2 -= y}
}

// função para mover todas as imagens, não está funcionando descobrir o porque
let mover = (nomeDoCarro, y) => {
  if(nomeDoCarro< -50) {nomeDoCarro+=750}
  else {nomeDoCarro-=y}
}
2 respostas
solução!

Olá Desiree, tudo bem com você?

Você acabou de descobrir uma das características mais importantes das linguagens, talvez da pior maneira aauauauha

O que está acontecendo é o chamado: Passagem de parâmetros por referência ou por cópia

Existem alguns dados, que em outras linguagens vão ser chamados de "tipos primitivos", que quando passados para uma função ela irá fazer uma cópia, como por exemplo Numbers, Strings, booleanos

E alguns dados mais complexos, como listas, objetos, classes, a gente passa uma referência na memória

A grande diferença é que no primeiro caso, qualquer mudança na variável dentro da função não afeta a variável externa, que foi o que aconteceu no seu caso, veja:

mover(xCarro1,2)

Como xCarro é um número, dentro da nossa função mover:

let mover = (nomeDoCarro, y) => {
  if(nomeDoCarro< -50) {nomeDoCarro+=750}
  else {nomeDoCarro-=y}
}

Não estamos alterando o valor de xCarro pois fizemos uma cópia do valor, e o resultado é que estamos sempre passando o mesmo dado dentro do draw, por isso temos a impressão de que o carro não se move, é como se estivesse executando sempre

mover(300, 2);
mover(300, 2);
mover(300, 2);

Para corrigir isso é bem simples, vamos retornar um valor com a nossa função, e, atribuir a xCarro, no caso:

let mover = (nomeDoCarro, y) => {
  if(nomeDoCarro< -50) 
    return nomeDoCarro+=750
  else 
    return nomeDoCarro-=y
}

// no Draw

xCarro = mover(xCarro1, 2);

Dessa forma estaremos corretamente a cada execução do draw mudando o valor da nossa variável xCarro =)

mover(300, 2);
mover(298, 2);
....

Lembrando que quando temos uma instrução apenas no if podemos omitir as chaves, é mais comum fazer dessa forma do que abrir e fechar as chaves na mesma linha, o código aparenta ficar um pouco poluído :)

Abraços e Bons Estudos!

Oi Geovani, muito obrigada por me explicar!!!