spawn area nodes improvements
This commit is contained in:
parent
7c12f31ed9
commit
987ee5c2d3
@ -77,7 +77,7 @@ pub const Areas = struct {
|
|||||||
return valuesToRandomise;
|
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);
|
var nodes = try self.allocator.alloc(str_node.Node, self.areas.len);
|
||||||
|
|
||||||
for (0..self.areas.len) |i| {
|
for (0..self.areas.len) |i| {
|
||||||
|
@ -24,7 +24,6 @@ pub const SpawnArea = struct {
|
|||||||
return new_spawn;
|
return new_spawn;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo if window size changes this needs to be recalculated
|
|
||||||
pub fn setLocation(self: *SpawnArea) void {
|
pub fn setLocation(self: *SpawnArea) void {
|
||||||
self.location = switch (self.area) {
|
self.location = switch (self.area) {
|
||||||
.top_left => rl.Vector2{ .x = 0, .y = 0 },
|
.top_left => rl.Vector2{ .x = 0, .y = 0 },
|
||||||
|
@ -17,6 +17,7 @@ pub fn main() !void {
|
|||||||
rl.initWindow(globals.getScreenWidth(), globals.getScreenHeight(), "Promet SIM");
|
rl.initWindow(globals.getScreenWidth(), globals.getScreenHeight(), "Promet SIM");
|
||||||
defer rl.closeWindow();
|
defer rl.closeWindow();
|
||||||
|
|
||||||
|
rl.setExitKey(.null);
|
||||||
rl.maximizeWindow();
|
rl.maximizeWindow();
|
||||||
rl.setTargetFPS(60);
|
rl.setTargetFPS(60);
|
||||||
|
|
||||||
@ -26,6 +27,8 @@ pub fn main() !void {
|
|||||||
var road_manager = roadman_str.RoadManager.init(allocator);
|
var road_manager = roadman_str.RoadManager.init(allocator);
|
||||||
defer road_manager.deinit();
|
defer road_manager.deinit();
|
||||||
|
|
||||||
|
try road_manager.addAreaNodes(area_manager);
|
||||||
|
|
||||||
while (!rl.windowShouldClose()) {
|
while (!rl.windowShouldClose()) {
|
||||||
rl.beginDrawing();
|
rl.beginDrawing();
|
||||||
defer rl.endDrawing();
|
defer rl.endDrawing();
|
||||||
@ -36,6 +39,9 @@ pub fn main() !void {
|
|||||||
if (globals.checkWindowSizeChanged(new_width, new_height)) {
|
if (globals.checkWindowSizeChanged(new_width, new_height)) {
|
||||||
globals.setWindowSize(new_width, new_height);
|
globals.setWindowSize(new_width, new_height);
|
||||||
area_manager.recalculate();
|
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);
|
rl.clearBackground(.light_gray);
|
||||||
@ -43,5 +49,6 @@ pub fn main() !void {
|
|||||||
try road_manager.inputHandler();
|
try road_manager.inputHandler();
|
||||||
road_manager.draw();
|
road_manager.draw();
|
||||||
area_manager.draw();
|
area_manager.draw();
|
||||||
|
road_manager.drawNodes();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -65,6 +65,8 @@ pub const RoadManager = struct {
|
|||||||
|
|
||||||
fn clearRoads(self: *RoadManager) void {
|
fn clearRoads(self: *RoadManager) void {
|
||||||
self.roads.clearAndFree();
|
self.roads.clearAndFree();
|
||||||
|
// todo this will delete spawn nodes which MUST NOT be deleted
|
||||||
|
// fix at earliest convinience
|
||||||
self.nodes.clearAndFree();
|
self.nodes.clearAndFree();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,30 +183,28 @@ pub const RoadManager = struct {
|
|||||||
|
|
||||||
pub fn draw(self: *const RoadManager) void {
|
pub fn draw(self: *const RoadManager) void {
|
||||||
// if last road is being drawn display node marker
|
// 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| {
|
for (self.roads.items) |*road| {
|
||||||
road.draw();
|
road.draw();
|
||||||
|
// reset the road colour
|
||||||
if (!road.isValid())
|
if (!road.isValid())
|
||||||
road.*.setColor(str.RoadState.valid);
|
road.*.setColor(str.RoadState.valid);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (draw_marker)
|
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));
|
marker_node.draw(self.canCreateNode(pos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (self.mode != str.InputMode.node) return;
|
if (self.mode != str.InputMode.node) return;
|
||||||
for (self.nodes.items) |node| {
|
for (self.nodes.items) |node| {
|
||||||
@ -228,10 +228,19 @@ pub const RoadManager = struct {
|
|||||||
self.selected_road = null;
|
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();
|
const nodes = try areas.getNodes();
|
||||||
defer self.allocator.free(nodes);
|
defer self.allocator.free(nodes);
|
||||||
|
|
||||||
try self.nodes.appendSlice(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];
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user