Rolling Renegade is a 2d platforming character I have been working on which I have designed for dynamic and skilful play.
I have been working on this game in Unity while learning programming and game development as an experiment trying figure out what the best possible platforming controls would be to allow you to move around quickly, skilfully and dynamically.
Play demo here: https://quantumrecursion.itch.io/rolling-renegade
Symmetrical controls which allow you to travel on any angle of platform
Dynamic and complete controls which give you full control over the player actions
Freedom in how to play and choice in how to approach challenges
Can move in anyway, but nothing is done for you automatically.
A physical world to interact with.
Controls are intuitive to pick up and has depth for mastery
Enemies and combat system based on momentum
Varied game play
Highly customisable. Can change:
Which UI elements you want to show
In the game you play as Rolling Renegade a Circle who is created by the Squares as the ultimate weapon to destroy the Triangles, made to move over difficult geometry where Squares cannot travel.
You have a set of complimentary moves and mechanics which combine to give you freedom of movement to play how you choose. The controls have a wide skill range with various levels of expertise to give the game a fun mastery curve when playing it and getting better.
You can roll, jump, dash, bounce, spin and rotate in in any direction over any angle of platform.
I have basically just tried to make the character to 2d platformers what F1 is to cars , meaning its designed to be optimal for moving around quickly. Like a 2d Super hero whose super power is dynamic movement, like how I imagine Sonic would feel to sonic.
I have tried to make the controls easy for a beginner to understand the skill range is very high because of precision and variability in controls. So its not too difficult to play but almost impossible to do play perfectly.
Level Design with Tile maps
I have been using the Unity Tile maps to make levels. As the levels in the above video are using.
I used a rule tile with an extended brush which allowed me to increment each grid position to set the tile with a key. This allowed me to have more varied platforms and cycle through different styles of platform
This allowed me to have more variation in tiles that are placed and have different types of tiles placed together. It did sometimes make incrementing it tedious so I made it so you could copy chunks like you would normal tiles.
I also made a circle brush tool as demonstrated which allowed me to make circle and oval shaped platforms and tunnels quickly although the shapes are not really the best for my players movement.
Tile maps are a quick easy and versatile way to make levels efficiently. However as the controls evolved I have started to think maybe tile maps limited the game and that the character should be travelling on platforms of all angles and curves to be making use of 360 degrees of movement.
Which is why Sprite Shape has been really interesting for me as it allows me to make levels which suit my games controls better than tile maps. I will still use tile maps for some levels but I will move to using Sprite Shape for most levels.
Tile Map to Sprite Shape
When moving to Sprite Shape a problem with the design became highlighted. When moving over the outer arc of a curve the player will move away from it because you accelerate parallel to the platforms normal so as the platform curved way from you, you keep jerking off it. Its subtle but it makes the movement feels weird and out of your control.
I realised you need to be pushing into the platform, and this was something you were already doing but only when upside down. I made the player push into roofs automatically as a function of speed so that when you're going fast enough you defy gravity. This was disabled when on the ground because it seemed pointless and created extra friction which slowed you down and unbalanced the controls.
I realised this was a great chance to improve the controls. I needed to make it so that the player would choose to push into platforms which kept them into curves and when upside down to defy gravity. This made the game move from less automatic and to more intentional. And from orientation exceptionalism and towards platform symmetry which were both things I have been trying to do.
// Old method where you would push into the platform as a function of speed
// Angle factor determines how relevant angle is to how much you are pushed in. Because you needed to be pushed in more when closer to a flat roof.
internal void RoofSticking()
if (!platforms.HasPlatforms() || Data.pushInToPlatform || !(platforms.Normal().y < 0)) return;
var ratio = RoofAngleRatio(Data.roof.roofStickAngleFactor, Data.roof.stickLerpType);
var upForce = platforms.Normal() * velocity.magnitude* Data.roof.roofStickFactor * ratio;
body.velocity -= upForce * Time.fixedDeltaTime;
private float RoofAngleRatio(float angleFactor, LerpType lerpType)
var angle = Vector2.Angle(platforms.Normal(), Vector2.down);
var ratio = (90 - angle * angleFactor) / 90;
var lerpRatio = Lerping.LerpRatio(lerpType, ratio);
I had considered this before and decided against it because of 2 problems; first it causes you to slow down as you push in as a kind of extra friction, second it causes you to push forward less decreasing your acceleration. Both of which make the player slower.
However you can still push forward fully of course so you can't just flat out increase acceleration and reduce friction because you can not push in at all, in which case you will go too fast if these values are reduced too much.
This turns out to be a positive when controlled for because this forces it to be the case that to push in less and push forward more makes you go faster. And when on a roof the less you push in the faster you go, but the less you push in the easier it is to accidentally push in too little and fall off. So more precise and skilful play increases speed.
To make all of this balance I ended up needing to make the input values ease out so that you need to push in less to get a high input value and you can simultaneously push forward and in with quite high values. I have tried to make it so that it isn't too difficult to be able to travel around upside down so its not frustrating to play but because of the precision and variability in controls their is a high skill range for players to grow into.
// New method where you push into platform
public Vector2 PushIntoPlatformAcceleration()
if (!platforms.HasPlatforms() || !Data.pushInToPlatform) return Vector2.zero;
var inputRatio = AngledInput.Input().y;
if (inputRatio >= 0) return Vector2.zero;
inputRatio = Lerping.LerpRatio(Data.speed.intoPlatformInputLerp, Mathf.Abs(inputRatio));
var speedRatio = body.velocity.magnitude / Data.speed.pushInMaxSpeed;
speedRatio = Mathf.Clamp01(speedRatio);
speedRatio = Lerping.LerpRatio(Data.speed.intoPlatformSpeedLerp, speedRatio);
var intoPlatformAcceleration = speedRatio * inputRatio * Data.speed.intoPlatformAcceleration* body.velocity.magnitude * Time.fixedDeltaTime;
var intoPlatformAccelerationVector = platforms.Normal() * -intoPlatformAcceleration;
The push in value needs to be quite low or it slows you down to much. Counter intuitively when I was figuring out what value to use, reducing the push in made it easier to move around platforms, the below video shows how it works with a very into platform acceleration, followed by the normal acceleration, you can see how you are slowed down to a crawl at times an fly away from sharp edges.
Note that some of these collides aren't optimised so the movement is a little jumpy at times. It turns out that if the gap between nodes is to large it makes the collider less smooth.
The two uses of pushing in also combine so you can push into a curved roof, so the controls ended up allowing you to roll around the outside of circles as shown. Obviously the larger the circle the easier it is too do and if the circle is small enough it cannot be done.
Level Design with Sprite Shape
Sprite Shape allows you to make smooth levels which fit my character alot faster than with tile maps. You can make huge platforms faster and intricate parts in more detail.
It also has a few tools already with it such as node attach with helps with level design. As demonstrated in the video below. With updating the movement and other things I haven't had too much time to experiment with level design so over the Christmas period when I'm going to be playing around with level design in Sprite Shape alot.
Tool ideas and improvement ideas.
The collider is less detailed if nodes are spaced apart as shown in the video above. It can be tedious to place extra nodes for the sake of this. To fix it could:
Make it so that collider detail can be maintained regardless of node spacing
Implement an algorithm which automatically adds nodes evenly spaced along the spline.
Deformer so that when you hit into platforms it is reshaped. I tried this a little but haven't yet had the time figure it out.
Make auto generated collider take the node height into account. As show below if the collider would match this then it be a massive improvement to the tool.
This would let you make corners and steep curves alot smoother and quicker.
Get feedback and improve it based on what people think
Improve presentation and art.
Fix combat system
Create enemy AI which moves across varied terrain
Create boss fights
Create Shape AI
Square, Triangle and Circle.
With ML Agents if possible
Thank you for taking the time to check out my project.