diff --git a/build.zig b/build.zig new file mode 100644 index 0000000..1c9e3a0 --- /dev/null +++ b/build.zig @@ -0,0 +1,72 @@ +const std = @import("std"); +const rlz = @import("raylib_zig"); + +pub fn build(b: *std.Build) !void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const raylib_dep = b.dependency("raylib_zig", .{ + .target = target, + .optimize = optimize, + + // Fixes panic from weird joystick OOB crap on hello world project + // panic: index -255 out of bounds for type 'int[512]' + // js->linjs.keyMap[code - BTN_MISC] in glfw/src/linux_joystick.c + .config = "-fno-sanitize=undefined", + }); + const raylib = raylib_dep.module("raylib"); + const raylib_artifact = raylib_dep.artifact("raylib"); + + const exe_mod = b.createModule(.{ + .root_source_file = b.path("src/main.zig"), + .target = target, + .optimize = optimize, + }); + exe_mod.addImport("raylib", raylib); + + const run_step = b.step("run", "Run the app"); + + //web exports are completely separate + if (target.query.os_tag == .emscripten) { + const emsdk = rlz.emsdk; + const wasm = b.addLibrary(.{ + .name = "zig-frugg", + .root_module = exe_mod, + }); + + const install_dir: std.Build.InstallDir = .{ .custom = "web" }; + const emcc_flags = emsdk.emccDefaultFlags(b.allocator, .{ .optimize = optimize }); + const emcc_settings = emsdk.emccDefaultSettings(b.allocator, .{ .optimize = optimize }); + + const emcc_step = emsdk.emccStep(b, raylib_artifact, wasm, .{ + .optimize = optimize, + .flags = emcc_flags, + .settings = emcc_settings, + .shell_file_path = emsdk.shell(raylib_dep), + .install_dir = install_dir, + .embed_paths = &.{.{ .src_path = "resources/" }}, + }); + b.getInstallStep().dependOn(emcc_step); + + const html_filename = try std.fmt.allocPrint(b.allocator, "{s}.html", .{wasm.name}); + const emrun_step = emsdk.emrunStep( + b, + b.getInstallPath(install_dir, html_filename), + &.{}, + ); + + emrun_step.dependOn(emcc_step); + run_step.dependOn(emrun_step); + } else { + const exe = b.addExecutable(.{ + .name = "zig-frugg", + .root_module = exe_mod, + }); + b.installArtifact(exe); + + const run_cmd = b.addRunArtifact(exe); + run_cmd.step.dependOn(b.getInstallStep()); + + run_step.dependOn(&run_cmd.step); + } +} diff --git a/build.zig.zon b/build.zig.zon new file mode 100644 index 0000000..90efce6 --- /dev/null +++ b/build.zig.zon @@ -0,0 +1,52 @@ +.{ + // This is the default name used by packages depending on this one. For + // example, when a user runs `zig fetch --save `, this field is used + // as the key in the `dependencies` table. Although the user can choose a + // different name, most users will stick with this provided value. + // + // It is redundant to include "zig" in this name because it is already + // within the Zig package namespace. + .name = .zig_frugg, + // This is a [Semantic Version](https://semver.org/). + // In a future version of Zig it will be used for package deduplication. + .version = "0.0.0", + // Together with name, this represents a globally unique package + // identifier. This field is generated by the Zig toolchain when the + // package is first created, and then *never changes*. This allows + // unambiguous detection of one package being an updated version of + // another. + // + // When forking a Zig project, this id should be regenerated (delete the + // field and run `zig build`) if the upstream project is still maintained. + // Otherwise, the fork is *hostile*, attempting to take control over the + // original project's identity. Thus it is recommended to leave the comment + // on the following line intact, so that it shows up in code reviews that + // modify the field. + .fingerprint = 0x83fd67e65259ef3a, // Changing this has security and trust implications. + // Tracks the earliest Zig version that the package considers to be a + // supported use case. + .minimum_zig_version = "0.16.0", + // This field is optional. + // Each dependency must either provide a `url` and `hash`, or a `path`. + // `zig build --fetch` can be used to fetch all dependencies of a package, recursively. + // Once all dependencies are fetched, `zig build` no longer requires + // internet connectivity. + .dependencies = .{ + .raylib_zig = .{ + .url = "git+https://github.com/raylib-zig/raylib-zig?ref=devel#58f3c0fa328fc9ff48d17c2c3771ab9c5114aaa6", + .hash = "raylib_zig-6.0.0-KE8REMNkBQCpxwqT9ubVNf5aEOcWRUVIaH2sgt_sDDoZ", + }, + .emsdk = .{ + .url = "git+https://github.com/emscripten-core/emsdk?ref=4.0.9#3bcf1dcd01f040f370e10fe673a092d9ed79ebb5", + .hash = "N-V-__8AAJl1DwBezhYo_VE6f53mPVm00R-Fk28NPW7P14EQ", + }, + }, + .paths = .{ + "build.zig", + "build.zig.zon", + "src", + // For example... + //"LICENSE", + //"README.md", + }, +} diff --git a/resources/PlayerSprite2.png b/resources/PlayerSprite2.png new file mode 100644 index 0000000..62cfb0c Binary files /dev/null and b/resources/PlayerSprite2.png differ diff --git a/resources/burp.mp3 b/resources/burp.mp3 new file mode 100644 index 0000000..6370422 Binary files /dev/null and b/resources/burp.mp3 differ diff --git a/resources/placeholder.txt b/resources/placeholder.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/main.zig b/src/main.zig new file mode 100644 index 0000000..0d14719 --- /dev/null +++ b/src/main.zig @@ -0,0 +1,56 @@ +const std = @import("std"); +const rl = @import("raylib"); + +const Vec3 = rl.Vector3; +const Vec2 = rl.Vector2; + +const Frug = struct { + pos: Vec3, + radius: f32 = 24, + pub fn draw(self: @This()) void { + rl.drawCircleV( + Vec2.init(self.pos.x, self.pos.y), + self.radius, + .green, + ); + } + pub fn init() Frug { + return Frug{ + .pos = .{ .x = 200, .y = 400, .z = 10 }, + .radius = 24, + }; + } +}; + +pub fn main(init: std.process.Init) anyerror!void { + const io = init.io; + try std.Io.File.stdout().writeStreamingAll(io, "FRUGG!\n"); + + const screenWidth = 800; + const screenHeight = 600; + + rl.initWindow(screenWidth, screenHeight, "Zig Frugger"); + defer rl.closeWindow(); + + rl.initAudioDevice(); + defer rl.closeAudioDevice(); + const frugBurp = try rl.loadSound("resources/burp.mp3"); + defer rl.unloadSound(frugBurp); + + rl.setTargetFPS(60); + + const frug = Frug.init(); + + while (!rl.windowShouldClose()) { + rl.beginDrawing(); + defer rl.endDrawing(); + + if (rl.isKeyPressed(.space)) rl.playSound(frugBurp); + + rl.clearBackground(.sky_blue); + + frug.draw(); + + rl.drawText("FRUGG!", 10, 10, 40, .green); + } +}