不参加C ++课程的事件对象

时间:2015-10-04 00:28:15

标签: c++

我正在使用C ++游戏教程,我无法弄清楚为什么我创建的类对象给出了“Expression必须具有类类型”的错误。该对象称为“menuEvent”,当您将鼠标悬停在变量上时,在简介的第一行显示“sf :: Event menuEvent”,然后在简介的第二行显示“Error:expression必须具有类类型” ”。它在相同的简报中是矛盾的,我无法弄明白。我正在使用C ++代码在Visual Studio 2015中工作。任何帮助将非常感激。这就是我所拥有的;

这篇文章来自我的一个外部依赖文档;

namespace sf
{
class Event
{
public:
struct MouseButtonEvent
{
    Mouse::Button button; ///< Code of the button that has been pressed
    int x; ///< X position of the mouse pointer, relative to the left of the owner window
    int y; ///< Y position of the mouse pointer, relative to the top of the owner window
};
};
}

然后这件作品来自我的一个源文件;

MainMenu::MenuResult MainMenu::HandleClick(int x, int y)
{
std::list<MenuItem>::iterator it;

for (it = _menuItems.begin(); it != _menuItems.end(); it++)
{           
    sf::Rect<int> menuItemRect = (*it).rect;

    if(menuItemRect.contains(sf::Vector2<int>(x,y)))
        {
            return it->action;
        }
}

return Nothing;
}

MainMenu::MenuResult MainMenu::GetMenuResponse(sf::RenderWindow& window)
{
sf::Event menuEvent;

while (true)
{
    window.pollEvent(menuEvent);
    // The above line with menuEvent it reads as being of the sf::Event type

    if (menuEvent.type == sf::Event::MouseButtonPressed)
    {
        //But the below line here when I hover over "menuEvent" it shows that it's of the sf::Event type, but then right below that it says "Error:expression must have class type".
        return HandleClick(menuEvent.MouseButtonPressed.x , menuEvent.MouseButtonPressed.y);
    }

    if (menuEvent.type == sf::Event::Closed)
    {
        return Exit;
    }
}

}

2 个答案:

答案 0 :(得分:0)

您宣布了一个名为sf::Event的课程。

此类声明一个名为MouseButtonEvent的内部类。

MouseButtonEvent不是班级成员。这是一个内心阶层。

您声明了名为“menuEvent”的sf::Event实例:

sf::Event menuEvent;

您的编译器无法编译以下表达式:

HandleClick(menuEvent.MouseButtonPressed.x,
            menuEvent.MouseButtonPressed.y);

错误是因为sf::Event没有名为MouseButtonPressed的类成员(从技术上讲,这不完全正确,但我注意到这个问题没有“language-lawyer”标签,所以我正在快速地玩它......)

表达式“menuEvent.MouseButtonPressed”是对menuEvent类名为“MouseButtonPressed”的成员的引用。

没有这样的班级成员。 MouseButtonPressed是一个内部类,而不是类成员。

我的代码的意图并不清楚,所以我无法建议代码在这里尝试完成的正确语法。

答案 1 :(得分:0)

那就做到了!非常感谢Sam Varshavchik的帮助。

这是我的最终代码版本;

外部作品;

namespace sf {
  class Event
    {
      public:
      struct MouseButtonEvent
        {
          Mouse::Button button; ///< Code of the button that has been pressed
          int x; ///< X position of the mouse pointer, relative to the left of the owner window
          int y; ///< Y position of the mouse pointer, relative to the top of the owner window
        };

      MouseButtonEvent btnVariable;
    }
}

源文件;

MainMenu::MenuResult MainMenu::HandleClick(int x, int y)
{
  std::list<MenuItem>::iterator it;

  for (it = _menuItems.begin(); it != _menuItems.end(); it++)
   {
    sf::Rect<int> menuItemRect = (*it).rect;

    if(menuItemRect.contains(sf::Vector2<int>(x,y)))
        {
            return it->action;
        }
   }
  return Nothing;
}

MainMenu::MenuResult MainMenu::GetMenuResponse(sf::RenderWindow& window)
  {
    sf::Event menuEvent;

    while (true)
    {

    window.pollEvent(menuEvent);

    if (menuEvent.type == sf::Event::MouseButtonPressed)
      {
        return HandleClick(menuEvent.btnVariable.x , menuEvent.btnVariable.y);
      }

    if (menuEvent.type == sf::Event::Closed)
      {
        return Exit;
      }

    }
  }