失去弹跳球的位置



我正试图使用WIN32 GUI绘制一个弹跳球,因此我为球的位置定义了一个二维矢量和一张矩形地图,上面有我的屏幕大小

struct pos {
    float x;
    float y;
};
RECT maprect = {0, 0, 800, 600};
pos ballpos;
ballpos.x=300;
ballpos.y=300;

(当然,我为2dvec使用了一个类,它不止于此(

我画了一个椭圆

Ellipse(backbufferDC, (int)ballpos.x-45, (int)ballpos.y-45,
        (int)ballpos.x+45, (int)ballpos.y+45);

现在,为了使我的椭圆反弹,我在消息循环中使用了以下代码,它运行良好:

bool balldown = false; 
if (ballpos.y > maprect.bottom-40) {
    balldown = true;
}
else if (ballpos.y < maprect.top+300) {
    balldown = false;
}
if (ballpos.y > maprect.bottom-40) {
    balldown = true ;
}
else if(ballpos.y < maprect.top+300) {
    balldown = false;
}
if (!balldown) {
    vel+=1;
    ballpos.y +=3;
}
else {
    ballpos.y-=3;
}

Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
        (int)tankpos.x+45, (int)tankpos.y+45);

但为了让它看起来更逼真,我决定在移动时改变球的速度所以我最终得到了这个代码

float vel;
if (ballpos.y > maprect.bottom-40) {
    balldown = true ;
}
else if (ballpos.y < maprect.top+300) {
    balldown = false ;
}
if (!balldown) {
    vel+=0.5f;
    ballpos.y +=vel;
}
else {
    vel-=0.5f;
    ballpos.y-=vel;
}

Ellipse(bbdc, (int)tankpos.x-45, (int)tankpos.y-45,
        (int)tankpos.x+45, (int)tankpos.y+45);

现在看起来好多了,但问题是球只反弹了一次,然后第二次落地就消失了!

if (!balldown) {
    vel+=0.5f;
    ballpos.y +=vel;
}
else {
    vel-=0.5f;
    ballpos.y-=vel;
}

这种逻辑是错误的。重力总是导致相同方向的加速度,向下。

你应该做的是处理碰撞。与巨大墙壁的弹性碰撞可能看起来像

vel = -vel;

所以最后你有

vel -= 0.5f;
ballpos.y += vel;
if (ballpos.y <= floory) {
    vel = -vel;
    ballpos.y = 2*floory - ballpos.y;
}
 else {
        vel-=0.5f;
        ballpos.y-=vel;
      }

你可能会在这里得到负值。

相关内容

  • 没有找到相关文章

最新更新