Meu designer de interface do usuário criou um adorável PSD de Photoshop e tudo bonito. O maior problema que estou tendo é converter algumas das fontes mais elegantes usadas em algo renderizável no jogo. Existe uma maneira de converter esses estilos de fonte no Photoshop em uma fonte de bitmap de algum tipo?
Eu preciso ser capaz de renderizar texto como este dentro do meu código:
Respostas:
Ok, você terá que me perdoar por não fornecer um código XNA específico, porque não conheço essa plataforma, mas o que vou dizer deve funcionar em qualquer mecanismo de jogo que permita desenhar sprites.
Fontes não é o seu único problema, por isso vou dar um conselho e depois responder sua pergunta. Com essas duas coisas, você poderá estabelecer um relacionamento amoroso com seu designer de GUI, e os dois poderão criar jogos muito felizes.
A primeira coisa é que você vai se sentar com seu designer e pedir a ela que lhe forneça dois conjuntos de arquivos. O primeiro é um conjunto de arquivos transparentes que compõem sua GUI (idealmente no formato PSD ou DXT). Para cada botão, rótulo fixo, plano de fundo, borda e caixa de texto, você receberá um arquivo (você também pode fazer atlas de textura, mas eu recomendo que você faça isso depois de montar sua GUI e, em seguida, ajustar as coordenadas de origem ao fazer a blitagem). O texto não estático deve ser deixado de fora neste momento (revisitarei isso mais tarde).
A segunda coisa que você terá é o design da GUI, desta vez no formato Photoshop. Para esse arquivo, você solicitará ao seu designer que faça o design completo da GUI, usando apenas os arquivos que ele forneceu anteriormente.
Ela então colocará cada elemento da GUI em uma camada separada, sem nenhum efeito. Você vai dizer para ela fazer esse pixel perfeito, porque os locais onde ela colocará tudo é onde tudo estará realmente no jogo finalizado.
Quando você conseguir isso, para cada camada, pressione Ctrl-T e, no painel Informações (F8), você anotará as coordenadas X e Y de cada elemento. Verifique se suas unidades estão definidas para pixels (Preferências-> Unidades e réguas-> Unidades). Essas são as posições que você usará ao desenhar seus sprites.
Agora, para fontes, como você deve saber claramente agora, não será possível fazer com que suas fontes sejam exatamente da mesma maneira que as vê no Photoshop usando APIs de renderização de texto. Você precisará pré-renderizar seus glifos e depois montar programaticamente seus textos. Existem muitas maneiras de fazer isso, e mencionarei a que uso.
A primeira coisa é renderizar todos os seus glifos em um ou mais arquivos. Se você se preocupa apenas com o inglês, uma textura para todos os glifos será suficiente, mas se quiser ter um conjunto de caracteres mais extenso, poderá usar vários arquivos. Apenas verifique se todos os glifos que você deseja estão disponíveis na fonte escolhida pelo designer.
Portanto, para renderizar os glifos, você pode usar os recursos de
System.Drawing
para obter as métricas de fonte e desenhar seus glifos:Com isso, você desenhou glifos brancos sobre um fundo transparente em vários arquivos PNG e criou um arquivo de índice que informa sobre cada ponto de código, em qual arquivo o glifo está localizado, sua localização e dimensões. Observe que eu também coloquei dois pixels adicionais para separar cada glifo (para acomodar outros efeitos)
Agora, para cada um desses arquivos, você o coloca no photoshop e faz todos os filtros que deseja. Você pode definir cores, bordas, sombras, contornos e qualquer outra coisa que desejar. Apenas verifique se os efeitos não fazem os glifos se sobreporem. Nesse caso, ajuste o espaçamento, renderize novamente, enxágue e repita. Salve como PNG ou DXT e, junto com o arquivo de índice, coloque tudo no seu projeto.
O texto do desenho deve ser muito simples. Para cada caractere que você deseja imprimir, encontre sua localização usando o índice, desenhe-o, avance a posição e repita. Você também pode ajustar o espaçamento, kerning (complicado), espaçamento vertical e até coloração. Em lua:
E lá vai você. Repita o procedimento para todas as outras fontes (e também o tamanho ideal)
Editar : eu mudei o código para usar em
Graphics.MeasureString
vez de,TextRenderer.MeasureText()
porque ambos usam sistemas de medição diferentes e podem levar a inconsistências entre o glifo medido e o desenhado, especialmente com glifos pendentes encontrados em algumas fontes. Mais informações aqui .fonte
Bem, como alguém disse, no XNA, o spritefont faz o trabalho pesado para você. no site do clube de criadores, existe um exportador de fontes de bitmap que exporta em imagens de fontes no estilo XNA. ( http://xbox.create.msdn.com/en-US/education/catalog/utility/bitmap_font_maker ) Em seguida, você pode abri-lo no photoshop ou qualquer outra coisa e torná-la bonita. A partir daí, você adiciona a textura ao seu projeto de conteúdo e, no tipo de conteúdo, selecione a textura da fonte do sprite. No seu código, você o carrega como uma fonte sprite normal
(Exemplo: http://www.youtube.com/watch?v=SynGWrWYUQI )
fonte
A solução é bastante simples e é usada por um grande número de jogos. Tudo o que você precisa fazer é tratar suas fontes como se fossem sprites.
Peça ao seu designer que desenhe toda a gama de números e letras que você deseja usar no seu jogo. Em seguida, renderize-as para imagens estáticas de tamanhos variados (.png, .bmp, qualquer que seja o formato que você use). Você terá algo parecido com isto:
Agora tudo o que você precisa fazer é renderizar cada letra da sua "folha de fontes" como se fosse um sprite na tela. Certamente ajuda a criar uma classe auxiliar para traduzir entre strings e sprites.
Minha implementação é mais complexa, mas útil. A folha de fontes é construída como a imagem acima, com várias fontes, tudo em um arquivo .png. Eu tenho um
.ini
arquivo que mapeia a letra de cada fonte para uma posição na folha, juntamente com sua largura e altura. Isso deixa meu designer (e eu) enlouquecendo, criando fontes legais sem precisar tocar em nenhum código. Ao desenhar uma corda para a tela, eu tenho um método que procura o tipo de letra e achar
partir do arquivo .ini para obter a posição e os limites da carta da folha fonte, então eu apenas chamar aTexture2D
comSpriteBatch.Draw()
usando a fonteRectangle
da letra em questão.fonte
A interface do usuário é um assunto vasto e complexo. A renderização de fontes é uma parte difícil. Aconselho que você use uma biblioteca já existente que permita exibir conteúdo em Flash ou HTML no jogo, em vez de refazer tudo.
O Awesomium parece promissor e deve funcionar com o XNA , para que você possa experimentá-lo. É gratuito para jogos não comerciais ou se você não estiver ganhando muito dinheiro:
fonte
Se você está procurando efeitos mais sofisticados que o importador simples .spritefont, pode tentar procurar um "gerador de fontes de bitmap".
Pessoalmente, prefiro este: http://www.ironstarmedia.co.uk/2010/01/free-game-dev-utility-fancy-bitmap-font-generator/
Algumas outras idéias:
fonte
XNA
faz todo o trabalho duro para você. ComSpritefont
você, você pode facilmente converter um arquivo de fonte em sua máquina no tipo de planilha de sprite que você está perguntando, definindo um arquivo XML.Depois de adicionar o arquivo XML ao seu projeto de conteúdo, carregue-o com o
ContentManager
:Aqui está um exemplo de um arquivo .spritefont do meu projeto de conteúdo:
fonte
Não tenho certeza de que nunca o usei, mas as pessoas me sugeriram usar o Glyph Designer. Aqui está um tutorial em vídeo:
http://vimeo.com/32777161
Aqui há uma discussão sobre o Photoshop.
Há pessoas usando também o editor de fontes Hiero .
Em este site há uma lista de outro editor de fonte que você pode querer ter um olhar.
Deixe-me saber qual funciona melhor para você :)
fonte