Estou pensando em me escrever um jogo 2D simples. Não brilha com gráficos ou jogabilidade perfeitos no começo, mas eu consideraria o meu primeiro passo no desenvolvimento de jogos para PC. Então, imagine um jogo 2D simples baseado em sprite (como Heroes IV ou Startcraft BroodWar).
Quero que a jogabilidade suporte dia / noite com as mudanças de iluminação correspondentes e, ao mesmo tempo, será loucura ter que criar sprites para todas as nuances de iluminação. Então, decidi que basta adicionar uma camada semitransparente sobre outros objetos.
O problema desta solução é que, se eu tiver um objeto de fonte de luz no jogo (como o herói usando uma tocha ou um prédio em chamas), deve haver uma área mais clara ao redor, certo? Como estou colocando minha camada semi-transparente sobre tudo, como você sugeriria obter o efeito visual da tocha que eu quero? Talvez redesenhe essa camada adicionando 'lacunas' ou áreas de cores diferentes com base no efeito de iluminação?
Respostas:
Não sei no que você está programando, mas é assim que eu lidei com o XNA:
List<Light>
objeto é criado / limpo.Light
objetos serão anexados aoList<Light>
.RenderTarget2D
.Light
s é iterada e desenhada por conta própria,RenderTarget2D
usando uma textura que fiz com a seguinte aparência:(Nota: usei os valores R, G e B aqui, mas você provavelmente deve usar o canal alfa no seu textura real.)
Agora, há algumas coisas a serem observadas:
Em relação ao ponto 4:
Na verdade, tenho dois shaders personalizados, um para desenhar as luzes no alvo de renderização da iluminação (etapa 4) e outro para desenhar o alvo de renderização do bloco na tela usando o alvo de renderização da iluminação (etapa 5).
O sombreador usado no ponto 4 me permite adicionar (o que eu chamo) um valor de "luminosidade". Esse valor é um
float
multiplicado por cada pixel na textura antes de ser adicionado ao destino de renderização, para que eu possa essencialmente tornar as luzes mais claras ou mais escuras.Nesse ponto, também levo em consideração o valor de "escala" da luz, o que significa que posso ter luzes grandes ou pequenas usando apenas uma textura.
Em relação ao ponto 5:
Pense no alvo de renderização da iluminação como tendo essencialmente um valor para cada pixel de 0 (preto) a 1 (branco). O sombreador multiplica essencialmente esse valor contra os valores RGB de um pixel no bloco renderiza o alvo para criar a imagem final desenhada.
Também tenho mais código aqui, onde passo (para o sombreador) um valor a ser usado como a cor da sobreposição dia / noite. Isso também é multiplicado pelos valores RGB e incluído nos cálculos de destino da renderização de iluminação.
Agora, isso não permitirá que você faça coisas como bloquear a luz de contornar objetos e outros enfeites, mas, pelo menos para os meus propósitos, é simples e funciona bem.
Escrevi posts mais detalhados aqui e aqui, que podem ajudá-lo. Não tenho tempo agora, mas se você quiser, posso entrar em mais detalhes aqui no gamedev.
Ah, e aqui está uma olhada no meu editor de mapas:
fonte
Draw
método do bloco é onde você descobre se um bloco tem luzes ou não. Eu não percorro todas as peças desenhadas noUpdate
método, portanto adicionaria uma sobrecarga extra para isso. Além disso, o XNA tenta garantir queUpdate
será chamado 60 vezes por segundo, para que possa sacrificar asDraw
chamadas por isso, o que significa que esse código seria chamado com menos frequência.Normalmente, a iluminação nos jogos 2D é feita com um Mapa Normal para todos os seus sprites, e calcule os efeitos de iluminação 3D nos seus sprites 2D. Isso é conhecido livremente como "2.5D". No entanto, eu não recomendaria fazer isso no seu primeiro jogo, pois é complexo.
Aqui está um vídeo incrível de alguém que fez isso no XNA: http://www.youtube.com/watch?v=-Q6ISVaM5Ww
Dito isto, provavelmente existem maneiras de trapacear e obter um sistema de pseudo-iluminação que possa funcionar com várias suposições.
fonte
É difícil sugerir uma abordagem se você não for completamente específico sobre o efeito que está tentando alcançar. Detalhes como se as luzes devem ser obstruídas pelo ambiente ou não, qual é o ponto de vista do seu jogo, até que ponto a luz deve interagir com o ambiente etc.
Vou largar meus dois centavos embora. Veja se este tutorial de Catalin Zima, intitulado Dynamic 2D Shadows, se encaixa na sua conta. Como você pode ver, a luz tem um raio e não passa por obstáculos. Você pode animar um pouco o raio e a cor para torná-la mais próxima de uma luz real da tocha.
Nesse caso, a luz atua como uma espécie de sobreposição na parte superior da cena, mas não interage com ela da mesma forma que no exemplo de John, embora leve em consideração os obstáculos.
Editar
Catalin vincula a outro artigo que ele usou como referência, mas o link está quebrado. Aqui está um link atualizado .
fonte