Introduction: Duel of the Fate
This is a pong game works on Processing with two Arduino potentiometer as controller.
Step 1: Circuit Example
Arduino UNO x 1
Mini breadbaord x1
Potentiometer x 2
Wires x 12
Step 2: Example Code for Arduino
In this project you will need to code in both Processing and Arduino.
For Arduino
int secondSensor = 0; // second analog sensorint firstSensor = 0; // first analog sensor
int inByte = 0; // incoming serial byte
char val;
void setup()
{ // start serial port at 9600 bps:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
pinMode(2, OUTPUT); // digital sensor is on digital pin 2
establishContact(); // send a byte to establish contact until receiver // responds
}
void loop()
{ // if we get a valid byte, read analog ins:
if (Serial.available() > 0) {
// get incoming byte:
inByte = Serial.read(); // read first analog input, divide by 4 to make the range 0-255:
firstSensor = analogRead(A0) / 4;
// delay 10ms to let the ADC recover:
delay(10);
// read second analog input, divide by 4 to make the range 0-255:
secondSensor = analogRead(1) / 4;
// read switch, map it to 0 or 255L
// send sensor values:
Serial.write(firstSensor);
Serial.write(secondSensor);
}
}
void establishContact() { while (Serial.available() <= 0) {
Serial.print('A'); // send a capital A
delay(100);
}
}Step 3: Example Code for Processing
For Proccessing
// This example code is in the public domain.
import processing.serial.*; int bgcolor; // Background color int fgcolor; // Fill color Serial myPort; // The serial port int[] serialInArray = new int[3]; // Where we'll put what we receive int serialCount = 0; // A count of how many bytes we receive int apos, bpos; // Starting position of the player int p1score=0; // Score int p2score=0; boolean start=false; // The status of game boolean p1goal=false; boolean p2goal=false; boolean Gameover=false;
boolean Hit=false; boolean Goal=false;
ball b; Letter l; Number n; Score s;
boolean firstContact = false; // Whether we've heard from the
// microcontroller
void setup() {
size(500, 305); // Stage size
noStroke(); // No border on the next thing drawn
// Set the starting position of the ball (middle of the stage)
apos = width/2;
bpos = height/2;
b= new ball();
l= new Letter();
n= new Number();
s= new Score();// Print a list of the serial ports, for debugging purposes:
// I know that the first port in the serial list on my mac
// is always my FTDI adaptor, so I open Serial.list()[0].
// On Windows machines, this generally opens COM1.
// Open whatever port is the one you're using.
String portName = Serial.list()[0];
myPort = new Serial(this, portName, 9600);
}
void draw() {
background(bgcolor);
fill(255);
// Draw the shape
rect(30, apos, 20, 60);
rect(470, bpos, 20, 60);
b.balldraw();
b.ballcheck();
s.display();
s.check();}
void serialEvent(Serial myPort) {
// read a byte from the serial port:
int inByte = myPort.read();
// if this is the first byte received, and it's an A,
// clear the serial buffer and note that you've
// had first contact from the microcontroller.
// Otherwise, add the incoming byte to the array:
if (firstContact == false) {
if (inByte == 'A') {
myPort.clear(); // clear the serial port buffer
firstContact = true; // you've had first contact from the microcontroller
myPort.write('A'); // ask for more
}
} else {
// Add the latest byte from the serial port to array:
serialInArray[serialCount] = inByte;
serialCount++;
// If we have 3 bytes:
if (serialCount > 2 ) {
apos = serialInArray[0];
bpos = serialInArray[1];
fgcolor = serialInArray[2];
// print the values (for debugging purposes only):
println(apos + "t" + bpos + "t");
// Send a capital A to request new sensor readings:
myPort.write('A');
// Reset serialCount:
serialCount = 0;
}
}
}Step 4: Example Code for Processing (2)
class ball {float x=250; // Starting position of the ball float y=150;
float xspeed=3; // Speed of the ball float yspeed=3;
void balldraw() {
fill(255);
rectMode(CENTER);
rect(width/2, height/2, 6, height);
rectMode(CORNER); if ((keyPressed)&&(key==CODED)) { //Press UP to start the game
if (keyCode==UP)
{
if (Gameover==false) {
start=!start;
}
}
} if (start==false) {
fill(255);
x=250;
y=150;
ellipse(width/2, height/2, 30, 30);
}
if (start==true) {
fill(255);
ellipse(x, y, 30, 30);
x=x+xspeed;
y=y+yspeed;
}
}
void ballcheck() {
if (y<15) {
yspeed=-yspeed;
}
if (y>290) {
yspeed=-yspeed;
}
if (x>485) {
start=false;
p1score+=1;
p1goal=true;
Goal=true;
}
if (x<15) {
start=false;
p2score+=1;
p2goal=true;
Goal=true;
} if ((x>45)&&(x<65)&&(y>apos-15)&&(y<apos+75)) {<="" p=""></apos+75))>xspeed=-xspeed;
Hit=true;
}
if ((x>450)&&(x<470)&&(y>bpos)&&(y<bpos+75)) {<="" p=""></bpos+75))> xspeed=-xspeed;
Hit=true;
}
if ((x>40)&&(x<width-<width-40)&&(y style="background-color: initial;">40)&&(y>40)&&(y<height-40)){Hit=false;}</width-40)&&(y><width-40)&&(y style="background-color: initial;">}</width-40)&&(y>
<width-40)&&(y style="background-color: initial;">}</width-40)&&(y>
<width-40)&&(y style="background-color: initial;"><p>class Score{</p><p>void display(){
if(p1score==0){n.Zero(width/2-15,15,2);}
if(p1score==1){n.One(width/2-15,15,2);}
if(p1score==2){n.Two(width/2-15,15,2);}
if(p1score==3){n.Three(width/2-15,15,2);}
if(p2score==0){n.Zero(width/2+12,15,2);}
if(p2score==1){n.One(width/2+12,15,2);}
if(p2score==2){n.Two(width/2+12,15,2);}
if(p2score==3){n.Three(width/2+12,15,2);}
}</p><p>void check(){</p><p> if(p1score==3){
l.P(width/2-42,105,8);
n.One(width/2+40,105,8);
l.W(width/2-46,180,8);
l.I(width/2-4,180,8);
l.N(width/2+38,180,8);
Gameover=true;
}
if(p2score==3){
l.P(width/2-42,105,8);
n.Two(width/2+40,105,8);
l.W(width/2-46,180,8);
l.I(width/2-4,180,8);
l.N(width/2+38,180,8);
Gameover=true;
}</p><p>}</p><p>}</p></width-40)&&(y>Step 5: Example Code for Processing (3)
For Processing (3)
This part is unnecessary, but I still use this way in my code. If you can use text function, you can ignore this part and fix the code on your own.
class Letter { void A(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x, y, p, p);
rect(x-p*1, y+p*1, p, p*4);
rect(x+p*1, y+p*1, p, p*4);
rect(x, y+p*2, p, p);
}
void B(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y, p*2, p);
rect(x-p*1, y+p*2, p*2, p);
rect(x-p*1, y+p*4, p*2, p);
rect(x+p*1, y+p*1, p, p*3);
}
void C(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y+p*1, p, p*3);
rect(x, y, p*2, p);
rect(x, y+p*4, p*2, p);
}
void D(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x, y, p, p);
rect(x+p*1, y+p*1, p, p*3);
rect(x, y+p*4, p, p);
}
void E(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y+p*2, p*3, p);
rect(x-p*1, y+p*4, p*3, p);
}
void F(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y+p*2, p*3, p);
}
void G(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y+p*4, p*3, p);
rect(x+p*1, y+p*3, p, p);
}
void H(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x, y+p*2, p, p);
}
void I(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x, y, p, p*5);
rect(x-p*1, y+p*4, p*3, p);
rect(x-p*1, y, p*3, p);
}
void J(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x+p*1, y, p, p*4);
rect(x, y+p*4, p, p);
rect(x-p*1, y+p*3, p, p);
}
void K(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x, y+p*2, p, p);
rect(x+p*1, y, p, p*2);
rect(x+p*1, y+p*3, p, p*2);
}
void L(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y+p*4, p*3, p);
}
void M(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x, y+p*1, p, p*3);
}
void N(float x, float y, float p) { rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x, y, p, p);
}
void O(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x-p*1, y+p*4, p*3, p);
}
void P(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y, p*3, p);
rect(x+p*1, y, p, p*3);
rect(x-p*1, y+p*2, p*3, p);
}
void Q(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*4);
rect(x+p*1, y, p, p*4);
rect(x-p*1, y+p*3, p*3, p);
rect(x+p*1, y+p*4, p, p);
}
void R(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*5);
rect(x-p*1, y, p*3, p);
rect(x+p*1, y, p, p*3);
rect(x-p*1, y+p*2, p*3, p);
rect(x, y+p*3, p, p);
rect(x+p*1, y+p*4, p, p);
}
void S(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x, y, p*2, p);
rect(x-p*1, y+p*1, p, p*2);
rect(x-p*1, y+p*2, p*3, p);
rect(x+p*1, y+p*2, p, p*2);
rect(x-p*1, y+p*4, p*2, p);
}
void Y(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*3);
rect(x+p*1, y, p, p*3);
rect(x, y+p*2, p, p*3);
} void V(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p, p*4);
rect(x+p*1, y, p, p*4);
rect(x, y+p*3, p, p*2);
}
void W(float x, float y, float p) {
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x, y+p*2, p, p*2);
}
}class Number {
void Zero(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*1, y, p*3, p);
rect(x-p*1, y, p, p*5);
rect(x+p*1, y, p, p*5);
rect(x-p*1, y+p*4, p*3, p);
}
void One(float x, float y, float p) { rectMode(CORNER);
fill(255); rect(x, y, p, p*4);
rect(x-p*1, y, p, p);
rect(x-p*1, y+p*4, p*3, p);
} void Two(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*2, y, p*3, p);
rect(x, y, p, p*3);
rect(x-p*2, y+p*2, p*3, p);
rect(x-p*2, y+p*2, p, p*3);
rect(x-p*2, y+p*4, p*3, p);
} void Three(float x, float y, float p) {
rectMode(CORNER);
fill(255);
rect(x-p*2, y, p*3, p);
rect(x, y, p, p*3);
rect(x-p*2, y+p*2, p*3, p);
rect(x, y+p*2, p, p*3);
rect(x-p*2, y+p*4, p*3, p);
}
}



