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 serial
- import processing.serial.*;
-
- Serial myPort; // Cria um objeto
- float raio = 20; //Raio da bola
- int X, Y; //Posição X e Y da bola
- float vx=2, vy=2; // Componentes X e Y da velocidade da bola
- float vx0=vx, vy0=vy; // Velocidades iniciais
- int p1=0; //Pontuação do jogador 1 e 2
- int 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 raquete
- String[] 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);
- }
0 comentários:
Postar um comentário