Took sounds from freesound.org that had CreativeCommons0 licenses and used them in my game! it makes it feel so much more alive :)
Now the game is harder because the obstacles move back faster as the game progresses. I used an autoload Timer for this and it works surprisingly well!
I hope you guys get to try my game out! Iâm shipping it rn!
Now if someone calls you in the middle of you playing this game you wonât rage quit lol
I modeled them in blender and stuff and made them modular. There are 5 types of buildings in total currently and 4 building chunk modules.
I tweaked some spawner settings bc the more u got into the game the more weirdly the spawning would be like bursts of difficulty instead of constant accelerated difficulty. so fixed that :)
now there is:
Fixed a bug so now start screen fade out animation works as expected
the playerâs height and camera was adjusted so obstacles are better seen and scaling is more realistic
I just made an array of the Node3Ds that had MeshInstance3Ds of each kind of road and made the spawner terrain controller thing alternate between them two :))
iâm trying to figure out how to make an infinite scroller in 3d godot but since itâs not like 2d u canât just put parallax⌠u need to actual write a script to generate the mesh and get rid of them accordingly while moving all the mesh towards the player. and my tiny brain cannot wrap my head around it. so hereâs what it looks like so far before i find out how to do this infinite 3d scroller thing :â)
I added a footer to the home page to make it feel more complete
now the number statistics animate when you scroll upon them. so i attached a video to show u what that looks like. I used the NumberFlow React libraryâit was pretty intuitive itself but then i had to use useState, useEffect, and useRef hooks and understand how to use those and how to defer the useEffect until the window detects it đ đ u can do it with the native .getBoundingClientRect tho and u have to do it to an element you want to be the trigger, in my case i made the card the trigger, so if it shows then the animation will happen. and then make sure itâs less than window.innerHeight and elementâs position.bottom must be greater than 0, which means that the element is below the top edge of ur screen
holy yap but this is how i teach myself bc that was something new for me đ
now the game over scene has a cool cubicle graphic (i drew it on aseprite all graphics here are custom-made) and it blinks. the instruction to go back to the start menu looks like that because this game is supposed to pair with my SuiheisenPad micropad (like an arcade machine)
The cubicle changes depending on the message that the game chooses
Now the player goes still when the game is over and itâs fading out, and the playerâs side dodge collisions arenât spheres but custom convex 3D shapes so that they canât dodge the limbo obstacle
now when game over happens the main scene fades out to black and game over fades in
yippee
I made the running animation look less cut off on the sides
I made the dodging animations more polished with outlines
when the horizon bar is at 0 the game over scene is cued
now thereâs a randomization of 4 messages, them being
I added the horizon bar, which is basically this gameâs version of a health bar. Itâs to fit the concept tho. Basically, the premise of the game is that this office worker is trying to escape his mundane office life running towards the horizon. (wants to chase the horizon and touch it) so yeah thatâs why the bar is a sky themed thingâitâs to represent the horizon almost.
This took me way too long to figure out
the obstacles spawn more frequently by 1% every 3 seconds
spawning cap and cooldown for spawning are safeguards so that the game isnât impossible
If the player successfully avoids the obstacle, points are registered. If not, then points are not registered (soon there will be a consequence implemented as well.)
Player collision optimized so that people donât rage quit while playing lollll I had to make custom convex CollisionShapeD for limbo and regular running position
Player now is forced to return to the running position after 0.5 seconds! unless you spam the buttonâin that case the player will remain in that position.
Obstacles now spawn randomly with a slightly higher weight for the limbo obstacle (1.2x more likely to pop up, tentative number)
Collisions are looking good so far! I will update them accordingly if theyâre not accurate but theyâve been through like 10 rounds of optimization atp lol
As you can see, I also assigned CollisionShape3D based on the characterâs position. So when the player doesnât dodge this left obstacle that is repeatedly spawned after 3 seconds, it will print âOI HITâ but if the player dodges to the right then it wonât collide. Obviously Iâll replace this OI HIT printing with actual game logic, namely losing a life.
I made a basic running animation as well as dodging animations to accompany it. I stupidly made an idle animation and quickly realized I wouldnât ever use it but whatevs.
I added different card types, and so now you can switch between them. So CardGrid is extra reusable LOL
This is through capitalized variables that I just learned! I could work logic between choosing components using a capitalized variable (yk the one that uses PascalCase)
I heard itâs better to create an array of the props rather than an array of the cards, so after struggling a bit I got to do it the conventional way with array mapping!
Not entirely sure what the individual mapping keys are for but I will look more deeply into that. It says online that you have to keep keys stable so that React knows which item youâre referencing but donât totally understand why it would need to know that lol
Both are reusable!
I create InfoCard.jsx component which makes these light blue cards. I used props for the first time, so you can pass in an argument making these components completely reusable across the platform!
I created an array of cards and then passed them through the Card Grid. I made it so that the cols prop you pass in leads to the amount of columns created with Tailwind CSS by assigning 1 to âgrid-col-1â etc etc in an object and then using that for part of the Tailwind CSS for the Card Grid. super simple logic but im still proud nevertheless LOL
I implemented Splide JS into the website so it could create this photo gallery carousel!! iâm so proud of it! and the syntax for Splide was surprisingly easy and intuitiveâI followed a tutorial on Medium to understand how to use it. The home page is already looking more polished.