Add Introduction
107
Introduction.md
Normal file
107
Introduction.md
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
# Introduction
|
||||||
|
|
||||||
|
> [!IMPORTANT]
|
||||||
|
> Voile is still work in progress and not production-ready. Expect stability and performance issues, lacking documentation, and experimental APIs.
|
||||||
|
|
||||||
|
Welcome to the documentation for Voile, a cross-platform game framework written in C#.
|
||||||
|
|
||||||
|
## Considerations
|
||||||
|
|
||||||
|
Before using Voile or any other software, its important to know if a particular engine/framework is suitable for your workflow, goals and requirements. **Here's what Voile doesn't try to be**:
|
||||||
|
|
||||||
|
- **A fully fledged game IDE with a scene editor**. Voile will have its own editors for some resources (particles, asset bundles, etc.) and a default module for a scene graph based on Entity Component architecture, but it will not provide a full blown scene editor in itself. Consider alternatives such as Godot or Unity if you require tight integration with a WYSIWYG editor.
|
||||||
|
- **A cutting edge 3D engine**. Voile will provide basic 3D functionality suitable for PSX or cartoon-styled games, but if you want to make AAA grade 3D graphics, consider Unreal or Unity.
|
||||||
|
- **A dedicated game engine**. Voile will never provide tools for a specific genre. Think of it as a collection of libraries that simplify work with rendering, input, physics, and creating your own tools for modifying your game-specific content. Entity management, order of execution, etc. is managed manually by the user.
|
||||||
|
|
||||||
|
## What's missing
|
||||||
|
|
||||||
|
Voile is still work in progress, but has a [roadmap](roadmap.md) with planned features.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- 2D rendering.
|
||||||
|
- **Minimal size and fast startups**. Voile is built with NativeAOT compatibility in mind, doesn't ship unnecessary things, and doesn't run anything without your knowledge.
|
||||||
|
- **Full control over resources and lifetime**. No default main loop behavior, implicit system initialization (more on that later), and resources instantiation.
|
||||||
|
- **Content hot-reloading**. All resources can be reloaded while the game is running, reducing iteration time.
|
||||||
|
|
||||||
|
## Minimal project example
|
||||||
|
|
||||||
|
### TestGame.cs
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
using Voile;
|
||||||
|
using Voile.Resources;
|
||||||
|
using Voile.Utils;
|
||||||
|
|
||||||
|
public class TestGame : Game
|
||||||
|
{
|
||||||
|
public override string ResourceRoot => "Resources/";
|
||||||
|
|
||||||
|
// Called when it's time to initialize the subsystems, or modify default game settings or system settings.
|
||||||
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
// Initializes systems with defaults.
|
||||||
|
InitializeDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when it's time to load the game's resources, such as images or sounds.
|
||||||
|
protected override void LoadResources()
|
||||||
|
{
|
||||||
|
if (!ResourceManager.TryLoad("my_sound", "sounds/test_sound.ogg", out Sound? _testSound))
|
||||||
|
{
|
||||||
|
// Handle resource load failure here.
|
||||||
|
// Display an on-screen alert, close the game, reload from a different path, etc.
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ResourceManager.TryLoad<Font>("inter_regular", "fonts/Inter-Regular.ttf", out Font? _font))
|
||||||
|
{
|
||||||
|
// Handle resource load failure here.
|
||||||
|
// Display an on-screen alert, close the game, reload from a different path, etc.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when it's safe to manipulate the resources or/and systems.
|
||||||
|
// You can safely create game objects, scenes, etc. in this method.
|
||||||
|
protected override void Ready()
|
||||||
|
{
|
||||||
|
Input.AddInputMapping("play", new InputAction[] { new KeyInputAction(KeyboardKey.Spacebar) });
|
||||||
|
Input.AddInputMapping("sprint", new InputAction[] { new KeyInputAction(KeyboardKey.LeftShift) });
|
||||||
|
Input.AddInputMapping("toggle_fullscreen", new InputAction[] { new KeyInputAction(KeyboardKey.F11) });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when everything has been readied to start the main loop.
|
||||||
|
protected override void Run()
|
||||||
|
{
|
||||||
|
while (Renderer.ShouldRun)
|
||||||
|
{
|
||||||
|
if (Input.IsActionPressed("play"))
|
||||||
|
{
|
||||||
|
_logger.Echo("Spacebar pressed!");
|
||||||
|
}
|
||||||
|
|
||||||
|
Renderer.BeginFrame();
|
||||||
|
// Sets transform for drawing at the center of the screen. We won't use transform pivot.
|
||||||
|
Renderer.SetTransform(position: Renderer.WindowSize / 2, pivot: Vector2.Zero);
|
||||||
|
Renderer.DrawCircle(radius: 16f, Color.White);
|
||||||
|
Renderer.EndFrame();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Called when the application quits and it's safe to clean up.
|
||||||
|
public override void Shutdown()
|
||||||
|
{
|
||||||
|
// Default resource shutdown and cleanup.
|
||||||
|
ShutdownDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Logger _logger = new(nameof(TestGame));
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Program.cs
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
// Use the default constructor for game.
|
||||||
|
var game = new TestGame();
|
||||||
|
game.Start();
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user