Fazendo o jogo do Pong com o arduino - Projeto TI
Headlines News :

.

Home » » Fazendo o jogo do Pong com o arduino

Fazendo o jogo do Pong com o arduino

Written By x86_g on 2013-04-03 | 6:43 AM



O jogo do Pong é o primeiro videogame com fins lucrativos. O jogo é composto de duas "raquetes" (uma para cada jogador) e o objetivo é rebater a bola, evitando o ponto do seu oponente.


A imagem acima dá uma idéia melhor de como o jogo funciona. A idéia deste projeto é utilizar dois potenciômetros ao arduino e enviar a posição angular do potenciômetro para o computador através da comunicação serial. Utilizando o processing, vamos ler a porta serial e utilizar os dados recebidos para definir a posição das raquetes. A montagem do circuito é trivial.
O código do arduino é igualmente simples. Vamos ler os valores das portas analógicas e passá-los através da comunicação serial, no seguinte formato: os dois valores dos potenciômetros separados por ";".

  1. void setup(){
  2.  Serial.begin(9600);
  3. }
  4. void loop(){
  5.  Serial.print(analogRead(A0));
  6.  Serial.print(";");
  7.  Serial.println(analogRead(A2));
  8. }

Simples assim, sem nenhum mistério. Agora só precisamos fazer o código do processing para receber e interpretar as informações. Não irei colocar muitos comentários sobre o código, se alguém tiver alguma dúvida, pode postar nos comentários que eu respondo.

  1. // Importa a biblioteca de comunicação serial
  2. import processing.serial.*;
  3.  
  4. Serial myPort;        // Cria um objeto
  5. float raio = 20;  //Raio da bola
  6. int X, Y;    //Posição X e Y da bola
  7. float vx=2, vy=2; // Componentes X e Y da velocidade da bola
  8. float vx0=vx, vy0=vy; // Velocidades iniciais
  9. int p1=0;  //Pontuação do jogador 1 e 2
  10. int p2=0;
  11. int x1=15; // Posição X das duas "raquetes"
  12. int x2=785;
  13. float y1=0;  // Posição Y das duas "raquetes"
  14. float y2=0;
  15. int tam=100; // tamanho da raquete
  16. String[] vector;

  17. void setup(){
  18.   size( 800, 400 );  //tamanho da janela
  19.   myPort = new Serial(this, Serial.list()[0], 9600); // Inicia a comunicação com a porta serial 0
  20.   PFont f = createFont("SansSerif", 40, true);  //Define a fonte utilizada no placar
  21.   textFont(f,40);  
  22.   strokeWeight( 1 );  // Largura das linhas
  23.   frameRate( 44 );  // Velocidade dos quadros
  24.   X = width / 2;
  25.   Y = (height-100) / 2;
  26.   myPort.bufferUntil('\n');  //Só inicia quando houver a primeira comunicação serial.
  27. }


  28. void draw(){
  29.   background( 255 );  //Define a cor de fundo
  30.   ////////////////////////////////////////////////////
  31.   //  Pega as informações recebidas pela porta
  32.   // serial e atribui as posições X e Y das raquetes
  33.   ////////////////////////////////////////////////////
  34.   if(myPort.available()>1){
  35.     String inString= myPort.readString(); // Lê tudo que foi obtido pela porta serial
  36.     String[] teste =split(inString,"\n"); // Divide em linhas
  37.     String[] vector = split(teste[teste.length-2],";");  // pega a penúltima e separa num vetor
  38.      y1 = float(vector[0]);
  39.      y2 = float(vector[1]);
  40.      y1 = map(y1, 0, 1023, 0, height-tam-100); // renormaliza pelo tamanho útil da janela.
  41.      y2 = map(y2, 0, 1023, 0, height-tam-100);
  42.   }
  43.  
  44.   fill( 0, 121, 184 );
  45.   ellipse( X, Y, raio, raio );
  46.   fill(255,0,0);
  47.   rect(x1,y1,-10,tam);  
  48.   fill(0,0,255);
  49.   rect(x2,y2,10,tam);
  50.   X+=vx;
  51.   Y+=vy;
  52.   ////////////////////////////////////
  53.   // Colisão com as raquetes
  54.   ////////////////////////////////////
  55.   if(X < x1+raio/2 && (Y > y1 && Y < y1+tam)){
  56.     X-=vx;
  57.     vx*=-1.1;
  58.   }
  59.   if(X > x2-raio/2 && (Y > y2 && Y < y2+tam)){
  60.     X-=vx;
  61.     vx*=-1.1;
  62.   }
  63.   ////////////////////////////////
  64.   //Fronteiras horizontais
  65.   ////////////////////////////////
  66.   if(X > x2-raio/2 || X < x1-raio/2){
  67.     if(X > x2-raio/2){
  68.       p1++;
  69.     }
  70.     if(X < x1-raio/2){
  71.       p2++;
  72.     }
  73.     X = width / 2;
  74.     Y = (height-100) / 2;
  75.     vx0=-1*vx0;
  76.     vx=vx0;
  77.     vy=vy0;
  78.     fill( 0, 121, 184 );
  79.     ellipse( X, Y, raio, raio );
  80.     vx=vx0;
  81.     vy=vy0;
  82.     delay(2000);
  83.   }
  84.   /////////////////////////////////////////
  85.   // Fronteiras verticais
  86.   ////////////////////////////////////////
  87.   if(Y > height-100-raio/2 || Y < raio/2){
  88.     Y-=vy;
  89.     vy*=-1;
  90.   }
  91.   /////////////////////////////////////////
  92.   // Placar
  93.   /////////////////////////////////////////
  94.   fill(0);
  95.   line(0,height-100,width,height-100);
  96.   text("Placar:",10,height-10);
  97.   fill(255,0,0);
  98.   text(p1, 350, height-10);
  99.   fill(0);
  100.   text("X",400,height-10);
  101.   fill(0,0,255);
  102.   text(p2, 450, height-10);
  103. }

Share this article :

0 comentários:

Postar um comentário