Помощь с функцией проверки удара - PullRequest
1 голос
/ 25 февраля 2011

Я создаю графический интерфейс, в котором у виджетов есть дети, а дети и в тесте на попадание, и при рендеринге обрезаются до прямоугольника родителя.Однако это не всегда так.Виджет может выбрать не обрезать своих детей.В этом случае дочерние элементы привязываются к родительскому прямоугольнику родителя.Мой рендеринг в настоящее время отражает это, но мой тест на попадание не дает.

Вот мой тест на попадание:

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) -> isClippingChildren ();?

По сути, на данный момент он находит первый виджет, который проходит тест на попадание, затем копает свои дочерние элементы, потому что только они могут быть приемлемыми.И он продолжает делать это до тех пор, пока не останется больше дочерних элементов, в которые можно копаться, и, следовательно, последний найденный виджет будет правильным.Это должно измениться на что-то вроде этого:

Если виджет не обрезает своих дочерних элементов, то, если его родительский элемент прошел тест на попадание, мы проверяем дочерние элементы того, кто не обрезает его дочерних элементов.Если ни один из них не пройдет тест на попадание, тогда нам нужно вернуться и продолжить с того места, где мы были.

У меня такое чувство, что какой-то тип очереди может быть полезен, но я просто не уверен, как.

Существенным результатом модификации является то, что результат будет таким же, как если бы использовался тот же алгоритм, что и выше, за исключением того, что виджет не обрезает свои дочерние элементы, мы просто позволяем его дочерним элементам обрабатываться как дочерние элементыродитель.

Спасибо

1 Ответ

1 голос
/ 25 февраля 2011

Дайте вашему AguiWidget хит-тест, и пусть он превратится в своих детей, когда будет положительным. Затем при нажатии на обрезанную область gitTest родительского (обтравочного) виджета завершится неудачно, и для обрезанного виджета тест на удар никогда не будет выполнен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...