Я написал довольно простое java-приложение, которое позволяет вам перетаскивать мышью и на основе длины перетаскивания мышью, которую вы сделали, и будет стрелять в этот мяч, отскакивая от стен, когда он идет.
Вот скриншот:
alt text http://img222.imageshack.us/img222/3179/ballbouncemf9.png
Каждый из кругов на экране является объектом Ball. Движение шаров разбивается на вектор x и y;
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 position
}
}
Это отлично работает. Все шары отскакивают вокруг и вокруг от стены до стены.
Однако я решил, что хочу включить эффекты гравитации. Я знаю, что объекты ускоряются к земле со скоростью 9,8 м/с, но я не знаю, как это следует перевести в код. Я понимаю, что yVector будет затронут, но мои эксперименты с этим не имели желаемого эффекта, который я хотел.
В идеале я хотел бы добавить эффект гравитации в эту программу, а также позволить шарам несколько раз отказываться, прежде чем оседать на "землю".
Как я могу создать этот прыгающий эластичный эффект гравитации? Как я должен манипулировать векторами скорости шара на каждом шаге? Что нужно делать, когда оно попадает в "землю", чтобы я мог позволить ему снова отскакивать, но несколько короче, чем в предыдущее время?
Любая помощь приветствуется, указывая мне в правильном направлении.
Спасибо за комментарии всем! Он уже отлично работает!
В моем шаге() я добавляю константу силы тяжести к моему yVector, как и люди, и это мой 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.
}
Тем не менее, шары будут продолжать скользить/рулить по полу. Я предполагаю, что это потому, что я просто беру процент (90%) от их векторов каждый отскок, и он никогда не равен нулю. Должен ли я добавить проверку, что если xVector становится определенным абсолютным значением, я должен просто изменить его на ноль?