Prowl.Drift 2.6.0

There is a newer version of this package available.
See the version list below for details.
dotnet add package Prowl.Drift --version 2.6.0
                    
NuGet\Install-Package Prowl.Drift -Version 2.6.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Prowl.Drift" Version="2.6.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Prowl.Drift" Version="2.6.0" />
                    
Directory.Packages.props
<PackageReference Include="Prowl.Drift" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Prowl.Drift --version 2.6.0
                    
#r "nuget: Prowl.Drift, 2.6.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Prowl.Drift@2.6.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Prowl.Drift&version=2.6.0
                    
Install as a Cake Addin
#tool nuget:?package=Prowl.Drift&version=2.6.0
                    
Install as a Cake Tool

Github top languages GitHub version GitHub license GitHub issues GitHub stars Discord

<span id="readme-top"></span>

<p>Table of Contents</p>

  1. About The Project
  2. Features
  3. Getting Started
  4. Contributing
  5. Contributors
  6. License

<span align="center">🎱 About The Project 🎱

Prowl.Drift is an open-source, MIT-licensed 2D physics engine built for the Prowl Game Engine. It provides a lightweight, high-performance physics simulation with support for rigid body dynamics, collision detection, and constraint solving.

Prowl.Drift follows a simple and intuitive API design, making it easy to integrate physics into your games and applications. Whether you're building a platformer, a physics puzzle game, or need realistic object interactions, Prowl.Drift has you covered.

Here's a basic example:

// Create a physics space
var space = new Space();

// Create a dynamic body with a box shape
var body = new Body(Body.BodyType.Dynamic, new Vector2(100, 50));
var boxShape = ShapePoly.CreateBox(0, 0, 32, 32);
body.AddShape(boxShape);
space.AddBody(body);

// Apply a force
body.ApplyForceToCenter(new Vector2(0, -500));

// Step the simulation (with solver iterations)
space.Step(1f / 60f, 8, 3, true); // dt, velocity iterations, position iterations, warm starting

<span align="center">✨ Features ✨</span>

  • General:

    • Cross-Platform! Windows, Linux & Mac!
    • 100% C#!
    • Built on System.Numerics for performance
    • Supports .NET 6, 7, 8, and 9
    • Highly Portable
      • Very easy to integrate
    • Lightweight and fast
  • Physics Features:

    • Rigid Body Dynamics
      • Static, Kinematic, and Dynamic bodies
      • Mass, velocity, and angular velocity
      • Force and torque accumulation
      • Linear and angular damping
      • Fixed rotation support
    • Shape Support
      • Circles
      • Polygons (convex)
      • Line segments (With Rounded Thickness)
      • Multiple shapes per body (Compound)
    • Collision Detection
      • Broad-phase spatial hashing (Very Simple)
      • Narrow-phase SAT (Separating Axis Theorem)
      • Contact manifold generation
    • Constraint Solving
    • Joint System
      • Distance joints
      • Revolute joints (pin joints)
      • Prismatic joints (slider joints)
      • Weld joints
      • Wheel joints
      • Rope joints
      • Angle joints
      • Mouse joints (for dragging)

<p align="right">(<a href="#readme-top">back to top</a>)</p>

<span align="center">🚀 Getting Started 🚀</span>

Installation

dotnet add package Prowl.Drift

Basic Usage

Prowl.Drift is designed to be simple to use. Create a space, add bodies with shapes, and step the simulation.

using Prowl.Drift;
using System.Numerics;

// Create a physics space
var space = new Space();
space.Gravity = new Vector2(0, -10); // Set gravity

// Create the ground (static body)
var ground = new Body(Body.BodyType.Static, new Vector2(0, 400));
var groundShape = ShapePoly.CreateBox(0, 0, 800, 20);
ground.AddShape(groundShape);
space.AddBody(ground);

// Create a falling box (dynamic body)
var box = new Body(Body.BodyType.Dynamic, new Vector2(100, 50));
var boxShape = ShapePoly.CreateBox(0, 0, 32, 32);
box.AddShape(boxShape);
space.AddBody(box);

// Main game loop
while (gameRunning)
{
    // Step the physics simulation (60 FPS)
    space.Step(1f / 60f, 8, 3, true);

    // Use body.Position and body.Angle for rendering
    RenderBox(box.Position, box.Angle);
}

Creating Bodies

Bodies are the fundamental objects in the physics simulation. They can be static (immovable), kinematic (movable but not affected by forces), or dynamic (fully simulated).

// Static body (walls, ground, platforms)
var staticBody = new Body(Body.BodyType.Static, position);
space.AddBody(staticBody);

// Kinematic body (moving platforms, elevators)
var kinematicBody = new Body(Body.BodyType.Kinematic, position);
kinematicBody.LinearVelocity = new Vector2(50, 0); // Moves at constant velocity
space.AddBody(kinematicBody);

// Dynamic body (players, projectiles, physics objects)
var dynamicBody = new Body(Body.BodyType.Dynamic, position);
space.AddBody(dynamicBody);
dynamicBody.ApplyForceToCenter(new Vector2(0, -500)); // Apply force

Shapes and Collision

Bodies need shapes to participate in collision detection. Multiple shapes can be attached to a single body.

// Box shape
var boxShape = ShapePoly.CreateBox(0, 0, width, height);
body.AddShape(boxShape);

// Circle shape
var circleShape = new ShapeCircle(0, 0, radius);
body.AddShape(circleShape);

// Polygon shape (must be convex)
var vertices = new Vector2[] {
    new Vector2(-16, -16),
    new Vector2(16, -16),
    new Vector2(16, 16),
    new Vector2(-16, 16)
};
var polyShape = new ShapePoly(vertices);
body.AddShape(polyShape);

// Line segment
var segmentShape = new ShapeSegment(new Vector2(-50, 0), new Vector2(50, 0), 2); // thickness = 2
body.AddShape(segmentShape);

// Set material properties
boxShape.Density = 1.0f;
boxShape.Friction = 0.7f;
boxShape.Elasticity = 0.2f; // Restitution/bounciness

Joints and Constraints

Joints connect bodies together with various constraints.

// Distance joint - maintains fixed distance
var distanceJoint = new DistanceJoint(bodyA, bodyB, anchorA, anchorB);
space.AddJoint(distanceJoint);

// Revolute joint - pin joint, allows rotation
var revoluteJoint = new RevoluteJoint(bodyA, bodyB, worldAnchor);
revoluteJoint.CollideConnected = false; // Disable collision between connected bodies
space.AddJoint(revoluteJoint);

// Rope joint - maximum distance constraint
var ropeJoint = new RopeJoint(bodyA, bodyB, anchorA, anchorB);
ropeJoint.CollideConnected = false;
space.AddJoint(ropeJoint);

// Weld joint - rigid connection
var weldJoint = new WeldJoint(bodyA, bodyB, worldAnchor);
space.AddJoint(weldJoint);

<p align="right">(<a href="#readme-top">back to top</a>)</p>

<span align="center">🤝 Contributing 🤝</span>

Check our Contributing guide to see how to be part of this team.

<p align="right">(<a href="#readme-top">back to top</a>)</p>

<span align="center">📜 License 📜</span>

Distributed under the MIT License. See LICENSE for more information.

<p align="right">(<a href="#readme-top">back to top</a>)</p>


Join our Discord server! 🎉

Discord

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
.NET Core netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.1 is compatible. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • .NETStandard 2.1

    • No dependencies.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
2.7.0 41 7/16/2026
2.6.3 94 7/13/2026
2.6.0 94 7/12/2026
2.5.5 93 7/11/2026
2.5.4 95 7/9/2026
2.5.1 93 7/9/2026
2.4.0 101 7/7/2026
2.3.4 99 7/3/2026
2.3.1 104 7/3/2026
1.1.0 294 9/22/2025
1.0.0 268 9/22/2025