🏐 Ball Tale 🏐
A game by Siim Raudsepp
What is it?
Ball Tale is a 2D adventure/metroidvania-ish platformer. You control a bouncing ball through uniquely themed areas. Each area has its own difficulties, puzzles to solve and bosses to beat. The game also features an upgrade system.
Heavily inspired by An Untitled Story
Project plan
The goal of this project is to have a go at making my own 2D platformer and testing what works/what doesn't.
The plan is to first work on getting some of the controls implemented, after which I will add a static world and enemies. Later I will add more abilities to the ball (for example a speed boosting mechanic), boss fights and some upgrades to be found throughout the world. Sometime down the road I will work on the soundtrack and sound effects. The art will be made as things progress. I would also like to add a nicer main menu to the game near the end.
Ideally I would also like to have some interactable NPCs in some areas that you could chat with to get some information about the world or buy items from, but initially it is out of scope of this project. I have also thought about adding some multiplayer functionality (highscores, VS mode), but it will be clearly out of the scope of this project.
The mechanics will be as simple as possible because I don't want the player to get overwhelmed by the amount of different things he/she can do at once.
Mechanics currently planned to implement in the game (during the project) are as follows :
- Rolling around
- Jumping
- Rebounding off walls
- A self-boosting mechanic where the ball is suspended in air for a few seconds and the player can choose a direction to be shot in with extra speed. I think this will really make up for some fun moments in combination with the physics
- A shooting mechanic(haven't really thought about the details yet)
Technologies/Software that I will be using :
- Unity - Game engine
- Audacity - Sound editing and possibly recording
- Paint.NET - Programmer art :)
- Reason - MIDI editing and recording
Milestone 1 (09.03) - The Ball
Goals
- Setup the Unity project and repository - (1h 30min) ✔️
- Create empty project in Unity - (15 min) ✔️
- Create repository - (15 min) ✔️
- A test scene with a few rectangles here and there to test the functionality, nothing too fancy - (1h) ✔️
- Add TextMesh Pro to the project - (This will take 5 minutes or 5 hours depending on how Unity feels about it) ✔️
- Implement at least 50% of the planned movement/controls: - (4h)
- The player can move left and right - (1h) ✔️
- The player can jump up - (1h) ✔️
- The player can bounce against terrain and will rebound (My initial guess is physics materials in Unity) - (2h) ❌
Progress
Setting up the repository and Unity project went really smoothly and I even got TextMesh Pro to import correctly on the first try.
After that I started to create a test scene. Initially I started out with just placing some rectangles on the scene, but then I remembered that using the tilemap is the easier (you could even say the right) way to do it. I scrapped everything I had and re-implemented the scene. Adding collision to it was suprisingly easy, too. Just attach a Tilemap Collider 2D component to the Tilemap gameobject and you're good to go.
Up next was adding the ball that the player controls to the scene. I hastily popped open the 2D components menu in Unity and saw that only Sprite was the only thing I could use to represent the ball in game. After some time playing around with it and having problems (like the ball wasn't perfectly round because I do not know how to make a perfect circle in P.NET), I decided to take a step back and do my homework. It turned out that 3D primitives also work in 2D nicely, you just have to add a 2D Collider and Rigibody to make it work properly. There was also a problem where the ball was too dark, no matter what colors or settings I tried, but I quickly realized that it's a shader problem (I had no light source in my scene). So I changed the shader of the ball to unlit, after which I had the right color I wanted on the ball.
With that out of the way, I started implementing the controls. Moving left and right is implemented by changing the horizontal velocity of the ball. Jumping is implemented by giving an impulse to the ball. This gave me good enough controls to start implementing the main part of this game : bouncing around, although the gravity and some other parameters will have to be tuned at a later time.
I knew before that physics materials are used to implement this sort of behavior I am looking for, so I started with that. Turns out you just have to create a PhysicsMaterial2D and attach it to the player. It worked right away. After playing around with the settings some time I found that using {$ \frac{\sqrt{2}}{2} $} as the bounciness coefficient works nicely.
But there was another problem with the collisions when bouncing against the wall...
After researching the problem for 4 hours, I couldn't come up with or find a solution. Since the movement was already sloppy in other parts too, I decided it would be wise to start from scratch and implement player controls using raycasts. I found a nice tutorial on YouTube that explained and implemented raycast-based controls in depth. So I started off with that and right now I have the movement, variable height jumping and camera movement working, although the collision detection needs some work on the edges.

Broken raycasts on the parts of the circle that are not defined by a specific direction (up,down,left,right)
The bouncing implementation will be pushed to the next iteration, since I cannot use physics materials anymore to get it for free. I have done a bit of research into it and found a nice Wikipedia article on how bounces work in real life.
All in all, I am very delighted with my progress in this milestone. My only regret is that I didn't work on this more actively (instead of working only 3 evenings out of all the time), because it was only a day before the deadline that I discovered that I couldn't fix wall collisions.
Milestone 1 build link
Currently SPACE is used to jump, LEFT and RIGHT arrow keys are used to move horizontally
Milestone 2 (23.03) - The Environment
Goals
- Implement the self-boosting mechanic - (2h)
- Implement bouncing around and against walls - (4h)
- Implement floating texts or signs to show messages to the player - (2h)
- Design a starting place and implement tutorial in it - (4h)
Progress
Milestone 3 (06.04)
Goals
Progress
TBA



