Skip to content

Game development

Game development is a creative outlet for me. Here’s what I’m working on for fun.

The Legend of Bingus (working title)

Inspired by Hero Klungo Saves the World, Bingus auto runs: the player has to avoid obstacles and time jumps to survive.

0:00
/0:27

Prototype showing double jump, normal/red coins and level warp at end

Latest update: 0.5 (16/02/25)

  • Moved pause system to a global system
  • Created dynamic music (pausing and completing a level triggers musical motifs)
  • Save system to track red coins, level completion and coin balance
  • Stats screen
  • Perfect runs: collect every single (non red) coin and get to the end without dying to earn that level's green gem!
  • Map load system with error handling
  • Level select screen, levels unlock after completing one before
  • Coins collected during a level get deposited into a "wallet" at the end. This can be used to unlock rewards in the future
  • Each level reports a custom speed for Bingus so we can make some levels easier/harder than others
  • Reworked coin system make it global, enabling handling of coins/transactions at any point in the game instead of per-level.

Development roadmap

  • Auto scrolling ✅
  • Obstacles ✅
  • Clickable buttons that show/hide/move platforms ✅
  • System to swap direction of movement 🚧
  • Coins ✅
  • Coin sound system (coins collected in sequence increase pitch of coin sound to signify a 'combo') ✅
  • Checkpoints ✅
  • Level select ✅
  • 3x red coins per level, harder to collect ✅

Soundtrack

audio-thumbnail
World1
0:00
/58.584
audio-thumbnail
World1 Bonus Time
0:00
/26.544

Successes

Red coins

Red coin system is dynamic (mostly).

Each level has an ID that it self-reports to the game manager.

The coins also have an ID: coin_1 etc. Game manager uses this to check whether the coins have been collected, stored in a dictionary:

var red_coin_progress = {
	# Each entry corresponds to the appropriate level ID.
	1: {"coin_1": false, "coin_2": false, "coin_3": false},
	2: {"coin_1": false, "coin_2": false, "coin_3": false},
	3: {"coin_1": false, "coin_2": false, "coin_3": false},
}

Level IDs are integers but the coin IDs are still strings, which will be fixed soon. The levels are integers to help the level swapping system know where to go next.

Code runs on level initialise to check if the coin has been collected previously. If it has, we set transparency to 50% to visually indicate this to the player.

func _ready():
	# Wait a frame before running logic as the global dictionary isn't ready...
	await get_tree().process_frame 
	
	# Check whether we've collected the coin before
	if Global.red_coin_progress[Global.current_level][coin_id]:
		self.modulate.a = 0.5
	else:
		print("Don't have this coin (", coin_id, ") in ", Global.current_level, ", keeping it as-is.")
Prototype snow level with (very faint) snow particle effect