Я в настоящее время занят написанием маленького физического движка шарика для моего курса программирования в API Win32 и C++. Я закончил визуализатор буферов GDI и весь графический интерфейс (пару дополнительных действий для настройки), но я очень близок к завершению. Единственными серьезными препятствиями, которые в последнее время являются шары на столкновение с мячом (но я могу это исправить самостоятельно), но самая большая проблема из них - это отскок шаров. Что происходит, так это то, что я бросаю мяч, и он действительно падает, но как только он отскакивает, он будет подпрыгивать выше, чем точка, я выпустил его ??? самое смешное, это происходит только при определенной высоте. Эта часть кода физики: (Если вам нужно больше кода или объяснение, пожалуйста, спросить, но я бы очень признательны, если вы, ребята могли бы посмотреть на мой код.)Отскок мяча не соответствует правилу сохранения энергии
#void RunPhysics(OPTIONS &o, vector<BALL*> &b)
{
UINT simspeed = o.iSimSpeed;
DOUBLE DT; //Delta T
BOOL bounce; //for playing sound
DT= 1/o.REFRESH;
for(UINT i=0; i<b.size(); i++)
{
for(UINT k=0; k<simspeed; k++)
{
bounce=false;
//handle the X bounce
if(b.at(i)->rBall.left <= 0 && b.at(i)->dVelocityX < 0) //ball bounces against the left wall
{
b.at(i)->dVelocityX = b.at(i)->dVelocityX * -1 * b.at(i)->dBounceCof;
bounce=true;
}
else if(b.at(i)->rBall.right >= SCREEN_WIDTH && b.at(i)->dVelocityX > 0) //ball bounces against the right wall
{
b.at(i)->dVelocityX = b.at(i)->dVelocityX * -1 * b.at(i)->dBounceCof;
bounce=true;
}
//handle the Y bounce
if(b.at(i)->rBall.bottom >= SCREEN_HEIGHT && b.at(i)->dVelocityY > 0) //ball bounces against the left wall
{
//damping of the ball
if(b.at(i)->dVelocityY < 2+o.dGravity/o.REFRESH)
{
b.at(i)->dVelocityY = 0;
}
//decrease the Velocity of the ball according to the bouncecof
b.at(i)->dVelocityY = b.at(i)->dVelocityY * -1*b.at(i)->dBounceCof;
b.at(i)->dVelocityX = b.at(i)->dVelocityX * b.at(i)->dBounceCof;
bounce=true;
}
//gravity
b.at(i)->dVelocityY += (o.dGravity)/o.REFRESH;
b.at(i)->pOrigin.y += b.at(i)->dVelocityY + (1/2)*o.dGravity/o.REFRESH*DT*METER;
//METER IS DEFINED GLOBALLY AS 100 which is the amount of pixels in a meter
b.at(i)->pOrigin.x += b.at(i)->dVelocityX/o.REFRESH*METER;
b.at(i)->UpdateRect();
}
}
return;
}
DT установлен в 1/o.REFRESH, а затем используется в o.REFRESH * DT, поэтому я предполагаю, что в нем есть какая-то логическая ошибка или вы можете просто удалить его. – schnaader