【问题标题】:Losing a bouncing ball's position失去弹跳球的位置
【发布时间】:2011-05-01 19:34:32
【问题描述】:

我正在尝试使用 WIN32 GUI 绘制一个弹跳球,所以我为球的位置定义了一个 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);

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

【问题讨论】:

  • 您是否检查过值截断?您是否确保没有传递可能导致屏幕坐标不正确的负值?

标签: c++ winapi user-interface


【解决方案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;
}

【讨论】:

    【解决方案2】:
     else {
            vel-=0.5f;
            ballpos.y-=vel;
          }
    

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

    【讨论】:

    • 我试过..... int vel=1; if(!balldown){ v​​el+=1; ballpos.y +=vel; }else { vel-=1; ballpos.y-=vel; } 但我得到相同的结果
    • @Max,解决这个问题的最佳方法是将输出保存到文件中,或者在不绘制弹跳球的情况下将它们打印到屏幕上。应该可以帮助您指出错误。
    • 可能在某个地方我得到一个负值我应该检查 vel
    • @Max,希望你能解决问题:)
    猜你喜欢
    • 2013-05-23
    • 2016-03-02
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    相关资源
    最近更新 更多