저는 현재 Win32 API 및 C++의 프로그래밍 과정을위한 작은 공 물리 엔진을 작성하는 중입니다. 나는 GDI 백 버퍼 렌더러와 전체 GUI (조정할 더 많은 것들)를 마쳤지 만, 나는 완성에 가깝다. 마지막으로 공을 던지기 만하면되는 큰 장애물이 있습니다. (하지만이 문제는 직접 해결할 수 있습니다.)하지만 가장 큰 문제는 공이 튀는 것입니다. 무슨 일이 일어나는가하면 나는 공을 던져서 정말로 떨어지지만 한번 튀어 오르면 나는 그것을 풀어 주었다. 우스운 일은 특정 높이 이하에서만 발생합니다. (당신이 더 이상 코드 나 설명이 필요하면 문의하시기 바랍니다,하지만 너희들이 내 코드를 살펴 가질 수 있다면 나는 대단히 감사합니다.) 몇튀어 오르는 공이 에너지 보존 규칙을 따르지 않음
#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