我正在制作一个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(); ?
目前基本上,它的作用是,它找到第一个通过命中测试的小部件,然后通过它的子项进行挖掘,因为只有它们才有资格。它继续这样做,直到没有更多的孩子可以挖掘,因此找到的最后一个小部件是正确的。这需要改为更像这样的东西:
如果窗口小部件没有剪切其子节点,那么如果它的父节点通过了命中测试,我们将检查没有裁剪其子节点的子节点的子节点。如果他们都没有通过命中测试,那么我们需要返回并继续我们所处的位置。
我觉得某种类型的队列可能有用,但我只是不确定如何。
修改的基本结果是,与上面使用相同算法的结果相同,除非小部件没有剪切其子节点,我们只是将其子节点作为父节点的子节点处理。
由于
答案 0 :(得分:1)
给你的AguiWidget一个hitTest,让它在积极的时候递归到它的孩子身上。 然后,当单击剪切区域时,父(剪辑)小部件的gitTest将失败,并且永远不会对剪辑的小部件执行命中测试。