2

一些代码:

Menu.Handle_MouseOvers(MousePosition); //Runs function below

void Handle_MouseOvers(Vector2<int> &MousePositions) ///Runs function below
{
    if (MenuButtons.size() > 0)
    MenuButtons[0].CheckContains(MousePositions);
}

void CheckContains(Vector2<int> &MousePositions)
{
    if (ButtonShape.GetShape() == "Rect" && ButtonShape.GetRect().Contains(MousePositions)) ///This doesn't run sometimes
    {
        MouseOver = true;
        std::cout << "MouseOver is true" << std::endl;
    }
    else{
        std::cout << "mouseOver is false" << std::endl;
        MouseOver = false;
    }
}

出于某种原因,ButtonShape.GetRect().Contains(MousePositions) 只运行了大约 80% 的时间。我在函数中放置了一些 couts,当它失败时,它根本不运行该函数。我不知道为什么它大部分时间都可以工作,哈哈。有没有人有任何想法?任何帮助将不胜感激。

将此添加为编辑;

bool Contains(Vector2<int> &MousePosition)
{
    std::cout << MousePosition.x << " " << MousePosition.y << std::endl;
    if (MousePosition.x >= x && MousePosition.x <= x + Width && MousePosition.y >= y && MousePosition.y <= y + Height)
        return true;
    else
        return false;
}
4

2 回答 2

2

一个原因可能是因为这是一个逻辑/布尔表达式:

ButtonShape.GetShape() == "Rect" && ButtonShape.GetRect().Contains(MousePositions)

这样&&工作:

  • 如果左侧的表达式为假,则它的计算结果为假而不计算右侧的表达式
  • 如果左侧表达式的计算结果为真,则仅计算第二个表达式
    • 现在,如果右侧表达式的计算结果为假,则结果为假
    • 否则,最终结果为真。

如果您在删除后进行测试,请GetShape确保每次Shape都设置为。Rect


如果该功能每次都没有运行,那么可能是您MousePositions每次都没有正确设置。根据您的函数代码,这将显示为函数未运行。

于 2013-04-22T01:44:41.257 回答
1

如果 ButtonShape.GetShape() != "Rect",那么第二个表达式(包含对 ButtonShape.GetRect().Contains(MousePositions) 的调用)将不会被调用,因为它不需要满足整个表达式 -这称为“短路”。

于 2013-04-22T01:51:09.943 回答