Estou usando o Direct3D com o invólucro D3DXSPRITE para desenhar os blocos na tela. Eu tenho uma classe de bloco que contém membros como colisão e tipo de bloco, então eu tenho uma matriz de blocos, por exemplo
Grade de mosaico [256] [256];
Qual seria um método melhor?
-Desenha o jogador no centro da tela e desloca para onde o mapa desenha.
Mova o player com a câmera a seguir.
Eu estava usando o primeiro método, mas está ficando muito complicado quando você chega ao canto superior esquerdo do mapa e quando outros jogadores / inimigos estão no mapa e se movem ao mesmo tempo
se eu fizer a câmera seguir o player, eu teria que chamar spriteBatch-> Draw (...) para cada bloco de grade único, embora apenas alguns possam caber na tela?
Mover a câmera nas coordenadas do mundo e fazer com que seu personagem se mova ao redor do mundo é a maneira mais fácil de abordar esse problema. Trabalhar nas coordenadas do mundo significa que você não precisa fazer nenhum cálculo extra quando se resumir a todos os outros sistemas que devem funcionar em um ambiente. sistema de coordenadas relativas e também entender onde elas estão nas coordenadas do mundo.
Como você está trabalhando em 2D, outra boa dica é fazer um particionamento espacial da maneira mais fácil possível para criar um sistema de grade mundial virtual, isso permitirá que você gerencie cada bloco individualmente associando sprites e outros recursos por bloco, portanto, em essência, o processo seria:
crie alguma classe de bloco que possa conter as coordenadas de limite do bloco e quaisquer recursos que um bloco específico possa precisar (sprites, inimigos, etc.).
decida o tamanho do seu mundo e crie uma matriz 2D (você pode usar uma dimensão e acessá-la como 2D) de blocos, cada um representando um pouco do seu mundo com todos os recursos associados.
apenas atrai recursos do bloco em que o jogador está e seus vizinhos.
Com uma grade, você pode facilmente descobrir em qual bloco o jogador está, com base em sua posição em relação ao início da grade.
Para solucionar o problema que você mencionou sobre a câmera, você precisa tornar o player e a câmera dois sistemas independentes, nos quais a câmera não vai mais longe do que o centro dos ladrilhos das bordas; assim, quando o jogador viaja para esse ladrilho, ele ainda pode viajar pelo todo o bloco como ele é limitado pelas coordenadas do mundo (ou seja, não está mais centralizado na tela), mas a câmera está bloqueada.
fonte
Eu uso uma superfície. Crio o mundo inteiro em uma superfície fora da tela e mantenho as coordenadas x e y. Eu as altero à medida que o jogador se move e cada quadro desenha um retângulo de 1028 x 768 da superfície para o buffer usando x e y.
como para outras pessoas, dou-lhes um x e y e deixo que se movam pelo mundo como bem entenderem, ao desenhar verifico se x e y estão no retângulo 1028 x 768 e, se sim, desenhá-los (uso texturas para as pessoas) .
Eu tenho o player no centro da tela e verifico se a borda do mundo atingiu a borda da tela. Nesta circunstância, o jogador se move pela tela para a extremidade do mundo e de volta ao centro, em seguida, o mundo começa a se mover novamente. parece difícil e levou um tempo, mas não é tão ruim de fazer.
Uso 64 x 64 peças e o maior mundo que usei até agora é 50 x 60 peças.
Tudo isso é feito em x direto com c ++
fonte
É bastante normal que o código tenha um pouco de dor nos cantos de um mundo lado a lado, ao determinar quais são os níveis a serem traçados e simultaneamente garantir que a câmera não saia do mundo. Esses casos extremos são basicamente a coisa mais compelx na implementação de um mundo baseado em blocos 2D que é maior que a resolução da tela. Fica muito mais complexo se você suporta o zoom e o zoom no cursor: D
fonte