/*////////////////////////////////////////////////////////
Andrew Taylor
Interactive Toy
Description:
Press A = Ignites Fire
Press S = Stops Fire
Press W = Addes Stroke Effect
Press E = Removes Stroke Effect
"Located on the top left corner you will see a white bar. Please press this for further instructions.
Welcome to our fire, have a seat and make your self cozy. Maybe this is a mediocre pixel fire place clone.
Maybe this exactly what you need to be watching at this moment. Who knows?
Id say take a deep breathe and soak in the stars, tell a few stories and enjoy this dynamic your are experiencing"
////////////////////////////////////////////////////////*/
// GLOBAL VARIABLES
// PIXEL SIZE - Defines the default size of the squares in the sketch
float pixelSpacingBig = 40;
// EMBERS - These variables control the speed on the embers
float emberY = 400;
float emberSlow = .25;
float speed = random(.25);
// BOOLEANS - These variables are created for use within the conditional statements (Stroke / no Stroke, Fire / no Fire);
boolean a = true;
boolean s = false;
boolean w = true;
boolean e = false;
// CUSTOM FONT - Loads the font used in the sketch. This font was made using the built in font creation tool in processing.
PFont font;
// SETUP -
// Intializes size of sketch,
// Removes stroke as default
// Initializes and loads custom font
// Prints message on startup
void setup() {
size(800, 400);
noStroke();
font = loadFont ("fireFont.vlw");
textFont (font);
println(
"Located on the top left corner you will see a white bar. Please press this for further instructions. Welcome to our fire, have a seat and make your self cozy. Maybe this is a mediocre pixel fire place clone. Maybe this exactly what you need to be watching at this moment. Who knows? Id say take a deep breathe and soak in the stars, tell a few stories and enjoy this dynamic your are experiencing"
);
}
// DRAW -
// Draws the background every frame
// Draws the functions called within draw every frame
void draw() {
background(0);
addStroke();
grass();
woodDark();
woodBright();
menu();
woodEmbers();
fireMediumOrange();
fireBrightOrange();
woodDarkBottomBorder();
fireYellow();
fireEmbers();
controls();
timer();
}
// MENU
// Creates the blue bar on the left side of the sketch
void menu() {
fill(80, 177, 227);
rect(0, -20, 20, 450, 5);
}
// GRASS
// Creates the dark blue - green background behind the fire
void grass() {
fill(15, 20, 20);
rect(0, 250, 800, 150, 5);
}
// WOODEMBERS
// A nested loop which draws the bright red pixelated effect seen when the fire is off
void woodEmbers() {
for (float i = 100; i <= 700; i=i+pixelSpacingBig) {
for (float j = 310; j <= 320; j=j+pixelSpacingBig) {
fill(random(245, 255), random(25, 45), 0);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
// WOODBRIGHT
// A nested loop which draws the lighter tone of brown of the logs
void woodBright() {
for (float i = 50; i <= 750; i=i+pixelSpacingBig) {
for (float j = 280; j <= 360; j=j+pixelSpacingBig) {
fill(random(100, 108), random(40, 48), 0);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
// WOODDARK
// A nested loop which draws the darker tone of the brown of the logs
void woodDark() {
for (float i = 30; i <= 780; i=i+pixelSpacingBig) {
for (float j = 270; j <= 400; j=j+pixelSpacingBig) {
fill(random(60, 68), random(20, 28), 0);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
// WOODDARKBOTTOMBORDER
// Another nested loop which draws the bottom bottom portion of the logs
void woodDarkBottomBorder() {
for (float i = 30; i <= 780; i=i+pixelSpacingBig) {
for (float j = 380; j <= 400; j=j+pixelSpacingBig) {
fill(random(40, 48), random(10, 18), 0);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
// TIMER
// A conditional statement which displays text based on whether the coresponding time condition is met
void timer() {
if (millis() >= 5000 && millis() <= 10000) {
fill(0, 150);
textSize(32);
text("The smoke rises high ...", 125, 150);
} else if (millis() >= 11000 && millis() <= 16000) {
fill(0, 150);
textSize(32);
text("... The flame reaches out to warm ...", 125, 150 );
} else if (millis() >= 17000) {
fill(0, 150);
textSize(32);
text("... Echoes in the night", 125, 150);
}
}
// CONTROLS
// Displays the control menu if the mouse X & Y coordinates on within the parameters of the initial rectangle
// If they are, the menu expands and displays the controls text
void controls() {
fill(255);
rect(15, 0, 10, 50, 5);
if ((mouseX <= 25 && mouseX >= 10) && (mouseY <= 70 && mouseY >= 20)) {
fill(255, 104);
rect(25, 0, 300, 50, 5);
fill(0);
textSize(12);
text(" A = Ignite", 28, 13);
text(" S = Rain", 28, 23);
text(" W = Whoa", 28, 33);
text(" E = Un - Whoa", 28, 43);
}
}
// FIREYELLOW, FIREBRIGHTORANGE, FIREMEDIUMORANGE & FIREEMBERS
// Displays the top rectangle of fire
// Conditional is used to control whether fire is displayed or not depending on whether or not a specific button is pressed
// If A is pressed, fire turns on and displays the fire and if S is pressed, the fire is turned off. Fire off is the default.
// This logic applies to FIREBRIGHTORANGE, FIREMEDIUMORANGE & FIREEMBERS as well.
void fireYellow() {
if (key == 'S' || key == 's') {
s = !s;
} else if (key == 'A' || key == 'a') {
a = !a;
for (float i = 110; i <= 700; i = i+pixelSpacingBig) {
for (float j = 60; j <= 270; j = j+pixelSpacingBig) {
fill(random(245, 255), random(175, 200), 0, 255);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
}
void fireBrightOrange() {
if (key == 'S' || key == 's') {
s = !s;
} else if (key == 'A' || key == 'a') {
a = !a;
for (float i = 90; i <= 720; i = i+pixelSpacingBig) {
for (float j = 130; j <= 320; j = j+pixelSpacingBig) {
fill(random(245, 255), random(125, 175), 0, 190);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
}
void fireMediumOrange() {
if (key == 'S' || key == 's') {
s = !s;
} else if (key == 'A' || key == 'a') {
a = !a;
for (float i = 70; i <= 740; i = (i + pixelSpacingBig)) {
for (float j = 200; j <= 320; j = j + pixelSpacingBig) {
fill(random(245, 255), random(100, 130), 0, 210);
rect(i, j, pixelSpacingBig, pixelSpacingBig);
}
}
}
}
// FIREEMBERS
// Using loops and conditionals similar to others with a couple differences.
// The embers travel in a negative (upwards direction) when A is pressed and reset to height of window when they reach 0.
// They also follow pMouse function to allow for some minor pseudo parallaxing.
void fireEmbers() {
if (key == 'S' || key == 's') {
s = !s;
} else if (key == 'A' || key == 'a') {
a = !a;
for (float i = 170; i <= 680; i = i + 150) {
if (emberY >= -30) {
fill(255, 54, 16, 200);
rect(i+pmouseX/4, emberY+pmouseY/4, pixelSpacingBig, pixelSpacingBig);
emberY = emberY-(emberSlow+speed);
} else if (emberY <= 100) {
fill(255, 54, 16, 200);
rect(i+pmouseX/4, emberY+pmouseY, pixelSpacingBig, pixelSpacingBig);
emberY = height;
emberY = emberY-(emberSlow+speed);
}
}
}
}
// ADDSTROKE
// When W is pressed, stroke effect is added to the drawing, when E is pressed, it is removed.
void addStroke() {
if (key == 'w' || key == 'W') {
s = !s;
stroke(0);
} else if (key == 'e' || key == 'E') {
noStroke();
a = !a;
}
}