Version corta
¿Existe un patrón de diseño para distribuir las etiquetas de los vehículos de manera que no se superpongan, colocándolos lo más cerca posible del vehículo al que se refieren? Si no, ¿es viable alguno de los métodos que sugiero? ¿Cómo implementaría esto usted mismo?
Versión extendida
En el juego que estoy escribiendo tengo una visión panorámica de mis vehículos en el aire. También tengo al lado de cada uno de los vehículos una pequeña etiqueta con datos clave sobre el vehículo. Esta es una captura de pantalla real:
Ahora, dado que los vehículos podrían estar volando a diferentes altitudes, sus íconos podrían superponerse. Sin embargo, me gustaría que sus etiquetas no se superpongan (o que una etiqueta del vehículo 'A' se superponga con el icono del vehículo 'B').
Actualmente, puedo detectar colisiones entre sprites y simplemente elimino la etiqueta ofensiva en una dirección opuesta al sprite superpuesto . Esto funciona en la mayoría de las situaciones, pero cuando el espacio aéreo se llena, la etiqueta puede ser empujada muy lejos de su vehículo, incluso si hubiera una alternativa alternativa "más inteligente". Por ejemplo me sale:
B - label
A -----------label
C - label
donde sería mejor (= etiqueta más cerca del vehículo) obtener:
B - label
label - A
C - label
EDITAR: También debe tenerse en cuenta que, además del caso de los vehículos superpuestos, podría haber otras configuraciones en las que se podrían superponer las etiquetas de los vehículos (los ejemplos de arte ASCII muestran, por ejemplo, tres vehículos muy cercanos en los que la etiqueta de A
se superpondría al icono de B
y C
)
Tengo dos ideas sobre cómo mejorar la situación actual, pero antes de dedicar tiempo a implementarlas, pensé en pedir consejo a la comunidad (después de todo, parece un "problema bastante común" que podría existir un patrón de diseño).
Para lo que vale, estas son las dos ideas que estaba pensando:
Slot-isation del espacio de etiqueta
En este escenario, dividiría toda la pantalla en "ranuras" para las etiquetas. Luego, cada vehículo siempre tendrá su etiqueta colocada en el vacío más cercano (vacío = no hay otros sprites en esa ubicación.
Búsqueda en espiral
Desde la ubicación del vehículo en la pantalla, trataría de colocar la etiqueta en ángulos crecientes y luego en radios crecientes, hasta que se encuentre una ubicación no superpuesta. Algo en la línea de:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...