public class PlatformerPhysics
public float PlayerSpeedX = 0.25f;
public float JumpHeight = 3f;
public float GravityPower = 0.156912f;
public float Timescale = 1f;
public float WorldWidth = 800f;
public Vector2 PlayerPos = new Vector2(0, 0);
public Vector2 PlayerVel = new Vector2(0, 0);
public Func<string, bool> CheckCollision = (direction) => false;
public PlatformerPhysics(Func<string, bool> collisionCheck)
CheckCollision = collisionCheck;
public Vector2(float x, float y)
public float RoundBy(float input, float by)
return (float)Math.Floor(input / by + 0.5) * by;
public float RPT1(float val, float max)
else if (val < 1) return max;
public int BYN(float val)
else if (val < 0) return -1;
public float Clamp2(float val, float min, float max)
if (val > max) return max;
else if (val < min) return min;
PlayerVel.y -= GravityPower * Timescale;
PlayerPos.x += PlayerVel.x * Timescale;
PlayerPos.y += PlayerVel.y * Timescale;
if (CheckCollision("left") && PlayerVel.x < 0)
if (CheckCollision("right") && PlayerVel.x > 0)
PlayerPos.x = Clamp2(PlayerPos.x, 0, WorldWidth);
PlayerVel.y = JumpHeight;
public static void Main(string[] args)
Func<string, bool> mockCollisionCheck = (direction) =>
if (direction == "left" && new PlatformerPhysics((s) => false).PlayerPos.x <= 10) return true;
if (direction == "right" && new PlatformerPhysics((s) => false).PlayerPos.x >= 790) return true;
PlatformerPhysics physics = new PlatformerPhysics(mockCollisionCheck);
physics.WorldWidth = 800;
Console.WriteLine($"Initial Position: ({physics.PlayerPos.x}, {physics.PlayerPos.y})");
Console.WriteLine($"Initial Velocity: ({physics.PlayerVel.x}, {physics.PlayerVel.y})");
for (int i = 0; i < 60; i++)
Console.WriteLine($"Frame {i+1}: Position: ({physics.PlayerPos.x}, {physics.PlayerPos.y}), Velocity: ({physics.PlayerVel.x}, {physics.PlayerVel.y})");
Console.WriteLine($"Jump! Velocity: ({physics.PlayerVel.x}, {physics.PlayerVel.y})");
for (int i = 0; i < 60; i++)
Console.WriteLine($"Frame {i+61}: Position: ({physics.PlayerPos.x}, {physics.PlayerPos.y}), Velocity: ({physics.PlayerVel.x}, {physics.PlayerVel.y})");