我正在尝试使用WIN32 GUI绘制一个Bouncing球,所以我为球位置定义了一个2d矢量 和我的屏幕尺寸的矩形地图
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);
现在看起来好多了,但问题是球只弹了一次,然后第二次进入地面消失了!
答案 0 :(得分:1)
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;
}
答案 1 :(得分:0)
else {
vel-=0.5f;
ballpos.y-=vel;
}
您可能会在此处获得负值。