Estou fazendo um jogo semelhante ao Legend of Zelda: Link to the Past (ação-aventura 2D de cima para baixo). Eu quero que o personagem fique centralizado na tela quando ele se mover.
Atualmente, sempre que o jogador quer se mover, movo todo o mapa na direção oposta. Isso funciona, mas à medida que adiciono mais objetos ao mundo, movê-los fica mais complicado.
Existe uma maneira melhor de abordar isso?
Respostas:
A maneira típica de lidar com isso é criar um objeto de câmera. A forma mais simples de uma câmera é apenas uma posição. Esta câmera simples define o "centro" da visão atual. Para não modificar todas as posições de seus ladrilhos / entidades, basta subtrair as coordenadas da câmera das posições ao desenhar. Nesta situação, a câmera não "se move".
Enquanto a câmera e seu personagem compartilham uma posição na maioria das vezes, você ainda pode tê-los como valores separados. Assim, é possível, por exemplo, impedir que a câmera se mova quando chegar ao fim do mundo, mas permita que o jogador para continuar em movimento.
Uma câmera um pouco mais avançada se move. Todas as entidades e blocos são desenhados sem deslocamento e a posição a partir da qual você está renderizando é alterada. Isso é muito semelhante à câmera mais básica, e você ainda pode realizar muitas das mesmas otimizações para renderização seletiva (apenas chamando o
draw
que a câmera pode ver), em ambas. É essencialmente apenas uma maneira diferente de pensar sobre isso.fonte
cam variables
... e ofereceu um método alternativo ... stackoverflow.com/questions/18199373/...Não, este é o caminho errado para fazer isso.
Como você vai fazer a detecção de armadilhas? E quando o jogador atinge as bordas das paredes? Seu sistema de visualização funcionará para masmorras ou você terá que reescrever uma parte significativa do código?
O mundo é geometria. O jogador é geometria. O mundo não se move. O jogador faz. Defina a posição da câmera para centralizar no player. Sempre . E é só isso.
Não tente ser extravagante com "ah, se eu deslizar pelo mundo, ele dará a aparência que o jogador está movendo". Você só vai complicar a matemática com sistemas de coordenadas estranhos no final do dia.
É verdade que a renderização do OpenGL realmente funciona "fixando a câmera para apontar para baixo - z e transformando e girando toda a geometria do mundo para que ela caiba no volume de visualização canônico", mas você não deve pensar dessa maneira ao programar .
gluLookAt
tem parâmetros nomeadoseye
,look
eup
por uma razão - para que você possa pensar em termos de um sistema de coordenadas sensata.fonte