Qual é a maneira mais prática de implementar câmera / viewport em um jogo 2D?
Eu li que devo armazenar a posição mundial do objeto em vez da posição relativa à tela?
Situação atual:
Eu implementei um jogo 2D simples, onde carrego objetos e níveis de arquivos XML. Atualmente, o arquivo XML de nível se parece com isso:
<map>
<tile obj="ground" x="0" y="555" />
<tile obj="ground" x="16" y="555" />
<tile obj="ground" x="32" y="555" />
...
</map>
Todos os objetos têm uma "posição" do vetor 2D armazenando sua localização atual na tela.
O que eu quero que seja:
Na foto:
- A câmera é 800x600 ou 640x480
- Blocos e sprites são 16x16 pixels.
- O tamanho do mundo pode variar
- As coordenadas provavelmente devem ser normalizadas em relação ao mundo, não à tela?
- A posição da janela de visualização em relação ao x, y do jogador e se move quando o jogador atinge a zona morta da câmera (semelhante a este vídeo ).
Estou perguntando pseudo exemplos / artigos, mas se você precisar saber o que estou usando para o desenvolvimento: SDL & C / C ++.
c++
2d
architecture
camera
bluekirai
fonte
fonte
Respostas:
Você precisa ter todos os objetos posicionados em relação ao mundo em vez da tela. Sua câmera também deve ter suas próprias coordenadas mundiais para que possa ser desenhada em uma posição relativa no mundo. Também pode ser conveniente que sua câmera siga um objeto; portanto, onde quer que esteja, a câmera usa apenas suas coordenadas. Normalmente, as coordenadas da câmera a posicionam no canto superior esquerdo. Isso significa que a câmera teria uma posição mundial de aproximadamente (0,24) na imagem .
Quanto ao desenho dos objetos que a câmera pode "ver", você deve desenhar todos os objetos relativos às coordenadas do mundo da câmera. Para calcular a posição da tela de um objeto em relação à câmera, basta:
Obviamente, alguns objetos não são realmente visíveis para a câmera, então você pode implementar um sistema de seleção de exibição.
fonte
É melhor fazer tudo isso na GPU usando as matrizes World e View, não modificando onde você desenha os objetos na CPU.
Dessa forma, você pode mudar a câmera arbitrariamente (até aproximar e afastar!) E ela funcionará magicamente. Você ainda pode selecionar a seleção, para economizar tempo de empate. E nenhum código para desenhar o mundo precisará ser alterado depois que você tiver configurado as matrizes de exibição e mundo corretamente.
No SDL, você provavelmente pode simplesmente incluir chamadas OpenGL, como
glOrtho
eglTranslate
.Veja este tópico .
fonte