Concept:
For this project, I couldn’t really think of anything in particular that satisfied the requirements, so I took another approach where I thought of elements I wanted to have in my work and I slowly expanded from there to satisfy the requirements. Whenever I feel stuck or uninspired, I’d turn to cats because I just love cats, and thus I started brainstorming this project with cats. After many considerations on the user interactivity and my artistic preference, I ended up with the idea of ‘Choose’ your destiny but as a cat. The work revolves around a day in the life of a cat in a cafe where it’s cozy, calm, and full of ‘ambiance’, something I personally enjoy as well. I wanted the work to have as many ‘senses’ as possible, and to me that would mean sound and visuals, so throughout the work, I intend to create a cozy, natural world through constant sounds that’s not abrupt and well designed. However, different from my initial design, I decided to remove the weights from the choices to make the work more “experience-based” so the users don’t rush through the story to get the weighted result, much like what people used to do with the Buzzfeed quizzes. Therefore, I kept the options purely as the design or story line and sounds, and nothing else, so that the users can really immerse and focus on the ‘cat life’ they imagine/want to see, instead of rushing through.
A highlight of code I’m proud of:
I’m particularly proud of my animations, the two cats I ‘drew’, as well as the rescaling of the coordinates for elements to appear nicely according to window height and width:
A snippet of the rescaling I did:
square(width / 3, 135, 200);
fill("#a77952");
rect(width / 3, 290, 195, 40);
fill(255);
noStroke();
//right cloud
circle(width / 3 + 153, 180, 48);
arc(width / 3 + 196, 174, 60, 60, HALF_PI, PI + HALF_PI, OPEN);
My animation sprite and the code for it to move:
//initialize cat frames arrays
sitCatFrames = await Promise.all([
loadImage("sitCat 1.png"),
loadImage("sitCat 2.png"),
loadImage("sitCat 3.png"),
loadImage("sitCat 4.png"),
loadImage("sitCat 5.png"),
]);
sittingCat = new sprite(sitCatFrames, width - 250, height - 270, 200, 200, 9);
Embedded sketch:
‘How Was This Made’:
I started by organizing the class and the functions I want to have. After getting those figured out, I started drawing out each scene then moving them to their designated draw functions so I could call on it, however as the scenes increased, this method stopped working that well, because I had to go through the work itself (the buttons and everything) just to see the updated versions of the specific scene, which was very annoying. So instead of drawing beforehand, I would change the starting scene index to the one I’m working on right now and draw within that scene’s function and see the updates, so essentially a little reversed work. So with that, I just gradually placed everything in place, drew buttons and texts, etc and then used the coordinates of the elements to design the click detections. After I got comfortable and grasped a good sense of work flow, I started adding other media like my animation sprites. Everything went pretty smooth, until I started working on the rescaling for window width and height.
Changing canvas:
Changing the canvas size made the draw functions I made very disorganized because they all had very specific coordinate values and because the values were made for a 600 x 500 canvas, so they were all concentrated in that top left corner. This means, I have to now ‘scale up’ all of the elements’ size, coordinates, etc. to match the new canvas size. For text and drawings, it was fairly simple, however, it’s the click detections for the buttons that really threw me off, so I really had to go through all the specific values for the buttons and update them to the new ones that’s proportional to the window size.
I made the text right aligned, so the x & y coordinate is for the right top corner, which is the opposite of how we usually imagine positioning elements, which made the positioning of the next button very difficult as it uses the conventional way of positioning, thus i had to “reverse” calculate and it finally worked and fixed in a position I liked.
Before:
After adjusting:
And with that, rescaling came with difficulties in click detections because now I don’t have the precise values and have to calculate respective to the window’s height and width, which is extra difficult when some elements are in mode(center/right/left) :
Wrong calculation making click detection not precise:
Correct values:
With the rescaling done, the rest was mostly smooth and mostly about my own aesthetic preference like the font distinction between the owner and the cat as well as the prompt for the restart page. I picked a specific font for the storyline to play into the atmosphere, tone and overall story line I had in mind, which was very cozy and all, but for the restart page, I found that font not too ‘useful’/’optimal’? It was abrupt and didn’t feel like a good design so I went with this typing machine kind of font to make it more ‘cold’ and ‘machine’.
Story font:
Changed to this:
Reflection for future improvements:
I found the wireframe very helpful, drawing the scenes out helped ground my work flow and gave me a sense of ‘assurance’ for reference. However, with that said, I wish I went and made it more detailed? So that things can be even more organized, maybe including the desired text and button positions, etc. because at some point I had a little contemplation on where I should place them but I quickly figured it out after experimenting. Overall I really enjoyed working on this project, especially on the animation, I really enjoyed drawing them!
References:
For the inspiration of picture:
Gemini generated:

Pinterest inspo cat window sprite:
inspiration
Right customer image, generated by gemini to match the kid’s art style:

All sound files from freesound :




























