Lab 5 – Use functions and objects in Processing (Sean Kelly)

For this lab, Carson initially decided it would be a fun idea to use a photo of me as the basis for his project. Not wanting to be outdone, I decided to use a photo of him for my project. With a huge 98 “likes” on facebook, I thought it was a great way to stay relevant. In this sketch, Carson’s face bounces and pops while distorting based on the mouse’s x and y position.

Screenshots:

Screen Shot 2014-03-14 at 11.01.36 AM Screen Shot 2014-03-14 at 11.01.47 AM Screen Shot 2014-03-14 at 11.03.17 AM

 

The Code:

ArrayList<Box> myBoxes;
int totalBoxes = 0;
int boxLimit = 50;
PImage img;

void setup() {
size(800, 800);
myBoxes = new ArrayList<Box>();

img = loadImage (“carsons.png”);
}

void draw() {
background (255);
image (img,0,0);

for (int i = 0; i < totalBoxes; i++) {
Box myBox = myBoxes.get(i);
myBox.move();
}
if (totalBoxes < boxLimit) {

color c = color(floor(random(0, 255)), floor(random(0, 255)), floor(random(0,255)));
myBoxes.add (new Box(c, floor(mouseX), floor(mouseY)));
totalBoxes++;

}
}

 

New Tab:
class Box {

PVector myPosition;
color myColor;
float myRotation = 1;
int mySize = 30;
Box(color c, int x, int y) {

println(“Box”);
myPosition = new PVector(x, y);
myColor = c;
}

void move() {
println(“move”);

fill(myColor);

pushMatrix();
translate(myPosition.x, myPosition.y);
translate(40,40);
rotate(myRotation);
myRotation += -2;
//rect(0-mySize/2, 0-mySize/2, mySize, mySize);

image (img,0,0,mouseX*2, mouseY*2);

popMatrix();
}

}

Lab 4– Create an animation in Processing (Sean Kelly)

For this lab, I tried to expand on my previous snowman picture and add a simple blizzard animation to it. The “snowflakes” blow around quickly and either stay in the background or in front of the snowman. Possible future improvements: change the code so that the snowflakes do not bunch together in the top left corner.

Screen Shot 2014-03-31 at 9.35.02 PM

 

The Code:

ArrayList<Box> myBoxes;
int totalBoxes = 0;
int boxLimit = 100;

 
void setup () {
size (640, 480);
myBoxes = new ArrayList<Box>();
background (255);
smooth () ;
strokeWeight (2);
for (int i = 2; i < width; i = i+50) {
for (int j = 2; j < height; j = j+50) {

point (i,j);
}
}
}

void draw () {

beginShape();
vertex(0, 350);
vertex(850, 350);
vertex(850, 500);
vertex(0, 500);
fill (255);
endShape(CLOSE);

beginShape();

ellipseMode (CORNER); //lower body
ellipse (175,260,225,190);

ellipseMode (CORNER); // middle body
ellipse (195,175,175,125);

ellipseMode (CORNER); //head
ellipse (225,100, 110, 100);

ellipseMode (CENTER); //L outer eye
ellipse (260,136,20,20);

ellipseMode (CENTER); //R outer eye
ellipse (300,136,20,20);

ellipseMode (CENTER); //L inner eye
ellipse (262,140,2,2);

ellipseMode (CENTER); //R inner eye
ellipse (298,140,2,2);

line (215,230,125,190); //L arm
line (355,230,420,150); //R arm

fill (250,150,0); // why does this work

triangle(365, 162, 280, 150, 280, 175); //nose
endShape(CLOSE);

fill (139,69,19);
beginShape(); //trunk
vertex(630, 300);
vertex(590, 300);
vertex(590, 400);
vertex(630, 400);
endShape (CLOSE);

fill (0,100,0);
beginShape (); //tree
triangle(610, 75, 650, 175, 570, 175);
triangle(610, 125, 670, 250, 550, 250);
triangle(610, 175, 710, 325, 510, 325);
endShape (CLOSE);

fill (255);

for (int i = 0; i < totalBoxes; i++) {
Box myBox = myBoxes.get(i);
myBox.move();
}
if (totalBoxes < boxLimit) {

color c = color(floor(random(0, 255)), floor(random(0, 255)), floor(random(0,255)));
myBoxes.add(new Box(c, floor(random(0,width)), floor(random(0,height))));
totalBoxes++;

}
}

Second tab – “Box” (snowflakes)

class Box {

PVector myPosition;
color myColor;
float myRotation = 0;

Box(color c, int x, int y) {

println(“Box”);
myPosition = new PVector(x, y);
myColor = c;
}

void move() {
println(“move”);

pushMatrix();
translate(myPosition.x, myPosition.y);

rotate(myRotation);
myRotation += .1;
rect(myPosition.x, myPosition.y, 10, 10);

popMatrix();
}

}

Storyboard: Connie, Villa and Alicja

Our idea for the project is to create a kind of a tribute to Shanghai, to show in our video how we see it. Therefore, we want to film at many different sites, which we can plan out, but it is hard to predict what exactly we will be able to film. For the same reason we found it hard to come up with the time duration – some shots can be pretty short, while others might turn out longer, so we left it blank for now.

Here is our storyboard, sorry for the bad quality.

photo 2 photo 1 stboard

Echo and Dongning’s midterm project

Basically we made a game called Flappy Egg which is quite similar to Flappy Bird using processing, and then assembled a force sensor to control the egg. This is actually our plan B since our plan A, which is to use a wii nunchuck to control the egg, didn’t work at last.  It was a long but fun process working on this project, and we learned a lot from it.

import processing.serial.*;
import cc.arduino.*;
Arduino arduino;

//judge click the play button
boolean isMouseOverPlayButton(){
//Get half-width
int hw=playButtonWidth/2;
//Get half-height
int hh=playButtonHeight/2;
// Returns true if mouse position is within the bounds of the button
return mouseX >= playButtonX – hw && mouseX <= playButtonX + hw &&
mouseY >= playButtonY – hh && mouseY <= playButtonY + hh;
}

//judge click the try again button
boolean tryAgainButton(){
int hw2=tryAgainButtonWidth/2;
int hh2=tryAgainButtonHeight/2;
// Returns true if mouse position is within the bounds of the button
return mouseX >= tryAgainButtonX-hw2 && mouseX<=tryAgainButtonX+hw2 &&
mouseY >= tryAgainButtonY-hh2 && mouseY<= tryAgainButtonY+hh2;
}

//make the egg
void egg(){
//start the timer
timer=millis()-startTimer;

//Draw the egg.
background(255);
ellipseMode(CENTER);
fill(0);
ellipse(200,eggY-15,30,35);
if (eggY<height){
eggY+=speedY;
}
//times counting through the game
fill(0);
textSize(20);
text(“Time passed: “+timer/1000+” seconds”,120,10);
text(“Obstacles passed:”+number,95,30);
}

//the gameover screen
void showGameOverScreen(){
//Game over
rect(tryAgainButtonX, tryAgainButtonY, tryAgainButtonWidth, tryAgainButtonHeight);
background(0);
textAlign(CENTER,CENTER);
textSize(72);
fill(255);
text(“GAME OVER”,width/2,height/4);
textSize(24);
int timerEnd=timer;
int num=number;
//timer&numbber
text(“You played “+timerEnd/1000+” seconds.”,width/2,height/3+30);
text(“You passed “+number+” obstacles.”,width/2,height/3+60);
//try again button
fill(0);
stroke(255);
rectMode(CENTER);
rect(width/2,1*height/2+52, width/5+50,height/8);
fill(255);
textSize(44);
text(“TRY AGAIN”,width/2,1*height/2+50);
}

//if the egg hits the obstacles
void hit(){
for (int i = allPipes.size()-1; i >= 0; i–) {
Pipe thisPipe = allPipes.get(i);
println(thisPipe.rectX);

//Hit on the left side
distanceLeft=dist(200,eggY-15,thisPipe.rectX,eggY-15);
if((distanceLeft<=15)&&((eggY<thisPipe.rectheight)||(eggY>thisPipe.rectheight+120))){
gameover=true;
}

//Hit on the up side
if ((thisPipe.rectX<230)&& (thisPipe.rectX>110)){
distanceUp=dist(200,eggY-35/2,200,thisPipe.rectheight);
if (distanceUp<=15){
gameover=true;
}
distanceDown=dist(200,eggY-35/2,200,thisPipe.rectheight+thisPipe.gap);
if(distanceDown<=35/2){
gameover=true;
}
}
if (eggY>=400){
gameover=true;
}
if (eggY<=0){
gameover=true;
}
}
}

//Click to play & Control the game by mouse
void mousePressed(){
// Check if we haven’t started yet, and if the click is within the button bounds
if (!bStarted && isMouseOverPlayButton())
{
// Now, we can start!
bStarted = true;
return;
}

//Check Try again
if (gameover=true && tryAgainButton()==true){
//Try again start
reset();
gameover=false;
return;
}
}

//reset the game
void reset(){
for (int i = allPipes.size()-1; i >= 0; i–) {
Pipe thisPipe = allPipes.remove(i);
thisPipe.rectX=1000;
eggY=200;
timer=0;
startTimer=millis();
number=0;
}
}

//the welcome screen
void showWelcomeScreen(){
rect(playButtonX, playButtonY, playButtonWidth, playButtonHeight);
//Title
textAlign(CENTER,CENTER);
textSize(72);
fill(0);
text(“~Flappy Egg~”,width/2,height/4);

//Play Button
fill(255);
stroke(3);
rectMode(CENTER);
rect(width/2,1*height/2+20, width/5,height/8);
fill(0);
textSize(44);
text(“PLAY”,width/2,1*height/2+15);

//Instruction
textSize(24);
fill(0);
text(“Click the sensor to move up the egg.”,width/2,height/2+100);
text(“Avoid the obstacles.”,width/2,height/2+130);
startTimer=millis();
}

//Control the game by keyboard
void keyPressed(){
if (key == CODED) {
if (keyCode == UP) {
eggY-=60;
}
}
}

int pipeTimer = 0;
int pipeTimeOut = floor(random(50, 400));
float eggY=200;
float speedY=1.5;
float distanceLeft;
float distanceUp;
float distanceDown;
int playButtonWidth, playButtonHeight;
int playButtonX, playButtonY;
int tryAgainButtonWidth, tryAgainButtonHeight;
int tryAgainButtonX, tryAgainButtonY;
boolean bStarted;//game starts
boolean gameover=false;//game over
int timer;//time passed since start
int number=0;//times hit the obstacles
boolean show=false;
int startTimer;
ArrayList<Pipe> allPipes;
int sensorVal;

void setup() {

arduino = new Arduino(this, Arduino.list()[5], 57600);
for (int i = 0; i <= 13; i++)
arduino.pinMode(i, Arduino.INPUT);
size(1000, 400);
//add pipes
allPipes = new ArrayList<Pipe>(); // Create an empty ArrayList
allPipes.add(new Pipe());
//play button
playButtonWidth = width / 5;
playButtonHeight = height / 8;
playButtonX = width / 2;
playButtonY = 1* height / 2+20;
//try again button
tryAgainButtonWidth=width/5+50;
tryAgainButtonHeight=height/8;
tryAgainButtonX=width/2;
tryAgainButtonY=height/2+52;
timer = 0;
}

void draw() {
//WelcomeScreen
background(255);

sensorVal = arduino.analogRead(0);

if (sensorVal>0){
eggY=eggY-1.5*sensorVal;
}

//Situations in the game
if (!bStarted && !gameover)
{
showWelcomeScreen();
return;
}

else if (bStarted && gameover) {
showGameOverScreen();
return;
}
else if (bStarted && !gameover) {
egg();
hit();
}

// Move the pipe
if (pipeTimer == pipeTimeOut) {
allPipes.add(new Pipe());
pipeTimer = 0;
pipeTimeOut = floor(random(75, 150));
}

for (int i = allPipes.size()-1; i >= 0; i–) {
Pipe thisPipe = allPipes.get(i);
thisPipe.movePipe();
if (100==thisPipe.rectX){
number++;
}
}
pipeTimer++;
println(pipeTimer);
println(pipeTimeOut);
}屏幕快照 2014-03-31 下午2.56.44屏幕快照 2014-03-31 下午2.58.58屏幕快照 2014-03-31 下午2.57.31IMG_4731

Nancy’s midterm project

Basically, my midterm project is a variation of a recently popular game named 2048. The rule for the game is quite simple: when two boxes with the same number collide, they will become one box and the number inside the box will double. For example, two boxes with the same number 2 collide will become a box containing the number 4. You will win if the number inside the box is 2048. I want to substitute pictures with something funny related to GPS for the boxes with numbers, which means every picture corresponds to one number.  I get the original codes online, but the author writes the codes implicitly and the codes are almost unreadable. Hence, I have to spend a lot of time reading and understanding the codes as well as seeking some ways to make changes. Finally, I understood most parts of the codes and found a way to make the changes and I used photoshop to make the pictures into proper size. Here is the final codes and the screenshot of the game.

int[][] b = new int[4][4];
int pad = 20, bs = 100, len = pad*(b.length+1)+bs*b.length, score = 0, dead = 1;
PImage img3;
PImage img4;
PImage img6;
PImage img5;
PImage img7;
PImage img8;
PImage img9;
PImage img10;
PImage img11;
PImage img12;
PImage img13;

void setup() {
size(500, 500); //size(len, len);
restart();
textFont(createFont(“Courier”, 40));
img3 = loadImage(“3.jpg”);
img4 = loadImage(“4.jpg”);
img5 = loadImage(“5.jpg”);
img6 = loadImage(“6.jpg”);
img7 = loadImage(“7.jpg”);
img8 = loadImage(“8.jpg”);
img9 = loadImage(“9.jpg”);
img10 = loadImage(“10.jpg”);
img11 = loadImage(“11.jpg”);
img12 = loadImage(“12.jpg”);
img13 = loadImage(“13.jpg”);
}
void restart() {
b = new int[4][4];
spawn();
score = dead = 0;
}
void spawn() {
ArrayList<Integer> xs = new ArrayList<Integer>(), ys = new ArrayList<Integer>();
for (int j = 0 ; j < b.length; j++) for (int i = 0 ; i < b[j].length; i++) if (b[j][i]==0) {
xs.add(i);
ys.add(j);
}
int rnd = (int)random(0, xs.size()), y = ys.get(rnd), x = xs.get(rnd);
b[y][x] = random(0, 1) < .9 ? 2 : 4;
}
void draw() {
background(255);
noStroke();
rectt(0, 0, width, height, 10, color(150));
for (int j = 0 ; j < b.length; j++)
for (int i = 0 ; i < b[j].length; i++) {
fill(200);
rect(pad+(pad+bs)*i, pad+(pad+bs)*j, bs, bs, 5);
}
for (int j = 0 ; j < b.length; j++)
for (int i = 0 ; i < b[j].length; i++) {
float x = pad+(pad+bs)*i, y=pad+(pad+bs)*j;
if (b[j][i] > 0) {
int mm = b[j][i];
switch (mm) {
case 2:
image(img3, x, y, bs, bs);
break;
case 4:
image(img4, x, y, bs, bs);
break;
case 8:
image(img5, x, y, bs, bs);
break;
case 16:
image(img6, x, y, bs, bs);
break;
case 32:
image(img7, x, y, bs, bs);
break;
case 64:
image(img8, x, y, bs, bs);
break;
case 128:
image(img9, x, y, bs, bs);
break;
case 256:
image(img10, x, y, bs, bs);
break;
case 512:
image(img11, x, y, bs, bs);
break;
case 1024:
image(img12, x, y, bs, bs);
break;
case 2048:
image(img13, x, y, bs, bs);
break;
}
}
textt(“score: “+score,10,5,100,50,color(0),10.0, LEFT);
if(dead>0) {
rectt(0,0,width,height,0,color(255,100));
textt(“Gameover! Click to restart”, 0,height/2,width,50,color(0),30,CENTER);
if(mousePressed) restart();
}
}
}
void rectt(float x, float y, float w, float h, float r, color c) { fill(c); rect(x,y,w,h,r); }
void textt(String t, float x, float y, float w, float h, color c, float s, int align) {
fill(c); textAlign(align); textSize(s); text(t,x,y,w,h); }
void keyPressed() {
if (dead == 0) {
int dy=keyCode==UP ? -1 : (keyCode==DOWN ? 1 : 0), dx=keyCode==LEFT ? -1 : (keyCode==RIGHT ? 1 : 0);
int[][] newb = go(dy, dx, true);
if (newb != null) {
b = newb;
spawn();
}
if (gameover()) dead = 1;
}
}
boolean gameover() {
int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};
boolean out = true;
for (int i = 0 ; i < 4; i++) if (go(dy[i], dx[i], false) != null) out = false;
return out;
}
int[][] go(int dy, int dx, boolean updatescore) {
int[][] bak = new int[4][4];
for (int j = 0 ; j < 4; j++) for (int i = 0 ; i < 4; i++) bak[j][i] = b[j][i];
boolean moved = false;
if (dx != 0 || dy != 0) {
int d = dx != 0 ? dx : dy;
for (int perp = 0; perp < b.length; perp++)
for (int tang = (d > 0 ? b.length – 2 : 1); tang != (d > 0 ? -1 : b.length); tang-=d) {
int y = dx != 0 ? perp : tang, x = dx != 0 ? tang : perp, ty = y, tx = x;
if (bak[y][x]==0) continue;
for (int i=(dx != 0 ? x : y)+d; i!= (d > 0 ? b.length : -1); i+=d) {
int r = dx != 0 ? y : i, c = dx != 0 ? i : x;
if (bak[r]

[c][/c]

!= 0 && bak[r]

[c][/c]

!= bak[y][x]) break;
if (dx != 0) tx = i;
else ty = i;
}
if ( (dx != 0 && tx == x) || (dy != 0 && ty == y)) continue;
else if (bak[ty][tx]==bak[y][x]) {
bak[ty][tx] *= 2;
if(updatescore) score += bak[ty][tx];
moved = true;
}
else if ( (dx != 0 && tx != x) || (dy != 0 && ty != y)) {
bak[ty][tx] = bak[y][x];
moved = true;
}
if (moved) bak[y][x] = 0;
}
}
return moved ? bak : null;
}

屏幕快照 2014-03-26 9.19.48 AM 屏幕快照 2014-03-26 9.17.07 AM

July’s midterm project

My project is called WOODS SONG. It includes a beginning and 8 patterns which could play different notes when you click on them.

I designed and drew the patterns myself and tried to combine them with processing.

I met a lot difficulties while doing it, for example the GIF animation as the beginning would’t play and the audios didn’t work neither. I asked people for help and solving the first problem by changing the GIF into mov; solving the second problem by substituting the audio files.

 

See the code below.

// related to video
import processing.video.*;
int counter;
Movie myMovie;
boolean movieStop = false;

//realted to sound
import ddf.minim.*;

Minim m0;
Minim m1;
Minim m2;
Minim m3;
Minim m4;
Minim m5;
Minim m6;
Minim m7;

AudioPlayer s0;
AudioPlayer s1;
AudioPlayer s2;
AudioPlayer s3;
AudioPlayer s4;
AudioPlayer s5;
AudioPlayer s6;
AudioPlayer s7;

boolean[] playedOnceArray = new boolean[8];

// Related to image
PImage photo0;
PImage photo1;
PImage photo2;
PImage photo3;
PImage photo4;
PImage photo5;
PImage photo6;
PImage photo7;
void setup() {
background(255);
size(1080, 720);
stroke(150);
smooth();
frameRate(30);

// Related to image
photo0 = loadImage(“mogu.png”);
photo1 = loadImage(“lizi.png”);
photo2 = loadImage(“guozi.png”);
photo3 = loadImage(“sucai1.png”);
photo4 = loadImage(“gunzi.png”);
photo5 = loadImage(“songzi.png”);
photo6 = loadImage(“yezi.png”);
photo7 = loadImage(“yumao.png”);

//Related to sound
m0 = new Minim(this);
m1 = new Minim(this);
m2 = new Minim(this);
m3 = new Minim(this);
m4 = new Minim(this);
m5 = new Minim(this);
m6 = new Minim(this);
m7 = new Minim(this);

s0 = m0.loadFile(“a.wav”);
s1 = m1.loadFile(“b.wav”);
s2 = m2.loadFile(“c.wav”);
s3 = m3.loadFile(“d.wav”);
s4 = m4.loadFile(“e.wav”);
s5 = m5.loadFile(“f.wav”);
s6 = m6.loadFile(“g.wav”);
s7 = m7.loadFile(“bird.wav”);

for (int i = 0; i < 8; i++) {
playedOnceArray[i] = false;
}

// related to movie
myMovie = new Movie(this, “July’s mov.mov”);
myMovie.play();
counter = 0;
movieStop = false;
}

void draw() {
println(“begin”);

startVideo();

if (movieStop == true) {

image(photo0, 100, 50, 190, 237);
image(photo1, 340, 100, 179.3, 111.1);
image(photo2, 553, 50, 281, 192.5);
image(photo3, 100, 350, 239, 301);
image(photo4, 884, 50, 97.5, 206.5);
image(photo5, 389, 350, 212, 278);
image(photo6, 651, 320, 132, 344);
image(photo7, 837, 310, 203, 376);

if (playedOnceArray[0] != true && mouseX > 100 && mouseX < 290 && mouseY > 50 && mouseY< 287 && mousePressed) {
s0.rewind();
s0.play();
playedOnceArray[0] = true;
}
else {
playedOnceArray[0] = false;
}

if (playedOnceArray[1] != true && mouseX > 340 && mouseX < 520 && mouseY > 100 && mouseY< 211 && mousePressed) {
s1.rewind();
s1.play();
playedOnceArray[1] = true;
}
else {
playedOnceArray[1] = false;
}

if (playedOnceArray[2] != true && mouseX > 553 && mouseX < 834 && mouseY > 50 && mouseY< 242.5 && mousePressed) {
s2.rewind();
s2.play();
playedOnceArray[2] = true;
}
else {
playedOnceArray[2] = false;
}

if (playedOnceArray[3] != true && mouseX > 884 && mouseX < 984 && mouseY >50 && mouseY< 256.5 && mousePressed) {
s3.rewind();
s3.play();
playedOnceArray[3] = true;
}
else {
playedOnceArray[3] = false;
}

if (playedOnceArray[4] != true && mouseX > 100 && mouseX < 339 && mouseY > 350 && mouseY<651 && mousePressed) {
s4.rewind();
s4.play();
playedOnceArray[4] = true;
}
else {
playedOnceArray[4] = false;
}

if (playedOnceArray[5] != true && mouseX > 389 && mouseX < 600 && mouseY > 350 && mouseY < 628 && mousePressed) {
s5.rewind();
s5.play();
playedOnceArray[5] = true;
}
else {
playedOnceArray[5] = false;
}

if (playedOnceArray[6] != true && mouseX > 651 && mouseX < 781 && mouseY > 320 && mouseY < 664 && mousePressed) {
s6.rewind();
s6.play();
playedOnceArray[6] = true;
}
else {
playedOnceArray[6] = false;
}

if (playedOnceArray[7] != true && mouseX > 837 && mouseX < 1040 && mouseY > 310 && mouseY < 686 && mousePressed) {
s7.rewind();
s7.play();
playedOnceArray[7] = true;
}
else {
playedOnceArray[7] = false;
}
}
}

void stop()
{
s0.close();
m0.stop();

s1.close();
m1.stop();

s2.close();
m2.stop();

s3.close();
m3.stop();

s4.close();
m4.stop();

s5.close();
m5.stop();

s6.close();
m6.stop();

s7.close();
m7.stop();

super.stop();
}

In the beginning tab:

void startVideo() {
image(myMovie, 0, 0, 1080, 720);
counter++;

// stop automatically after playing
if (counter==275) {
counter = 0;
myMovie.stop();
movieStop = true;
}
}

void movieEvent(Movie m) {
m.read();
}

void mousePressed() {
myMovie.stop();
movieStop = true;
}

 

 

Snip20140331_1 Snip20140331_2

Snip20140331_3

 

 

 

Jacko Walz: Midterm Project

For my midterm project, I wanted to create a connect 4 game for two players. I, at first, thought I may be selling myself short with this project, but as I delved into it, I learned I had my work cut out for me.

In order to make the game work, I needed to layers of circles on top of each other, one to simply draw them, and another to organize them into columns. This was pretty difficult and time consuming in itself, but the real issue was the logic behind having the pieces fall to the bottom, and alternate colors.

With plenty of help from Matt, I was able to organize the circles correctly and write the logic sensibly. The game officially works perfectly and is fun! I’m considering taking this a step forward for my final project and making something with a physical interface.Screen Shot 2014-03-31 at 1.23.13 AM Screen Shot 2014-03-31 at 1.23.26 AM Screen Shot 2014-03-31 at 1.24.09 AM Screen Shot 2014-03-31 at 1.24.34 AM Screen Shot 2014-03-31 at 1.23.38 AM Screen Shot 2014-03-31 at 1.23.50 AM Screen Shot 2014-03-31 at 1.24.24 AM Screen Shot 2014-03-31 at 1.25.01 AM Screen Shot 2014-03-31 at 1.25.08 AM