sábado, 14 de fevereiro de 2015

Pong Arduino Simples com TV Out

Comprei as resistências necessárias e passei a noite programando e consegui fazer o meu próprio PONG com arduino‼ Além do próprio Arduino, usei apenas mais uma resistência de 1K, uma de 470Ω, dois potenciômetros de 20K, um cabo RCA e uns fiozinhos. A quem interessar, colocarei aqui o código e amanhã trarei imagens




// A montagem consiste em:
// Uma resistência de 1K entre o pino 9 e o centro do cabo RCA
// Uma resistência de 470Ω entre o pino 7 e o centro do cabo RCA
// Um cabo RCA cujo centro estará ligado às resistências e o externo ao ground
// Dois potenciômetros,dos quais uma das extremidades deles será ligado em 5v e a outra, no ground
// O centro de um dos potenciômetros estará ligado ao pino A1 e o do outro ao A2, estes são os controles do jogo
// Utiliza a biblioteca TVout disponível em https://code.google.com/p/arduino-tvout/
// Sejam livres para usá-lo e modificá-lo, ficarei feliz em saber sobre novas utilidades, upgrades e modificações em geral
// Créditos ao Álvaro Carvalho (A11V1R15@Gmail.com)

#include "TVout.h"
#include "fontALL.h"

TVout TV;
int P1;
int P2;
int S1;
int S2;
int BallX;
int BallY;
int BallDirX;
int BallDirY;
int Vel;

void setup() {
  TV.begin(NTSC,120,96);
  TV.select_font(font8x8);
  Vel = 75;
  S1 = 0;
  S2 = 0;
  BallX = 55;
  BallY = 48;
  BallDirX = -1;
  BallDirY = 0;
}

void loop() {
  TV.clear_screen();
  for (int y=1; y<=96; y+=2){
    TV.draw_line(55,y,55,y,WHITE);
  }
  player();
  ball();
  delay(Vel);
}

void player() {
  P1 = round(analogRead(A2)/12)+1;
  P2 = round(analogRead(A1)/12)+1;
  TV.draw_rect(0,P1-1,2,11,WHITE,WHITE);
  TV.draw_rect(109,P2-1,2,11,WHITE,WHITE);
  TV.print(30,20,S1);
  TV.print(80,20,S2);
}

void ball() {
  ball1();
  ball2();
  if ((BallY > 80)||(BallY < 5)){
    BallDirY *=-1;
  }
  TV.draw_circle(BallX, BallY, 3, INVERT, INVERT);
  BallX += BallDirX;
  BallY += BallDirY;
}

void ball1(){
  if (BallX < 3){                      // Testa aproximação com o Jogador 1 
    if ((P1 < BallY)&&(P1+9 > BallY)){ // Testa se o jogador está ali pra amparar a bola
      BallDirX = 1;                    // Reverte a direção da bola, levando-a em direção ao player 2
      if (Vel>5){                      // Caso o delay seja maior que 5 milisegundos,
        Vel-=2;                        // Diminui ele pro jogo ficar mais rápido
      }
      if (BallY == P1){                // Se a bola bater na ponta de cima do jogador,
        BallDirY = -3;                 // Faz a bola ficar com o angulo máximo pra cima
      }else if (BallY < P1+3){         // E se quase isso,
        BallDirY = -2;                 // Faz a bola ficar com o angulo medio pra cima    
      }else if (BallY < P1+5){         // E se quase isso,
        BallDirY = -1;                 // Faz a bola ficar com o angulo menor pra cima    
      }else if (BallY == P1+9){        // Se a bola bater na ponta de baixo do jogador,
        BallDirY = 3;                  // Faz a bola ficar com o angulo máximo pra baixo
      }else if (BallY > P1+7){         // E se quase isso,
        BallDirY = 2;                  // Faz a bola ficar com o angulo medio pra baixo    
      }else if (BallY > P1+5){         // E se quase isso,
        BallDirY = 1;                  // Faz a bola ficar com o angulo menor pra baixo    
      }else{                           // E se não for nada disso, é bem no centro,
        BallDirY = 0;                  // Onde será rebatida reto
      }
    }else{                             // E se ele não estiver,
      S2+=1;                           // Aumenta o score do adversário,
      BallX = 55;                      // Reseta a posição da bola,
      BallY = 48;                      // Mas não sua direção,
      Vel = 75;                        // E volta pro valor inicial do Delay
    }
  }
}

void ball2(){
  if (BallX > 108){                    // Testa aproximação com o Jogador 2 
    if ((P2 < BallY)&&(P2+9 > BallY)){ // Testa se o jogador está ali pra amparar a bola
      BallDirX = -1;                   // Reverte a direção da bola, levando-a em direção ao player 1
      if (Vel>5){                      // Caso o delay seja maior que 5 milisegundos,
        Vel-=2;                        // Diminui ele pro jogo ficar mais rápido
      }
      if (BallY == P2){                // Se a bola bater na ponta de cima do jogador,
        BallDirY = -3;                 // Faz a bola ficar com o angulo máximo pra cima
      }else if (BallY < P2+3){         // E se quase isso,
        BallDirY = -2;                 // Faz a bola ficar com o angulo medio pra cima    
      }else if (BallY < P2+5){         // E se quase isso,
        BallDirY = -1;                 // Faz a bola ficar com o angulo menor pra cima    
      }else if (BallY == P2+9){        // Se a bola bater na ponta de baixo do jogador,
        BallDirY = 3;                  // Faz a bola ficar com o angulo máximo pra baixo
      }else if (BallY > P2+7){         // E se quase isso,
        BallDirY = 2;                  // Faz a bola ficar com o angulo medio pra baixo    
      }else if (BallY > P2+5){         // E se quase isso,
        BallDirY = 1;                  // Faz a bola ficar com o angulo menor pra baixo    
      }else{                           // E se não for nada disso, é bem no centro,
        BallDirY = 0;                  // Onde será rebatida reto
      }
    }else{                             // E se ele não estiver,
      S1+=1;                           // Aumenta o score do adversário,
      BallX = 55;                      // Reseta a posição da bola,
      BallY = 48;                      // Mas não sua direção,
      Vel = 75;                        // E volta pro valor inicial do Delay
    }
  }
}

2 comentários:

Pode falar, eu não mordo... Pelo menos não através da internet