In the world of graphic design . . .
Designers have to constantly work with color values. While it is easy to simply google the R,G,B value of a color, it is a nice skill to recognize what values will output what colors. I thought this would be a fun concept to explore visually, and so the RGB GAME controller emerged.
For this project, there is an input of 3 numbers, ranging from 0 – 255 as the Red, Green and Blue values. (Meaning 0,0,0 will be black and 255,255,255 will be white.) I thought it would be a fun way for people to practice visually looking at colors and relating them to a numerical value (such as that used in coding.)
From there, the numbers are inputed through 3 knobs on the box/controller shown below.


When the game actually begins, the player must turn the knobs in order to try their best to match the color of a randomly drawn rectangle on the screen. The values of the r,g,b values the user is altering are shown on the screen, along with a timer that counts down from 25 seconds.
Originally, I wanted the randomized rectangle that was shown on the screen to disappear after 5 seconds, and the user still had to match the new rectangle from memory. This feature was discarded after some user testing that determined this would make the game a bit too difficult.
Here is a final product video.
How the code works:
There is a range of numbers ( + or – 25) in which the code is checking to see if the random rectangle matches. There is also the timer which will display a loss if the colors are not matched after 25 seconds; a win will be shown immediately.
Here is the code:
import processing.serial.*;
PFont font;
Serial myPort;
String[] messages;
int r;
int g;
int b;
boolean complete = false;
int begin;
int duration = 25;
int time = 25;
int baseRectR = floor(random(0, 255));
int baseRectG = floor(random(0, 255));
int baseRectB = floor(random(0, 255));
void setup () {
//println(Serial.list());
font = createFont("Arial", 40);
textFont(font);
begin = millis();
printArray(Serial.list());
String portname=Serial.list()[3];
println(portname);
myPort = new Serial(this, portname, 9600);
fullScreen();
}
void draw() {
background(255);
noStroke();
String vals =r + " " + g + " " + b;
String valsSet = "This rect was: " + baseRectR + " " + baseRectG + " " + baseRectB;
String valYours = "Your rect was: " + r + " " + g + " " + b;
//checks if the colors match within a range of 25
if ( (r-baseRectR <= 25) && (r-baseRectR >= -25) && (g-baseRectG <= 25) && (g-baseRectG >= -25) && (b-baseRectB <= 25) && (b-baseRectB >= -25))
{
complete = true;
font = createFont("Arial", 75);
textFont(font);
fill(0);
text("YOU HAVE WON :)", 400, height/2);
font = createFont("Arial", 40);
textFont(font);
text(valsSet, 800, 800);
text(valYours, 250, 800);
noLoop();
}
// if colors do not match after the timer is up == lose
if (time <=0 && complete == false)
{
vals = null;
fill(0);
text("SORRY HOMIE, BETTER LUCK NEXT TIME :(", 250, height/2);
font = createFont("Arial", 40);
textFont(font);
complete = true;
text(valsSet, 800, 800);
text(valYours, 250, 800);
noLoop();
}
//displays end message
fill(0);
if (complete==false) {
text(vals, 250, 800);
}
if (complete == false) {
fill(baseRectR, baseRectG, baseRectB);
rect((1.8*width)/3, height/3, 400, 400);
}
fill(r, g, b);
// sets timer
if ((time > 0) && complete == false) {
rect(width/9, height/3, 400, 400);
fill(0);
time = duration - (millis() - begin)/1000;
text(time, width/2.07, height/2);
}
}
//reads the input
void serialEvent(Serial porty)
{
String message = porty.readStringUntil('\n');
if (message != null) {
message = trim(message);
messages = message.split(",");
//println(message);
r = int(messages[0]);
g = int(messages[1]);
b = int(messages[2]);
//println(messages[0], messages[1], messages[2]);
}
}
Overall, I’m super happy with how this turned out! Even the box for the controller ended up looking really cool.