From c95a5e7d1c6f5ddcabf09a055eaeb06ab14a32f0 Mon Sep 17 00:00:00 2001 From: duck Date: Thu, 27 Mar 2025 22:28:14 +0500 Subject: [PATCH] Initial commit --- .gitignore | 2 ++ build.zig | 25 +++++++++++++++ build.zig.zon | 10 ++++++ src/game.zig | 88 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/main.zig | 8 +++++ src/sdl.zig | 4 +++ 6 files changed, 137 insertions(+) create mode 100644 .gitignore create mode 100644 build.zig create mode 100644 build.zig.zon create mode 100644 src/game.zig create mode 100644 src/main.zig create mode 100644 src/sdl.zig diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e901168 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.zig-cache +/zig-out diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..6cd6441 --- /dev/null +++ b/build.zig @@ -0,0 +1,25 @@ +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const exe = b.addExecutable(.{ + .name = "spacefarer", + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + b.installArtifact(exe); + exe.linkLibC(); + exe.linkSystemLibrary("SDL3"); + + const run_cmd = b.addRunArtifact(exe); + run_cmd.step.dependOn(b.getInstallStep()); + if (b.args) |args| { + run_cmd.addArgs(args); + } + + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); +} diff --git a/build.zig.zon b/build.zig.zon new file mode 100644 index 0000000..3cd4506 --- /dev/null +++ b/build.zig.zon @@ -0,0 +1,10 @@ +.{ + .name = "spacefarer", + .version = "0.0.0", + .dependencies = .{}, + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + }, +} diff --git a/src/game.zig b/src/game.zig new file mode 100644 index 0000000..bd2c153 --- /dev/null +++ b/src/game.zig @@ -0,0 +1,88 @@ +const std = @import("std"); +const sdl = @import("sdl.zig"); + +renderer: ?*sdl.SDL_Renderer, +window: ?*sdl.SDL_Window, +running: bool, + +const Self = @This(); +pub fn init() GameError!Self { + if (!sdl.SDL_Init(sdl.SDL_INIT_VIDEO | sdl.SDL_INIT_EVENTS)) return GameError.SdlError; + + var renderer: ?*sdl.SDL_Renderer = null; + var window: ?*sdl.SDL_Window = null; + + if (!sdl.SDL_CreateWindowAndRenderer( + "Spacefarer", + 1600, + 900, + sdl.SDL_WINDOW_VULKAN, + &window, + &renderer, + )) return GameError.SdlError; + + if (!sdl.SDL_SetRenderVSync(renderer, sdl.SDL_RENDERER_VSYNC_ADAPTIVE)) return GameError.SdlError; + + return Self{ + .renderer = renderer, + .window = window, + .running = false, + }; +} + +pub fn run(self: *Self) GameError!void { + self.running = true; + while (true) { + try self.process_events(); + if (!self.running) { + break; + } + try self.update(); + try self.draw(); + } +} + +fn update(self: *Self) GameError!void { + _ = self; +} + +fn draw(self: *Self) GameError!void { + if (!sdl.SDL_SetRenderDrawColor(self.renderer, 0, 0, 0, 255)) return GameError.SdlError; + if (!sdl.SDL_RenderClear(self.renderer)) return GameError.SdlError; + if (!sdl.SDL_RenderPresent(self.renderer)) return GameError.SdlError; +} + +fn process_events(self: *Self) GameError!void { + sdl.SDL_PumpEvents(); + while (true) { + var buffer: [16]sdl.SDL_Event = undefined; + const count: usize = @intCast(sdl.SDL_PeepEvents(&buffer, buffer.len, sdl.SDL_GETEVENT, sdl.SDL_EVENT_FIRST, sdl.SDL_EVENT_LAST)); + if (count == -1) return GameError.SdlError; + for (buffer[0..count]) |event| { + self.process_event(event); + } + if (count < buffer.len) { + break; + } + } + sdl.SDL_FlushEvents(sdl.SDL_EVENT_FIRST, sdl.SDL_EVENT_LAST); +} + +fn process_event(self: *Self, event: sdl.SDL_Event) void { + switch (event.type) { + sdl.SDL_EVENT_QUIT => { + self.running = false; + }, + else => {}, + } +} + +pub fn deinit(self: *Self) void { + sdl.SDL_DestroyRenderer(self.renderer); + sdl.SDL_DestroyWindow(self.window); + sdl.SDL_Quit(); +} + +pub const GameError = error{ + SdlError, +}; diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..aeebed5 --- /dev/null +++ b/src/main.zig @@ -0,0 +1,8 @@ +const std = @import("std"); +const Game = @import("game.zig"); + +pub fn main() !void { + var game = try Game.init(); + defer game.deinit(); + try game.run(); +} diff --git a/src/sdl.zig b/src/sdl.zig new file mode 100644 index 0000000..38679f2 --- /dev/null +++ b/src/sdl.zig @@ -0,0 +1,4 @@ +pub usingnamespace @cImport({ + @cInclude("SDL3/SDL.h"); +}); +