Exercício 10 - Jogo do Pong

                   Neste exercício o objetivo é modificar o código feito em sala para criar uma versão simplificada do jogo Pong, o primeiro jogo lucrativo da história.


                 Comecei utilizando o exercício 9 como base para a movimentação da bola, porém com algumas modificações, a bola só irá rebater se colidir com as superfícies superior e inferior, não mais com as laterais. Junto a isso crio os dois paddles necessários para o jogo, um esquerdo e um direito.
                 Será nesses paddles que a bola terá que colidir para poder rebater lateralmente, como funciona do jogo Pong. Para isso, criei uma função chamada colisao , essa função irá detectar em qual paddle(direito ou esquerdo) a bola irá colidir:

boolean colisao(int xP, int yP, int x1, int x2, int y1, int y2) {
  if (((xP <= x1-rC) || (xP >= x2+rC))||((yP<= y1) || (yP>=y2))) {
    return false;
  } else {
    return true;
  }
}
Imagem ilustrativa para uma melhor noção dos valores das variáveis
              Já feito o sensor de colisão, falta determinar como utilizar o sensor, que será:
    ellipse(xC, yC, rC*2, rC*2); //bola
  rect(width - 40, yBloco, 20, 80); //paddle direito
  rect(20, yBloco2, 20, 80); //paddle esquerdo

   xC+= dXC; //muv horizontal da bola
  yC+= dYC; //muv vertical da bola

  if (colisao(xC, yC, width - 40, width - 40+20, yBloco, yBloco+80) == true) { 
    // se colisao com o paddle direito for verdadeiro, inverta a velocidade X da bola e print "direita"
    println(" direita");
    dXC = - dXC;
  } else if (colisao(xC, yC, 20, 40, yBloco2, yBloco2+80)== true) {
    // se colisao com o paddle esquerdo for verdadeiro, inverta a velocidade X da bola e print "esquerda"
    println("esquerda");
    dXC = - dXC;
  } else if (yC >=height-rC) { // se colidir com a parte inferior da tela, inverta o Y da bola
    dYC = - dYC;
  } else if (yC<=0) { //se colidir com a parte superior ta tela, também inverta o Y da bola
    dYC = - dYC;
  }


       Quando a bola encostar em um dos paddles ou nas extremidades superiores ou inferiores da tela, ela irá rebater. Por fim, criei também uma função chamada Score que mostra quem venceu a partida com apenas 1 ponto.

    void Score() {
  int PontoE=0;
  int PontoD=0;
  textSize(25);
  if (xC>width) {
    //se a bola sair da tela pelo lado direito, marcar ponto para o esquerdo
    text("Lado esquerdo Ganhou!", width/2-140, height/2);
    PontoE+=1;
  } else if (xC<0) {
    //se a bola sair da tela para o lado esquerdo, marcar ponto para o direito
    text("Lado direito Ganhou!", width/2-140, height/2);
    PontoD+=1;
  }
  text(PontoE, width/2-50, 50);
  text(PontoD, width/2+35, 50);
}

      
        Segue o código completo:

//Versão simplificada do jogo pong, disputando apenas 1 score
int xC = 100;
int yC = 120;
int rC = 10;
int yBloco = 210;
int yBloco2 = 210;
int dXC = 5 ;
int dYC = 3 ;

void setup() {
  size(640, 480);
}

boolean colisao(int xP, int yP, int x1, int x2, int y1, int y2) {
  if (((xP <= x1-rC) || (xP >= x2+rC))||((yP<= y1) || (yP>=y2))) {
    return false;
  } else {
    return true;
  }
}

void keyPressed() {
  if (key == 'w') {
    yBloco2 =yBloco2 -15;
  }
  if (key == 's') {
    yBloco2 =yBloco2 +15;
  }
  if (keyCode == UP) {
    yBloco =yBloco -15;
  }
  if (keyCode == DOWN) {
    yBloco = yBloco +15;
  }
} 

void Score() {
  int PontoE=0;
  int PontoD=0;
  textSize(25);
  if (xC>width) {
    //se a bola sair da tela pelo lado direito, marcar ponto para o esquerdo
    text("Lado esquerdo Ganhou!", width/2-140, height/2);
    PontoE+=1;
  } else if (xC<0) {
    //se a bola sair da tela para o lado esquerdo, marcar ponto para o direito
    text("Lado direito Ganhou!", width/2-140, height/2);
    PontoD+=1;
  }
  text(PontoE, width/2-50, 50);
  text(PontoD, width/2+35, 50);
}

void draw() {
  background(0);
  rect(width/2-1, 0, 2, height); //linha delimitadora
  ellipse(xC, yC, rC*2, rC*2); //bola
  rect(width - 40, yBloco, 20, 80); //paddle direito
  rect(20, yBloco2, 20, 80); //paddle esquerdo
  xC+= dXC; //muv horizontal da bola
  yC+= dYC; //muv vertical da bola
  
  if (colisao(xC, yC, width - 40, width - 40+20, yBloco, yBloco+80) == true) { 
    // se colisao com o paddle direito for verdadeiro, inverta a velocidade X da bola e print "direita"
    println(" direita");
    dXC = - dXC;
  } else if (colisao(xC, yC, 20, 40, yBloco2, yBloco2+80)== true) {
    // se colisao com o paddle esquerdo for verdadeiro, inverta a velocidade X da bola e print "esquerda"
    println("esquerda");
    dXC = - dXC;
  } else if (yC >=height-rC) { // se colidir com a parte inferior da tela, inverta o Y da bola
    dYC = - dYC;
  } else if (yC<=0) { //se colidir com a parte superior ta tela, também inverta o Y da bola
    dYC = - dYC;
  }
  Score(); // mostrar score
}









  

Comentários

Postagens mais visitadas deste blog

Exercício 6 - Bandeira do Brasil

Execício 8 - Sensor de distância