Em um jogo baseado em blocos 2D, qual é um bom método para rolar?


9

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?

Respostas:


4

Provavelmente, é melhor fazer todas as atualizações e cálculos em unidades mundiais "reais" e mover a câmera. Seu spriteBatch pode executar o descarte sozinho, mas se for muito lento, você pode tentar determinar quais peças precisam ser exibidas na tela e desenhá-las apenas.


Você provavelmente vai querer escrever código para desenhar apenas os sprites visíveis, especialmente se achar que precisa aumentar o tamanho da sua grade.

2

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.


0

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 ++


11
Isso parece um enorme porco da memória. Manter o mundo inteiro desenhado em uma superfície fora da tela vai causar problemas de memória quando você começar a querer fazer coisas como ter várias camadas (animadas) para o seu mundo e expandi-lo além do que você tem agora. Seria muito melhor manter as informações sobre o mundo e desenhar apenas as partes / objetos que precisam ser desenhados quando precisam ser desenhados. Apenas meus 2 centavos. :)
Richard Marskell - Drackir

@ Drackir Acho que você não entendeu. apenas o mundo é retirado da tela, coisas como as outras pessoas são rastreadas e desenhadas no buffer de backup quando são necessárias. Também não me vejo fazendo mais que 70 x 70 mundo. quando digo mundo, quero dizer área, pode ser uma cidade, uma masmorra ou o interior de uma casa, quando o jogador se move entre eles, a superfície fora da tela é reconstruída. sim, é preciso memória, mas os blocos 2D nas unidades modernas de terrabita o tornam insignificante e, em poucos segundos, o carregamento é um preço pequeno a pagar pela rolagem e animação suaves. mas sim, existem maneiras melhores e mais difíceis :)
Skeith

A superfície deve ser armazenada na memória do cartão GFX, não no disco rígido. No entanto, acredito que se a memória do cartão GFX for muito grande, ela moverá as superfícies para o HD, o que reduziria consideravelmente as coisas. É certo que já faz um tempo desde que lidei com essas coisas, então não me lembro exatamente como funcionou, mas acho que desde que você não esteja desenhando um mundo grande demais, tudo bem. :)
Richard Marskell - Drackir

@ Drackir Isso é interessante saber, nunca pensei nisso assim. Descobri que dessa maneira me dá um pergaminho mais suave que, se eu desenhar dinamicamente novos ladrilhos, acho que ele se encaixa bem, mas terei que analisar isso.
Skeith

Eu estava trabalhando em um jogo em que tinha mapas 31x31, mas eles foram anexados lado a lado. Eu estava tentando trabalhar com o mecanismo de outra pessoa e eles desenhavam todos os mapas ao redor do mapa em que o jogador estava; nove mapas no total. Cada mapa tinha várias (acho 6) camadas. Assim como 31x31x9x6 = 51894 blocos sendo desenhados (no máximo, é claro; nem todos os blocos estavam cheios) toda vez que o usuário alterna os mapas. Isso foi uma grande desaceleração para mim, então reescrevi a rotina de desenho para desenhar apenas os ladrilhos que cercavam o jogador até 1 ladrilho além da borda da tela (para lidar com ladrilhos parciais enquanto se movia).
Richard Marskell - Drackir

0

É 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.