1
resposta

Finalizei o Freeway com "Game Over" e "You Win"

Oi, pessoal!

Montei o Freeway ao longo das aulas e fui fazendo alterações conforme ia tendo ideias. Para o jogo, usei imagens a mais para os carros que seriam das faixas da outra mão, fiz o Ator começar de cima (yActor = 0) e se movimentar para os lados, também com limite nas bordas laterais da tela.

Uma outra mudança que fiz foi considerar o placar como um "número de vidas" (começando com três) que se acumulam conforme se atravessa até o final. Caso o jogador chegue a 10, ele vence a partida e é exibida a mensagem "you win" no centro da tela, hehe. Se as "vidas" chegam a 0, é exibida a mensagem "game over" em vermelho. Para funcionar assim, tive que desconsiderar a função "pontosMaiorQueZero" e coloquei "speedCar = 0" para parar os carros:

function youWin(){ if (gameScore > 9){ congratsYouWin(); speedCars = 0; yActor = 370; } }

function congratsYouWin(){ stroke(0); textAlign(CENTER); textStyle(BOLD); textSize(65); fill(color(0,255,100)); text('YOU WIN!', width / 2, height / 2 + 20); }

function endGame(){ if (gameScore < 0){ gameOver(); speedCars = 0; xActor = 225; yActor = 200; } }

function gameOver(){ stroke(0); textAlign(CENTER); textSize(70); fill(color(175,0,0)); text('GAME OVER', width / 2, height / 2 + 20); }

Para ter carros nos dois sentidos, acabei criando dois arquivos JS, um para os carros que vão e outro para os que voltam. Pra isso, optei por duplicar a maioria das funções mas com nomes parecidos (para exibir os carros, "showCar" num arquivo e "showCar2" noutro, por exemplo). Acho que dá pra deixar melhor.

Aqui o sketch: https://editor.p5js.org/taugoliv/sketches/fe6-Tmxt6

Aqui o resultado final: https://editor.p5js.org/taugoliv/full/fe6-Tmxt6

1 resposta

Oi, Thiago! Tudo bom contigo?

Primeiramente, peço desculpas pela demora em retornar!

Que bacana o seu jogo! Gostei muito das alterações que você fez ao longo do código e também do resultado final.

Visto que você optou por criar dois arquivos separados para ter carros em ambos os sentidos, trago aqui uma sugestão de como podemos diminuir as repetições de código. O passo a passo abaixo mostra isso:

  • Colocar todas as imagens dos carros em uma única lista em “images.js”:
function preload(){
  imageRoad = loadImage("images/highway.png");
  imageActor = loadImage("images/actor.png");
  imageCar1 = loadImage("images/car1.png");
  imageCar2 = loadImage("images/car2.png");
  imageCar3 = loadImage("images/car3.png");
  imageCar4 = loadImage("images/car4.png");
  imageCar5 = loadImage("images/car5.png");
  imageCar6 = loadImage("images/car6.png");
  imageCars = [imageCar1, imageCar2, imageCar3, imageCar4, imageCar5, imageCar6];
  soundtrackFXMusic = loadSound("soundfx/trilha.mp3");
  scoreFX = loadSound("soundfx/pontos.wav");
  accidentFX = loadSound("soundfx/colidiu.mp3");
}
  • Remover o segundo for da função checkTouchActor (localizada no arquivo “actor.js”) e indentar gameScore -= 1 para que essa atribuição de valores possa integrar o bloco condicional:
function checkTouchActor(){
  for (let i = 0; i < imageCars.length; i++){
    hit = collideRectCircle(xCars[i], yCars[i], widthCars, heightCars, xActor, yActor, 15)
    if (hit){
      accidentFX.play();
      backtoStartPosition();
      //if (scoreGreaterThanZero()){
      gameScore -= 1;
      //}
    }
  }
}
  • Adicionar os valores correspondentes aos carros que se movimentam para a direita (do arquivo “cars2.js”) às listas xCars, yCars e speedCars, do arquivo “cars.js”:
//var Car Display
let xCars = [520, 440, 470, -100, -100, -100];
let yCars = [40, 94, 147, 208, 260, 317];
let widthCars = 75;
let heightCars = 45;

//var Car Mvmt
let speedCars = [5, 3, 7, -6, -3, -4];
  • Ainda no arquivo “cars.js”, comentar a função carEndRoute e alterar a condicional da função throwbackCar, fazendo com que haja duas verificações:
function throwbackCar(){
  for (let i = 0; i < imageCars.length; i++){
    if(xCars[i] < -100){
      xCars[i] = 550;
    } else if (xCars[i] > 550) {
      xCars[i] = -100
    }
  }
}

// function carEndRoute(xCars){
//   return xCars < -100;
// }

Enquanto a primeira parte verifica se xCars[i] é inferior a -100, a segunda analisa se xCars[i] é maior que 550. Nestas duas situações, o valor de xCars[i] é alterado, dando a ideia de que os carrinhos sempre estão passando pelas estradas.

  • Comentar o código de “cars2.js” ou deletar o arquivo;
  • Comentar as chamadas das funções showCar2, moveCar2 e throwbackCar2 em “sketch.js
function setup() {
  createCanvas(500, 400);
  soundtrackFXMusic.loop();
}

function draw() {
  background(imageRoad);
  showActor();
  moveActor();
  showCar();
  moveCar();
  throwbackCar();
  // showCar2();
  // moveCar2();
  // throwbackCar2();
  checkTouchActor();
  addScoreboard();
  scoreCount();
  endGame();
  youWin();
}

Trouxe apenas uma sugestão. Portanto, sinta-se livre para utilizar sua criatividade no desenvolvimento da lógica trabalhada nessa questão!


Caso surjam dúvidas após minha explicação ou ao decorrer dos seus estudos, lembre-se que você pode enviá-las ao fórum. Fico à disposição para te ajudar.

Até mais!