Como aplico gravidade à minha aplicação de bola quicando?
Eu escrevi um aplicativo java bastante simples que permite arrastar o mouse e, com base no comprimento do mouse, ele dispara uma bola nessa direção, ricocheteando nas paredes à medida que avança.
Aqui está uma captura de tela rápida:
texto alternativo http://img222.imageshack.us/img222/3179/ballbouncemf9.png
Cada um dos círculos na tela é um objeto Bola. O movimento das bolas é dividido em um vetor xey;
public class Ball {
public int xPos;
public int yPos;
public int xVector;
public int yVector;
public Ball(int xPos, int yPos, int xVector, int yVector) {
this.xPos = xPos;
this.yPos = yPos;
this.xVector = xVector;
this.yVector = yVector;
}
public void step()
{
posX += xVector;
posY += yVector;
checkCollisions();
}
public void checkCollisions()
{
// Check if we have collided with a wall
// If we have, take the negative of the appropriate vector
// Depending on which wall you hit
}
public void draw()
{
// draw our circle at it's position
}
}
Isso funciona muito bem. Todas as bolas saltam e giram de parede a parede.
No entanto, decidi que quero poder incluir os efeitos da gravidade. Eu sei que os objetos aceleram em direção à Terra a 9,8m / s, mas não sei diretamente como isso deve se traduzir em código. Sei que o yVector será afetado, mas minha experiência com isso não teve o efeito desejado que eu queria.
Idealmente,Eu gostaria de poder adicionar algum efeito gravitacional a este programa e também permitir que as bolas saltassem algumas vezes antes de se estabelecerem no "solo".
Como posso criar esse efeito de gravidade elástico-saltitante? Como devo manipular os vetores de velocidade da bola em cada etapa? O que deve ser feito quando atinge o "solo" para que eu possa saltar novamente, mas um pouco mais curto que o tempo anterior?
Qualquer ajuda é apreciada em me apontar na direção certa.
Obrigado pelos comentários a todos! Já está funcionando muito bem!
No meu passo (), estou adicionando uma constante de gravidade ao meu yVector como as pessoas sugeriram e este é o meu checkCollision ():
public void checkCollision()
{
if (posX - radius < 0) // Left Wall?
{
posX = radius; // Place ball against edge
xVector = -(xVector * friction);
}
else if (posX + radius > rightBound) // Right Wall?
{
posX = rightBound - radius; // Place ball against edge
xVector = -(xVector * friction);
}
// Same for posY and yVector here.
}
No entanto, as bolas continuarão a deslizar / rolar no chão. Suponho que isso ocorre porque estou simplesmente obtendo uma porcentagem (90%) de seus vetores a cada salto e nunca é realmente zero. Devo acrescentar que, se o xVector se tornar um determinado valor absoluto, devo alterá-lo para zero?