Projeto: Fazendo o jogo do Pong com o arduino
Autor: Daniel Girardi | Publicado: 2011-07-18T09:28:00-07:00

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 ";".void setup(){ Serial.begin(9600);}void loop(){ Serial.print(analogRead(A0)); Serial.print(";"); Serial.println(analogRead(A2));}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.// Importa a biblioteca de comunicação serialimport processing.serial.*; Serial myPort;        // Cria um objetofloat raio = 20;  //Raio da bolaint X, Y;    //Posição X e Y da bolafloat vx=2, vy=2; // Componentes X e Y da velocidade da bolafloat vx0=vx, vy0=vy; // Velocidades iniciaisint p1=0;  //Pontuação do jogador 1 e 2int p2=0;int x1=15; // Posição X das duas "raquetes"int x2=785;float y1=0;  // Posição Y das duas "raquetes"float y2=0;int tam=100; // tamanho da raqueteString[] vector;void setup(){  size( 800, 400 );  //tamanho da janela  myPort = new Serial(this, Serial.list()[0], 9600); // Inicia a comunicação com a porta serial 0  PFont f = createFont("SansSerif", 40, true);  //Define a fonte utilizada no placar  textFont(f,40);    strokeWeight( 1 );  // Largura das linhas  frameRate( 44 );  // Velocidade dos quadros  X = width / 2;  Y = (height-100) / 2;  myPort.bufferUntil('\n');  //Só inicia quando houver a primeira comunicação serial.}void draw(){  background( 255 );  //Define a cor de fundo  ////////////////////////////////////////////////////  //  Pega as informações recebidas pela porta   // serial e atribui as posições X e Y das raquetes  ////////////////////////////////////////////////////  if(myPort.available()>1){     String inString= myPort.readString(); // Lê tudo que foi obtido pela porta serial    String[] teste =split(inString,"\n"); // Divide em linhas    String[] vector = split(teste[teste.length-2],";");  // pega a penúltima e separa num vetor     y1 = float(vector[0]);      y2 = float(vector[1]);      y1 = map(y1, 0, 1023, 0, height-tam-100); // renormaliza pelo tamanho útil da janela.     y2 = map(y2, 0, 1023, 0, height-tam-100);  }    fill( 0, 121, 184 );  ellipse( X, Y, raio, raio );  fill(255,0,0);  rect(x1,y1,-10,tam);    fill(0,0,255);  rect(x2,y2,10,tam);  X+=vx;  Y+=vy;  ////////////////////////////////////  // Colisão com as raquetes  ////////////////////////////////////  if(X < x1+raio/2 && (Y > y1 && Y < y1+tam)){    X-=vx;    vx*=-1.1;  }  if(X > x2-raio/2 && (Y > y2 && Y < y2+tam)){    X-=vx;    vx*=-1.1;  }  ////////////////////////////////  //Fronteiras horizontais  ////////////////////////////////  if(X > x2-raio/2 || X < x1-raio/2){    if(X > x2-raio/2){      p1++;    }    if(X < x1-raio/2){      p2++;    }    X = width / 2;    Y = (height-100) / 2;    vx0=-1*vx0;    vx=vx0;    vy=vy0;    fill( 0, 121, 184 );    ellipse( X, Y, raio, raio );    vx=vx0;    vy=vy0;    delay(2000);  }  /////////////////////////////////////////  // Fronteiras verticais  ////////////////////////////////////////  if(Y > height-100-raio/2 || Y < raio/2){    Y-=vy;    vy*=-1;  }  /////////////////////////////////////////  // Placar  /////////////////////////////////////////  fill(0);  line(0,height-100,width,height-100);  text("Placar:",10,height-10);  fill(255,0,0);  text(p1, 350, height-10);  fill(0);  text("X",400,height-10);  fill(0,0,255);  text(p2, 450, height-10);}