Skip to main content

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 it is a viable solution for game development. We also found from trying out the engine that it was relatively easy to understand.

No engine is perfect, though, and we later find its downside is in the lack of community support for the engine's niche aspects (more on that later).

Creating a 2D side-scrolling platformer with a double jump was easy, and I was able to set it up within a few hours. I was also easily able to get the gun object (which would be both the character's arm and gun) to point to the position of the mouse while remaining with the body positionally. Creating the zombies was also rather simple thanks to the pythonic structure of GDscript that allowed me to easily implement their functionality as shown below.

The first major hurdle in development came in the form of the bullets. Since the player could shoot at any angle, I needed to implement a way for the bullets to move "forward". For those less knowledgeable in programming, everything operates on an axis. In the case of 2D games, they are typically x and y. So as a programmer, I can control the bullet's x and y coordinates to make it move horizontally and vertically. This would be fine if the player could only shoot in fixed angles (such as up, down, left and right), however, making the bullets move in a 'forward' direction at any random angle in any random direction is a lot more complicated. And for my own sanity in the future, I am going to make an entire post about exactly how I achieved it for all to see.

But for now, here was the state of the game after 4 hours of steady development and 8 gruelling hours of trying to make bullets be bullets:

Goodbye for now!

-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...

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 witho...

Game Jam #2 - Van Helsing (PART 4) - More Functionality

Continuing on from the last log: The Ghost The purpose of the ghost is simple: to keep the player moving. Although not refined, there are elevated platforms the player can stand on in the level (i.e. the Statues and Lampposts) and one issue we identified quite early is that the player could take advantage of this to avoid the zombies indefinitely by remaining in one 'safe' spot until they had killed all the zombies. To rectify this, we created the idea of the ghost - an enemy that could reach the player on any y level and could not be killed. They have a delayed start to give the player some time to get moving and then, if not progressing quick enough, the ghost will eventually catch up to the player and nudge them along (or kill them if they fail to do so).     Creating the delay was simple. On level start, the ghost spawns just off-screen with the variable "begin" set to false. Inside the _process function, everything is behind an if statement waiting for begin to b...