Void.Engine
1.2.1
See the version list below for details.
dotnet add package Void.Engine --version 1.2.1
NuGet\Install-Package Void.Engine -Version 1.2.1
<PackageReference Include="Void.Engine" Version="1.2.1" />
<PackageVersion Include="Void.Engine" Version="1.2.1" />
<PackageReference Include="Void.Engine" />
paket add Void.Engine --version 1.2.1
#r "nuget: Void.Engine, 1.2.1"
#:package Void.Engine@1.2.1
#addin nuget:?package=Void.Engine&version=1.2.1
#tool nuget:?package=Void.Engine&version=1.2.1
Void Engine
A lightweight, extensible 2D game framework for .NET.
Philosophy
Extend, don't modify.
Most game engines try to do everything. They have physics, networking, UI, animation, and everything else you can think of. The problem is your game is unique. Your physics needs are different. Your UI is different. Yet these engines force you to use their way of doing things. You fight the engine instead of making your game.
At the other extreme, frameworks like MonoGame give you almost nothing. You end up rebuilding things every game needs: saving, audio management, pathfinding. These are solved problems. Why rebuild them?
Void sits in the middle. It gives you the essentials and gets out of your way.
Features
| System | What It Does |
|---|---|
| Rendering | Batched sprite and primitive rendering, texture atlasing, shaders, post-processing |
| Assets | Mount-based virtual file system, encrypted pack loading, LRU eviction |
| Input | Keyboard, mouse, gamepad with SDL mapping, action system |
| Audio | Sound pooling, priority-based voice stealing, category volumes |
| Saving | AES-GCM encrypted saves with manifest verification |
| Pathfinding | A*, Dijkstra, BFS, flow fields |
| Coroutines | Tweens, sequencing, delays, 33 easing functions |
| Logging | Async logging with console and file sinks |
| Math | Vectors, rectangles, colors, easing, random |
| LDtk | Full level editor support with entities, tilesets, and custom fields |
| Modding | Mount-based virtual file system for mod support |
Quick Install
dotnet add package Void.Engine
Project Template
dotnet new install Void.Templates
Quick Start
1. Install the template
dotnet new install Void.Templates
2. Create a new game
dotnet new voidgame -n MyGame
cd MyGame
Or use the current folder:
mkdir MyGame
cd MyGame
dotnet new voidgame
3. Run your game
dotnet run
A window will appear. That's it.
Customizing Your Game
When creating a new game, you can specify:
dotnet new voidgame -n MyGame --appCompany MyStudio --appTitle "My Game"
| Option | Description | Default |
|---|---|---|
-n, --name |
The project name | Current folder name |
--appCompany |
The company name (used for AppData folders) | MyCompany |
--appTitle |
The display title of the game window | My Game |
--TargetFrameworkOverride |
Overrides the target framework | net10.0 |
What You Get
The template generates a complete, runnable game project with:
Program.cs— Entry point with game settingsMyGameGame.cs— Main game class withOnEnter,OnUpdate,OnDraw,OnExitContent/— Folder for your assets- Pre-configured
.csprojwithVoid.Enginereference
Manual Setup (Optional)
If you prefer to set up manually instead of using the template:
dotnet new console -n MyGame
cd MyGame
dotnet add package Void.Engine
Then create MyGame.cs:
using Void.Engine;
public class MyGame : Game
{
public MyGame(GameSettings settings) : base(settings) { }
protected override void OnEnter() { }
protected override void OnUpdate(FrameTime frameTime) { }
protected override void OnDraw(FrameTime frameTime) { }
protected override void OnExit() { }
}
And Program.cs:
using Void.Engine;
var settings = GameSettings.Instance
.SetAppCompany("MyStudio")
.SetAppName("MyGame")
.SetWindow(1280, 720)
.Build();
using var game = new MyGame(settings);
game.Run();
Demos
- FlappyBirb: A Flappy Bird clone
- Scavengers: A rogue-lite zombie survival clone
Asset Packer
Void includes a CLI tool and API for packing assets into encrypted, tamper-proof archives.
CLI Tool
# Build a pack
void-packer build -c Content/ -o Packs/
# Extract a pack
void-packer extract --pack GameAssets.pack --output Extracted/
# Verify pack integrity
void-packer verify --pack GameAssets.pack
# List files in a pack
void-packer list --pack GameAssets.pack --detailed
# Update a pack (fast incremental updates)
void-packer update --pack GameAssets.pack --add Content/newfile.png --remove oldfile.txt
Security Features
- AES-GCM 256-bit encryption
- Separate encryption for header and data sections
- Per-file CRC32 integrity verification
- Adaptive compression
- Chunked encryption with per-chunk authentication
- Stream-based reading from disk (no full pack loaded into memory)
- Thread-safe for concurrent asset loading
API Usage
// Load a pack in your game
var pack = AssetManager.Instance.LoadPack("GameAssets.pack");
AssetManager.Instance.AddMountToStart(pack);
// Load multiple packs with priority control
var graphicsPack = AssetManager.Instance.LoadPack("Graphics.pack");
var audioPack = AssetManager.Instance.LoadPack("Audio.pack");
AssetManager.Instance.AddMountToStart(graphicsPack);
AssetManager.Instance.AddMountToStart(audioPack);
// Graceful error handling
if (!Packer.TryLoadPack("Mod.pack", out var reader, out var error))
{
Console.WriteLine($"Failed to load mod: {error}");
return;
}
Extensibility
Void was built to be extended, not just used.
Every major system is built around interfaces and base classes that you can replace, customize, or ignore entirely.
What you can extend:
| Interface | Purpose |
|---|---|
IAsset |
Define new asset types |
IMount |
Add custom asset sources |
IAtlasPacker |
Plug in your own texture packing algorithm |
ILogSink |
Send logs anywhere |
IBatcher |
Custom rendering logic |
IRenderTarget |
Custom render surfaces |
ContentTypeWriterReader |
Any save data type |
How it works:
GameSettings.Instance.SetAtlasPacker(typeof(MyAtlasPacker));
AssetManager.Instance.AddMountToStart(new CloudMount());
Logger.Instance.AddSink(new DatabaseSink());
No engine code modification. No forking the repo. No fighting the framework.
Supported Platforms
| Platform | Status |
|---|---|
| Windows | ✅ Full support |
| macOS | ✅ Full support |
| Linux | ✅ Full support |
Requirements
- .NET 10
- SFML.Net 3.0
License
MIT. Use it for anything. No royalties. No fees.
Void Engine: Made by developers who care about your work.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. |
-
net10.0
- SFML.Net (>= 3.0.0)
- Void.Packer (>= 1.0.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
[1.2.1] 2026.9.8
Hotfix:
* Critical fix for DiscoverableHelper stack overflow caused by infinite recursion when scanning assemblies
* DiscoverableHelper could crash the engine at startup or during mod loading when ExcludeFramework mode was active
Added:
* Added TryFindManyByName, TryFindManyByCategory, and TryFindManyByNameAndCategory for bool-based collection queries
* Added TryFindAll for bool-based retrieval of all discoverable types
* Added string and enum overloads for all new TryFindMany methods
Fixed:
* Fixed infinite recursion in IsGameAssembly that caused stack overflow during assembly scanning
* Fixed DiscoverableHelper not respecting AssemblyScanMode.ExcludeFramework due to recursive method call
* Fixed DiscoverableHelper inspecting assembly metadata inside AssemblyLoad events, which could trigger recursive assembly loading and cause stack overflow
Removed:
* Removed IsGameAssembly method entirely to eliminate recursion and consolidate assembly filtering
Changed:
* Replaced IsGameAssembly with ShouldScanAssembly and IsDefaultAllowed for safer assembly scanning
* Updated OnAssemblyLoad to only increment the load version counter without touching assembly metadata
* Wrapped ShouldScanAssembly in try/catch to gracefully skip assemblies that cannot be inspected
Impact:
* Any project using DiscoverableHelper with default settings could experience stack overflow crashes
* Mod loading or assembly scanning could crash the engine at runtime
* This hotfix is recommended for all users on 1.2.0 or below.