Void.Engine 1.2.1

There is a newer version of this package available.
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
                    
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="Void.Engine" Version="1.2.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Void.Engine" Version="1.2.1" />
                    
Directory.Packages.props
<PackageReference Include="Void.Engine" />
                    
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 Void.Engine --version 1.2.1
                    
#r "nuget: Void.Engine, 1.2.1"
                    
#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 Void.Engine@1.2.1
                    
#: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=Void.Engine&version=1.2.1
                    
Install as a Cake Addin
#tool nuget:?package=Void.Engine&version=1.2.1
                    
Install as a Cake Tool

Void Engine

A lightweight, extensible 2D game framework for .NET.

License: MIT NuGet .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 settings
  • MyGameGame.cs — Main game class with OnEnter, OnUpdate, OnDraw, OnExit
  • Content/ — Folder for your assets
  • Pre-configured .csproj with Void.Engine reference

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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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.1.0 39 9/14/2026
2.0.1 53 9/13/2026
1.2.1 93 9/8/2026

[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.