GROVE GUARDIANS – Final Project

GROVE GUARDIANS

– Sylvia Trujillo – Gottfried Haider

 

  • CONCEPTION AND DESIGN

The concept that we hope to convey through this project is the importance of taking care of our environment in order to combat impending issues that our world is facing such as climate change, deforestation, desertification, and much more. One main source and reference that we used when coming up with ideas for this project was this article published by National Geographic https://www.nationalgeographic.com/environment/article/desertification. Then, taking into consideration the information and lessons featured in the text, we decided to convey this message of action against environmental issues through an engaging and interactive way by creating a video game. Some previous research and tasks that we also applied while brainstorming for this assignment, and that influenced our project’s concept are activities and skills which we developed through in-class recitations, our experience with the midterm project, as well as readings earlier in the semester which discussed the importance and influence of interaction when addressing an audience. We brainstormed ideas individually but then combined different aspects of each for our final project proposal.

There were many design decisions in our project that were affected by how we believed users would interact with it. For example, we wanted users to be constantly engaged and hoped to make them think about why they were required to complete the tasks they were given to beat the game. Therefore, some design decisions that we made such as the sensor types, were to simulate different ways to care for plants, the instructions used images in terms of real world examples, and the box referenced arcade games to illustrate the gameplay style. We also decided to make certain elements that were more confusing, extra user friendly and intuitive by simplifying them and adding visual instructions, building a game layout both physically and digitally, as well as by placing decorative components such as the trees in inaccessible areas. Unfortunately, at the User Testing Session our project was not as complete as I would’ve liked it to be. We had very simple code completed, many of our sensors were inconsistent, and we were still deciding how we wanted to approach the fabrication and physical design of the project. Nevertheless, the User Testing provided a lot of good feedback and ideas that we were able to take and apply to our designs to make many great improvements. Based on the comments and feedback from the user testers, we made many changes to our initial design. For example, on the game component, some changes that we made included having the trees in the game change shade gradually, adding a win and lose animation, adding instructions at the start, making the game more time sensitive, as well as giving the trees health ranges. For the physical design choices, we also added a laser cut box to make the different elements feel more cohesive and approachable. We also rearranged the 3D printed trees and added visual cues to better guide the user. Overall, I believe all these changes were extremely effective and added a lot to our project, not just visually, but also helped to make the interaction with it more intuitive for the viewers. 

User Testing Feedback 
  • Not super intuitive
  • Hide wires
  • Better and more detailed setup
  • Sun for light sensor, more intuitive
  • Watering can for water
  • Cardboard box with themed areas
  • Batter atmosphere
  • Work on fabrication
  • Stand for trees
  • Use different sensor that may be more intuitive
  • Animation on screen that better explains goal
    • Ex. Water can on screen
  • Can laser cut box fit for sensors
  • Make physical trees more like digital ones
  • Use led for physical trees to show green and yellow lights
  • More details for more cohesive
  • Different sensors that make more sense to the story
    • Ex. Use moisture for watering
    • Copper tape for weeding in visual display
  • Instead of trees be physical use it to explain what the digital versions purpose is 
  • User Testing Videos




 

  • FABRICATION AND PRODUCTION

There were many steps throughout the process of production during this assignment. Nevertheless there was a good balance, and despite the setbacks, the successes assured that we achieved our goals for this project. 

Failures  Successes 
  • Gameplay and use is not as intuitive as hoped
  • Inconsistent sensors 
  • Some awkward movements 
  • Short gameplay
  • Not easy to understand the purpose of all the components
  • More intuitive than prior designs  
  • Visually nice exterior
  • Friendly game design and appealing visuals 
  • Smooth gameplay 
  • Fun experience

Keeping in mind our project goals, the production choices we made for our project were decided through what would best deliver our message and incorporate our medium choice. Therefore, we chose to create an exterior reminiscent of arcane games to show the gaming aspect, while the gameplay and sensors would represent the theme and activities we tried to promote. Thus, the sensors that were incorporated into this project were a pressure sensor, a potentiometer, a light sensor, and a sound sensor. The first tree was attached to a pressure sensor, the second used a potentiometer, the third plant incorporated a light sensor, and the last one used a sound sensor. The criteria we used to select these was, what sensors would have the audience engaging in actions that were similar to real world ways of plant care? For example, the pressure sensor was meant to represent fertilizing and weeding, the potentiometer  would be turned to allude to watering plants, the light sensor showed how plants need to receive light, and finally the sound sensor represents how many people think that talking to plants helps them grow healthier. We believe these sensors were better suited for our project than others because they best illustrated the actions we hoped the audience would take when they are caring for trees in a simple and quick way. Despite this, someone suggested that we use a moisture sensor instead of a potentiometer and copper tape to replace the pressure sensor for the weeds. However, we stuck to the sensors we originally chose because we believed they were easier to understand and connect to the real world ideas we tried to convey. Moreover, in the process of creating this project there were aspects that we worked together and individually to realize the final project. My partner and I both worked on creating the final project proposal, as well as on the assembly of the physical display components. I made a rough outline and a prototype model of the final display and she digitally designed the components for laser cutting. Other than that, my personal contributions consisted of creating the drawings and animations that are used in the game, in addition to completing the circuit and code components. 


 

  • CONCLUSIONS

We hope that this project can be both educational and fun for the users, providing both inspiration and motivation for this pressing topic of environmental care and sustainability. I’m pretty satisfied with the outcome of our project and I believe it was fairly effective at achieving its intended goals. The gameplay functioned as we had intended, and the outside display fit our theme well and tied all the concepts together. My expectations of audience interaction were similar to how they ultimately approached and responded to our project. Although it was intended to be a single player game, a lot of the time people ended up playing in groups. However, I think this adds to the overall interactive experience as the users can choose how many people they would like to complete the tasks with, and emphasizes that deforestation and desertification is an issue that we all have to work together to solve and make a difference in our world. Additionally, this project’s results align with my definition of interaction because there is a system of input, process, and output that functions between the interaction of the machine with the user. The tasks that we assign to the user also make it so that there is a higher level of interaction during the gameplay process, as they are required to be constantly engaged to win the game. But, if I had more time there are many things that I would add and change. To begin, some things I would add are more sensors, and make the visual display better and easier to use. For the game elements, I would like to add music, more outcomes to the game, and instead of just stopping at the end, I think it would be nice if the game automatically returned to the start screen. In the end, some things I learned from the setbacks and failures in this project were the importance of time management and trial and error. If projects are started early there is more room for improvements and better results. Also, even if aspects of your original plan are not going as you expected, sometimes that can lead to even more creative and better outcomes. 

From the accomplishments of this assignment, I learned many new techniques and how different lessons can be compiled together to create a unique product. Game design and animation seemed so out of reach, but now I know the possibilities and I hope to create more and build upon my skills in the future. All in all, I believe GROVE GUARDIANS successfully and effectively relays the overarching message we intended. However, other meaningful values and parts of this assignment came from the design process. The setbacks and failures we faced during the creation, assembly, User Testing, and presentation became vital learning points. There were many meaningful improvements and changes that came as a result of errors and feedback from viewers, which in the end helped push us into becoming more adaptable and open minded to new approaches, in addition to encouraging us to make positive and meaningful improvements. This project and experience demonstrated design’s collaborative essence, and the importance of learning from mistakes and critiques in innovation. 

 

  • DISASSEMBLY

After finishing the project, we took apart the circuit components and returned the materials to their corresponding locations. However, my partner decided that they would like to keep the arcade box, so we recycled the first two models, and she took the other pieces home. 


 

      • APPENDIX

Circuit and Gameplay Diagrams:

Game Media:

  • Videos



  • Images

 

Code Elements:

Processing Code
import processing.video.*;

import processing.serial.*;
import processing.video.*;
Serial serialPort;

Movie myMovie;
boolean showMovie = true;
int animationDuration = 17000; // Set the duration of the animation in milliseconds
int startTime;

Movie myMovie2;
boolean showMovie2 = true;
int animationDuration2 = 14000; // Set the duration of the animation in milliseconds
int startTime2;

Movie myMovie3;
boolean showMovie3 = true;
int animationDuration3 = 14000; // Set the duration of the animation in milliseconds
int startTime3;

int NUM_OF_VALUES_FROM_ARDUINO = 4;
int arduinoValue[] = new int[NUM_OF_VALUES_FROM_ARDUINO];

PImage[] img = new PImage[13];
int state = 1; //change this to 1

 

void setup() {
printArray(Serial.list());
serialPort = new Serial(this, “/dev/cu.usbmodem1101”, 9600);

size(1430, 780); //canvas size

//first animation
myMovie = new Movie(this, “startanimation.mp4”);
myMovie.play();
startTime = millis(); // Record the start time of the animation

//die animation
myMovie2 = new Movie(this, “dead.mp4”);
startTime2 = millis(); // Record the start time of the second animation

//win animation
myMovie3 = new Movie(this, “win.mp4”);
startTime3 = millis(); // Record the start time of the second animation

img[0] = loadImage(“bg.PNG”);
img[1] = loadImage(“tg1.PNG”);
img[2] = loadImage(“tg2.PNG”);
img[3] = loadImage(“tg3.PNG”);
img[4] = loadImage(“tg4.PNG”);
img[5] = loadImage(“td1.PNG”);
img[6] = loadImage(“td2.PNG”);
img[7] = loadImage(“td3.PNG”);
img[8] = loadImage(“td4.PNG”);
img[9] = loadImage(“e1.PNG”);
img[10] = loadImage(“e2.PNG”);
img[11] = loadImage(“e3.PNG”);
img[12] = loadImage(“e4.PNG”);
}

void draw() {
// receive the values from Arduino
getSerialData();

if (state == 1) {
state1(); // intro video
} else if (state == 2) {
state2(); // main gameplay
} else if (state == 3) {
state3();
} else if (state == 4) {
state4();
}
}

 

void state1() {
if (myMovie.available()) {
myMovie.read();
}
image(myMovie, 0, 0, width, height);

if (millis() – startTime > animationDuration) {
state = 2;
}
}

float tree1health = 63;
float tree2health = 63;
float tree3health = 63;
float tree4health = 63;

float bgX = 0;

void state2() {

image(img[0], bgX-width, 0, width, height);
image(img[0], bgX, 0, width, height);
bgX = bgX + 1;
if (bgX > width) {
bgX = bgX – width;
}

image(img[5], 0, 0, width, height);
tint(255, 255, 255, map(tree1health, 0, 100, 0, 255));
image(img[1], 0, 0, width, height);
tint(255);

image(img[6], 0, 0, width, height);
tint(255, 255, 255, map(tree2health, 0, 100, 0, 255));
image(img[2], 0, 0, width, height);
tint(255);

image(img[7], 0, 0, width, height);
tint(255, 255, 255, map(tree3health, 0, 100, 0, 255));
image(img[3], 0, 0, width, height);
tint(255);

image(img[8], 0, 0, width, height);
tint(255, 255, 255, map(tree4health, 0, 100, 0, 255));
image(img[4], 0, 0, width, height);
tint(255);

//tree health
//tree 1
if (arduinoValue[0] > 200) {
tree1health = tree1health + 0.5;
} else {
tree1health = tree1health – 0.2;
}
tree1health = constrain(tree1health, 0, 100);
//println(tree1health);

//tree 2
if ((arduinoValue[1] > 300) && (arduinoValue[1] < 700)) {
tree2health = tree2health + 0.5;
} else {
tree2health = tree2health – 0.5;
}
tree2health = constrain(tree2health, 0, 100);

//tree 3
if (arduinoValue[2] > 600) {
tree3health = tree3health + 0.5;
} else {
tree3health = tree3health – 0.3;
}
tree3health = constrain(tree3health, 0, 100);

//tree 4
if (arduinoValue[3] > 12) {
tree4health = tree4health + 0.5;
} else {
tree4health = tree4health – 0.1;
}
tree4health = constrain(tree4health, 0, 100);

//exclamation points
//tree 1
if (tree1health < 50) {
image(img[9], 0, 0, width, height);
}

//tree 2
if (tree2health < 50) {
image(img[10], 0, 0, width, height);
}

//tree 3
if (tree3health < 50) {
image(img[11], 0, 0, width, height);
}

//tree 4
if (tree4health < 50) {
image(img[12], 0, 0, width, height);
}

//tree win
if ((tree1health > 90) && (tree2health > 90) && (tree3health > 90) && (tree4health > 90)) {
state = 4;
}

//tree lose
if ((tree1health < 10) && (tree2health < 10) && (tree3health < 10) && (tree4health < 10)) {
state = 3;
}
}

void state3() {
if (myMovie2.available()) {
myMovie2.read();
}
myMovie2.play();
image(myMovie2, 0, 0, width, height);
}

void state4() {
if (myMovie3.available()) {
myMovie3.read();
}
myMovie3.play();
image(myMovie3, 0, 0, width, height);
}

void mousePressed() {
// Toggle between play and pause when a key is pressed
if (myMovie.isPlaying()) {
myMovie.pause();
} else {
myMovie.play();
}
}

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++) {
arduinoValue[i] = int(serialInArray[i]);
}
}
}
}
}

Arduino Code
int pressurePin = analogRead(A0);
int potentiometerPin = analogRead(A1);
int lightSensorPin = analogRead(A2);
int soundSensorPin = analogRead(A3);
int pressureValue = 0;
int potentiometerValue = 0;
int lightSensorValue = 0;
int soundSensorValue = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
pressureValue = analogRead(A0);
potentiometerValue = analogRead(A1);
lightSensorValue = analogRead(A2);
soundSensorValue = analogRead(A3);
Serial.print(pressureValue);
Serial.print(“,”);
Serial.print(potentiometerValue);
Serial.print(“,”);
Serial.print(lightSensorValue);
Serial.print(“,”);
Serial.println(soundSensorValue);
delay(100);
}

Leave a Reply

Your email address will not be published. Required fields are marked *