Ich bin derzeit damit beschäftigt, eine kleine Ballphysik-Engine für meinen Programmierkurs in Win32 API und C++ zu schreiben. Ich habe den GDI-Backbuffer-Renderer und die gesamte GUI fertiggestellt (ein paar Dinge müssen noch angepasst werden), aber ich bin der Fertigstellung sehr nahe. Die einzigen großen Hindernisse, die noch bestehen, sind die Kollisionen zwischen den Bällen (aber das kann ich selbst beheben), aber das größte Problem von allen ist das Springen der Bälle. Was passiert, ist, dass ich einen Ball werfe und er wirklich fällt, aber sobald er abprallt, springt er höher als der Punkt, an dem ich ihn losgelassen habe??? das Lustige daran ist, dass es nur passiert, wenn er unter einer bestimmten Höhe ist. Dieser Teil ist der Physik-Code: (Wenn ihr mehr Code oder Erklärungen braucht, fragt bitte, aber ich würde es sehr schätzen, wenn ihr euch meinen Code ansehen könntet).
#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;
}
0 Stimmen
DT wird auf 1/o.REFRESH gesetzt und später in o.REFRESH*DT verwendet, also liegt entweder ein logischer Fehler vor, oder man kann es einfach entfernen.