Categories
Uncategorised

GD2 Blog: Week 30

Collaborative Project

As of the 16th of May, I’ve been adding some further adjustments to the game. I’ve gotten plenty of feedback from Jerome for the current level design as well as some certain aspects of the player and widget (See Figure 1). I’ve also been working on the second level of the game based upon this feedback and their suggestions.

Figure 1

One issue players had with the game was that the projectiles fired by spawners seemed too small, and that their size had to be upped slightly more. This meant that the projectiles felt a bit too easy to dodge and thus giving the spawners less of a challenging presence.

Another issue is that the light projectiles seemed far too small, and were being fired too much by the spinning projectile spawner (See Figure 2).

Figure 2

For the spinning projectile spawner, I changed the size of the light projectiles it fires to be slightly more larger and noticeable by the player as well as delaying the amount of time it fires. The result is a much easier room to encourage movement as less projectiles make it less intimidating.

As for the other projectile spawner down the hall, I simply switched out the base projectiles for a heavier one, which is a much more larger and noticeable projectile (See Figure 3).

Figure 3

Another requested change was to reduce the player’s speed, however I disagreed with this change.

I feel that the argument of having the players speed through rooms is more of a problem with the level design rather than the player themselves – tuning down the player’s speed would also mean slowing the player’s ability to traverse through the current projectile spawners made within the game as well. I personally think slowing down the pace of the player would go against the point of it being a bullet hell as well, as it makes dodging more harder.

As for the other requested changes, health was requested to be shown in a different way. The previous gameplay hud in the game felt a bit too small and hard to see, it also didn’t display lives.

I’ve changed this to have a much more prominent presence within the game, moving the health up to the top right and making the text much bigger and clearer to see – lives and health are also coded to be different colours (See Figure 4)

Figure 4

I’ve also been making sure to help port more assets created by the artists of the team, Emre Kulac has also so far been adding details towards the first level of the game (See Figure 5).

Figure 5

Here are the model assets I’ve help import into the game, these have been done by Jordan (See Figure 6).

Figure 6

Some more feedback towards the game was to add some more complex projectile spawners (See Figure 7).

Figure 7

Following this feedback, I introduced a new type of projectile spawner which fires a configurable amount of projectiles in a circular pattern at once, it also calculates an angle for each projectile.

Figure 8 and 7 show the customizability of this, it allows people to set the amount of projectiles to spawn, at whichever spawn rate speed and which type of projectile in particular.

Figure 8
Figure 9

To achieve this within my code, I needed to change some things within the Base Projectile Spawner’s code. In the header file before I created a child class for it, I moved the function that shot the projectiles and moved it under “Protected” and changed it into a virtual void that would be overridden by the child spawner (See Figure 10).

Being moved under a Protected access specifier makes it so that the void will be able to be accessed within inherited classes of the actor.

“Protected members cannot be accessed from outside the class, however, they can be accessed in inherited classes.”

w3schools.com, 2022

Figure 10

Within the circular projectile spawner’s header file is just the virtual void for the function being overridden as well as an integer variable that determines the amount of projectiles to be fired (See Figure 11).

Figure 11

Within the CPP code, I’ve set a for loop that will repeat through the spawner for as many times as the projectile amount is set.

Within the loop, it will also get the rotation angle of each projectile and add it onto the rotation of the projectile to be spawned through each loop – as the rotation angle is the projectile amount being divided by 360, this means that all the projectiles will always be able to form a circular shape no matter the amount (Figure 12).

Figure 12

As soon as these got added, I started development on the second level within the game using these in mind using a design plan (See Figure 13).

Figure 13

The player is lead on a linear path towards their first circular projectile spawner room, this room will introduce a projectile spawner that spawns a low amount of weak projectiles which will conveniently avoid the entrance door the player enters through – this prepares the player for the following future rooms.

Figure 14

The player will require opening the door to the other half of the level by choosing a side room to go into, each one has a switch that will unlock one part of the door – the player decides which room they head into by operating a single moving block towards two pressure plates that unlock their respective doors, the player here is free to choose whichever door they want to open first (See Figure 15).

Figure 15

The room on the right side is a very large room, it proposes a single spawner that shoots a large amount of heavier projectiles across the whole room. Although they’re firing slow projectiles, an enemy is added into the room as well to provide supporting projectiles that fire more frequently and faster towards the player constantly (See Figure 16).

Figure 16

This introduces the player rooms that make use of multiple hazards, and makes sure that once the player enters the room, they will have to deal with the enemy as well as looking out for heavy projectiles emitted from the spawner.

The left side of the room introduces two moving block sequences as well as providing some cover unlike the other room which was more open, the objective of this room is to try and get the moving blocks onto both switches whilst also concentrating on the patterns of the projectile to make sure you avoid them (See Figure 17).

Figure 17

The player will also have to go across to the end of the room to complete the puzzle, which will require them to use cover and to time their movement carefully – this room teaches the player that sometimes they must be patient with the game and to not rush as it requires good timing.

The second half of the level will involve some more different uses of circular projectile spawners, featuring one more combat room with an enemy and a puzzle (See Figure 18).

Figure 18

The first room features a unique circular projectile spawner with only two differently facing projectiles set to fire from it, this results in a horizontal or vertical line of fire, this spawner fires the heavy variation of projectiles and each form a gap inbetween them that the player can slip through.

There’s also an enemy on the other side of the room that the player is unable to reach, due to this room being much more smaller than the last enemy room the player will have to be even more careful to not touch the incoming projectiles firing at them – once the enemy is cleared, the door then opens allowing them to progress out of the room (See Figure 19).

Figure 19

The second room in the player’s path is a long hallway with a projectile spawner at the end of it, this spawns a ton of projectiles that fill the hallway and are almost impossible to dodge without getting into any cover of sorts.

The tactic here is to use the moving block as cover to try and get closer to the exit out of the room, they’d need to move this closer to the exit to progress. Like the enemy and projectile spawner room, this is an attempt at making a room that involves mixing two mechanics together to form a puzzle (See Figure 20).

Figure 20

Not only could this player use a moving block as their shield to traverse through the hallway, but they can also use it to block most of the oncoming projectiles by placing it directly in front of the spawner (See Figure 21).

Figure 21

Although not exactly a puzzle room, this makes use of the circular projectile spawner in a way that makes it form a barrier from the other half of the room.

It could arguably serve as a good indicator to show where the player needs to progress (See Figure 22).

Figure 22

The final room afterwards has a centered circular projectile spawner, in this room are also several moving blocks the player has to slide onto pressure plates.

However the challenge of this room is to try and to take things slow, as the pressure plates aren’t placed at dead ends so that moving blocks can easily slide over them if the player fires too many bullets and gives them too much force – This teaches the player to patiently fire their shots whilst under pressure by fire and to not overly rush or else they’re more likely to overshoot the moving blocks (See Figure 23).

Figure 23

As shown in Figure 24 is the full layout of Level02, it is the longest level out of the whole game.

Figure 24

As shown in Figure 25, responses to the second level were mostly positive, and its shown to be a step up from level01 – as level01 is easy, it only makes sense to ramp up the difficulty for level02, as it is harder it also serves as preparation for the boss fight.

Figure 25

I’ve also been able to try and test Jerome’s boss battle level and some good progress has been made as the boss is fully functional and can be beaten (See Figure 26).

Figure 26

I’ve given my following feedback for the boss, requesting that the arena be smaller as there’s plenty of room to dodge projectiles and the difficulty of the boss should somewhat rely on being in a closer quarters space to make it harder (See Figure 27)

Figure 27

I’ve also gotten testing on the final stage of the game done from a third-party source, this being another Games Development student. They overall liked the gameplay and idea of our game and appreciated the concept of it.

They gave some feedback that the game needed some better audio and visual cues, such as indications for when doors get unlocked or the player being able to indicate taking damage – we unfortunately cannot add audio in our game due to none of the team having experience with working on audio, there’s also time constraints to worry about (See Figure 28).

Figure 28

As for my progress, I seem to be done with all I need to do for the game whilst I’m waiting for everyone else to finish. I’ve marked my Trello progress as completed (See Figure 29).

Figure 29

One feature that had to be cut was giving the enemies the ability to move, simply due to how it wasn’t needed throughout the current level design of the game – Time constraints were also a problem which also contributed to the feature being scrapped.

Although, as this was our last week working on the game. We unfortunately weren’t able to make all the progress as we’d hoped, but still managed to pull through with a prototype that’s playable from start to finish which I am overall proud of.

One particular main issue we had with working was that the group had a weak direction, as no one took a lead in the project which led to many of the group not working too much on the game – this led to communication between most of the group being much more harder. I took the lead and set up a GitHub to make progress on work much easier for the the group and encouraging as many to work on the game as possible – We weren’t fully able to completely follow through with our game testing plan.

If I were to start another group project, I’d try to focus and make sure that the next team has a more stronger directive and to take the initiative more often in organizing and helping set up things to further ensure we make the best progress as possible with our time.

Bibliography

W3schools.com. 2022. C++ Access Specifiers. [online] Available at: https://www.w3schools.com/cpp/cpp_access_specifiers.asp#:~:text=In%20C%2B%2B%2C%20there%20are,be%20accessed%20in%20inherited%20classes. [Accessed 18 May 2022].

Leave a Reply

Your email address will not be published. Required fields are marked *