Concept
Instead of developing a game for my midterm project I decided to create a space for an emotional experience. I believe that midterms often bring about stress, and it’s essential for individuals to be able to relax and prioritize their overall well-being. Consequently, I designed a meditation program that would help unwind people’s minds and partake in self-care activities.
Approach and Code highlight
For the development of this project, I planned to have three different exercises breathing, mantras, and journaling. I have shown the code for the breathing exercises in my midterm progress blog post, where I designed a program of a bouncing ball that would be helpful for people to find a certain rhythm in their breathing. For the mantras, I was planning to show participants different affirmative quotes that would allow participants of the meditation program to focus on their selves. I planned to use the method of a .substring().
I found a sketch that would help to display a portion of the string, based on the mouse position, here. For the journaling exercise, I decided to give some space for the participant where they can think about some questions and have a space to write down their responses. I used a csv. file to store all of the prompts for the journaling exercises. I created an array of strings to hold the entire file and preloaded the text from the file into an array. because I only had one row for all of the prompts, I did not need to loop through each row in the file. I created an index of the random prompt in the prompt array, a variable for a random prompt, and the code that would choose 1 of the prompts from an array. I created an input window and a button that when pressed would erase the input and leave a thankful note to the participant. As the basis for building this little program, I found a code for creating an input on the reference page, here.
Here is the code and sketch for this program, which I am very proud of.
let input, submitButton, prompt;
let strings = [];
function preload() {
strings = loadStrings("quotes.csv");
}
function setup() {
if (strings == null) {
print("failed to load the file, stopping here");
}
print("strings array contains this many lines: " + strings.length);
// create canvas
createCanvas(710, 400);
input = createInput();
input.position(20, 100);
input.size(400);
submitButton = createButton("submit");
submitButton.position(input.x + input.width, 100);
submitButton.mousePressed(prompting);
// all the prompts in an array
let allThePrompts = split(strings[1], ",");
print(allThePrompts); //it has 5 prompts and they are all split. nice!!!
// X is the index of the random prompt in the promt array
let X = int(random(allThePrompts.length));
print(X);
// variable for a random prompt
let randomPrompt = allThePrompts[int(random(5))];
print(randomPrompt);
//choosing 1 of the prompts from an array
prompt = createElement("h2", foo);
prompt.position(20, 5);
textAlign(CENTER);
textSize(50);
}
function prompting() {
input.hide();
// ? not working: how to hide the button: button.hide();
prompt.html(
"Thank you for your response ! Hopefully it made your day a little better ^^ "
);
input.value("");
}
Another part of the program, which I am very proud of and which ended up working perfectly is the three buttons in the choosing menu. I was able to program buttons myself using an image and not using built-in buttons. For this, I used object-orientated programming. I created a class, where I specified how buttons should be displayed and function when a mouse is over and the mouse is clicked on these buttons. Then, in setup, I created the three similar buttons that are in the array, which would use the commands specified in the class. Here is a code highlight of the class:
class ChoosingButtons {
constructor(inX, inY, inImg, inScenery) {
// what does this mean?
this.x = inX;
this.y = inY;
this.img = inImg;
this.scenery = inScenery; // where to go if this button is clicked
}
display() {
stroke(0);
print("in button display; scenery = " + this.scenery);
// tint the image on mouse hover
if (this.mouseOverImage()) {
print("mouse over image");
tint(254, 220, 220, 255);
// furthermore, if the mouse is clicked,
// set the scene
if (this.mouseClickedOnImage()) {
print("mouse is clicked" + this.scenery);
scene = this.scenery;
}
} else {
noTint();
}
image(this.img, this.x, this.y);
noTint();
print(this.img.width, this.img.height);
}
// over automatically matches the width & height of the image read from the file
// see this.img.width and this.img.height below
mouseOverImage() {
if (
mouseX > this.x &&
mouseX < this.x + this.img.width &&
mouseY > this.y &&
mouseY < this.y + this.img.height
) {
return true;
} else {
return false;
}
}
// over automatically matches the width & height of the image read from the file
// see this.img.width and this.img.height below
mouseClickedOnImage() {
if (
mouseIsPressed &&
mouseX > this.x &&
mouseX < this.x + this.img.width &&
mouseY > this.y &&
mouseY < this.y + this.img.height
) {
return true;
} else {
return false;
}
}
}
The code for the three buttons:
// make the three choosing buttons
buttonsChoosing.push(new ChoosingButtons(20, 150, choosingImage, BREATHING));
buttonsChoosing.push(new ChoosingButtons(235, 150, choosingImage, MANTRAS));
buttonsChoosing.push(new ChoosingButtons(450, 150, choosingImage, JOURNALING));
Future Thoughts and Reflection
I haven’t finished this project in three parameters: the switching back and forth between the pages, and the implementation of the sound and shape. I would have added the sound and the shape (btw, I know how to do it) if I finished the switch code. However, because I am very new to coding and have never designed such a complex program of switching between multiple cases, I did not fully realize my project. I decided to take the risk of creating multiple cases in the switch statement, however, the back buttons did not work perfectly well and I spent a lot of time trying to debug it and make it work. Even though it works in the sense that it changes cases, it didn’t change the case to the one I intended. Moreover, as I designed the code for journaling exercises in another shorter program, I was having issues implementing it in my main code. I tried multiple ways of breaking it down, however, it still didn’t work.
Nevertheless, I learned a lot during this project. I now know how to program a switch statement and create my own buttons from images. I learned how to create an input box and display text correctly. I recapped how to use a csv. file to load the information and I learned how to randomly present information from this file. I also learned patience and that it is best to debug a long program by diving it into smaller programs even though it may not work when you are trying to paste it back into the main program. I also was able to practice object-oriented programming on a new level by creating buttons with it. So, even though I didn’t get all of my program to work as was planned, I am nevertheless very happy with the experience and knowledge I gained in the process of creating it.