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:
Já feito o sensor de colisão, falta determinar como utilizar o sensor, que será:
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
|
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
Postar um comentário