Я написал довольно простое Java-приложение, которое позволяет вам перетаскивать мышь и, исходя из длины перетаскивания мыши, оно будет стрелять мячом в этом направлении, отскакивая от стен по ходу движения.
Вот быстрый скриншот:
альтернативный текст 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's 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 становится определенным абсолютным значением, я должен просто изменить его на ноль?