The most obvious feature of the game is the changing of colors of the world and the player in a harmonized way, to achieve this I made keyframes corresponding to temperatures from -50 to 100 degrees.

var colors_light = {

100 : Color(1.00,0.314,0.314,1.00),

70 : Color(1.00,0.702,0.502,1.00),

40 : Color(1.00,0.902,0.502,1.00),

20 : Color(0.898,1.00,0.502,1.00),

0 : Color(0.655,0.970,0.760,1.0),

-20 : Color(0.686,0.914,0.866,1.0),

-50 : Color(0.835,0.898,1.00,1.00)

}

// this is one of the lists containing all the data for light colors

// probably there were numerous better ways to achieve this but,

// this way seemed most apt to me at the time

The keyframes were stored as Global Variables in form or arrays/lists and was used all over the game including the title screen getting the respective color for the current world temperature.

Hopefully this makes things a little more clear

Another interesting thing to know about my game is that the whole game has no colors it’s completely Black and White. And you will say that I am messing with you but no.

Actually all the assets are BW but I have used the modulate function.

Probably this explains why I have colours stored the way i have stored them, this not only keeps the size of the game down but also allows for the colour shift effect of my game.

if nd.position.distance_squared_to(Data.mouseposGlobal) > 1600:

nd.look_at( Vector2(Data.mouseposGlobal.x, Data.mouseposGlobal.y))

nd.rotate( PI / 2) // here I used distance_squared as it was supposed to be called each frame and square_root is a rather heavy function

// next I just used the Global position

// and just to get things properly aligned I rotated the node by 90 degrees or PI/2

Next up I had the challenge of creating the player face the mouse, I used the lookat() function with the , and made the Player face the mouse cursor.

Next I added an AIM to the game, made it follow the mouse position and this made for the cursor for the game.

rotate_to( nd.rotation, delta * rot_speed)

Next I had to make the player move as if it was trying to move towards the cursor but not snap to it, so I just went ahead and added a created a separate Node2D and made that node lookat the cursor and then used it to get the facing rotation and rotated towards it with the rot_speed .

Parallax BG as child of Player and UI using CanvasLayer

Next was adding some Backgound and GUI, and giving the world something to make it feel as if we were moving cause in a blank sky it just felt like nothing was moving.

Former was done using the CanvasLayer.

And I added a ParallaxBackground to the whole world, made if as big as I could and made it move at a slightly different speed scale than the world using a ParallaxLayer.

With this the basics were done, I only had to add some obstacles/enemies to add something for the player to do. And some kind of attack for the player to be able to use.

tpos = target.position + Vector2((randi() % 100 + 10.0), (randi() % 100 + 10.0)) // here I use the target position after changing it with some random values.

I added a gun ability to the player and called it the end of the Player system. And went on to the enemy system, I used a similar mechanic as the Player used to make the enemies follow the player at high speeds while feeling as if they are not as fast as the player, which was tricky to implement but using some random functions, I managed to pull it off.

Now all the enemies were following the player but with a random offset which was not enough to make it miss a static target but for a moving target it felt as it sometimes the enemies would just dodge the player which was sort of the result I wanted and also maintain the enemies a little apart from each other without me having to add a collision/cluster system to the enemies.

health -= abs(Data.current_temp - my_temp) / 100 * health_max

Now the enemies could follow the player but when will they get destroyed, I added a damage function which took into account the enemy color. So if the BG color is in the vicinity of the Enemy color then the damage will be less while if it’s different then damage will be higher. The bullets will hurt the enemies and getting hit by the enemies will surely kill them but will also damage the player.

Finally I went on to add the temperature system to the game where, if you kept firing the gun then the ship will overheat and if you get the shard on overheating your gun will start to decrease the temperature instead. Interesting fact this feature was probably the only confusing feature in my game and it remained largely undetected. So probably goes to tell how much simple games can do over some complex games.

All that was left now was the enemy generation system I made a small arrow telling the direction from where the enemies will come and added some randomisation for this stuff. Then I just added some more enemy types.

The menu not at the center because I wanted to keep it off the player

All that was left now was adding some music and GUI stuff. I added a score system then I quickly went on to adding a Label to display it, next I added some Settings like Musics Off and SFX Off and fullscreen.

At the clock only a few hours were left so I sped up and made a Title Screen and started work on the export. I noticed that I had a few errors on export went on to fix some bugs and learned that audio was not getting properly closed so made sure to end the audio stream in the exit_tree function.

All this taught me to use enter_tree() and exit_tree() functions to make the levels rather than calling functions needlessly.

Still some of the best ideas from this Jam was likely the borderless game screen that makes the game feel more natural.

My view of the game I created,