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

Função com Return = Não explicado = Magia?

Boa noite à todos.

Percebi que não foi apenas eu que tive dificuldade em compreender a lógica de onde o código tira o paramêtro do xCarro para ser analisado, uma vez que tal variável não foi específicada em momento nenhum, e sim a do xCarros.

Várias respostas - tais como a da Giovanna Moeller e do Matheus Castiglioni - que foram muito bem explicadas, tais quais compreendi o propósito do return nas explicações e poderia me dar por satisfeito... Maaaaas, de fato nenhuma delas respondeu minha dúvida.

Talves pelo fato de xCarro for parecido com xCarros, o "erro" permanece sem explicações.

Então vamos eliminar tal problema... Renomeei a dita variável para chapolin afim de evitar mais confusões, e...

Como isso é possível?

// Código dos Carros

let xCarros = [600, 600, 600];
let yCarros = [40, 96, 150]; 
let speed = [2, 2.5, 3.2];

function mostraCarro(){
  for(let i = 0; i < imagemCarros.length; i = i+ 1){
    image(imagemCarros[i], xCarros[i], yCarros[i], 50, 40);
  }
}


function movimentaCarro(){
  for(let i = 0; i < imagemCarros.length; i = i+ 1){
    xCarros[i] -= speed[i];  
  }
}

function carLoop(){
  for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[i])){
                xCarros[i] = 600;
        }
    }
}

function passouTodaATela(chapolin){
    return chapolin < - 50;
}

Lembrando que não específiquei nenhum tipo de variável chamada chapolin. Realmente apenas a usei nessa função, e... Sim... O jogo está rodando normalmente como "esperado". Os carros saem da tela e reaparecem em loop.

Acredito que agora agora a minha dúvida e a de tantos outros está clara.

Jogo rodando normalmente - sem erros

*Alteração irrelevante (voltaPosicaoInicialDoCarro = carLoop)

2 respostas
solução!

Olá, Percival! Tudo bem com você?

De fato, esse assunto causa certa confusão no início e até desenvolvedores experientes. É totalmente normal e é muito bom você possuir o interesse em aprofundar seus conhecimentos. O teste que você realizou é totalmente coerente e vou tentar explicar o que ocorreu:

Sua pergunta é muito interessante e faz todo o sentido porque parece que um valor surgiu aparentemente "do nada" . No entanto, precisamos retomar alguns conteúdos para conseguirmos entender melhor o que aconteceu.

No primeiro momento o instrutor desmembrou a função voltaPosicaoInicialDoCarro() e criou uma nova para fazer a verificação do Movimento do carro pela tela, que é a função passouTodaATela() ( Nesse caso ele já tinha as variáveis com os valores dos carros e suas velocidades , que armazenou em lista para deixar o código mais fluido).

Dessa forma, o que aconteceu na function passouTodaATela(xCarro){ return xCarro < - 50; } é que o xCarro é um parâmetro da função.

Mas... o que são parâmetros de funções?

Todas as funções possuem em sua estrutura um parâmetro (que pode ser nomeado ou não na construção da função). Quando definimos uma função, temos uma forma (que chamamos de sintaxe) especial para declará-la, vamos ver como funciona?

Sintaxe de uma função

//Assim é a estrutura de uma função

function nome([param[, param[, ... param]]]) {
   instruções;
}

nome: nome da função;

param: o nome de um argumento a ser passado para a função (são os valores ou informações que vamos utilizar em nossa função);

instruções: instruções que formam o corpo da função (o que nós queremos que nossa função execute);

Vamos ver no código do instrutor como fica? :)

//Agora veja a função que o instrutor criou

function passouTodaATela(xCarro){ 
return xCarro < - 50; 
}

nome: passouTodaATela

parâmetro: xCarro

instrução: return xCarro <- 50

O parâmetro é apenas uma forma de nomear que naquele local vai um valor (que chamamos de argumento), você poderia substituir o nome desse parâmetro por qualquer outro que o resultado seria o mesmo (apenas aconselhamos a inserir um nome que faça sentido por questões de boa prática).

E como a função "voltaPosiçãoInicial()" vai saber o que é o xCarro?

A função "voltaPosiçãoInicial()" sabe pois o instrutor inseriu o valor da lista xCarros dentro do parâmetro xCarro , olha só:

function voltaPosicaoInicialDoCarro(){
    for(let i = 0; i < imagemCarros.length; i = i + 1){
        if(passouTodaATela(xCarros[i])){ //bem aqui ele inseriu a lista xCarros como o valor do parâmetro.
                xCarros[i] = 600;
        }
    }
}

Separei aqui alguns links que podem te ajudar:

Espero que tenha ajudado, qualquer dúvida que surgir é só falar!

Um abraço e bons estudos! :)

Muito obrigado pela ajuda Camila. Resposta muito bem formulada. Fico muito grato por despender esse tempo e esforço na minha dúvida. A terceira inserção de bloco de código me ajudou - e muito - a começar a compreender a lógica. Não cheguei no 100%, mas não tenho dúvidas que com os links e um estudo mais aprofundado chegarei lá. Mais tarde com a cabeça mais fresca voltarei para conferir os links, pois agora preciso de sono. xD

Abraços e bom estudo para você também.