A. Good Parents or Not? – Yuebei Xu (Monica yx2121) – Professor Andy Garcia
B.CONCEPTION AND DESIGN
Project Concept: Our project is a story development game in the context of family relationships between parents and children. Our previous preparatory research inspired us to think about the reasons behind the increasing depression rate among children and youth. With attention to kids’ mental health, we contemplated the relationship between parents and kids. We believe it is meaningful to develop a story between parents and kids based on real-life experiences, making players role as parents and engaging in kids’ growing process. We expect two major kinds of user interaction. First, the story development game itself is a direct interaction because the story ending is determined based on choices the player makes for their virtual kids. Second, we include a scale on which players are required to put cubes that correspond to the stress of their choices. Put simply, we aim to use the scale to visualize the pressure that parents put on their kids. It is possible that we provide a hint for players to be careful with each choice they make by visualizing that.
In the user testing, we got several valuable feedback. First, we only had 6 questions, and several testers suggested we add a few more questions so the story is more complete. So we eventually have 10 questions. Second, our button device looked terrible, so we made good decorations afterward. Third, we found some people are a bit confused with the instructions, so we modified the instruction on the introduction page as well. Those changes are necessary and effective.
C. FABRICATION AND PRODUCTION
This project is heavily on the digital part that was developed based on Processing code, with 4 buttons and scale on the Arduino part. The most important part of our project, I believe, is the code for the smooth transition from one scenario to another. This part is somewhat difficult because we had to use “previous value” to record different states so that the scenario only changes once when players press the button. Otherwise, since Arduino analog keeps reading values, the states can iterate very fast while the players even only press the button once. We didn’t have many options besides this, we discussed with the professor over this problem and concluded this would be an ideal solution to avoid such a tech glitch.
D. CONCLUSIONS
The goal of our project is to educate and remind parents of the potential stress they can put on kids when they make different decisions in their kid’s development process. I believe we achieved the stated goal because we have 4 different endings for kids based on kids’ final mental health grades and academic performance grades. With the feedback, players will be able to see their expected outcome and their actual outcome. This contrast serves as direct feedback for players. The project is aligned with the definition of interaction because the project communication is two-way. The story is constructed by players throughout the experience and it returns feedback to users.
As for improvement, for one thing, we would be happy to include more storylines and narrow down the grade range further in order to enrich the story plots and variations. In addition, we would also like to record our voices and add filters to make it a good story narrative, which ideally will be applied to each scenario. We also identified the confusion of instruction on the “scale” part, so further clarification is necessary as well. Given the project is heavily digital, the setbacks primarily came from coding. And I think the key obstacle is how to perfectly manage digital communication between Arduino and Processing, specifically, the timing we need to make use of the recorded value and the timing we wish to stop the communication. While this project is very time-consuming due to the coding part, it rewards me a great sense of accomplishment during the final presentation when I saw people showing curiosity and interest in our project. And it is also very interesting to see people responding by the end with “Aha, I’m a good parent!”, “I didn’t know I put so much stress on my kids”, “My kid will be happy but only mediocre in academic performance?”. The feedback perfectly indicates the goal of the project is realized.
E. APPENDIX
All technical documentation that was not included in previous sections should be attached here. Include your code from both Processing and Arduino, wiring diagrams (e.g. made with TinkerCad Circuits), pictures, videos and all related documentation that would help to understand the technical development process. If you used code or any assets that were not your own, properly cite them.
Video for Complete Project
Pictures
Laser Cutting Draft for button box
Add ABCD option has the
In the process of Button Box installation
Adding emoji decorations to Button Box.
Cut different weight cubes (credits to Professor Andy)
Button, Scale, Screen Display, Cubes (final presentation)
Code from Arduino
import processing.serial.*; import processing.sound.*; Serial serialPort; SoundFile sound; int NUM_OF_VALUES_FROM_ARDUINO = 5; /* CHANGE THIS ACCORDING TO YOUR PROJECT */ /* This array stores values from Arduino */ int arduino_values[] = new int[NUM_OF_VALUES_FROM_ARDUINO]; PImage kid1; PImage kid2; PImage kid3; PImage a1; PImage a2; PImage a3; PImage a4; PImage a5; PImage a6; PImage a7; PImage a8; PImage a9; PImage ed1; PImage ed2; PImage ed3; PImage ed4; // use state to record if the button is pressed int state = 0; // value we need for game: ap and mp int AP = 100; int MP = 100; Float weight; int grade; int preVal; int preMP; //String[] instruction = new String[7]; //instruction[0] = "You and your lover have a kid, and you really love him/her"; //instruction[1] = "You acoompanied with your kid through a carefree childhood"; //instruction[2] = "As time goes by, your kid needs to attend primary school"; //instruction[3] = "Suddenly, you need to make so many decicisions for your kid"; //instruction[4] = "No matter you like it or not, it is your duty..."; //instruction[5] = "Now, it is your turn to make choices"; //instruction[6] = "Press Any Button To Continue..."; void setup() { size(1200, 750); kid1 = loadImage("kid1.jpg"); kid2 = loadImage("kid2.jpg"); kid3 = loadImage("kid3.jpg"); a1 = loadImage("a1.jpg"); a2 = loadImage("a2.jpg"); a3 = loadImage("a3.jpg"); a4 = loadImage("a4.jpg"); a5 = loadImage("a5.jpg"); a6 = loadImage("a6.jpg"); a7 = loadImage("a7.jpg"); a8 = loadImage("a8.png"); a9 = loadImage("a9.jpg"); ed1 = loadImage("ed1.jpg"); ed2 = loadImage("ed2.jpg"); ed3 = loadImage("ed3.png"); ed4 = loadImage("ed4.jpg"); //start page image(kid1, 0, 0); // BGM frameRate(30); println("Loading mp3..."); sound = new SoundFile(this, "Under the Heavens.mp3"); sound.loop(); printArray(Serial.list()); // put the name of the serial port your Arduino is connected // to in the line below - this should be the same as you're // using in the "Port" menu in the Arduino IDE serialPort = new Serial(this, "/dev/cu.usbmodem142301", 9600); } void draw() { //println(state); //println(MP); //receive the values from Arduino getSerialData(); // use the values like this: int a = arduino_values[0]; int b = arduino_values[1]; int c = arduino_values[2]; int d = arduino_values[3]; float e = arduino_values[4]; println (e); weight = map (e, 76070, 118125, 0, 100); grade = int (100 - weight); println(weight); println(grade); // 76000 nothing; largest box: 80800 if (state == 100) { funeral(); } if (state == 200) { if (MP>=60 && AP >=80) { ed1(); } else if (MP<60 && AP >=80) { ed2(); } else if (MP>=60 && AP <=80) { ed3(); } else { ed4(); } } if (state == 0) { noStroke(); fill(255, 255, 255, 100); triangle(800, 200, 900, 200, 750, 250); ellipse(950, 150, 350, 250); fill(255, 255, 255, 1); rect(750, 575, 350, 100); String s = "What Do You Want Me"; String t = "To Be Like?"; fill(#778283); strokeWeight (10); textSize(30); text (s, 810, 140); text (t, 880, 190); String m = "Press Any Button To"; String n = "Start The Story Game!"; fill(255, 255, 255, 10); text (m, 795, 615); text (n, 780, 650); } // page 2 - Introduction Page -- no need to make choice, just press button to proceed if (state == 1) { image(kid2, 0, 0); fill(255); textSize(30); text ("You and your lover have a kid, and you really love him/her", 150, 120); text ("You acoompanied with your kid through a carefree childhood", 150, 170); text ("As time goes by, your kid needs to attend school", 150, 220); text ("Suddenly, you face so many decicisions", 150, 270); text ("No matter you like it or not, it is your duty...", 150, 320); text ("Now, it is your turn to make choices", 150, 370); textSize(23); text ("For each choice, add weight if you feel your chocie are somewhat harsh", 150, 650); text ("take off weight if you feel your chocie relief kid's pressure", 150, 685); textSize (22); text ("Press Any Button To Continue...", 900, 710); //for (int i = 0; i < instruction.length; i++) { // fill(255); // textSize(30); // text(instruction[i], 100, 50 * i + 50); // delay (200); //} } if (state == 2) { a1(); // Choose A if (a == 1) { if (a != preVal) { MP+=5; AP+=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP+=5; AP-=5; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP-=10; AP-=5; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP-=20; AP-=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 3) { a2(); // Choose A if (a == 1) { if (a != preVal) { MP+=5; AP+=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=10; AP+=5; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP-=10; AP-=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP-=20; AP-=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 4) { a3(); if (a == 1) { if (a != preVal) { MP+=5; AP+=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP+=5; AP-=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP-=5; AP+=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP-=10; AP-=10; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 5) { a4(); if (a == 1) { if (a != preVal) { MP-=20; AP-=10; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=10; AP-=5; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP-=5; AP+=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP+=5; AP-=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 6) { a5(); if (a == 1) { if (a != preVal) { MP-=20; AP-=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=10; AP+=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP+=5; AP+=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP+=10; AP+=10; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 7) { a6(); if (a == 1) { if (a != preVal) { MP-=10; AP+=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=20; AP+=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP+=10; AP-=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP-=20; AP-=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 8) { a7(); if (a == 1) { if (a != preVal) { MP-=30; AP-=5; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=10; AP-=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP+=10; AP-=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP+=20; AP+=10; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 9) { a8(); if (a == 1) { if (a != preVal) { MP-=30; AP+=-10; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP-=5; AP-=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP+=10; AP-=10; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP-=5; AP-=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 10) { a9(); if (a == 1) { if (a != preVal) { MP-=20; AP-=10; preVal = 0; } } // Choose B if (b == 1) { if (b != preVal) { //MP unchange MP+=10; AP-=10; preVal = 0; } } // Choose C if (c == 1) { if (c!= preVal) { MP-=10; AP-=20; preVal = 0; } } // Choose D if (d == 1) { if (d != preVal) { MP+=5; AP+=20; preVal = 0; } } if (MP <=0) { state = 100; } } if (state == 11) { if (MP <=0) { state = 100; } if (MP>0) { state = 200; } } // press a button, and move on to next image if (a == 1 || b == 1 || c == 1 || d == 1 ) { preVal = 1; } if (a!=preVal && b!=preVal && c!=preVal && d!=preVal) { state +=1; preVal = 0; } //draw() end } //the helper function below receives the values from Arduino // in the "arduino_values" array from a connected Arduino // running the "serial_AtoP_arduino" sketch // (You won't need to change this code.) void getSerialData() { while (serialPort.available() > 0) { String in = serialPort.readStringUntil( 10 ); // 10 = '\n' Linefeed in ASCII if (in != null) { //print("From Arduino: " + in); String[] serialInArray = split(trim(in), ","); if (serialInArray.length == NUM_OF_VALUES_FROM_ARDUINO) { for (int i=0; i<serialInArray.length; i++) { arduino_values[i] = int(serialInArray[i]); } } } } } // here we define function to be used void a1() { noStroke(); image(a1, 0, 0); fill(#B7B7B7, 180); rect(130, 110, 500, 77, 25); fill(255); textSize(40); text ("I got a low grade in school…", 150, 160); fill(#B7B7B7, 180); rect(130, 390, 915, 280, 25); fill(255); textSize(35); text("A. It's Ok, You Will Make Progress", 150, 430); // MP+5, AP+5 text("B. You don't think grade is that important in primary school", 150, 500); // MP+5, AP-5 text("C. Hold Temper, but Actually Anxious about Peer Competition", 150, 570); // MP-10, AP-5 text("D. Angrily: You Didn't Work Hard Enough", 150, 640); // MP-20, AP-20 }; void a2() { image(a2, 0, 0); fill(#B7B7B7, 180); rect(130, 110, 900, 77, 25); fill(255); textSize(35); text ("You find Your Kid Got a Very Low Grade Without Telling You...", 150, 160); fill(#B7B7B7, 180); rect(130, 390, 860, 280, 25); fill(255); textSize(30); text("A. 'Why did you hide the Grade?'", 150, 430); // MP+5, AP+5 text("B. 'Why did you get this Grade?'", 150, 500); // MP-10, AP+5 text("C. You talk to teacher first", 150, 570); // MP-10, AP-10 text("D. Shocked and Angry,'You Didn't Work Hard Enough and You Lie?'", 150, 640); // MP-20, AP-20 }; void a3() { image(a3, 0, 0); fill(#B7B7B7, 180); rect(130, 110, 690, 77, 25); fill(255); textSize(35); text ("Can I hang out with my friends on Weekend?", 150, 160); fill(#B7B7B7, 180); rect(130, 350, 900, 290, 25); fill(255); textSize(30); text("A. Yes but Back Home Before Dinner, You have Exams tomorrow", 150, 400); // MP+5, AP+5 text("B. Sure, go have some fun in Weekend", 150, 470); // MP+5, AP-10 text("C. Well...Did You Review for BIG Exams on Monday?", 150, 540); // MP-5, AP+10 text("D. No Unless You finished Exam Practice", 150, 610); // MP-10,AP-10 }; void a4() { image(a4, 0, 0); fill(#B7B7B7, 180); rect(130, 95, 900, 100, 25); rect(130, 390, 885, 300, 25); fill(255); textSize(35); text ("I don't want to attend class today, I want some sleep.", 150, 160); textSize(30); text("A. You need to get up right now!", 150, 430); // MP-20,AP-10 text("B. You must go unless you are not feeling well", 150, 500); // MP-10,AP-5 text("C. OK but you need to talk with teachers over the reasons by yourself", 150, 570); // MP-5,AP+10 text("D. OK. I text teacher", 150, 640); // MP+5, AP-20 }; void a5() { image(a5, 0, 0); fill(#B7B7B7, 180); rect(130, 95, 860, 150, 25); rect(130, 390, 885, 290, 25); fill(255); textSize(35); text ("You heard from other parents about good extra courses", 150, 160); text ("that help kids improve exam scores", 150, 210); textSize(30); text("A. Nervous about peer competition, sign kid up for many courses", 150, 430); // MP-20, AP-5 text("B. Sign kid up for a one/two courses", 150, 500); // MP-10, AP+10 text("C. You Believe courses in school are enough, will not send kids there", 150, 570); // MP+5, AP+10 text("D. Prioritize Kid's Willingness, Respect Kid's Decisions", 150, 640); // MP+10, AP+10 }; void a6() { image(a6, 0, 0); fill(#B7B7B7, 180); rect(130, 100, 730, 160, 25); rect(130, 430, 890, 270, 25); fill(255); textSize(35); text ("I really don't like taking that class after school", 150, 160); text ("Can I just don't Go Please...", 150, 220); textSize(30); text("A. Insist it is good for kid's future development", 150, 480); // MP-10, AP+5 text("B. Angry: You should work harder", 150, 540); // MP-20, AP+10 text("C. Yes, sorry to make you feel you are forced to take that class", 150, 600); // MP+10, AP-10 text("D. Yes but can you promise your exam performance?", 150, 660); // MP-20, AP-20 }; void a7() { image(a7, 0, 0); fill(#B7B7B7, 180); rect(130, 100, 775, 110, 25); rect(130, 430, 840, 280, 25); fill(255); textSize(35); text ("You are told Kid has girlfriend/boyfriend at school...", 150, 160); textSize(30); text("A. Angry, Stop the Relationship", 150, 480); // MP-30, AP-5 text("B. Want to Stop, but Ask kid how is the other person first", 150, 540); // MP-10, AP-10 text("C. Don't think it is a big deal", 150, 600); // MP+10, AP-10 text("D. Feel Truly Happy for Kid", 150, 660); // MP+20, AP+5 }; void a8() { image(a8, 0, 0); fill(#B7B7B7, 180); rect(130, 100, 500, 110, 25); rect(130, 430, 890, 280, 25); fill(255); textSize(35); text ("'What if I give up college?'", 150, 160); textSize(30); text("A. Impossible, Why can't You make it when others are all out there?", 150, 480); // MP-30, AP-10 text("B. Why", 150, 540); // MP-5, AP-10 text("C. You are an adult, you make decisions and be responsible for that", 150, 600); // MP+10, AP-10 text("D. Anxious but no idea what to do", 150, 660); // MP-5, AP-20 }; void a9() { image(a9, 0, 0); fill(#B7B7B7, 180); rect(130, 100, 730, 110, 25); rect(130, 430, 800, 280, 25); fill(255); textSize(35); text ("I'm so stressed at graded mock exams recently", 150, 160); textSize(30); text("A. Stress pushes you forward", 150, 480); // MP-20, AP-10 text("B. Do you want to take a rest tommorrow?", 150, 540); // MP+10, AP-10 text("C. It's just mock exams", 150, 600); // MP-10, AP-20 text("D. Try to set lower expextations for grade", 150, 660); // MP+5, AP+20 }; void funeral() { image (kid3, 0, 0); fill (255); textSize(37); text ("Sad Story: YOU LOST YOUR KID", 520, 200); text ("Kid's Mental Health Points is", 520, 280); text("You expect kid's Mental Health to be:", 520, 360); text(grade, 520, 440); text (MP, 980, 280); } void ed1() { noStroke(); image (ed1, 0, 0); fill(#B7B7B7, 180); rect(140, 77, 900, 327, 25); fill (255); textSize(35); text("You expect kid's Mental Health to be:", 180, 120); text(grade, 740, 120); text("Kid's Mental Heath Grade:", 180, 180); text(MP, 570, 180); text("Kid's Academic Performance Grade:", 180, 240); text(AP, 720, 240); text("Your kid gets into a great college and has a", 180, 300); text("great time in college. After graduation, your", 180, 350); text("kid lives their own lives smoothly and happily", 180, 400); } void ed2() { noStroke(); image (ed2, 0, 0); fill(#B7B7B7, 180); rect(140, 77, 900, 327, 25); fill (255); textSize(35); text("You expect kid's Mental Health to be:", 180, 120); text(grade, 740, 120); text("Kid's Mental Heath Grade:", 180, 180); text(MP, 570, 180); text("Kid's Academic Performance Grade:", 180, 240); text(AP, 720, 240); text("Your kid goes to a good college, but when he becomes", 180, 300); text("self-indulgent when he/she has full control over life.", 180, 350); text("He/she fails college and lives an unhappy and normal life", 180, 400); } void ed3() { noStroke(); image (ed3, 0, 0); fill(#B7B7B7, 180); rect(140, 77, 900, 327, 25); fill (255); textSize(35); text("You expect kid's Mental Health to be:", 180, 120); text(grade, 740, 120); text("Kid's Mental Heath Grade:", 180, 180); text(MP, 570, 180); text("Kid's Academic Performance Grade:", 180, 240); text(AP, 720, 240); text("Your child goes to a mediocre college and leads a", 180, 300); text("very normal but fulfilling life.", 180, 360); } void ed4() { noStroke(); image (ed4, 0, 0); fill(#B7B7B7, 180); rect(140, 77, 900, 327, 25); fill (255); textSize(35); text("You expect kid's Mental Health to be:", 180, 120); text(grade, 740, 120); text("Kid's Mental Heath Grade:", 180, 180); text(MP, 570, 180); text("Kid's Academic Performance Grade:", 180, 240); text(AP, 720, 240); text("Your child fails to enter a college, and escapes from", 180, 300); text("home to find his/her freedom.", 180, 360); }