14 - Imagens

11 - Breakout

Nesta tarefa, devemos explicar e exemplificar a diferença entre o uso da variável de sistema keyPressed e a função keyPressed() com base no desenvolvimento de uma versão simplificada do jogo Breakout, que considere a colisão do centro da bola com o bastão e com dois ou mais obstáculos.

Para isso, desenvolvi uma versão do jogo Breakout, que inicia com uma tela que solicita ao usuário para apertar um botão para começar o jogo:

Tela inicial.

Criei uma variável booleana chamada tela, que quando verdadeira cria esta página. Quando o 'espaço' é pressionado, o booleano tela fica falso, iniciando o jogo:

void keyPressed() {
  if(keyCode == 32) {
    tela = false;
  }
  if(tela == false && keyCode == 82) {
    tela = true;
    
    // reset
    barraX = (width/2)-(larguraB/2);
    bolaX = 15;
    bolaY = 100;
  }
}

Foi usada a função keyPressed() para verificar se o botão correto foi pressionado e realizar a ação;

A diferença entre a função keyPressed() e a variável keyPressed, é que nesta última ela pode ser usada em um if para verificar se um botão foi pressionado, baseado em um keyCode.
Já na função é possível fazer isto de maneira automática, sem a necessidade de um if, pois ao criar a função já está se assumindo que um botão foi pressionado.

O usuário pode vencer ou perder. Na tela principal existem duas caixas em que a bola deve colidir. Caso a bola ultrapasse o "chão" é apresentada uma tela que informa que o usuário perdeu a partida, mas que pode reiniciá-la ao apertar o botão 'R'.

O usuário pode perder a partida caso a bola ultrapasse o limite inferior da tela.

Para calcular a distância entre a bola e as caixas foi usada esta função:

float distancia(float x1, float y1, float x2, float y2) {
  float b, c;
  b = abs(x1 - x2) * abs(x1 - x2);
  c = abs(y1 - y2) * abs(y1 - y2);
  float a = sqrt(b + c);
  return a;
}

Caso o usuário deixe a bola cair e perca a partida, esta tela é apresentada, solicitando que ele reinicie a partida.

Para organizar melhor o código, decidi implementar cada funcionalidade separadamente. No draw() elas são chamadas após o usuário iniciar o jogo:

if(tela) {
    background(29, 212, 216);
    fill(255);
    textSize(15);
    text("APERTE 'ESPAÇO' PARA COMEÇAR", 25, height/2);
    stroke(255);
    line(20, (height/2)+20, width-30, (height/2)+20);
    line(50, (height/2)+35, width-65, (height/2)+35);
  }
  else {
    background(255, 193, 7);
    
    colisaoBola();
    ellipse(bolaX, bolaY, raio, raio);
    
    colisaoBarra();
    rect(barraX, height-alturaB, larguraB, alturaB);
    
    colisaoSprites();
  }


Caso as duas caixas sejam eliminadas e a bola não caia no chão, o usuário vence a partida.

Colisão com a barra e as paredes implementadas.

 A colisão da bola foi implementada nesta função:

void colisaoBola() {
  bolaX += velX;
  bolaY += velY;
  
  // paredes
  if((bolaX > width-(raio/2)) || (bolaX < 0+(raio/2))) {
    velX = -velX;
  }
  if(bolaY < 0+(raio/2)) {
    velY = -velY;
  }
  
  // barra
  if((bolaX + raio/2 >= barraX) && (bolaX - raio/2 <= barraX + larguraB) && 
    (bolaY + raio/2 >= height - alturaB) && (bolaY + raio/2 <= height)) {
    velY = -velY;
  }
  
  // caso caia no chão
  if(bolaY > height) {
    background(255, 87, 34);
    textSize(19);
    fill(255);
    stroke(255);

    text("VOCÊ PERDEU!", width/2 - 70, height/2-25);
    line(25, height/2-7, width-28, height/2-7);
    text ("APERTE 'R' PARA REINICIAR", 25, height/2+25);
  }
}

Ao apertar o botão 'R' todos os valores iniciais são "resetados", ou seja, seus valores atuais são atualizados como iniciais. Assim, foi possível reiniciar o game.

Tela apresentada no fim da partida, caso o usuário vença.

Esta é uma versão resumida do jogo Breakout com o uso da função keyPressed().
Baixe o arquivo completo neste link: Game.


Anúncio

Comentários