É tudo relativo. Realmente, você está sempre transformando sua visão em relação à sua posição fixa no jogador.
Então, esquecendo a tela por enquanto, digamos que você tenha essas 3 etapas (representando as posições conforme atualizadas em cada loop do jogo):
playerWorldPosition = 50, 100; objectWorldPosition = 60, 200;
playerWorldPosition = 55, 110; objectWorldPosition = 60, 160;
playerWorldPosition = 60, 120; objectWorldPosition = 60, 120;
(como x, y em cada caso)
Como você pode ver, o jogador está voando ou pulando e se movendo levemente para a direita, enquanto o objeto (pode ser um powerup) está caindo diretamente. O jogador pega o poder. Agora, como você desenha essa tela?
Primeiro, vamos supor que você queira o seu player no centro da tela o tempo todo. Portanto, a visualização é bloqueada para o player - essa é a abordagem mais simples de visualizar. A posição do seu jogador será sempre screenCentre
(ie screenWidth/2, screenHeight/2
). Como você consegue a posição na tela de outros objetos no mundo?
objectScreenPosition = (objectWorldPosition - playerWorldPosition) + screenCentre;
Você pode ver que essa fórmula funciona mesmo para o jogador real, pois (playerWorldPosition- playerWorldPosition) + screenCentre
é igual a screenCentre
. Portanto, você pode aplicar a mesma fórmula a cada entidade do seu jogo, percorrendo uma lista. Você pode usar essa abordagem simples para desenvolver outras coisas (como atraso na câmera, casos em que você está no canto de um nível etc.)