mmiller5_Looking Outwards-2

Conway’s Game of Life, created by John Conway in 1970, is a generative “game” where cells live, die, or are created depending on the number of living cells around them.  Conway didn’t want the algorithm to lead to exponential amounts of growth but he also wanted the ruleset to be simple, so he based the rules around cell adjacency.  “Players” choose the starting conditions– which cells are alive– and from there the algorithm autonomously steps through generations leading to a wide degree of possible patterns including all cells dying, static lifeforms, self-replicators, and more.  What inspires me the most about this project is that from a simple ruleset, there is a great amount of complexity that can be created; that 4 basic rules leads to a system that creates wonderful patterns.  Communities have formed around discovering new properties in The Game of Life, and other versions of it have been created with different rulesets and cell types.

mmiller5_Project-2

sketch

var faceWidth = 225;
var faceHeight = 225;
var faceType = 1;
var earSize = 50;
var earType = 1;
var earStroke = 10;
var faceR = 225;
var faceG = 184;
var faceB = 153;
var eyeSize = 30;
var eyeR = 255;
var eyeG = 255;
var eyeB = 255;
var eyeStroke = 1;
var mouthSize = 40;
var mouthType = 1;
var types = [1,2,3]; // faces, ears, and mouths have 3 different versions which will get randomly chosen
 
function setup() {
    createCanvas(480, 640);
    rectMode(CENTER);
}
 
function draw() {
    background(255-faceR, 255-faceG, 255-faceB); //background color is inverse color of face
    fill(faceR, faceG, faceB);


    //Ear types
    strokeWeight(earStroke);
    stroke(faceR - 10, faceG - 10, faceB - 30);
    if(earType == 2){
	ellipse(width/2 - faceWidth/2, height/2 - faceHeight/4, earSize/3 * 2, earSize);
	ellipse(width/2 + faceWidth/2, height/2 - faceHeight/4, earSize/3 * 2, earSize);
    }
    if(earType == 3){
	triangle(width/2 - faceWidth/4, height/2 - faceHeight/5,
		 width/2, height/2 - faceHeight/3,
		 width/2 - faceWidth/2, height/2 - faceHeight/2 - earSize/2);
	triangle(width/2 + faceWidth/4, height/2 - faceHeight/5,
		 width/2, height/2 - faceHeight/3,
		 width/2 + faceWidth/2, height/2 - faceHeight/2 - earSize/2);
    }

    
    //Face types
    strokeWeight(5);
    if(faceType == 1){
	ellipse(width/2, height/2, faceWidth, faceHeight);
    }
    if(faceType == 2){
	rect(width/2, height/2, faceWidth, faceHeight);
    }
    if(faceType == 3){
	triangle(width/2 - faceWidth/2, height/2 - faceHeight/2,
		 width/2 + faceWidth/2, height/2 - faceHeight/2,
		 width/2, height/2 + faceHeight/2);
    }

    //Eye Sockets
    strokeWeight(0);
    fill(faceR - 30, faceG - 30, faceB - 50);
    ellipse(width/2 - faceWidth/6, height/2 - faceHeight/6, eyeSize + 2*eyeStroke, eyeSize + 2*eyeStroke);
    ellipse(width/2 + faceWidth/6, height/2 - faceHeight/6, eyeSize + 2*eyeStroke, eyeSize + 2*eyeStroke);
    
    //Eyes will follow mouse (kinda)
    strokeWeight(eyeStroke);
    stroke(eyeR/5, eyeG/5, eyeB/3);
    fill(eyeR, eyeG, eyeB);
    var eyeXL = constrain(mouseX, width/2 - faceWidth/6 - eyeSize/15, width/2 - faceWidth/6 + eyeSize/15);
    var eyeY = constrain(mouseY, height/2 - faceHeight/6 - eyeSize/15, height/2 - faceHeight/6 + eyeSize/15);
    var eyeXR = constrain(mouseX, width/2 + faceWidth/6 - eyeSize/15, width/2 + faceWidth/6 + eyeSize/15);
    ellipse(eyeXL, eyeY, eyeSize, eyeSize);
    ellipse(eyeXR, eyeY, eyeSize, eyeSize);

    //Pupils will follow mouse (kinda)
    fill(0);
    strokeWeight(0);
    var pupilXL = constrain(mouseX, width/2 - faceWidth/6 - eyeSize/4, width/2 - faceWidth/6 + eyeSize/4);
    var pupilY = constrain(mouseY, height/2 - faceHeight/6 - eyeSize/4, height/2 - faceHeight/6 + eyeSize/4);
    var pupilXR = constrain(mouseX, width/2 + faceWidth/6 - eyeSize/4, width/2 + faceWidth/6 + eyeSize/4);
    ellipse(pupilXL, pupilY, eyeSize/2, eyeSize/2);
    ellipse(pupilXR, pupilY, eyeSize/2, eyeSize/2);
    
    //Mouth
    fill(eyeR/3, eyeG/5, eyeB/5);
    if(mouthType == 1){
	strokeWeight(mouthSize/10);
	line(width/2 - mouthSize/2, height/2 + faceHeight/6, width/2 + mouthSize/2, height/2 + faceHeight/6);
    }
    if(mouthType == 2){
	strokeWeight(mouthSize/5);
	point(width/2, height/2 + faceHeight/6);
    }

}
 
function mousePressed() {
    faceWidth = random(150, 300);
    faceHeight = random(150, 300);
    faceType = random(types);
    
    earSize = random(75, 125);
    earType = random(types);
    earStroke = random(5, 20);
    //Skin colors are setup so as to mostly resemble realistic skin tones
    faceR = random(70,255);
    faceG = random(faceR/4, faceR);
    faceB = random(faceR/4, faceG);
    
    eyeSize = random(20, 35);
    eyeR = random(0, 255);
    eyeB = random(0, 255);
    eyeG = random(0, 255);
    eyeStroke = random(1, 4);
    
    mouthSize = random(30, 60);
    mouthType = random(types);
    }

I really wanted to focus on creating different types of features rather than just adjusting the same feature by changing variables, and so I found out about using arrays from which the program makes a selection to decide which version of a feature to use, if any.  I wanted to make it even more interactive, so I tried to make the eyes follow the mouse (it kinda worked, but I know there’s a different way to do it that I’ll probably try later).

Michael Miller_Project-1

Instructions: Move the mouse around the screen to wake up the face.

miller_portrait

function setup() {
    createCanvas(300,300);

}

function draw() {
    background(32,50,126);

    ellipseMode(CENTER);
    noStroke();
    fill(255,203,70);
    //face(sun)
    ellipse(mouseX,mouseY,325,325);
    //mouse gets close to center(sunrise)
    if(dist(mouseX,mouseY,150,150)<15)
    {
	if(mouseIsPressed){
	    //eyes bug out
	    fill(255);
	    ellipse(90,125,70,70);
	    ellipse(210,125,70,70);
    
	    fill(0);
	    ellipse(random(85,95),random(120,130),60,60);
	    ellipse(random(205,215),random(120,130),60,60);
	}else{
	    //normal eyes
	    fill(255);
	    ellipse(90,125,40,40);
	    ellipse(210,125,40,40);
    
	    fill(0);
	    ellipse(90,125,30,30);
	    ellipse(210,125,30,30);
	    text("Click!",140,290);
    }
    }else{
	//eyes open as as mouse moves closer to center(wakes up)
	fill(255);
	ellipse(90,125,40,35/(dist(mouseX,mouseY,150,150)-14)+5);
	ellipse(210,125,40,35/(dist(mouseX,mouseY,150,150)-14)+5);
    
	fill(0);
	ellipse(90,125,30,25/(dist(mouseX,mouseY,150,150)-14)+5);
	ellipse(210,125,30,25/(dist(mouseX,mouseY,150,150)-14)+5);
	//sleep
	text("ZZZ",143,290);
    }
    //mouth moves as mouse moves closer to center(talking)
    fill(0);
    ellipse(150,200,150/(abs(150-mouseX)+1),90/(abs(150-mouseY)+1));
    //outline of face to suggest people to fill it with circle
    noFill();
    strokeWeight(15);
    stroke(0);
    ellipse(150,150,325,325);
    
}

I suppose my project is more of an emotional self-portrait than an accurate depiction of my appearance, focused more on metaphor than realism.  As you move the mouse closer to the center of the screen, not only does the face form, but everything brightens and daytime comes, waking up the face for the learning that is to be had.  By wiggling the mouse a little bit, you can make the mouth move, showing that talking is possible, but it will take controlled effort.  And when the mouse is in the center of the screen, clicking causes the face to get super excited, showing how it feels to be here.  Overall, the project was fun to work on, and I found it fulfilling to explore different avenues to complete it.

Michael Miller-Looking Outwards-1


Trailer for Subset Games’ FTL

FTL: Faster Than Light is a game developed from 2011 to 2012 by Justin Ma (as the artist) and Matthew Davis (as the programmer), along with Ben Prunty (the sound designer and composer) and Tom Jubert (as the writer).  In the game, the player assumes the role of a spaceship’s captain who must make decisions, manage the crew, and control the ship’s systems in order to defeat the Rebel movement.  The gameplay was largely inspired by tabletop games such as Red November, but through the use of real-time action native to video games, FTL can achieve greater levels of engagement while still maintaining the ability for players to make well-informed, strategic decisions through the ability to pause.  Having played both FTL and Red November, I truly admire the creators of FTL’s ability to make the game feel active and responsive by simplifying the complexity of events experienced during gameplay.  FTL could be played as a boardgame– every event would be resolved using dice rolls– and if it were, it would be much more complex than Red November; however, the experience is streamlined for the player, and as such, although the events of the game are mechanically almost identical to those of Red November, the feel of the game becomes far more active.  I admire the game’s ability to change how a game feels for the player by presenting the same ruleset in a different manner.

More Info On Red November