Versão curta
Existe um padrão de design para distribuir etiquetas de veículos de maneira não sobreposta, colocando-as o mais próximo possível do veículo a que se referem? Caso contrário, algum dos métodos sugeridos é viável? Como você implementaria isso sozinho?
Versão extendida
No jogo que estou escrevendo, tenho uma visão aérea dos meus veículos aéreos. Também tenho ao lado de cada um dos veículos uma pequena etiqueta com dados importantes sobre o veículo. Esta é uma captura de tela real:
Agora, como os veículos podiam voar em diferentes altitudes, seus ícones podiam se sobrepor. No entanto, eu gostaria de nunca ter suas etiquetas sobrepostas (ou uma etiqueta do veículo 'A' se sobreponha ao ícone do veículo 'B').
Atualmente, posso detectar colisões entre sprites e simplesmente afasto o rótulo incorreto em uma direção oposta ao sprite sobreposto . Isso funciona na maioria das situações, mas quando o espaço aéreo fica lotado, a etiqueta pode ser empurrada para muito longe do veículo, mesmo se houvesse uma alternativa "mais inteligente" alternativa. Por exemplo, eu recebo:
B - label
A -----------label
C - label
onde seria melhor (= rotular mais perto do veículo) obter:
B - label
label - A
C - label
EDIT: Também deve-se considerar que, além do caso de veículos sobrepostos, pode haver outras configurações nas quais os rótulos dos veículos possam se sobrepor (os exemplos da arte ASCII mostram, por exemplo, três veículos muito próximos nos quais o rótulo de A
sobreporia o ícone de B
e C
)
Tenho duas idéias sobre como melhorar a situação atual, mas antes de dedicar algum tempo para implementá-las, pensei em pedir conselhos à comunidade (afinal, parece um "problema bastante comum" que um padrão de design possa existir).
Pelo que vale, aqui estão as duas idéias que eu estava pensando:
Slot-isation do espaço da etiqueta
Nesse cenário, eu dividiria toda a tela em "slots" para os rótulos. Então, cada veículo sempre teria seu rótulo colocado no mais próximo vazio (vazio = nenhum outro sprite naquele local.
Pesquisa em espiral
A partir da localização do veículo na tela, eu tentaria colocar a etiqueta em ângulos crescentes e depois em raios crescentes, até encontrar um local não sobreposto. Algo abaixo da linha de:
try 0°, 10px
try 10°, 10px
try 20°, 10px
...
try 350°, 10px
try 0°, 20px
try 10°, 20px
...