spawn area nodes improvements
This commit is contained in:
		@@ -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| {
 | 
			
		||||
 
 | 
			
		||||
@@ -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 },
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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];
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user