Como mantenho meu personagem centralizado na tela?

8

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?

asbumste
fonte
19
Crie uma câmera e mova-a. Basicamente, tudo será desenhado com um deslocamento baseado na posição da câmera. Mover o universo para mover seu personagem é um pouco excessivo, Professor Farnsworth.
MichaelHouse
11
+1 para fazer referência à referência para futurama: P
Maçaneta da porta
@ Byte56 Obrigado, isso é parecido com o que estou fazendo, então eu posso continuar do jeito que está. Mas isso faz muito sentido. Deseja colocar isso em uma resposta para que eu possa aceitá-lo?
precisa saber é o seguinte
Qual subsistema de renderização você está usando?
22413 Bobobobo

Respostas:

8

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 drawque a câmera pode ver), em ambas. É essencialmente apenas uma maneira diferente de pensar sobre isso.

MichaelHouse
fonte
Oi Byte, eu implementei o que você disse com sucesso ... eu acho. Mas agora estou tendo problemas ... você pode ajudar a dar uma olhada? Um cara disse que eu realmente não precisa de nenhum cam variables... e ofereceu um método alternativo ... stackoverflow.com/questions/18199373/...
Growler
Vou dar uma olhada mais tarde, por enquanto, sugiro que você pergunte sobre isso no chat .
Michaelhouse
3

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 . gluLookAttem parâmetros nomeados eye, looke uppor uma razão - para que você possa pensar em termos de um sistema de coordenadas sensata.

bobobobo
fonte
Um dos maiores erros que cometi com um sistema GL UI que estava desenvolvendo foi tentar trabalhar em coordenadas canônicas ([-1,1]) "para simplificar". Todos os objetos de tela tinham coordenadas em [-1,1]. Isso foi um grande erro, eu estava constantemente tentando pensar nessa faixa [-1,1], convertendo entre pixels e NDC, convertendo de volta. Quando desisti dessa ideia de trabalhar no NDC e apenas trabalhei em pixels e converti-o no NDC pouco antes da renderização como você deveria , havia um mundo de diferenças em como era fácil pensar em posicionar elementos na tela, eventos de entrada de processo, etc.
bobobobo