Qt图形视图:检测碰撞方向

时间:2013-11-01 13:28:22

标签: c++ qt qgraphicsview

我正在尝试使用qt创建游戏。我在图形视图中有一些障碍(QPixmapItem)。我有一个球,我想要的是它从障碍物上弹开。如何检测障碍物表面的法线,以便计算新的移动方向?例如:

------------------------------
    / \          |
   /   \         | 
  /     \        v
 /       \       ^
/         \      |

1 个答案:

答案 0 :(得分:0)

根据您的评论,您确实正确地解决了问题。然而,你需要得到的解决方案是迭代QPainterPath元素并确定哪些实际上与你的球的方向线相交(使用QLineF这应该是一个相当容易的任务)。此外,简化路径将减少任何贝塞尔曲线到直线,以便于计算(我将把它留给您,因为您不太可能需要自己处理贝塞尔计算或者可能根本不需要处理贝塞尔计算)。由于可能有多个交叉点,接下来您需要确定哪个交叉点最接近您的球的中心。一旦你弄清楚哪个点最接近,在QLineF中使用该元素找到它的法线向量,然后你就可以完成反弹方向的计算。

以下是一些基本的非线程代码,向您展示如何迭代QPainterPath并处理它的元素。

QPainterPath path = item->shape();

path = path.simplified(); //optional if you do not want to handle curveTo elements yourself

QPainterPath::Element element;
QPainterPath::Element P1;
QPainterPath::Element P2;
QPainterPath::Element P3;
QPainterPath::Element P4;

for(int i = 0; i < path.elementCount()-1; ++i)
{
    element = path.elementAt(i);
    if(element.isMoveTo())
    {
        //Do something
    }
    else if(element.isLineTo())
    {
        //Do something with element.x and element.y
    }
    else if(element.isCurveTo())
    {
        P1 = path.elementAt(i-1); // start point
        P2 = path.elementAt(i);   // control point
        P3 = path.elementAt(i+1); // control point
        P4 = path.elementAt(i+2); // end point

        //Do something with cubic bezier points
    }
}