Soooo, I have recreated my table tennis game but using a physical controller a.k.a. Potentiometer. It turned out to be better than the previous version since more than one key cannot be pressed at a time and the sensor transfer their values once a frame. I have encountered a problem though during coding. The thing is that when you output data from arduino to processing we use serial monitor. It transfers one line at a time, when i needed two. What Jack advised me to do is to put all the data in one line and separate using a comma (CSV file? really? how didnt I come up with that? Am I really a CS major?) Here is a short video:
And here is the code:
1)Code for arduino:
void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("0,0"); } void loop() { // put your main code here, to run repeatedly: if (Serial.available()>0){ char inByte = Serial.read(); int sensor = analogRead(A0); int sensor1 = analogRead(A1); delay(0); Serial.print(sensor); Serial.print(","); Serial.println(sensor1); } }
2) Code for processing:
a. Main file:
import processing.serial.*; Serial myPort; ball ball; padle padle1, padle2; color fillVal = color(126); float move = 0; float velocity = 40; float move1 = 0; PFont f; int padle3 = 0; int padle4 = 0; void setup() { rectMode(CENTER); size(1280, 640); f = createFont("Arial", 16, true); ball = new ball(5, 5, 20); padle1 = new padle(width*0.05, height/2, 10, height/4); padle2 = new padle(width*0.95, height/2, 10, height/4); printArray(Serial.list()); String portname=Serial.list()[32]; println(portname); myPort = new Serial(this, portname, 9600); myPort.clear(); } void keyPressed() { //println(keyCode); if (keyCode == 32) { ball.velocityX = 5; ball.ballY = height/2; ball.velocityY = 5; ball.ballX = width/2; ball.counter1 = 0; ball.counter2 = 0; } //if (keyCode == 83) { // if (move<=200) // move+= velocity; //} //if (keyCode == 87) { // if (move>=-200) // move -= velocity; //} //if (keyCode == 38) { // if (move1>=-200) // move1-= velocity; //} //if (keyCode == 40) { // if (move1<=200) // move1+= velocity; //} } void draw() { background(0); textFont(f, 32); fill(255); text(ball.counter1, width*0.33, height*0.1); text(ball.counter2, width*0.66, height*0.1); textFont(f, 14); text("'SPACE' to reset score", 5, 14); text("'W' and 'S' to move left paddle", 5, height-7); text("'UP' and 'DOWN' to move right paddle", width*0.78, height-7); drawLine(); ball.run(padle3-height/8, padle3+height/8, padle4-height/8, padle4+height/8); padle1.display(width*0.05, padle3, 10, height/4); padle2.display(width*0.95, padle4, 10, height/4); } void drawLine() { stroke(255); strokeWeight(4); fill(0); line(width/2, 0, width/2, height); } void serialEvent(Serial myPort) { String s=myPort.readStringUntil('\n'); s=trim(s); if (s!=null) { println(s); String[] s1 = split(s, ','); padle3 = (int)map(int(s1[0]),0,1023,0,height); padle4 = (int)map(int(s1[1]),0,1023,0,height); println(s1[0]); println(s1[1]); } myPort.write('0'); }
b. Ball class:
class ball { float velocityX; float velocityY; int size; float ballX = width/2; float ballY = height/2; color fillVal = color(255, 0, 0); int counter1 = 0; int counter2 = 0; ball(float _velocityX, float _velocityY, int _size) { velocityX = _velocityX; velocityY = _velocityY; size = _size; } void update(float a, float b, float c, float d) { //println("velocityX = "+velocityX); if (ballX >= width) { ballX = width/2; ballY = height/2; velocityX = -5; velocityY = 5; counter1+=1; } if (ballX <= 0 ) { ballX = width/2; ballY = height/2; velocityX = 5; velocityY = 5; counter2+=1; } if (ballX >= width*0.94 && ballX <= width*0.96 && ballY >= c && ballY <=d || ballX >= width*0.04 && ballX <= width*0.06 && ballY >= a && ballY <=b) { velocityX*=1.1; velocityY = random(-15,15); velocityX = -velocityX; } ballX += velocityX; if (ballY >= height || ballY <= 0) { velocityY = -velocityY; } ballY += velocityY; } void display() { //ellipse(width/2, height/2, size, size); fill(fillVal); noStroke(); ellipse(ballX, ballY, size, size); } void run(float a, float b, float c, float d) { update(a, b, c, d); display(); } }
c. Padle class:
class padle { float x; float y; float w; float h; color fillVal = color(0, 255, 0); padle(float _x, float _y, float _w, float _h) { x = _x; y = _y; w = _w; h = _h; } void update() { } void display(float x, float y, float w, float h) { fill(fillVal); rect(x, y, w, h, 5); } void run() { update(); display(x,y,w,h); } }
Final project idea:
My idea is to make a claw game where you pull out toys. But all of that will be on the screen except the controller. After that an actual toy that you have pulled out in the game falls from behind the screen. The idea is to make an unexpected result. The user won’t have an idea that the toy from the computer will fall out from behind the computer. Other than that I have some ideas like making a game in processing
and using a physical controller (sensors, buttons), but Aaron didn’t really liked this idea 🙁
“and using a physical controller (sensors, buttons), but Aaron didn’t really liked this idea”
I don’t remember saying that. I think using some sort of controller would be great actually.
Also, Jack is absolutely correct about the commas. Please see the sendMultipleToProcessing example in the class github repo for how to do it: https://github.com/aaronsherwood/introduction_interactive_media/blob/master/arduinoExamples/serialExamples/sendMultipleToProcessing05/sendMultipleToProcessing05.ino