For this week’s assignment I built upon the assignment I created two weeks ago for the Object Oriented Programming game. I added a joystick to control the square’s movement, as well as a potentiometer so the user can choose a color for the square throughout the game.
It was challenging to figure out how to send the information from the Arduino to Processing, but I am a lot more confident now in understanding how the Arduino sends information to Processing and how Processing uses this information.
The user uses the potentiometer attached to a breadboard, while they can use the joystick to control the customized square’s movement.
Here is a video of the joystick and potentiometer in action:
Below is the code for the Processing sketch:
import processing.serial.*; Serial myPort; int xPos, yPos; int xMove; int bgValue; float monsterSpotY = random(300, 560); float monsterSpotX = random(200, 560); float monsterRadius = 40; int gravity = 1; int coloramt = 0; class Player { float x; float y; float up; float down; float left; float right; float speed; float maxJump; float side; float prevY; Player() { x = 0; y = 580; up = 0; down = 0; left = 0; right = 0; speed = 4; maxJump = 400; side = 20; prevY = 1; } void display() { fill(255, 100, finalbgValue); rect(x, y, side, side); } void update() { x = x + (xPos) * speed; if (prevY == 1) { gravity = 1; y = y + (yPos + gravity) * speed; } //prevY = y; println(prevY); println("ypos is " + yPos); if (x <= 10) { if (y >= height - 10) { x = 10; y = height - 10; } else if (y < height - 10) { x = 10; } } else if (x >= 590) { if (y >= height - 10) { x = 590; y = height - 10; } else if (y < height - 10) { x = 590; } } else if (y <= 0) { y = 0; } else if (y >= 590) { y = 590; prevY = 1; } if (y <= 480) { prevY = 2; } if (prevY == 2) { gravity = 3; y = y + (yPos + gravity) * speed; } } } class Monster { float x; float y; float radius; float ySpeed; float monsterSpotY; float monsterSpotX; color monsterColor; Monster() { radius = monsterRadius; ySpeed = random(2, 6); monsterSpotX = random(0, width); monsterSpotY = random(0, 100); } void show() { //monsterColor = color(map(monsterSpotY, 0, height, 0, 255), map(monsterSpotY, 0, height, 100, 150), map(monsterSpotY, 0, height, 150, 255)); fill(coloramt); noStroke(); ellipse(monsterSpotX, monsterSpotY, monsterRadius, monsterRadius); } void fall() { monsterSpotY = monsterSpotY + ySpeed; if (monsterSpotY > height) { monsterSpotY = random(-200, 300); monsterSpotX = random(0, width); } } void run() { fall(); show(); } } int counter = 0; int gameState = 0; int finalbgValue; Player myPlayer; Monster myMonsters[]; void setup() { size(600, 600); myPlayer = new Player(); int monsterCount = 100; myMonsters = new Monster[monsterCount]; for (int i = 0; i < monsterCount; i++) { myMonsters[i] = new Monster(); } printArray(Serial.list()); String portname=Serial.list()[69]; println(portname); myPort = new Serial(this, portname, 9600); //myPort.bufferUntil('\n'); } void draw() { background(255); // configuration state; user can select color. if (gameState == 0) { textAlign(CENTER); fill(0); text("Color your hero!", width / 2, 200); fill(255, 100, bgValue); rectMode(CENTER); stroke(0); rect(width / 2, 290, 120, 120); fill(100); rect(width / 2, 395, 140, 30); fill(0); text("Click here to play!", width / 2, 400); println(mouseX); println(mouseY); if (mousePressed == true && mouseX > 230 && mouseX < 370 && mouseY > 383 && mouseY < 414) { gameState = 1; finalbgValue = bgValue; } } else if (gameState == 1) { myPlayer.display(); myPlayer.update(); gameOver(); fill(0); text(counter, width - 40, 30); int counterIncrement = counter /7; for (int i = 0; i < counterIncrement / 20; i+= 1) { myMonsters[i].run(); if (i == counterIncrement / 20) { i = 0; println(i); } } counter++; } else if (gameState == 2) { textAlign(CENTER); background(255); text("You Died! Your score is: " + counter, width/2, height / 2); text("Click here to play again", width / 2, height / 2 + 30); if (mousePressed == true && mouseX > 230 && mouseX < 360 && mouseY > 320 && mouseY < 340) { gameState = 1; counter = 0; myPort.stop(); // ^ myport clears serial before running setup again setup(); } } } void serialEvent(Serial myPort) { String temp=myPort.readStringUntil('\n'); temp=trim(temp); if (temp != null) { int values[]=int(split(temp, ',')); //split string of inputs by commas and end at line break "/n" if (values.length == 3) { xPos=(int)(values[0]); yPos=(int)(values[1]); bgValue = (int)(values[2]); xPos =(int) map(xPos, 0, 1023, -3, 3); yPos =(int) map(yPos, 0, 765, 3, -3); bgValue = (int) map(bgValue, 0, 1023, 0, 255); } } } void gameOver() { for (int i = 0; i < 30; i++) { if (myPlayer.x + 20 > myMonsters[i].monsterSpotX - 20 && myPlayer.x - 20 < myMonsters[i].monsterSpotX && myPlayer.y - 20 < myMonsters[i].monsterSpotY && myPlayer.y + 20 > myMonsters[i].monsterSpotY - 10) { gameState = 2; } else { } } }
Below is the code for the Arduino:
void setup() { Serial.begin(9600); pinMode(4, INPUT); pinMode(A1, INPUT); pinMode(A2, INPUT); pinMode(A0, INPUT); } void loop() { int xValue = analogRead(A1); int yValue = analogRead(A2); int sensor = analogRead(A0); Serial.print(xValue); Serial.print(","); Serial.print(yValue); Serial.print(","); Serial.println(sensor); }