Estoy recreando un sistema de enlace de borde del juego "Rimworld".
Los cuadrados morados son cuadrados individuales que deben formar "enlaces", en la dirección en que se dibujan las flechas, con esa longitud exacta.
Actualmente, no sé cómo hacer esto mejor que colocando todos esos cuadrados en un diccionario donde marco la posición de un cuadrado y su dirección (que puede ser ARRIBA o DERECHA), así:
Dictionary<Vector3Int, bool> linkSquares;
Quiero ordenar este diccionario para que los pares KV que vienen primero sean aquellos en los que Vector3Int.x es más bajo y luego donde Vector3Int.y es más bajo.
De esa manera, siempre podría comenzar en esos cuadrados (marcados con los números 1-4 en la imagen) e ir en la dirección de flecha adecuada, eliminando esos cuadrados a medida que avanzo, lo que solo dejaría otros cuadrados iniciales.
He leído que los diccionarios no se pueden ordenar, pero no sé cómo usaría un SortedDictionary para este caso. Todo este sistema parece demasiado sucio, pero no sé de qué otra manera lograría mi objetivo aquí, por lo que cualquier sugerencia de cambio de diseño es muy apreciada.
Intente definir una clase personalizada que incluya vector3 y bool juntos y luego haga una lista de objetos de esa clase. Luego puede ordenar la clase en la que desee.
Si solo necesita el bool para filtrar, puede ordenar el diccionario en una lista. Un ejemplo de cómo clasificar el diccionario en una lista es el siguiente:
List<Vector3Int> productList = myDictionary.OrderBy(kp => kp.key.x).ThenBy(kp => kp.key.y) .ToList();podría usar OrderBy para la primera clave y ThenBy para la segunda clave (Linq) y poner el resultado en un nuevo diccionario (ordenado):
var dictsorted= linkSquares.OrderBy(k => k.Key.x).ThenBy(k => k.Key.y).ToDictionary(k => k.Key, k=> k.Value);