From 69eb7236143cd1fe9a73f88fdd612de9118c2c6f Mon Sep 17 00:00:00 2001 From: IgLemp Date: Thu, 23 Mar 2023 20:55:34 +0100 Subject: [PATCH] Refactored code --- README.md | 3 ++ src/main.zig | 130 ++++++++---------------------------------------- src/physics.zig | 79 +++++++++++++++++++++++++++++ src/types.zig | 16 ++++++ 4 files changed, 120 insertions(+), 108 deletions(-) create mode 100644 src/physics.zig create mode 100644 src/types.zig diff --git a/README.md b/README.md index de93246..22d8716 100644 --- a/README.md +++ b/README.md @@ -1 +1,4 @@ zig version: 0.10.1 + +*TODO* +Swap raylib bindings to raylib.zig from raylib-zig diff --git a/src/main.zig b/src/main.zig index d0c8207..e226c56 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,95 +1,8 @@ -const rl = @import("raylib"); +const rl = @import("raylib"); const rlm = @import("raylib-math"); const std = @import("std"); - - -const Object = struct { - box: rl.Rectangle, - texture: ?rl.Texture2D, -}; - -const Player = struct { - box: rl.Rectangle, - velocity: rl.Vector2, - // max_velocity: f32, -}; - -const Map = struct { - tiles: []Object, -}; - - -const GRAVITY: f32 = -10; -const FRICTION: f32 = 10; -fn apply_player_phisics(player: *Player) void { - // apply gravity - player.velocity.y += GRAVITY * rl.GetFrameTime(); - player.box.y -= player.velocity.y; - - // apply friction - if (player.velocity.x > 0) { player.velocity.x -= FRICTION * rl.GetFrameTime(); } - if (player.velocity.x < 0) { player.velocity.x += FRICTION * rl.GetFrameTime(); } - if (player.velocity.x >= -1 and player.velocity.x <= 1) { player.velocity.x = 0; } - player.box.x += player.velocity.x; - - // clamp velocities to not reach light speed in a second - player.velocity.x = rlm.Clamp(player.velocity.x, -4, 4); - player.velocity.y = rlm.Clamp(player.velocity.y, -8, 8); -} - - -fn free_fly(player: *Player) void { - // apply friction for X - if (player.velocity.x > 0) { player.velocity.x -= FRICTION * rl.GetFrameTime(); } - if (player.velocity.x < 0) { player.velocity.x += FRICTION * rl.GetFrameTime(); } - if (player.velocity.x >= -1 and player.velocity.x <= 1) { player.velocity.x = 0; } - player.box.x += player.velocity.x; - - // apply friction for Y - if (player.velocity.y > 0) { player.velocity.y -= FRICTION * rl.GetFrameTime(); } - if (player.velocity.y < 0) { player.velocity.y += FRICTION * rl.GetFrameTime(); } - if (player.velocity.y >= -1 and player.velocity.y <= 1) { player.velocity.y = 0; } - player.box.y -= player.velocity.y; - - // clamp velocities to not reach light speed in a second - player.velocity.x = rlm.Clamp(player.velocity.x, -4, 4); - player.velocity.y = rlm.Clamp(player.velocity.y, -4, 4); -} - - -fn apply_player_collisions(player: *Player, map: Map) void { - - // for every tile - for (map.tiles) |tile| { - - // check if any collision occured - if ( rl.CheckCollisionRecs(player.box, tile.box) ) { - // get collision rectangle - var collision_rectangle = rl.GetCollisionRec(player.box, tile.box); - - // extract ranges - var range: rl.Vector2 = .{ .x = collision_rectangle.width, .y = collision_rectangle.height }; - - // calculate midpoints - var player_midpoint: rl.Vector2 = .{ .x = player.box.x + (player.box.width / 2), .y = player.box.y + (player.box.height / 2) }; - var tile_midpoint: rl.Vector2 = .{ .x = tile.box.x + (tile.box.width / 2), .y = tile.box.y + (tile.box.height / 2) }; - - - var player_on_top = if (player_midpoint.y > tile_midpoint.y) true else false; - var player_on_right = if (player_midpoint.x > tile_midpoint.x) true else false; - - // check on whitch side a collision occured and apply proper collisions - if (range.x > range.y) { - if (player_on_top) { player.box.y = tile.box.y + tile.box.height; } else { player.box.y = tile.box.y - player.box.height; } - player.velocity.y = 0; - } - else { - if (player_on_right) { player.box.x = tile.box.x + tile.box.width; } else { player.box.x = tile.box.x - player.box.width; } - player.velocity.x = 0; - } - } - } -} +const obj = @import("types.zig"); +const phs = @import("physics.zig"); // fn load_level(comptime file_path: []const u8) void { // // TODO @@ -129,15 +42,15 @@ pub fn main() anyerror!void }; // var map: Map = Map { .tiles = undefined }; - var objects = [_]Object{ + var objects = [_]obj.Object{ .{ .box = .{ .x = 0, .y = 0, .width = 300, .height = 20, }, .texture = null }, .{ .box = .{ .x = 100, .y = 0, .width = 20, .height = 200, }, .texture = null } }; - var map: Map = .{ .tiles = &objects }; + var map: obj.Map = .{ .tiles = &objects }; - var player: Player = .{ + var player: obj.Player = .{ .box = .{ .x = 20, .y = 300, .width = 20, .height = 20 }, .velocity = .{ .x = 0, .y = 0 }, }; @@ -158,25 +71,26 @@ pub fn main() anyerror!void // Main game loop ================================================================ while (!rl.WindowShouldClose()) // Detect window close button or ESC key { - // run game logic - apply_player_collisions(&player, map); + // handle user input + if (rl.IsKeyDown(rl.KeyboardKey.KEY_RIGHT)) { player.velocity.x += 1.5; } // move right + if (rl.IsKeyDown(rl.KeyboardKey.KEY_LEFT )) { player.velocity.x -= 1.5; } // move left + if (rl.IsKeyPressed(rl.KeyboardKey.KEY_F)) { fly = !fly; } + if (fly) { + if (rl.IsKeyDown(rl.KeyboardKey.KEY_UP)) { player.velocity.y += 1.5; } + if (rl.IsKeyDown(rl.KeyboardKey.KEY_DOWN)) { player.velocity.y -= 1.5; } + phs.free_fly(&player); + } else { + if (rl.IsKeyPressed(rl.KeyboardKey.KEY_UP)) { player.velocity.y = 15; } // jump + phs.apply_forces(&player); + } - // handle user input - if (rl.IsKeyDown(rl.KeyboardKey.KEY_RIGHT)) { player.velocity.x += 1.5; } // move right - if (rl.IsKeyDown(rl.KeyboardKey.KEY_LEFT )) { player.velocity.x -= 1.5; } // move left - - if (rl.IsKeyPressed(rl.KeyboardKey.KEY_F)) { fly = !fly; } - if (fly) { - if (rl.IsKeyDown(rl.KeyboardKey.KEY_UP)) { player.velocity.y += 1.5; } - if (rl.IsKeyDown(rl.KeyboardKey.KEY_DOWN)) { player.velocity.y -= 1.5; } - free_fly(&player); - } else { - if (rl.IsKeyPressed(rl.KeyboardKey.KEY_UP)) { player.velocity.y = 15; } // jump - apply_player_phisics(&player); - } + // run collisions + phs.apply_player_collisions(&player, map); + // camera setup camera.target = rl.Vector2 { .x = player.box.x + player.box.width / 2, .y = player.box.y + player.box.height / 2 }; + // input related to camera camera.zoom += rl.GetMouseWheelMove() * 0.05; diff --git a/src/physics.zig b/src/physics.zig new file mode 100644 index 0000000..024e8fd --- /dev/null +++ b/src/physics.zig @@ -0,0 +1,79 @@ +const rl = @import("raylib"); +const rlm = @import("raylib-math"); +const obj = @import("types.zig"); + +// constants +const GRAVITY: f32 = -10; +const FRICTION: f32 = 10; + + + +pub fn apply_forces(player: *obj.Player) void { + // apply gravity + player.velocity.y += GRAVITY * rl.GetFrameTime(); + player.box.y -= player.velocity.y; + + // apply friction + if (player.velocity.x > 0) { player.velocity.x -= FRICTION * rl.GetFrameTime(); } + if (player.velocity.x < 0) { player.velocity.x += FRICTION * rl.GetFrameTime(); } + if (player.velocity.x >= -1 and player.velocity.x <= 1) { player.velocity.x = 0; } + player.box.x += player.velocity.x; + + // clamp velocities to not reach light speed in a second + player.velocity.x = rlm.Clamp(player.velocity.x, -4, 4); + player.velocity.y = rlm.Clamp(player.velocity.y, -8, 8); +} + + +pub fn free_fly(player: *obj.Player) void { + // apply friction for X + if (player.velocity.x > 0) { player.velocity.x -= FRICTION * rl.GetFrameTime(); } + if (player.velocity.x < 0) { player.velocity.x += FRICTION * rl.GetFrameTime(); } + if (player.velocity.x >= -1 and player.velocity.x <= 1) { player.velocity.x = 0; } + player.box.x += player.velocity.x; + + // apply friction for Y + if (player.velocity.y > 0) { player.velocity.y -= FRICTION * rl.GetFrameTime(); } + if (player.velocity.y < 0) { player.velocity.y += FRICTION * rl.GetFrameTime(); } + if (player.velocity.y >= -1 and player.velocity.y <= 1) { player.velocity.y = 0; } + player.box.y -= player.velocity.y; + + // clamp velocities to not reach light speed in a second + player.velocity.x = rlm.Clamp(player.velocity.x, -4, 4); + player.velocity.y = rlm.Clamp(player.velocity.y, -4, 4); +} + + +pub fn apply_player_collisions(player: *obj.Player, map: obj.Map) void { + + // for every tile + for (map.tiles) |tile| { + + // check if any collision occured + if ( rl.CheckCollisionRecs(player.box, tile.box) ) { + // get collision rectangle + var collision_rectangle = rl.GetCollisionRec(player.box, tile.box); + + // extract ranges + var range: rl.Vector2 = .{ .x = collision_rectangle.width, .y = collision_rectangle.height }; + + // calculate midpoints + var player_midpoint: rl.Vector2 = .{ .x = player.box.x + (player.box.width / 2), .y = player.box.y + (player.box.height / 2) }; + var tile_midpoint: rl.Vector2 = .{ .x = tile.box.x + (tile.box.width / 2), .y = tile.box.y + (tile.box.height / 2) }; + + + var player_on_top = if (player_midpoint.y > tile_midpoint.y) true else false; + var player_on_right = if (player_midpoint.x > tile_midpoint.x) true else false; + + // check on whitch side a collision occured and apply proper collisions + if (range.x > range.y) { + if (player_on_top) { player.box.y = tile.box.y + tile.box.height; } else { player.box.y = tile.box.y - player.box.height; } + player.velocity.y = 0; + } + else { + if (player_on_right) { player.box.x = tile.box.x + tile.box.width; } else { player.box.x = tile.box.x - player.box.width; } + player.velocity.x = 0; + } + } + } +} \ No newline at end of file diff --git a/src/types.zig b/src/types.zig new file mode 100644 index 0000000..4f7e210 --- /dev/null +++ b/src/types.zig @@ -0,0 +1,16 @@ +const rl = @import("raylib"); + +pub const Object = struct { + box: rl.Rectangle, + texture: ?rl.Texture2D, +}; + +pub const Player = struct { + box: rl.Rectangle, + velocity: rl.Vector2, + // max_velocity: f32, +}; + +pub const Map = struct { + tiles: []Object, +}; \ No newline at end of file