aliot-faceosc
import oscP5.*;
import netP5.*;
PImage hand;
PImage foot;
PImage pizza;
PImage burger;
PImage cupcake;
PImage donut;
PImage bg;
float timer;
ArrayList foods = new ArrayList();
PImage[] indexedFoods = new PImage[6];
OscP5 oscP5;
NetAddress serverAddress;
NetAddress clientAddress;
int listeningPort;
int sendingPort;
float mouthHeight=-1;
float position_x=-1;
float position_y=-1;
boolean mouthOpen = false;
int score = 0;
PFont f;
String feedback = "LEVEL 1";
int feedback_timer = 150;
xy feedback_pos = new xy(300,200);
int fall_speed = 4;
int duration = 250;
int level = 1;
class xy
{
float x,y;
xy(float _x, float _y)
{
x=_x;
y=_y;
}
}
void setup(){
size(800,500);
smooth();
bg = loadImage("factory_background.png");
image(bg, 0, 0);
timer = millis();
hand = loadImage("hand.png");
pizza = loadImage("pizza_graphic.png");
burger = loadImage("burger_graphic.png");
cupcake = loadImage("cupcake_graphic.png");
donut = loadImage("donuts_graphic.png");
foot = loadImage("foot.png");
indexedFoods[0] = hand;
indexedFoods[1] = foot;
indexedFoods[2] = cupcake;
indexedFoods[3] = pizza;
indexedFoods[4] = burger;
indexedFoods[5] = donut;
generateFood();
listeningPort = 8338;
sendingPort = 12345;
oscP5 = new OscP5(this, listeningPort);
serverAddress = new NetAddress("127.0.0.1", sendingPort);
f = createFont("Arial",16,true);
}
void generateFood(){
int x = int(random(100, 700));
int y = -100;
int z = int(random(2,5));
int t = 0;
int foodIndex = int(random(0,5));
if (foodIndex == 0){
IntList hand = new IntList();
hand.append(0);
hand.append(x);
hand.append(y);
hand.append(z);
hand.append(t);
foods.add(hand);
} else if (foodIndex == 1){
IntList foot = new IntList();
foot.append(1);
foot.append(x);
foot.append(y);
foot.append(z);
foot.append(t);
foods.add(foot);
}else if (foodIndex == 2){
IntList cupcake = new IntList();
cupcake.append(2);
cupcake.append(x);
cupcake.append(y);
cupcake.append(z);
cupcake.append(t);
foods.add(cupcake);
}else if (foodIndex == 3){
IntList pizza = new IntList();
pizza.append(3);
pizza.append(x);
pizza.append(y);
pizza.append(z);
pizza.append(t);
foods.add(pizza);
}else if (foodIndex == 4){
IntList burger = new IntList();
burger.append(4);
burger.append(x);
burger.append(y);
burger.append(z);
burger.append(t);
foods.add(burger);
}else if (foodIndex == 5){
IntList donut = new IntList();
donut.append(5);
donut.append(x);
donut.append(y);
donut.append(z);
donut.append(t);
foods.add(donut);
}
}
void draw(){
image(bg, 0, 0);
if ( millis() - timer > 1000 ) {
generateFood();
timer = millis();
}
for (int i = 0; i < foods.size(); i++) {
IntList food = foods.get(i);
int index = food.get(0);
int x = food.get(1);
int y = food.get(2);
int z = food.get(3);
int t = food.get(4);
PImage foodToDraw = indexedFoods[index];
if (y < 150 && z == 2){
food.set(2, y+ fall_speed);
} else if (y < 200 && z == 3){
food.set(2, y+ fall_speed);
} else if (y < 275 && z == 4){
food.set(2, y+ fall_speed);
} else if (y < 350 && z == 5){ food.set(2, y+ fall_speed); } food.set(4, t+1); //add to time image(foodToDraw, x, y, 50*z, 50*z); if (t > duration){
foods.remove(i);
}
}
noFill();
strokeWeight(5);
stroke(200,50,50);
if (mouthHeight != -1 && position_x != -1 && position_y != -1){
ellipse(position_x, position_y, 100, 10*mouthHeight);
}
xy mouth_position = mouthClosed();
if (mouth_position.x != -1 && mouth_position.y != -1){
chomp(mouth_position.x, mouth_position.y);
}
if (mouthOpen == false && mouthHeight >= 2){
mouthOpen = true;
}
textFont(f,30);
fill(255);
text("Level " + level + " score: " + score, 500, 50);
if (feedback != ""){
text(feedback, feedback_pos.x, feedback_pos.y);
feedback_timer-=1;
if (feedback_timer <= 0){ feedback = ""; } } if (score >= level*100){
level = level+1;
duration -= 10;
fall_speed += 4;
}
}
void oscEvent(OscMessage receivedMessage)
{
if (receivedMessage.checkAddrPattern("/gesture/mouth/height")==true){
mouthHeight = receivedMessage.get(0).floatValue();
} else if (receivedMessage.checkAddrPattern("/pose/position")==true){
position_x = 800 - map(receivedMessage.get(0).floatValue(), 80.0, 530.0, 0.0, 800.0);
position_y = receivedMessage.get(1).floatValue();
}
}
xy mouthClosed(){
xy mouthPos = new xy(-1,-1);
if (mouthOpen == true && mouthHeight <= 2){
mouthOpen = false;
mouthPos.x = position_x;
mouthPos.y = position_y;
}
return mouthPos;
}
void chomp(float mouth_x, float mouth_y){
String[] food_feedback = {"Get in ma belly!", "Yum!", "Good Job!", "+10", "+10", "+10", "+10", "+10", "+10", "+10"};
String[] hand_feedback = {"Ew!", "A hand?!", "wtf!", "A hand?!", "-10", "-10", "-10", "-10", "-10", "-10"};
String[] foot_feedback = {"Ew!", "A foot?!", "A foot!", "Oh my lord!", "-10", "-10", "-10", "-10", "-10", "-10"};
int feedback_index = int(random(0,9));
for (int i = 0; i < foods.size(); i++) {
IntList food = foods.get(i);
int index = food.get(0);
int x = food.get(1);
int y = food.get(2);
int z = food.get(3);
int wid = z*25;
if ((abs((x+wid)-mouth_x) < 50) && (abs((y+wid)-mouth_y) < 50)){ foods.remove(i); if (index >= 2){
feedback = food_feedback[feedback_index];
feedback_timer = 40;
feedback_pos.x = map(x+wid, 0.0, 800.0, 20.0, 600.0);
feedback_pos.y = map(y+wid, 0.0, 800.0, 20.0, 600.0);
score += 10;
} else if (index == 0){ //hand
feedback = hand_feedback[feedback_index];
feedback_timer = 40;
feedback_pos.x = map(x+wid, 0.0, 800.0, 20.0, 600.0);
feedback_pos.y = map(y+wid, 0.0, 800.0, 20.0, 600.0);
score -= 10;
} else if (index == 1){ //foot
feedback = foot_feedback[feedback_index];
feedback_timer = 40;
feedback_pos.x = map(x+wid, 0.0, 800.0, 20.0, 600.0);
feedback_pos.y = map(y+wid, 0.0, 800.0, 20.0, 600.0);
score -= 10;
}
}
}
}
For this project, I wanted to create a game that could be played easily enough with the face so that the user had an intuitive response. I settled on making a game about capturing and eating food because the inclination for a user to open their mouth when they see a burger/pizza/etc is automatic. It’s also hilarious. I used the mouth height parameter as well as the face position parameter to give the user control over the food they chomp on. I tried to make the game funny to play as well as to watch, and I think I definitely achieved the latter. If I could spend more time on this game I would revise the graphics. I drew them myself in an attempt to make the game feel kinda cheesy and morbid at the same time. I would also add more objects, introduce some better effects, add sound, and change the ellipse to a pair of lips on the screen.