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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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("");
}
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(""); }
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
}
}
}
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; } } }
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// 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));
// 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));
// 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.

 

Leave a Reply