spawn area nodes improvements

This commit is contained in:
Martin Vrhovšek 2025-07-22 13:47:00 +02:00
parent 7c12f31ed9
commit 987ee5c2d3
4 changed files with 36 additions and 21 deletions

View File

@ -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| {

View File

@ -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 },

View File

@ -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();
}
}

View File

@ -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];
}
}
};