diff --git a/src/area/areas.zig b/src/area/areas.zig index f42fea6..8604443 100644 --- a/src/area/areas.zig +++ b/src/area/areas.zig @@ -77,7 +77,7 @@ pub const Areas = struct { return valuesToRandomise; } - pub fn getNodes(self: *Areas) ![]str_node.Node { + pub fn getNodes(self: *const Areas) ![]str_node.Node { var nodes = try self.allocator.alloc(str_node.Node, self.areas.len); for (0..self.areas.len) |i| { diff --git a/src/area/spawn-area.zig b/src/area/spawn-area.zig index da9fe7d..84094de 100644 --- a/src/area/spawn-area.zig +++ b/src/area/spawn-area.zig @@ -24,7 +24,6 @@ pub const SpawnArea = struct { return new_spawn; } - // todo if window size changes this needs to be recalculated pub fn setLocation(self: *SpawnArea) void { self.location = switch (self.area) { .top_left => rl.Vector2{ .x = 0, .y = 0 }, diff --git a/src/main.zig b/src/main.zig index 0a29ff7..3433615 100644 --- a/src/main.zig +++ b/src/main.zig @@ -17,6 +17,7 @@ pub fn main() !void { rl.initWindow(globals.getScreenWidth(), globals.getScreenHeight(), "Promet SIM"); defer rl.closeWindow(); + rl.setExitKey(.null); rl.maximizeWindow(); rl.setTargetFPS(60); @@ -26,6 +27,8 @@ pub fn main() !void { var road_manager = roadman_str.RoadManager.init(allocator); defer road_manager.deinit(); + try road_manager.addAreaNodes(area_manager); + while (!rl.windowShouldClose()) { rl.beginDrawing(); defer rl.endDrawing(); @@ -36,6 +39,9 @@ pub fn main() !void { if (globals.checkWindowSizeChanged(new_width, new_height)) { globals.setWindowSize(new_width, new_height); area_manager.recalculate(); + try road_manager.updateAreaNodes(area_manager); + // todo this will bring some trouble because what if other nodes/roads, when resized, will be placed upon existing spawn area + } rl.clearBackground(.light_gray); @@ -43,5 +49,6 @@ pub fn main() !void { try road_manager.inputHandler(); road_manager.draw(); area_manager.draw(); + road_manager.drawNodes(); } } diff --git a/src/road/road-manager.zig b/src/road/road-manager.zig index 71b08f4..74d9f00 100644 --- a/src/road/road-manager.zig +++ b/src/road/road-manager.zig @@ -65,6 +65,8 @@ pub const RoadManager = struct { fn clearRoads(self: *RoadManager) void { self.roads.clearAndFree(); + // todo this will delete spawn nodes which MUST NOT be deleted + // fix at earliest convinience self.nodes.clearAndFree(); } @@ -181,30 +183,28 @@ pub const RoadManager = struct { pub fn draw(self: *const RoadManager) void { // if last road is being drawn display node marker - const last = self.roads.getLastOrNull(); - const pos = rl.getMousePosition(); - const marker_node = node_str.Node.init(pos); - var draw_marker = false; - - if (last != null and last.?.end_point == null) { - draw_marker = true; - - // might have to put it in one function because we check this two times - // todo canCreateNode and canCreateRoad should be part of node/road struct - if (rl.Vector2.distance(last.?.start_point, pos) < self.min_distance) { - draw_marker = false; - self.roads.items[self.getLastIndex().?].setColor(str.RoadState.illegal); - } - } - for (self.roads.items) |*road| { road.draw(); + // reset the road colour if (!road.isValid()) road.*.setColor(str.RoadState.valid); } + } - if (draw_marker) - marker_node.draw(self.canCreateNode(pos)); + pub fn drawNodes(self: *const RoadManager) void { + const last = self.roads.getLastOrNull(); + const pos = rl.getMousePosition(); + const marker_node = node_str.Node.init(pos); + + if (last != null and last.?.end_point == null) { + // todo canCreateNode and canCreateRoad should be part of node/road struct + if (rl.Vector2.distance(last.?.start_point, pos) < self.min_distance) { + // todo we can maybe make this at draw() fn in road struct + self.roads.items[self.getLastIndex().?].setColor(str.RoadState.illegal); + } else { + marker_node.draw(self.canCreateNode(pos)); + } + } if (self.mode != str.InputMode.node) return; for (self.nodes.items) |node| { @@ -228,10 +228,19 @@ pub const RoadManager = struct { self.selected_road = null; } - pub fn getAreaNodes(self: *RoadManager, areas: area_str.Areas) !void { + pub fn addAreaNodes(self: *RoadManager, areas: area_str.Areas) !void { const nodes = try areas.getNodes(); defer self.allocator.free(nodes); try self.nodes.appendSlice(nodes); } + + pub fn updateAreaNodes(self: *RoadManager, areas: area_str.Areas) !void { + const nodes = try areas.getNodes(); + defer self.allocator.free(nodes); + + for (0..nodes.len) |i| { + self.nodes.items[i] = nodes[i]; + } + } };