/zig-gamekit

Companion repo for zig-renderkit for making 2D games

Primary LanguageZigMIT LicenseMIT

Zig GameKit

Companion repo and example implementation for zig-renderkit. GameKit provides an example implementation of a game framework built on top of RenderKit. It includes the core render loop, window (via SDL), input, Dear ImGui and timing support. You can use it as a base to make a 2D game as-is or create your own 2D framework based on it.

GameKit provides the following wrappers around RenderKit's API showing how it can be abstracted away in a real world project: Texture, Shader and OffscreenPass. Building on top of those types, GameKit then provides Mesh and DynamicMesh which manage buffers and bindings for you. Finally, the high level types utilize DynamicMesh and cover pretty much all that any 2D game would require: Batcher (quad/sprite batch) and TriangleBatcher.

Some basic utilities and a small math lib with just the types required for the renderer (Vec2, Vec3, Color, 3x2 Matrix, Quad) are also included.

Dependencies

GameKit has just one external dependency: SDL. You can install SDL with the package manager of your choice.

Usage

  • clone the repository recursively: git clone --recursive https://github.com/prime31/zig-gamekit
  • zig build help to see what examples are availble
  • zig build EXAMPLE_NAME to run an example

Minimal GameKit Project File

var texture: Texture = undefined;

pub fn main() !void {
    try gamekit.run(.{ .init = init, .render = render });
}

fn init() !void {
    texture = Texture.initFromFile(std.heap.HeapAllocator, "texture.png", .nearest) catch unreachable;
}

fn render() !void {
    gamekit.gfx.beginPass(.{ .color = Color.lime });
    gamekit.gfx.draw.tex(texture, .{ .x = 50, .y = 50 });
    gamekit.gfx.endPass();
}