From 6bfead54cc8282952703bae73d801dc7f2be231e Mon Sep 17 00:00:00 2001 From: Louis Pearson Date: Sat, 6 Aug 2022 17:30:06 -0600 Subject: [PATCH] Allow movement between screens --- src/component.zig | 3 +++ src/game.zig | 51 ++++++++++++++++++++++++++++++++++++++--------- src/main.zig | 6 +++++- src/world.zig | 9 +++++++++ 4 files changed, 59 insertions(+), 10 deletions(-) diff --git a/src/component.zig b/src/component.zig index a55f14d..2c7770e 100644 --- a/src/component.zig +++ b/src/component.zig @@ -23,6 +23,9 @@ pub const Pos = struct { pub fn getDirection(pos: Pos) Vec2f { return pos.pos - pos.last; } + pub fn getVelocity(pos: Pos) Vec2f { + return pos.pos - pos.last; + } }; pub const Control = struct { controller: enum { player }, diff --git a/src/game.zig b/src/game.zig index d174255..68e64c7 100644 --- a/src/game.zig +++ b/src/game.zig @@ -220,16 +220,44 @@ fn loadLevel(lvl: usize) !void { }); } -fn moveLevel(direction: enum { L, R, U, D }, lvl: usize) !void { - try loadLevel(lvl); - // var momentum = player.pos.pos - player.pos.last; +fn moveLevel(direction: enum { L, R, U, D }) !void { + // TODO: Figure out the more principled way for checking boundaries + var velocity = player.pos.getVelocity(); switch (direction) { - .L => player.pos.pos[0] = 156, - .R => player.pos.pos[0] = 4, - .U => player.pos.pos[1] = 156, - .D => player.pos.pos[1] = 4, + .L => { + const x = level.world_x - 1; + const y = level.world_y; + const lvl = db.findLevel(x, y) orelse return error.NoLevelLeft; + + try loadLevel(lvl); + player.pos.pos[0] = 160 - @intToFloat(f32, @divFloor(player.sprite.size[0], 2)); + }, + .R => { + const x = level.world_x + 1; + const y = level.world_y; + const lvl = db.findLevel(x, y) orelse return error.NoLevelRight; + + try loadLevel(lvl); + player.pos.pos[0] = @intToFloat(f32, @divFloor(player.sprite.size[0], 2)); + }, + .U => { + const x = level.world_x; + const y = level.world_y - 1; + const lvl = db.findLevel(x, y) orelse return error.NoLevelUp; + + try loadLevel(lvl); + player.pos.pos[1] = 160; + }, + .D => { + const x = level.world_x; + const y = level.world_y + 1; + const lvl = db.findLevel(x, y) orelse return error.NoLevelDown; + + try loadLevel(lvl); + player.pos.pos[1] = @intToFloat(f32, player.sprite.size[1]); + }, } - player.pos.last = player.pos.pos; + player.pos.last = player.pos.pos - velocity; } pub fn start() !void { @@ -341,7 +369,12 @@ pub fn update(time: usize) !State { physicsProcess(1, &player.pos, &player.physics); try manipulationProcess(&player.pos, &player.control); controlProcess(time, &player.pos, &player.control, &player.physics, &player.kinematic); - if (player.pos.pos[0] > 160 - 4) try moveLevel(.R, 1); + + if (player.pos.pos[0] > 160 - 4) try moveLevel(.R); + if (player.pos.pos[0] < 4) try moveLevel(.L); + if (player.pos.pos[1] > 160 - 4) try moveLevel(.D); + if (player.pos.pos[1] < 4) try moveLevel(.U); + try kinematicProcess(1, &player.pos, &player.kinematic); controlAnimProcess(1, &player.sprite, &player.controlAnim, &player.control); try particles.update(); diff --git a/src/main.zig b/src/main.zig index 3e1b650..68ddeff 100644 --- a/src/main.zig +++ b/src/main.zig @@ -33,7 +33,11 @@ export fn update() void { error.EndOfStream => showErr(@errorName(e)), error.OutOfMemory => showErr(@errorName(e)), error.InvalidLevel => showErr(@errorName(e)), - error.NullTiles => showErr(@errorName(e)), + error.NullTiles => showErr(@errorName(e)), + error.NoLevelDown => showErr(@errorName(e)), + error.NoLevelUp => showErr(@errorName(e)), + error.NoLevelLeft => showErr(@errorName(e)), + error.NoLevelRight => showErr(@errorName(e)), }, }; if (state != newState) { diff --git a/src/world.zig b/src/world.zig index ef272cc..6992628 100644 --- a/src/world.zig +++ b/src/world.zig @@ -504,6 +504,15 @@ pub const Database = struct { return level_info; } + + pub fn findLevel(db: *Database, x: i8, y: i8) ?usize { + for (db.level_info) |level, i| { + if (level.x == x and level.y == y) { + return i; + } + } + return null; + } }; // All levels in the game. If two rooms are next to each other, they