mirror of
https://github.com/Xevion/Pac-Man.git
synced 2025-12-11 00:07:57 -06:00
refactor: switch NodeId to u16, use I8Vec2 for grid coordinates
This commit is contained in:
@@ -5,7 +5,7 @@ use crate::map::graph::{Graph, Node, TraversalFlags};
|
||||
use crate::map::parser::MapTileParser;
|
||||
use crate::systems::movement::NodeId;
|
||||
use bevy_ecs::resource::Resource;
|
||||
use glam::{IVec2, Vec2};
|
||||
use glam::{I8Vec2, IVec2, Vec2};
|
||||
use std::collections::{HashMap, VecDeque};
|
||||
use tracing::debug;
|
||||
|
||||
@@ -38,7 +38,7 @@ pub struct Map {
|
||||
/// Connected graph of navigable positions.
|
||||
pub graph: Graph,
|
||||
/// Bidirectional mapping between 2D grid coordinates and graph node indices.
|
||||
pub grid_to_node: HashMap<IVec2, NodeId>,
|
||||
pub grid_to_node: HashMap<I8Vec2, NodeId>,
|
||||
/// Predetermined spawn locations for all game entities
|
||||
pub start_positions: NodePositions,
|
||||
/// 2D array of tile types for collision detection and rendering
|
||||
@@ -76,8 +76,8 @@ impl Map {
|
||||
let mut queue = VecDeque::new();
|
||||
queue.push_back(start_pos);
|
||||
let pos = Vec2::new(
|
||||
(start_pos.x * CELL_SIZE as i32) as f32,
|
||||
(start_pos.y * CELL_SIZE as i32) as f32,
|
||||
(start_pos.x as i32 * CELL_SIZE as i32) as f32,
|
||||
(start_pos.y as i32 * CELL_SIZE as i32) as f32,
|
||||
) + cell_offset;
|
||||
let node_id = graph.add_node(Node { position: pos });
|
||||
grid_to_node.insert(start_pos, node_id);
|
||||
@@ -89,9 +89,9 @@ impl Map {
|
||||
|
||||
// Skip if the new position is out of bounds
|
||||
if new_position.x < 0
|
||||
|| new_position.x >= BOARD_CELL_SIZE.x as i32
|
||||
|| new_position.x as i32 >= BOARD_CELL_SIZE.x as i32
|
||||
|| new_position.y < 0
|
||||
|| new_position.y >= BOARD_CELL_SIZE.y as i32
|
||||
|| new_position.y as i32 >= BOARD_CELL_SIZE.y as i32
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -108,8 +108,8 @@ impl Map {
|
||||
) {
|
||||
// Add the new position to the graph/queue
|
||||
let pos = Vec2::new(
|
||||
(new_position.x * CELL_SIZE as i32) as f32,
|
||||
(new_position.y * CELL_SIZE as i32) as f32,
|
||||
(new_position.x as i32 * CELL_SIZE as i32) as f32,
|
||||
(new_position.y as i32 * CELL_SIZE as i32) as f32,
|
||||
) + cell_offset;
|
||||
let new_node_id = graph.add_node(Node { position: pos });
|
||||
grid_to_node.insert(new_position, new_node_id);
|
||||
@@ -132,7 +132,7 @@ impl Map {
|
||||
for (grid_pos, &node_id) in &grid_to_node {
|
||||
for dir in Direction::DIRECTIONS {
|
||||
// If the node doesn't have an edge in this direction, look for a neighbor in that direction
|
||||
if graph.adjacency_list[node_id].get(dir).is_none() {
|
||||
if graph.adjacency_list[node_id as usize].get(dir).is_none() {
|
||||
let neighbor = grid_pos + dir.as_ivec2();
|
||||
// If the neighbor exists, connect the node to it
|
||||
if let Some(&neighbor_id) = grid_to_node.get(&neighbor) {
|
||||
@@ -199,9 +199,9 @@ impl Map {
|
||||
/// representing the four key positions within the ghost house structure.
|
||||
fn build_house(
|
||||
graph: &mut Graph,
|
||||
grid_to_node: &HashMap<IVec2, NodeId>,
|
||||
house_door: &[Option<IVec2>; 2],
|
||||
) -> GameResult<(usize, usize, usize, usize)> {
|
||||
grid_to_node: &HashMap<I8Vec2, NodeId>,
|
||||
house_door: &[Option<I8Vec2>; 2],
|
||||
) -> GameResult<(NodeId, NodeId, NodeId, NodeId)> {
|
||||
// Calculate the position of the house entrance node
|
||||
let (house_entrance_node_id, house_entrance_node_position) = {
|
||||
// Translate the grid positions to the actual node ids
|
||||
@@ -222,10 +222,13 @@ impl Map {
|
||||
|
||||
// Calculate the position of the house node
|
||||
let (node_id, node_position) = {
|
||||
let left_pos = graph.get_node(*left_node).ok_or(MapError::NodeNotFound(*left_node))?.position;
|
||||
let left_pos = graph
|
||||
.get_node(*left_node)
|
||||
.ok_or(MapError::NodeNotFound(*left_node as usize))?
|
||||
.position;
|
||||
let right_pos = graph
|
||||
.get_node(*right_node)
|
||||
.ok_or(MapError::NodeNotFound(*right_node))?
|
||||
.ok_or(MapError::NodeNotFound(*right_node as usize))?
|
||||
.position;
|
||||
let house_node = graph.add_node(Node {
|
||||
position: left_pos.lerp(right_pos, 0.5),
|
||||
@@ -249,10 +252,10 @@ impl Map {
|
||||
// Place the nodes at, above, and below the center position
|
||||
let center_node_id = graph.add_node(Node { position: center_pos });
|
||||
let top_node_id = graph.add_node(Node {
|
||||
position: center_pos + (Direction::Up.as_ivec2() * (CELL_SIZE as i32 / 2)).as_vec2(),
|
||||
position: center_pos + IVec2::from(Direction::Up.as_ivec2()).as_vec2() * (CELL_SIZE as f32 / 2.0),
|
||||
});
|
||||
let bottom_node_id = graph.add_node(Node {
|
||||
position: center_pos + (Direction::Down.as_ivec2() * (CELL_SIZE as i32 / 2)).as_vec2(),
|
||||
position: center_pos + IVec2::from(Direction::Down.as_ivec2()).as_vec2() * (CELL_SIZE as f32 / 2.0),
|
||||
});
|
||||
|
||||
// Connect the center node to the top and bottom nodes
|
||||
@@ -268,7 +271,7 @@ impl Map {
|
||||
|
||||
// Calculate the position of the center line's center node
|
||||
let center_line_center_position =
|
||||
house_entrance_node_position + (Direction::Down.as_ivec2() * (3 * CELL_SIZE as i32)).as_vec2();
|
||||
house_entrance_node_position + IVec2::from(Direction::Down.as_ivec2()).as_vec2() * (3.0 * CELL_SIZE as f32);
|
||||
|
||||
// Create the center line
|
||||
let (center_center_node_id, center_top_node_id) = create_house_line(graph, center_line_center_position)?;
|
||||
@@ -300,13 +303,13 @@ impl Map {
|
||||
// Create the left line
|
||||
let (left_center_node_id, _) = create_house_line(
|
||||
graph,
|
||||
center_line_center_position + (Direction::Left.as_ivec2() * (CELL_SIZE as i32 * 2)).as_vec2(),
|
||||
center_line_center_position + IVec2::from(Direction::Left.as_ivec2()).as_vec2() * (CELL_SIZE as f32 * 2.0),
|
||||
)?;
|
||||
|
||||
// Create the right line
|
||||
let (right_center_node_id, _) = create_house_line(
|
||||
graph,
|
||||
center_line_center_position + (Direction::Right.as_ivec2() * (CELL_SIZE as i32 * 2)).as_vec2(),
|
||||
center_line_center_position + IVec2::from(Direction::Right.as_ivec2()).as_vec2() * (CELL_SIZE as f32 * 2.0),
|
||||
)?;
|
||||
|
||||
debug!("Left center node id: {left_center_node_id}");
|
||||
@@ -336,8 +339,8 @@ impl Map {
|
||||
/// Creates hidden intermediate nodes beyond the visible tunnel entrances and connects them with zero-distance edges for instantaneous traversal.
|
||||
fn build_tunnels(
|
||||
graph: &mut Graph,
|
||||
grid_to_node: &HashMap<IVec2, NodeId>,
|
||||
tunnel_ends: &[Option<IVec2>; 2],
|
||||
grid_to_node: &HashMap<I8Vec2, NodeId>,
|
||||
tunnel_ends: &[Option<I8Vec2>; 2],
|
||||
) -> GameResult<()> {
|
||||
// Create the hidden tunnel nodes
|
||||
let left_tunnel_hidden_node_id = {
|
||||
@@ -353,7 +356,7 @@ impl Map {
|
||||
Direction::Left,
|
||||
Node {
|
||||
position: left_tunnel_entrance_node.position
|
||||
+ (Direction::Left.as_ivec2() * (CELL_SIZE as i32 * 2)).as_vec2(),
|
||||
+ IVec2::from(Direction::Left.as_ivec2()).as_vec2() * (CELL_SIZE as f32 * 2.0),
|
||||
},
|
||||
)
|
||||
.map_err(|e| {
|
||||
@@ -378,7 +381,7 @@ impl Map {
|
||||
Direction::Right,
|
||||
Node {
|
||||
position: right_tunnel_entrance_node.position
|
||||
+ (Direction::Right.as_ivec2() * (CELL_SIZE as i32 * 2)).as_vec2(),
|
||||
+ IVec2::from(Direction::Right.as_ivec2()).as_vec2() * (CELL_SIZE as f32 * 2.0),
|
||||
},
|
||||
)
|
||||
.map_err(|e| {
|
||||
|
||||
Reference in New Issue
Block a user