1
resposta

Dúvida sobre funções voltaPosicaoInicialCarro() e passouTodaATela()

Olá,

Eu estava estudando o código que criamos na lição e me surgiu alguns questionamentos.

No código seguinte:

function movimentaAtor(){
  if (keyIsDown(UP_ARROW)){
    yAtor -= 3;
  }
  if (keyIsDown(DOWN_ARROW)){
    if (limiteTelaInferior()){
      yAtor += 3;
    }  
  }
}

function limiteTelaInferior(){
  return yAtor < 463;
}

A função limiteTelaInferior() não possui parâmetro entre os parênteses e o valor booleano de yAtor < 463; é passado direto.

Já em:

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

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

A função passouTodaATela(x) possui como parâmetro o x , em que x é substituído por xCarros[i] .

Aí surgiu um questionamento:

É possível, ao invés de utilizar o parâmetro x, retornar o valor booleano de xCarros[i] < - 50;, utilizando a mesma "estrutura" do primeiro código que postei?

Testei o seguinte:

function voltaPosicaoInicialCarroTeste(){
  for (let i = 0; i < imagemCarros.length; i++){
    if (passouTodaATelaTeste()){
      xCarros[i] = 830;
      print(i)
    }
  }
}

function passouTodaATelaTeste(){
  for (let i = 0; i < imagemCarros.length; i++){
    return xCarros[i] < - 50;
  }
}

Porém quando inicio o jogo, apenas o primeiro carro tem sua posição resetada, ou seja, o índice i permanece 0 e não é incrementado de 1 em 1.

Alguém pode explicar por que isso ocorre e como o código deveria ser escrito? (apesar de ser desnecessário escrever dessa forma, gostaria de entender a sintaxe)

1 resposta

Olá Alec! tudo certo?

Agradeço a sua paciência em aguardar uma resposta para seu tópico.

Certo! vou estar explicando por partes sobre o que você apresentou para que ficar mais claro.


  • No primeiro código em que você compartilhou e apontou a função limiteTelaInferior() , você comentou que nela não existe um parâmetro sendo passado, e isso ocorre pois se trata de uma variável já estabelecida dentro do projeto e com seu valor definido, e por conta disso não é necessário ser passado um parâmetro. Com isso vai ser retornado um true ou false dependendo somente se aquele valor é menor do que 463.
function limiteTelaInferior(){
  return yAtor < 463;
}
  • Já esse segundo código ele basicamente na função voltaPosicaoInicialCarro() , vai estar percorrendo toda a lista xCarros , onde vai estar mudando a posição x desses carros para 830, mas isso só ocorre caso a função passouTodaATela() onde estar sendo passado o parâmetro de xCarros[i] para função checar se aquele carro na posição x é menor do que 50, se caso seja a posição x receberá o valor 830.
function passouTodaATela(x){
  return x < - 50;
}
  • Por fim no ultimo código apresentado ele contem duas complicações, sendo a primeira na função passouTodaATelaTeste() , o laço de repetição dentro dela sempre vai rodar apenas uma vez, pois como você pediu pra retornar sempre que xCarro[i] < -50 o return sempre vai acabar o laço quando o primeiro carro tiver sua posição igual da condição. E a outra complicação e adição desse segundo laço de repetição, ele acaba deixando a complexidade do código maior, como se trata de um código simples ele não afeta muito, porém caso seja uma aplicação em larga escala acaba deixando o código bem mais lento e complexo por isso não é usual essa construção.
function voltaPosicaoInicialCarroTeste(){
  for (let i = 0; i < imagemCarros.length; i++){
    if (passouTodaATelaTeste()){
      xCarros[i] = 830;
      print(i)
    }
  }
}

function passouTodaATelaTeste(){
  for (let i = 0; i < imagemCarros.length; i++){
    return xCarros[i] < - 50;
  }
}

Espero que eu tenha te ajudado, e caso você ainda tenha dúvidas estarei a sua disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.