Fazendo um símbolo aparecer em qualquer cor

7

Estou desenvolvendo um jogo estilo RPG / estilo roguelike. Em vez de ter mapas como:

.........
.........
....@....
...h.....

Oh, olhe, um anão.

Eu estava tendo ladrilhos sólidos de fundo, então um RPG baseado em ladrilhos sem ladrilhos desenhados. Eu gosto da idéia de ter azulejos ASCII para criaturas e coisas. Isso economiza muito tempo do artista. Posso trocar os ladrilhos para obter algum tipo de símbolo um pouco mais ... relacionado? Mas é melhor do que ter 4 direções para cada coisa separada.

Se eu fizesse isso em branco e tivesse uma área de neve, você não conseguiria ver. Então faça preto. Assim que você chega a um lugar escuro, fica novamente preso ao local onde está seu personagem. Existe um algoritmo ou algo que pode dizer 'isso é muito escuro entre o ladrilho e o NPC' e mudar a cor para algo visível, mas não para um ciano brilhante de um rosa pálido ou o que seja?

O Pato Comunista
fonte

Respostas:

8

Supondo que você tenha uma cor brilhante e uma cor escura para cada personagem, você pode verificar a diferença de luminância, convertendo a cor da peça e as cores do NPC em HSL . Escolha a cor do NPC com a maior diferença de luminância do ladrilho.

Se você não deseja atribuir manualmente as duas cores, basta codificar:

if (tile_color.l > 0.5)
    character_color.l = 0.1;
else
    character_color.l = 0.9;

E atribua pares HS ao invés de trigêmeos RGB a cada personagem.

Você também pode fornecer um contorno mais claro em torno de caracteres escuros e um contorno mais escuro em torno de caracteres claros, o tempo todo.


fonte
Posso usar o valor do HSV para o mesmo tipo de efeito aqui?
O pato comunista
Não. Intuitivamente, o valor pode "escurecer", mas não "clarear", ou apenas "clarear" até a metade. Para tornar a cor mais brilhante no HSV, você precisa aumentar simultaneamente o valor e reduzir a saturação. Veja os cilindros de cores na página da Wikipedia para ver como a mudança funciona.
5

Isso pressupõe que você esteja armazenando a arte ASCII como bitmaps em vez de renderização de texto, o que é melhor para desempenho, flexibilidade e pode facilitar a implementação fácil de conjuntos de blocos personalizados.

Em vez de alterar as cores, dependendo das cores do plano de fundo, faça com que toda a luz de arte ASCII seja tonificada e tenha um leve efeito de sombra projetada previamente nos bitmaps.

Isso fará com que os personagens e itens apareçam bem em todas as cores / tons / tons.

Edit: Aqui estão alguns exemplos

Com uma sombra texto alternativo

Sem sombra texto alternativo

AttackingHobo
fonte
Uma sombra ainda não funciona quando as cores coincidem demais. Você acaba vendo uma sombra que não é identificável e parece ruim por si só. Um contorno é melhor, preservando mais detalhes da forma.
@ Joe Wreshnig, editei a resposta e forneci exemplos.
precisa
Você forneceu dois tons de baixa luminância para fontes de luminância média-alta. Experimente apenas sombras em fundos quase iguais à fonte e você verá o problema. Ainda assim, o problema já está aparecendo no "e" sombreado em amarelo em "Texto" em branco.