帮助命中测试功能

时间:2011-02-25 06:20:14

标签: c++ algorithm user-interface

我正在制作一个Gui,其中Widgets有子节点,并且子节点在命中测试和渲染中被剪切到父节点的矩形。然而,它并不总是这样。小部件可以选择不剪切其子级。在这种情况下,子节点绑定到父节点的父节点。我的渲染目前反映了这一点,但我的命中测试没有。

这是我的热门测试:

AguiWidget* AguiEventManager::GetWidgetUnderMouse( AguiWidget* root,
                                            const AguiMouseEventArgs &mouse )
{
    /* sets the current node to the root node
    while a widget passes the hit test
    and the current node has children,
    iterate through the current node's 
    children and set the current node
    to the child who passes the hit test */

    AguiWidget* currentNode = root;

        bool foundsomething = true;
        while(foundsomething)
        {
            foundsomething = false;
            if(currentNode->getChildWidgetCount() > 0)
            for (std::vector<AguiWidget*>::const_reverse_iterator rit = 
                currentNode->getChildRBeginIterator();
                rit < currentNode->getChildREndIterator(); ++rit) 
            { 
                if (((*rit)->intersectionWithPoint(mouse.getPosition())
                    )
                    && (*rit)->isEnabled() && (*rit)->isVisible()) 
                { 
                     foundsomething = true;
                     currentNode = *rit;
                     break;
                } 

            } 

        }
        return currentNode;


}

我怎么能修改它来处理(* rit) - &gt; isClippingChildren(); ?

目前基本上,它的作用是,它找到第一个通过命中测试的小部件,然后通过它的子项进行挖掘,因为只有它们才有资格。它继续这样做,直到没有更多的孩子可以挖掘,因此找到的最后一个小部件是正确的。这需要改为更像这样的东西:

如果窗口小部件没有剪切其子节点,那么如果它的父节点通过了命中测试,我们将检查没有裁剪其子节点的子节点的子节点。如果他们都没有通过命中测试,那么我们需要返回并继续我们所处的位置。

我觉得某种类型的队列可能有用,但我只是不确定如何。

修改的基本结果是,与上面使用相同算法的结果相同,除非小部件没有剪切其子节点,我们只是将其子节点作为父节点的子节点处理。

由于

1 个答案:

答案 0 :(得分:1)

给你的AguiWidget一个hitTest,让它在积极的时候递归到它的孩子身上。 然后,当单击剪切区域时,父(剪辑)小部件的gitTest将失败,并且永远不会对剪辑的小部件执行命中测试。