Pages: 1 ... 3 4 [5]   Go Down
Author Topic: Arduino Pong  (Read 41946 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 18
Robotics Rulez
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

i made a version with the use of three buttons that can be made from some foil; check the playground for more info; you will need this library:
http://www.arduino.cc/playground/Main/CapSense

code:
(only one control for both paddles; need to upgrade the code if you want two independent controls)

Code:
#include <TVout.h>
#include <CapSense.h>

#define PADDLE_HEIGHT 12
#define PADDLE_WIDTH 2

#define RIGHT_PADDLE_X (TV.horz_res()-4)
#define LEFT_PADDLE_X 2

#define IN_GAME 0 //in game state
#define IN_MENU 1 //in menu state
#define GAME_OVER 2 //game over state

#define LEFT_SCORE_X (TV.horz_res()/2-15)
#define RIGHT_SCORE_X (TV.horz_res()/2+10)
#define SCORE_Y 4

#define MAX_Y_VELOCITY 3
#define PLAY_TO 7

#define LEFT 0
#define RIGHT 1

CapSense rightButton = CapSense(5,4);        // 10M resistor between pins 4 & 2, pin 2 is sensor pin, add a wire and or foil if desired
CapSense leftButton = CapSense(5,3);        // 10M resistor between pins 4 & 6, pin 6 is sensor pin, add a wire and or foil
CapSense startButton = CapSense(5,2);        // 10M resistor between pins 4 & 8, pin 8 is sensor pin, add a wire and or foil

TVout TV;
unsigned char x,y;

boolean buttonStatus = false;

int wheelOnePosition = 0;
int wheelTwoPosition = 0;
int rightPaddleY = 0;
int leftPaddleY = 0;

unsigned char ballX = 0;
unsigned char ballY = 0;
char ballVolX = 1;
char ballVolY = 1;

int leftPlayerScore = 0;
int rightPlayerScore = 0;

int frame = 0;
int state = IN_MENU;

int basicInput = 50;

void processInputs() {
  long total1 =  startButton.capSense(30);
  if(total1 > basicInput) {
    buttonStatus = true;
  } else {
    buttonStatus = false;
  }
  
  long total2 =  leftButton.capSense(30);
  long total3 =  rightButton.capSense(30);

  if(total2 > basicInput) {
    wheelOnePosition = wheelOnePosition + 3;
    wheelTwoPosition = wheelTwoPosition + 3;
  }

  if(total3 > basicInput) {
    wheelOnePosition = wheelOnePosition - 3;
    wheelTwoPosition = wheelTwoPosition - 3;
  }

leftPaddleY = wheelOnePosition;
if(leftPaddleY < 0) {
  wheelOnePosition = leftPaddleY = 0;
}
if(leftPaddleY > TV.vert_res()-PADDLE_HEIGHT) {
  wheelOnePosition = leftPaddleY = TV.vert_res()-PADDLE_HEIGHT;
}

rightPaddleY = wheelTwoPosition;
if(rightPaddleY < 0) {
  wheelTwoPosition = rightPaddleY = 0;
}
if(rightPaddleY > TV.vert_res()-PADDLE_HEIGHT) {
  wheelTwoPosition = rightPaddleY = TV.vert_res()-PADDLE_HEIGHT;
}


    Serial.print(total1);                  // print sensor output 1
    Serial.print("\t");
    Serial.print(total2);                  // print sensor output 2
    Serial.print("\t");
    Serial.println(total3);                // print sensor output 3

}

void drawGameScreen() {
  TV.clear_screen();
  //draw right paddle
  //rightPaddleY = ((wheelOnePosition / 8) * (TV.vert_res()-PADDLE_HEIGHT))/ 128;
  x = RIGHT_PADDLE_X;
  for(int i=0; i<PADDLE_WIDTH; i++) {
    TV.draw_line(x+i,rightPaddleY,x+i,rightPaddleY+PADDLE_HEIGHT,1);
  }

  //draw left paddle
//  leftPaddleY = ((wheelTwoPosition / 8) * (TV.vert_res()-PADDLE_HEIGHT))/ 128;
  x = LEFT_PADDLE_X;
  for(int i=0; i<PADDLE_WIDTH; i++) {
    TV.draw_line(x+i,leftPaddleY,x+i,leftPaddleY+PADDLE_HEIGHT,1);
  }

  //draw score
  TV.print_char(LEFT_SCORE_X,SCORE_Y,'0'+leftPlayerScore);
  TV.print_char(RIGHT_SCORE_X,SCORE_Y,'0'+rightPlayerScore);

  //draw net
  for(int i=1; i<TV.vert_res() - 4; i+=6) {
    TV.draw_line(TV.horz_res()/2,i,TV.horz_res()/2,i+3, 1);
  }

  //draw ball
  TV.set_pixel(ballX, ballY, 2);
}

//player == LEFT or RIGHT
void playerScored(byte player) {
  if(player == LEFT) leftPlayerScore++;
  if(player == RIGHT) rightPlayerScore++;

  //check for win
  if(leftPlayerScore == PLAY_TO || rightPlayerScore == PLAY_TO) {
    state = GAME_OVER;
  }

  ballVolX = -ballVolX;
}

void drawMenu() {
  x = 0;
  y = 0;
  char volX = 1;
  char volY = 1;
  TV.clear_screen();
  TV.select_font(_8X8);
  TV.print_str(10, 5, "Arduino Pong");
  TV.select_font(_5X7);
  TV.print_str(22, 35, "Press Button");
  TV.print_str(50, 45, "To Start");
  delay(1000);
  while(!buttonStatus) {
    processInputs();
    TV.delay_frame(3);
    if(x + volX < 1 || x + volX > TV.horz_res() - 1) volX = -volX;
    if(y + volY < 1 || y + volY > TV.vert_res() - 1) volY = -volY;
    if(TV.get_pixel(x + volX, y + volY)) {
      TV.set_pixel(x + volX, y + volY, 0);

      if(TV.get_pixel(x + volX, y - volY) == 0) {
        volY = -volY;
      }
      else if(TV.get_pixel(x - volX, y + volY) == 0) {
        volX = -volX;
      }
      else {
        volX = -volX;
        volY = -volY;
      }
    }
    TV.set_pixel(x, y, 0);
    x += volX;
    y += volY;
    TV.set_pixel(x, y, 1);
  }
  TV.select_font(_5X7);
  state = IN_GAME;
}

void setup() {
  Serial.begin(9600);
  x=0;
  y=0;
  TV.start_render(_PAL);//for devices with only 1k sram(m168) use TV.begin(_NTSC,128,56)

  ballX = TV.horz_res() / 2;
  ballY = TV.vert_res() / 2;
}

void loop() {
  processInputs();

  if(state == IN_MENU) {
    drawMenu();
  }
  if(state == IN_GAME) {
    if(frame % 3 == 0) { //every third frame
      ballX += ballVolX;
      ballY += ballVolY;

      if(ballY <= 1 || ballY >= TV.vert_res()-1) ballVolY = -ballVolY;
      if(ballVolX < 0 && ballX == LEFT_PADDLE_X+PADDLE_WIDTH-1 && ballY >= leftPaddleY && ballY <= leftPaddleY + PADDLE_HEIGHT) {
        ballVolX = -ballVolX;
        ballVolY += 2 * ((ballY - leftPaddleY) - (PADDLE_HEIGHT / 2)) / (PADDLE_HEIGHT / 2);
      }
      if(ballVolX > 0 && ballX == RIGHT_PADDLE_X && ballY >= rightPaddleY && ballY <= rightPaddleY + PADDLE_HEIGHT) {
        ballVolX = -ballVolX;
        ballVolY += 2 * ((ballY - rightPaddleY) - (PADDLE_HEIGHT / 2)) / (PADDLE_HEIGHT / 2);
      }

      //limit vertical speed
      if(ballVolY > MAX_Y_VELOCITY) ballVolY = MAX_Y_VELOCITY;
      if(ballVolY < -MAX_Y_VELOCITY) ballVolY = -MAX_Y_VELOCITY;

      if(ballX <= 1) {
        playerScored(RIGHT);
      }
      if(ballX >= TV.horz_res() - 1) {
        playerScored(LEFT);
      }
    }
    if(buttonStatus) Serial.println((int)ballVolX);

    drawGameScreen();
  }
  if(state == GAME_OVER) {
    drawGameScreen();
    TV.select_font(_8X8);
    TV.print_str(29,25,"GAME");
    TV.print_str(68,25,"OVER");
    while(!buttonStatus) {
      processInputs();
      delay(50);
    }
    TV.select_font(_5X7); //reset the font
    //reset the scores
    leftPlayerScore = 0;
    rightPlayerScore = 0;
    state = IN_MENU;
  }

  TV.delay_frame(1);
  if(++frame == 60) frame = 0; //increment and/or reset frame counter
}

pic:
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 83
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

do you need a kristal for this
(build in 8000hz kristal)
becaus i have an old vieuw vinder that this would be awsome for

inbead this in the vieuw finder

but is this duo player or single?
Logged

Pages: 1 ... 3 4 [5]   Go Up
Jump to: