From 84d2f0001428e90ab94556e2ed32ee7025996051 Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:37:33 -0300 Subject: [PATCH 1/6] implements pong game --- pong/build.zig | 35 ++++++++ pong/build.zig.zon | 18 ++++ pong/game.zig | 214 +++++++++++++++++++++++++++++++++++++++++++++ pong/main.zig | 68 ++++++++++++++ pong/object.zig | 56 ++++++++++++ 5 files changed, 391 insertions(+) create mode 100644 pong/build.zig create mode 100644 pong/build.zig.zon create mode 100644 pong/game.zig create mode 100644 pong/main.zig create mode 100644 pong/object.zig diff --git a/pong/build.zig b/pong/build.zig new file mode 100644 index 0000000..de00e6d --- /dev/null +++ b/pong/build.zig @@ -0,0 +1,35 @@ +// © 2024 Carl Åstholm +// SPDX-License-Identifier: MIT + +const std = @import("std"); + +pub fn build(b: *std.Build) void { + const target = b.standardTargetOptions(.{}); + const optimize = b.standardOptimizeOption(.{}); + + const exe_mod = b.createModule(.{ + .root_source_file = b.path("main.zig"), + .target = target, + .optimize = optimize, + }); + const exe = b.addExecutable(.{ + .name = "pong", + .root_module = exe_mod, + }); + + const sdl_dep = b.dependency("sdl", .{ + .target = target, + .optimize = optimize, + }); + const sdl_lib = sdl_dep.artifact("SDL3"); + + exe_mod.linkLibrary(sdl_lib); + + b.installArtifact(exe); + + const run_exe = b.addRunArtifact(exe); + run_exe.step.dependOn(b.getInstallStep()); + + const run = b.step("run", "Run the game"); + run.dependOn(&run_exe.step); +} diff --git a/pong/build.zig.zon b/pong/build.zig.zon new file mode 100644 index 0000000..cf7f234 --- /dev/null +++ b/pong/build.zig.zon @@ -0,0 +1,18 @@ +// © 2024 Carl Åstholm +// SPDX-License-Identifier: MIT + +.{ + .name = .breakout, + .version = "0.0.0", + .fingerprint = 0xdafcbd308058adbe, + .minimum_zig_version = "0.14.0", + .dependencies = .{ + .sdl = .{ + .url = "git+https://github.com/castholm/SDL.git#dbb1b96360658f5845ff6fac380c4f13d7276dc2", + .hash = "sdl-0.2.0+3.2.8-7uIn9FxHfQE325TK7b0qpgt10G3x1xl-3ZMOfTzxUg3C", + }, + }, + .paths = .{ + "invalid", // Not intended for consumption as a package + }, +} diff --git a/pong/game.zig b/pong/game.zig new file mode 100644 index 0000000..c324ca9 --- /dev/null +++ b/pong/game.zig @@ -0,0 +1,214 @@ +const std = @import("std"); +const main = @import("main.zig"); +const c = @cImport({ + @cInclude("SDL3/SDL.h"); + @cInclude("SDL3/SDL_main.h"); +}); + +const object = @import("object.zig"); +const Object = object.Object; + +pub const WINDOW_WIDTH = 640; +pub const WINDOW_HEIGHT = 480; + +var elapsed_time_ptr: *f32 = &main.elapsed_time; + +const BALL_SIZE = 10; +const BALL_SPEED = 300; + +const PADDLE_WIDTH = 10; +const PADDLE_HEIGHT = 50; + +const Ball = Object(BALL_SIZE, BALL_SIZE); +const Paddle = Object(PADDLE_WIDTH, PADDLE_HEIGHT); + +var ball: Ball = undefined; +var paddle_one: Paddle = undefined; +var paddle_two: Paddle = undefined; + +var initial_ball_direction: i8 = 1; + +var score_one: u8 = 0; +var score_two: u8 = 0; + +pub const ControllerState = struct { + key_w: bool = false, + key_s: bool = false, + key_o: bool = false, + key_k: bool = false, +}; + +var controller_state: ControllerState = .{}; + +fn resetGameState() void { + std.time.sleep(2_000_000_000); + initialize(); +} + +fn countScore(score: *u8) void { + score.* += 1; + resetGameState(); +} + +fn handleBallCollisionWithWall() void { + const left_collision = ball.position.x < 0; + const right_collision = ball.position.x > WINDOW_WIDTH - ball.shape.w; + const top_collision = ball.position.y < 0; + const bottom_collision = ball.position.y > WINDOW_HEIGHT - ball.shape.h; + + if (left_collision) { + countScore(&score_two); + } + + if (right_collision) { + countScore(&score_one); + } + + if (top_collision) { + ball.velocity.y *= -1; + ball.setPosition(ball.position.x, 0); + } + + if (bottom_collision) { + ball.velocity.y *= -1; + ball.setPosition(ball.position.x, WINDOW_HEIGHT - ball.shape.h); + } +} + +fn handlePaddleCollisionWithWall(paddle: *Paddle) void { + if (paddle.position.y < 0) { + paddle.setPosition(paddle.position.x, 0); + } + + if (paddle.position.y > WINDOW_HEIGHT - paddle.shape.h) { + paddle.setPosition(paddle.position.x, WINDOW_HEIGHT - paddle.shape.h); + } +} + +fn checkBallCollisionWithPaddle(paddle: *Paddle) bool { + const min_x = ball.position.x - paddle.shape.w; + const max_x = ball.position.x + ball.shape.w; + + if (paddle.position.x > min_x and paddle.position.x < max_x) { + const min_y = ball.position.y - paddle.shape.h; + const max_y = ball.position.y + ball.shape.h; + + if (paddle.position.y > min_y and paddle.position.y < max_y) { + return true; + } + } + + return false; +} + +fn handleBallCollisionWithPaddle(paddle: *Paddle) void { + if (checkBallCollisionWithPaddle(paddle)) { + const min_collision_position = paddle_one.position.x + paddle_one.shape.w; + const max_collision_position = paddle_two.position.x - ball.shape.w; + + if (ball.velocity.x < 0 and ball.position.x <= min_collision_position) { + ball.position.x = min_collision_position; + } + + if (ball.velocity.x > 0 and ball.position.x >= max_collision_position) { + ball.position.x = max_collision_position; + } + + ball.velocity.x = -ball.velocity.x; + } +} + +fn handleGameOver() void { + if (score_one == 10 or score_two == 10) { + score_one = 0; + score_two = 0; + + resetGameState(); + } +} + +fn drawScore(renderer: ?*c.SDL_Renderer, score: u8, x: f32, y: f32) !void { + var buf: [10]u8 = undefined; + const text = try std.fmt.bufPrintZ(&buf, "SCORE {}", .{score}); + + _ = c.SDL_SetRenderScale(renderer, 2, 2); + _ = c.SDL_SetRenderDrawColor(renderer, 0xff, 0xff, 0xff, 0xff); + _ = c.SDL_RenderDebugText(renderer, x, y, text.ptr); + _ = c.SDL_SetRenderScale(renderer, 1, 1); +} + +fn controlPaddleState(paddle: *Paddle, up: bool, down: bool) void { + var paddle_vel_y: f32 = 0; + if (up) paddle_vel_y -= 400; + if (down) paddle_vel_y += 400; + + paddle.velocity.y = paddle_vel_y; +} + +fn drawCenterDottedLine(renderer: ?*c.SDL_Renderer) void { + const x = WINDOW_WIDTH / 2; + var y: i32 = 3; + + while (y < WINDOW_WIDTH) : (y += 10) { + var dot = c.SDL_FRect{ .x = @floatFromInt(x), .y = @floatFromInt(y), .w = 4, .h = 4 }; + + _ = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, c.SDL_ALPHA_OPAQUE); + _ = c.SDL_RenderFillRect(renderer, &dot); + } +} + +pub fn initialize() void { + initial_ball_direction *= -1; + const initial_ball_direction_f32: f32 = @floatFromInt(initial_ball_direction); + + ball = Ball.init((WINDOW_WIDTH - BALL_SIZE) / 2, (WINDOW_HEIGHT - BALL_SIZE) / 2, BALL_SPEED * initial_ball_direction_f32, BALL_SPEED); + paddle_one = Paddle.init(10, (WINDOW_HEIGHT - PADDLE_HEIGHT) / 2, 0, 0); + paddle_two = Paddle.init(WINDOW_WIDTH - PADDLE_WIDTH - 10, (WINDOW_HEIGHT - PADDLE_HEIGHT) / 2, 0, 0); +} + +pub fn update() void { + ball.updatePositionByTime(elapsed_time_ptr.*); + handleBallCollisionWithWall(); + + paddle_one.updatePositionByTime(elapsed_time_ptr.*); + handlePaddleCollisionWithWall(&paddle_one); + + paddle_two.updatePositionByTime(elapsed_time_ptr.*); + handlePaddleCollisionWithWall(&paddle_two); + + handleBallCollisionWithPaddle(&paddle_one); + handleBallCollisionWithPaddle(&paddle_two); + + handleGameOver(); + + controlPaddleState(&paddle_one, controller_state.key_w, controller_state.key_s); + controlPaddleState(&paddle_two, controller_state.key_o, controller_state.key_k); +} + +pub fn draw(renderer: ?*c.SDL_Renderer) !void { + drawCenterDottedLine(renderer); + try drawScore(renderer, score_one, 8, 8); + try drawScore(renderer, score_two, WINDOW_WIDTH - 383, 8); + ball.draw(renderer); + paddle_one.draw(renderer); + paddle_two.draw(renderer); +} + +pub fn handleEvent(event: c.SDL_Event) !void { + switch (event.type) { + c.SDL_EVENT_QUIT => { + return error.Quit; + }, + c.SDL_EVENT_KEY_DOWN, c.SDL_EVENT_KEY_UP => { + const down = event.type == c.SDL_EVENT_KEY_DOWN; + switch (event.key.scancode) { + c.SDL_SCANCODE_W => controller_state.key_w = down, + c.SDL_SCANCODE_S => controller_state.key_s = down, + c.SDL_SCANCODE_O => controller_state.key_o = down, + c.SDL_SCANCODE_K => controller_state.key_k = down, + else => {}, + } + }, + else => {}, + } +} diff --git a/pong/main.zig b/pong/main.zig new file mode 100644 index 0000000..2fdc3e4 --- /dev/null +++ b/pong/main.zig @@ -0,0 +1,68 @@ +const c = @cImport({ + @cInclude("SDL3/SDL.h"); + @cInclude("SDL3/SDL_main.h"); +}); +const game = @import("game.zig"); + +const WINDOW_WIDTH = game.WINDOW_WIDTH; +const WINDOW_HEIGHT = game.WINDOW_HEIGHT; + +pub var last_time: u64 = 0; +pub var current_time: u64 = 0; +pub var elapsed_time: f32 = 0; + +pub fn createWindownAndRenderer() struct { *c.SDL_Window, *c.SDL_Renderer } { + c.SDL_SetMainReady(); + + _ = c.SDL_SetAppMetadata("Pong", "0.0.0", "sdl-examples.pong"); + _ = c.SDL_Init(c.SDL_INIT_VIDEO); + + const window: *c.SDL_Window, const renderer: *c.SDL_Renderer = create_window_and_renderer: { + var window: ?*c.SDL_Window = null; + var renderer: ?*c.SDL_Renderer = null; + _ = c.SDL_CreateWindowAndRenderer("Pong", WINDOW_WIDTH, WINDOW_HEIGHT, 0, &window, &renderer); + errdefer comptime unreachable; + + break :create_window_and_renderer .{ window.?, renderer.? }; + }; + + return .{ window, renderer }; +} + +fn render(renderer: ?*c.SDL_Renderer) !void { + _ = c.SDL_SetRenderDrawColor(renderer, 0, 0, 0, c.SDL_ALPHA_OPAQUE); + _ = c.SDL_RenderClear(renderer); + + try game.draw(renderer); + + _ = c.SDL_RenderPresent(renderer); +} + +pub fn main() !void { + const window: *c.SDL_Window, const renderer: *c.SDL_Renderer = createWindownAndRenderer(); + defer c.SDL_Quit(); + defer c.SDL_DestroyRenderer(renderer); + defer c.SDL_DestroyWindow(window); + + last_time = c.SDL_GetTicks(); + game.initialize(); + + main_loop: while (true) { + var event: c.SDL_Event = undefined; + + while (c.SDL_PollEvent(&event)) { + game.handleEvent(event) catch |err| { + if (err == error.Quit) break :main_loop; + }; + } + + { + current_time = c.SDL_GetTicks(); + elapsed_time = @as(f32, @floatFromInt(current_time - last_time)) / 1000; + game.update(); + last_time = c.SDL_GetTicks(); + } + + try render(renderer); + } +} diff --git a/pong/object.zig b/pong/object.zig new file mode 100644 index 0000000..0c48a1f --- /dev/null +++ b/pong/object.zig @@ -0,0 +1,56 @@ +const c = @cImport({ + @cInclude("SDL3/SDL.h"); + @cInclude("SDL3/SDL_main.h"); +}); + +const Position = struct { + x: f32, + y: f32, +}; + +const Velocity = struct { + x: f32, + y: f32, +}; + +pub fn Object(w: comptime_int, h: comptime_int) type { + return struct { + position: Position, + velocity: Velocity, + shape: c.SDL_FRect, + + pub fn init(pos_x: f32, pos_y: f32, vel_x: f32, vel_y: f32) @This() { + return @This(){ + .position = .{ .x = pos_x, .y = pos_y }, + .velocity = .{ .x = vel_x, .y = vel_y }, + .shape = c.SDL_FRect{ + .x = pos_x, + .y = pos_y, + .w = w, + .h = h, + }, + }; + } + + pub fn setPosition(self: *@This(), x: f32, y: f32) void { + self.position.x = x; + self.position.y = y; + + self.shape.x = x; + self.shape.y = y; + } + + + pub fn updatePositionByTime(self: *@This(), elapsed_time: f32) void { + const x = self.position.x + self.velocity.x * elapsed_time; + const y = self.position.y + self.velocity.y * elapsed_time; + + self.setPosition(x, y); + } + + pub fn draw(self: *@This(), renderer: ?*c.SDL_Renderer) void { + _ = c.SDL_SetRenderDrawColor(renderer, 255, 255, 255, c.SDL_ALPHA_OPAQUE); + _ = c.SDL_RenderFillRect(renderer, &self.shape); + } + }; +} From 88e1244f031d91051c5f50eb1ec3655957d35cf5 Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:42:22 -0300 Subject: [PATCH 2/6] add readme notes --- pong/README.md | 27 +++++++++++++++++++++++++++ pong/preview.gif | Bin 0 -> 86259 bytes 2 files changed, 27 insertions(+) create mode 100644 pong/README.md create mode 100644 pong/preview.gif diff --git a/pong/README.md b/pong/README.md new file mode 100644 index 0000000..8e6b3fb --- /dev/null +++ b/pong/README.md @@ -0,0 +1,27 @@ + + +# Pong + +Simple Pong clone using SDL3 for video and input. + +Uses the [castholm/SDL](https://github.com/castholm/SDL) Zig package, which builds SDL3 from source using the Zig build system. + +![Preview](preview.gif) + +## Controls + +### keyboard + +- Paddle one: W and S for up and down, respectively. +- Paddle two: O and K for up and down, respectively. + +## Building + +Requires Zig `0.14.0` or `0.15.0-dev` (master). + +```sh +# Run the game +zig build run diff --git a/pong/preview.gif b/pong/preview.gif new file mode 100644 index 0000000000000000000000000000000000000000..1af4bac438fc08f2cb4396fa0357469ca0a48760 GIT binary patch literal 86259 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̋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 Z`vGsaA8>d3Vb5+qknHxuPydzV{{Tl(7#jcp literal 0 HcmV?d00001 From b571ef32d128bd282d4ab7d6a50f581afb0d5d2a Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:46:41 -0300 Subject: [PATCH 3/6] add pong notes on main readme file --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 4b04988..a8e0e55 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ This is my collection of small example projects showcasing the Zig language, bui - [Breakout](#breakout) - [Snake](#snake) +- [Pong](#pong) - [OpenGL (SDL)](#opengl-sdl) - [C/C++/Zig](#cczig) @@ -24,6 +25,12 @@ Simple Breakout clone using SDL3 for video, audio, input, etc. How quickly can y ![Preview](snake/preview.gif) +## [Pong](pong) + +Simple Pong clone using SDL3 for video and input. + +![Preview](pong/preview.gif) + ## [OpenGL (SDL)](opengl-sdl) Creates a window using SDL3, then draws to it using OpenGL bindings generated by [zigglgen](https://github.com/castholm/zigglgen). From 483d9003c02d0a9a2875934fb31a9b2e375d1812 Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:50:47 -0300 Subject: [PATCH 4/6] update author name on readme file --- pong/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pong/README.md b/pong/README.md index 8e6b3fb..d2ed5e7 100644 --- a/pong/README.md +++ b/pong/README.md @@ -1,6 +1,6 @@ # Pong From bfcc26a406dd8ce6d1860ca959f8343639618b0e Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:51:18 -0300 Subject: [PATCH 5/6] update year on readme file --- pong/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pong/README.md b/pong/README.md index d2ed5e7..fed64d3 100644 --- a/pong/README.md +++ b/pong/README.md @@ -1,5 +1,5 @@ From 9aff094699b70fba43d7cda8ea4e123550fa04a8 Mon Sep 17 00:00:00 2001 From: Daniel Alves Date: Fri, 21 Mar 2025 03:52:57 -0300 Subject: [PATCH 6/6] update author and license on build and build.zon --- pong/build.zig | 4 ++-- pong/build.zig.zon | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pong/build.zig b/pong/build.zig index de00e6d..a3305cd 100644 --- a/pong/build.zig +++ b/pong/build.zig @@ -1,5 +1,5 @@ -// © 2024 Carl Åstholm -// SPDX-License-Identifier: MIT +// © 2024 Daniel Alves +// SPDX-License-Identifier: CC0-1.0 const std = @import("std"); diff --git a/pong/build.zig.zon b/pong/build.zig.zon index cf7f234..a60086a 100644 --- a/pong/build.zig.zon +++ b/pong/build.zig.zon @@ -1,5 +1,5 @@ -// © 2024 Carl Åstholm -// SPDX-License-Identifier: MIT +// © 2024 Daniel Alves +// SPDX-License-Identifier: CC0-1.0 .{ .name = .breakout,