From 63029a3a27eb3ae44d802cb17b0c453e84595ade Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Fri, 23 Sep 2022 19:09:28 +0200 Subject: Added ball physics --- src/ball.zig | 33 ++++++++++++++++++++++++++++----- src/game.zig | 3 ++- src/utils.zig | 1 + 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/ball.zig b/src/ball.zig index 11737bb..f2458d4 100644 --- a/src/ball.zig +++ b/src/ball.zig @@ -3,21 +3,44 @@ const utils = @import("utils.zig"); const w4 = @import("wasm4.zig"); pub const Ball = struct { + // position of the top left corner x: f64, y: f64, - dx: f64, - dy: f64, + vx: f64, + vy: f64, pub fn draw(self: Ball) void { var y = @floatToInt(u8, std.math.round(self.y)); var x = @floatToInt(u8, std.math.round(self.x)); - w4.DRAW_COLORS.* = 0x4321; + w4.DRAW_COLORS.* = 0x2400; w4.blit(&ball, x, y, ball_width, ball_height, ball_flags); } pub fn resetRound(self: *Ball, side: utils.side) void { self.x = @intToFloat(f64, utils.startingX[@enumToInt(side)] + 4); self.y = 160 - 32 - 8; - self.dx = 0; - self.dy = 0; + self.vx = 0; + self.vy = -250; + } + pub fn update(self: *Ball) void { + self.vy += utils.gravity; + self.x += self.vx * utils.frequency; + self.y += self.vy * utils.frequency; + // collisions handling + if (self.x < 0) { // left wall + self.vx = -self.vx * utils.bounce; + self.x = 0; + } + if (self.x >= 160 - ball_width) { // right wall + self.vx = -self.vx * utils.bounce; + self.x = 160 - ball_width - 1; + } + if (self.y < 0) { // ceiling + self.vy = -self.vy * utils.bounce; + self.y = 0; + } + if (self.y >= 160 - ball_height) { // floor + self.vy = 0; + self.y = 160 - ball_height; + } } }; diff --git a/src/game.zig b/src/game.zig index 2f3dfcd..01e3dc4 100644 --- a/src/game.zig +++ b/src/game.zig @@ -12,9 +12,9 @@ pub const Game = struct { playerSide: utils.side = undefined, pub fn draw(self: *Game) void { - self.ball.draw(); self.brothers[0].draw(); self.brothers[1].draw(); + self.ball.draw(); // draw the net w4.DRAW_COLORS.* = 0x42; w4.rect(78, 100, 4, 61); @@ -34,5 +34,6 @@ pub const Game = struct { self.gamepads[1].update(w4.GAMEPAD2.*); self.brothers[0].update(self.gamepads[0]); self.brothers[1].update(self.gamepads[1]); + self.ball.update(); } }; diff --git a/src/utils.zig b/src/utils.zig index bb9eb13..6f1e850 100644 --- a/src/utils.zig +++ b/src/utils.zig @@ -1,4 +1,5 @@ //----- Physics --------------------------------------------------------------- +pub const bounce: f64 = 0.7; // energy dispersion when bouncing pub const gravity: f64 = 9.807; // m/s² pub const scale: f64 = 1.0 / 30.0; // 30 pixels == 1m pub const frequency: f64 = 1.0 / 60.0; // 60 fps -- cgit v1.2.3