Eu tenho objetos no meu jogo que se movem mais rápido a 45 graus do que a 90 graus.
Cada objeto tem
- Posição do ponto (x, y)
- Direção Vector2D (x, y)
- Int velocidade
E o que faço durante uma atualização é que a nova posição é calculada como:
position.x += direction.x * speed
position.y += direction.y * speed
Como faço para corrigir isso? Quero que ele se mova com a mesma velocidade em qualquer ângulo.
Respostas:
Isso pode ser explicado pelo teorema de Pitágoras , que é a seguinte fórmula:
No seu caso, ao mover para a direita, você está usando (x: 1, y: 0), o que nos fornece
Ao mover para cima e para a direita, você está usando (x: 1, y: 1), o que nos fornece
Como você pode ver, o comprimento na diagonal é maior que o comprimento nos eixos cardinais.
Como outros já mencionaram, você deve simplesmente normalizar seu vetor de direção. Se você usa o XNA, é feito assim:
fonte
Normalize seu vetor de direção antes de usar.
Conforme explicado pelo MindWorX, isso pode ser entendido simplesmente, se você está preocupado com os vetores de direção que possivelmente causam sofrimento, verifique se eles são vetores unitários (magnitude / comprimento de 1).
Se normalizado:
fonte
Como você está calculando sua direção? Se 45 graus é
(1,1)
, certamente será mais rápido que 90 graus(1,0)
.Eu sugiro que você use algo como isto:
Para obter o ângulo em radianos, você precisará multiplicar seus graus com
PI / 180
ou, melhor ainda, com o usoMathHelper
. Por exemplo.fonte
Jason,
Em vez de ter três atributos de objeto,
geralmente é muito mais fácil combinar a direção e a velocidade em um vetor de velocidade. Então você tem apenas dois atributos,
Atualizando posição
Quando você precisa atualizar a posição do objeto, é tão simples quanto:
onde
Δt
está seu delta de tempo - ou diferença de tempo - ou intervalo de tempo.Atualizando posição e velocidade
Também é muito fácil lidar com a aceleração (como na gravidade). Se você tiver um vetor de aceleração, poderá atualizar a velocidade e a posição juntas assim:
(Esta é basicamente a fórmula s = vt + ½at² da Física 101.)
Aplicando uma velocidade
Se você deseja aplicar uma determinada velocidade em alguma direção normalizada, pode definir a velocidade da seguinte forma:
Derivando uma velocidade
E se você precisar fazer o inverso - derivando a velocidade e a direção de um determinado vetor de velocidade - você pode simplesmente usar o teorema de Pitágoras ou o
.Length()
método:E uma vez que a velocidade é conhecida, a direção normalizada pode ser calculada dividindo a velocidade pela velocidade (tomando cuidado para evitar a divisão por zero):
fonte