For this week, I thought it would be really cool to make my snake game more advanced by using a joystick to control the movement using both Processing and Arduino. For this I used 4 male and 4 female cables and a joystick. I faced different challenges such as the arduino not transferring to processing or only two sides of the joystick working and it was more challenging than I initially thought, but it I got it working in the end!
Arduino:
void setup() { // put your setup code here, to run once: Serial.begin(9600); Serial.println("0,0"); } void loop() { if(Serial.available()>0){ char inByte=Serial.read(); int sensor = analogRead(A0); delay(0); int sensor2 = analogRead(A1); delay(0); Serial.print(sensor); Serial.print(','); Serial.println(sensor2); } }
Processing:
int grid = 20; //How big each grid square will be import processing.serial.*; PVector food; int speed = 10; boolean dead = true; int highscore = 0; Snake snake; Serial myPort; int xPos=0; int yPos=0; void setup() { size(500, 500); snake = new Snake(); food = new PVector(); newFood(); String portname=Serial.list()[2]; println(portname); myPort = new Serial(this,portname,9600); //myPort.clear(); //myPort.bufferUntil('\n'); } void draw() { background(0,0,50); fill(200,200,200); if (!dead) { if (frameCount % speed == 0) { snake.update(xPos,yPos); } snake.show(); snake.eat(); fill(200,50,100); rect(food.x, food.y, grid, grid); textAlign(LEFT); textSize(15); fill(255); text("Score: " + snake.len, 10, 20); } else { textSize(25); textAlign(CENTER, CENTER); text("Alien snake Game\nAre you up for the challenge?\nClick to start" + "\nHighscore: " + highscore, width/2, height/2); } } void newFood() { food.x = floor(random(width)); food.y = floor(random(height)); fill( random(255), random(255), random(255), random(255)); food.x = floor(food.x/grid) * grid; food.y = floor(food.y/grid) * grid; } void mousePressed() { if (dead) { snake = new Snake(); newFood(); speed = 10; dead = false; } } void serialEvent(Serial myPort){ String s=myPort.readStringUntil('\n'); s=trim(s); if (s!=null){ int values[]=int(split(s,',')); if (values.length==2){ xPos=(int)map(values[0],0,1023,0, width); yPos=(int)map(values[1],0,1023,0, height); } } println(xPos+ " "+yPos); myPort.write('0'); } class Snake { PVector pos; PVector vel; ArrayList<PVector> hist; int len; int moveX = 0; int moveY = 0; Snake() { pos = new PVector(0, 0); vel = new PVector(); hist = new ArrayList<PVector>(); len = 0; } void update(int x, int y) { if (x>300 && y<300 && y>200 && snake.moveX != 2) { snake.vel.x = -1; snake.vel.y = 0; } else if (x<200 && y<300 && y>200 && snake.moveX != -1) { snake.vel.x = 1; snake.vel.y = 0; } else if (x<300 && x>200 && y<200 && snake.moveY != 2) { snake.vel.y = -1; snake.vel.x = 0; } else if (x<300 && x>200 && y>300 && snake.moveY != -1) { snake.vel.y = 1; snake.vel.x = 0; } hist.add(pos.copy()); pos.x += vel.x*grid; pos.y += vel.y*grid; moveX = int(vel.x); moveY = int(vel.y); pos.x = (pos.x + width) % width; pos.y = (pos.y + height) % height; if (hist.size() > len) { hist.remove(0); } for (PVector p : hist) { if (p.x == pos.x && p.y == pos.y) { dead = true; if (len > highscore) highscore = len; } } } void eat() { if (pos.x == food.x && pos.y == food.y) { len++; if (speed > 5) speed--; newFood(); } } void show() { noStroke(); fill( random(255), random(255), random(255), random(255)); ; rect(pos.x, pos.y, grid, grid); for (PVector p : hist) { rect(p.x, p.y, grid, grid); } } } void keyPressed() { if (keyCode == LEFT && snake.moveX != 1) { snake.vel.x = -1; snake.vel.y = 0; } else if (keyCode == RIGHT && snake.moveX != -1) { snake.vel.x = 1; snake.vel.y = 0; } else if (keyCode == UP && snake.moveY != 1) { snake.vel.y = -1; snake.vel.x = 0; } else if (keyCode == DOWN && snake.moveY != -1) { snake.vel.y = 1; snake.vel.x = 0; } }
Good job getting it working!