Skip to main content

Game Jam #3 - Feathers & Shadows (PART 3) - Refinement

 

Logo by Ephraim Mananga

Invincibility Frames

 A common design choice in games is to subtly give the player an unfair advantage over the enemy. This is because the goal is for the player to succeed, and it's important that a good balance is struck between the challenge of the encounter and the ability to succeed.

One common design feature is invincibility frames, wherein the player enters a temporary state after taking damage where they cannot take any more. This gives the player time to react accordingly without losing lots of health. In many platformers, this is represented by the player model flickering, and so that is the approach that I took.

Blueprints of the Invincibility Frames

When the player takes damage, a boolean called Invincibility is set to true. This triggers the Invincibility Frames Controller which calls the Invincibility Event and sets a Delay. The boolean timer_control is used to stop the code being rerun as it is directly connected to Event Tick and without it, the Flicker Effect would get called every frame, giving it no time to actually do anything. After the delay, the effect is turned off and everything is reset.

Inside the Flicker Effect event, the player model's visibility it rapidly toggled on and off, with a small delay between them so the effect is visible to the eye.

HUD

 The Heads-Up Display is the UI elements that are always on-screen to display vital information to the player (i.e. give them a 'heads up'). Typically, this includes things like health, score counters and maybe a mini-map. In Feathers and Shadows, the two kinds of information that needed to be shown was the health of the player and the amount of feathers they had collected.

The health was to be displayed via 4 hearts, each representing 25 out of 100 health 'points'. Upon taking damage, the player always loses exactly 25 health, so these can be considered 1 out of 4 as well. The feather counter was simply static UI with a dynamic text element.

For the health, the process starts here inside the Player. Where the health variable is checked to see what number it is at and adjusts an integer accordingly.

That integer is then sent to the HUD

 Inside the HUD, the integer value is used as a switch to decide which path to take. Each path sets the opacity of each heart element according to the health state of the Player.

So, for instance, if the Players' health was 50 - the integer would be set to 2. This would result in the first two hearts being reduced in opacity (lost hearts) and the last 2 being at full opacity (remaining hearts). By keeping lost hearts still visible to the player but also clearly not remaining gives them a better understanding on how much they have lost.

For the feather counter, each time one is collected and the variable increased, it is sent to the HUD.

 The HUD then sets the Text element to the passed value.


Level Design 

Finally, with everything else in place, all that was needed was a proper level. Although not technically my job, I did end up doing it. This is because at this point the group had crumbled. Without a producer to hold things together, communication and action within the group slowed considerably. By the end, only the two artists and me were really working on the game at all. And with me being the only one of the three with confidence in using Unreal Engine, I created the world the night before.

Truthfully, it was actually one of the most fun things I did on this project. Unlike a proper designer's approach of mocking up plans and realising them, I just made it up as I went. Positioning, Rotating and Scaling all the models, putting them together to create a coherent, creative world was a blast for me. It was both relaxing and engaging at the same time!

And thus, after adding music, sound effects and some simple Menu screens, the game was finished!


You can play the game for free here.

Apologies, this took a little longer than expected. I've been very busy and fell behind a little on these logs (that's why the GGJ devlog came out before this one, despite being sooner). I should be back on track now though, and I've got a lot more projects to share, so stay tuned!

Until next time,

- JDM

Comments

Popular posts from this blog

Game Jam #2 - Van Helsing (PART 2) - The Bullets

  (Bullet sprite by Nicolas Katsis) This part is solely on how I implemented the bullets shown in the video in Part 1. There are two parts to this split across two scripts. The first is its behaviour and the second is the spawning of the bullet. First of all, it's behaviour.   The first thing that occurs on spawn is that the bullet assigns itself to a group of objects known as "P_Bullet". You will notice in all the snippets of code that many of the variables and groups for this object are listed as "P_ something ". This is because we initially considered the idea of giving the player two different guns that they could swap between: A pistol with a higher ammo count and longer range but weaker damage, and a shotgun with a much higher damage but fewer bullets and shorter range. The P_ was a reference to 'Pistol' bullets and S_ was a reference to 'Shotgun' bullets. Unfortunately, due to time constraints, the Shotgun was never introduced. For those u...

Demigod - CSGO - Update 1

The 'player' with a cylinder to identify its front face As part of this teaching blocks assignment for my Coding & Scripting for Games module (nicknamed CSGO...we don't talk about the O) I have to make a simple game or game system inside Unreal Engine 5. This is a solo project that everyone has to do individually but as the focus is on the code, things such as appearance and presentation are not important, lightening the workload. My idea for this project is simple: I intend to make a 3D platformer wherein the player has a dash and double jump ability which can be stringed together for impressive world traversal. At first, you may think that's too easy, UE5 already has most of that built-in...until I say that I intend to program it all myself. Why am I doing that? Because of how the built-in versions work. Jumping, for instance, uses the advanced physics engine which makes it momentum based. You need to run/sprint before you jump or else you will go nowhere. Not onl...

Game Jam #2 - Van Helsing (PART 1) - The Beginning

  Game Jam #2 began on 13th October and lasted 3 weeks. The goal this time was "Shoot-em up" and the teams had been both expanded to average 4 per group and randomly assorted as opposed to being grouped based on those around you. My team consisted of the following: - Programmer (me) - Programmer - Artist - Designer  Off the bat, we were able to come up with a very solid idea for our game: A side-scrolling platformer where the player can shoot 360 degrees to kill zombies. The player can only see inside a small aura of light around them and must rely on lampposts and other light sources as well as directional audio cues to navigate the level. The other programmer, just like my last partner, had never used a game engine prior to this course. As such, we settled on using Godot for this project. The reason we chose Godot is because its proprietary scripting language, known as GDscript, is pythonic. This means it is eerily similar to python, but enhanced and integrated enough that ...