top of page
Search

Major Project - Misc.

  • Writer: Conor Currie
    Conor Currie
  • May 7
  • 8 min read

LEVEL SELECT

As I evolved the style of my project quite rapidly, the level select screen came across further changes. This came both from technical and stylistic issues that I found in the project.

ree

From the prototyping phase, I had planned on having this be part of a 3D interface, having a band van driving from one location to another. On hover, the idea was to have the van drive to that place in quickfire, providing a rather humorous animation. However, I found that the World Map tutorial I aimed to use for a world map wanted instead to rely on arrow keys.


This began to raise a bit of a red flag to me, as I aimed to focus exclusively on having an interface you only need a mouse for, but decided to follow it anyway and see as if there was anything I could borrow from it in regards to a mouse-only interface.


I then remade the interface, with the idea of it being a pop-up upon having reached the desired location. I first began with a low-fidelity remake of said interface.

ree

Then, I gave it a mid-fidelity makeover - though I struggled to incorporate the additional text at this stage, but still wanted a design to demonstrate.

ree

Upon bringing to high fidelity, I decided to give it a little more flair, adding an additional bar at the top of the screen.

ree

Then came the coding. The tutorial I was using included the use of splines, which seemed simple enough. From here, I set up a spline between two locations.

ree

Then, in the code of the travelling player, I had the players ability to move outside of the spline's path restricted, and hid the level window. From there, the level pads the player would step on would set new text for the level window, as well as the level ID, allowing for different levels to be selected.

ree

ree

ree

I did find, upon inital testing, that all seemed to be functionally well.

ree

However, upon further testing, I found the player was not sticking to the spline's path, going free and being able to be controlled in any direction.

ree

I consulted my programmer friends beyond this, to which they attempted to make modifications to the code. However, this ended up short unfortunately. As I tested this, I recognised that even if this was to work, to make this interface stylistically flow with everything else would be an ordeal, due to lack of 3D Modelling experience. Thus, I decided to then scrap this concept, and make the menu exclusively 2D.

From here, I went and iterated upon the menu I had before, this time making an effort to include what I originally had set out to on the low fidelity.

ree

I then decided to have the achievement text behind the icons instead of always displaying, in order to not obstruct the interface - as well as changing the display of the tick icons to resemble rest keys in music.

ree

Having then made level icons through the combination of album covers and discs, I assembled this menu in Unreal Engine.


ree

Additionally, I had a score menu appear from the side from a seperate canvas, similar to the main menu - allowing me to quickly and efficently have said essential menu without significant development.

ree

With that, I then added animations - such as the album cover bopping, as well as the menu background, which flowed well. I also added a pop-up description when hovering over the achievement icons, which overall proved far more functionally sound and stylistically dynamic for this menu, even if it took another iteration to get there.

ree

CHARACTER SWITCH

Originally, in the code of the original project, I had the character switch tied to button inputs. This was in order to make the process as simple as possible.


However, in wanting to establish different user interface types for this project, as well as have a more accessible key in order for a more streamlined UX for this project, I decided to have the character select be through an interface, instead, with the concept being that while holding down the Q key, this menu appears - disappearing when the key is released - so that the character can be swapped to in the heat of gameplay.

ree

To this, I decided to branch out with a unique interface, though still applying the style guide's colours in the design of the discs where possible, and have the character select wheel take place as a broken disc, with each piece representing a different party member.

ree

Then, in Photoshop, I brought each of the different pieces together.



ree

And, from here, I added a character image to mask on each layer, so they would fit within the bounds.


ree

With the above layer being the hovered state, I then decided to make the regular state an overlay, instead - allowing for greater contrast and emphasis as to which character the player is hovering upon.


ree

Finally, came the task of bringing these interfaces to Unreal Engine. Initally, I struggled - as upon recognising the unique shape, I remembered that Unreal Buttons are always square - and wouldn't have Collision correctly around the desired shape.


To circumvent this, I learned a trick; first and foremost, I made the different options all separate interfaces.

ree

Then, within them, I made a size box, which I placed the button within. From there, I made it non-hit testable as the visibility, allowing the button itself to not be what is triggered for the collision.

ree

Finally, I added multiple transparent images within the canvas panel, which were all set to match the areas of effect for the button.

ree

I then did the same with each other interface, ensuring to stay as inside of the button as I could.


ree

ree

ree

ree

Finally, on each, it would cast to the player, which would change the character ID and the visibility of the player who is meant to be on the map to appear, all the while hiding the previous character.

ree

And thus, it took shape as the following, with the collision wrapped to each buttons image.

ree

GAME OVER

For the game over screen, I struggled and, unfortunately, was not able to find a permanent solution to fix the issue with it - though achieving what I still set out to do with it.


ree

In concepting it, I was inspired by the interface of Super Mario 64, where Bowser’s face shows up as a vignette through the whole screen, as it fades to darkness.


ree

To this, I then made an asset in Figma, resembling the player character’s face - with a comical X-eyed expression. The original concept was to have the transparency exist within the player characters face area, with the white and the black on the outside being what remains.



ree

Then, to establish the different mask layers, I brought this over to Illustrator, spreading this out into different layers through its select tool - to which I got the following five layers.



ree

I then brought this over to After Effects, to which I then had each layer zoom out. The reason I layered them as so is so that there could be two variations, the traditional layer with the mask, which would be the base video, and the mask layer - which would demonstrate the colours that are needed, leaving everything white but the part that was to be cut out.


ree

I originally exported both as MP4, but upon loading the video, I found the material was quite laggy - as well as that, it had quite a low quality. Nevertheless, I tried to Chroma Key the video material, through establishing an alpha, referencing the alpha colour - and setting both the texture and opacity mask.

ree

This, however, was wholly ineffective in a User Interface widget under an Opacity Mask, resulting in this.


ree

With this, I decided to try something different.

ree

I was then advised to instead make this a PNG sequence, which is exporting the video into different individual frames. I then added them to Unreal Engine, putting them in its unique folder, and loading the first frame from there. However, upon making the two together, the layer with the mask colour left upon showed.

ree

It was here when I recognised that in order to obtain transparency, the mask alone wouldn’t remove the colour - and that in order to obtain transparency, I would have to stick to black and white. From here, I decided that I would get rid of the white outline in order to have the mask play as smoothly as possible. 


ree

This allowed for the transparency to properly exist, but in exchange to lose the white outline of the original vision, with it instead cutting out all the black on the mask, while not preserving the white outline. Since this had already given me a significant amount of trouble at this point, I was happy to settle for it.


ree

However, one issue I was not able to fix was the choppiness of the cutscene. I tried a few different solutions, such as changing the innate FPS. While changing it to 30 FPS did make it smoother, it was still choppy. In the period leading up to my graduate show, I intend to figure out a way to fix this.


VICTORY SCREEN


The victory screen went through a few design iterations in low-mid fidelity.


ree

ree

Having felt the layout of a more uniform interface would be simpler to interpret and more readable in terms of functionality, I decided to iterate upon the first interface.


ree

Eventually, in feeling more in lieu with other interfaces, such as the main menu and pause menu, which have important information anchored on the top over the side, I settled on the below design.


ree

In coding its function, I first tied the achievements, scoring and grade requirements to the level ID, that which is set in the level blueprint. This would tell what the player had to achieve in order to tell if the player met the requirements to complete the level.


ree

I began with setting the achievements. I first set the amount that was needed for each level in each respective achievement - being that the player needed to have a maximum combo of 30 or more, defeat 10 enemies, and complete the level under 5 minutes. To get the variable on a level-by-level basis, I had a custom event check the variable associated with that level - and set it as the amount variable.


ree

Then, I had the code check to see if this amount was above that, through casting to the player, game mode and timer widget. I also set up a function that sets the amount of times this has been done, and adds it one-by-one to the score associated with that achievement, so it appears on a variable-by-variable basis on the widget itself for dramatic effect - all until the amount variable reaches zero. It also knows wherever to play a tick or X dependant on whether the conditions of the achievement are met.


ree

Additionally, code is used to play a repeating drum roll until each variable's countdown is complete.

ree

For the score itself - as well as the combo and time, it instead displays random variables instead of counting down, keeping the player in suspense to their score. This is done the same as before, except setting the amount as a preset variable, in this case 60, and only displaying the score after that.

ree

Additionally, it is able to know wherever to play a "new best score" animation by comparing the current existing one within the Game Instance.


ree

And, in doing so, will write a new one itself.

ree

Finally, upon checking the players score in comparison to the grades set in the ones within the level blueprint, it will display a different animation.


ree

 
 
 

Comments


Post: Blog2_Post

©2021 by Conor's swag. Proudly created with Wix.com

bottom of page