我最近在TrollTech的Qt教程中学习Qt,我对this page中计算子弹位置的源代码感到困惑:
QRect CannonField::shotRect() const
{
const double gravity = 4;
double time = timerCount / 20.0;
double velocity = shootForce;
double radians = shootAngle * 3.14159265 / 180;
double velx = velocity * cos(radians);
double vely = velocity * sin(radians);
double x0 = (barrelRect.right() + 5) * cos(radians);
double y0 = (barrelRect.right() + 5) * sin(radians);
double x = x0 + velx * time;
double y = y0 + vely * time - 0.5 * gravity * time * time;
QRect result(0, 0, 6, 6);
result.moveCenter(QPoint(qRound(x), height() - 1 - qRound(y)));
return result;
}
在倒数第三行:
result.moveCenter(QPoint(qRound(x), height() - 1 - qRound(y)));
我认为- 1
是无稽之谈,不是吗?
答案 0 :(得分:3)
你有一个小部件:
如果窗口小部件的高度为height
,则y == 0
行位于窗口小部件的顶部,底线为y == height - 1
坐标。因此,如果您想在窗口小部件的底线显示一个点,则应将其y
坐标设置为height - 1
。
显然,他们使用小部件的底部作为地面级别,因此子弹只能在此级别之上或之上。