-1

我现在正在用 C++ (SFML 2.0) 制作我的第一款游戏,并且我正试图让它尽可能干净。在摆弄了一些代码之后,我将把它转换为面向对象的代码,但是运动让我开始思考。

我正在考虑将 传递sf::Event给更新函数以读取按钮按下并在类内进行移动。但我不确定这是否是明智之举。代码会很干净,但我记得在某处读到过按钮按下之类的东西不应该在课堂内完成。问题是我不知道为什么,如果它是真的。

有人可以给我一些建议吗?

4

2 回答 2

3

你的问题有点宽泛,但这里有一个我认为人们很难不同意的提示。将输入设备(键盘、鼠标等)与操作分开。您的游戏对象不应响应键盘上的左键,也不应了解任何信息。相反,他们应该响应,例如,“向左走”命令。在单独的代码(可能是 ObjectController 类)中,您将左键绑定到“Go Left”命令。这使得控件更加可配置,因为您可以轻松地绑定A键或左操纵杆按钮。或者,您可以通过插入发出“向左走”命令的 AI 将对象从玩家控制切换到计算机控制。

于 2013-05-12T14:11:07.540 回答
1

是的,正如 Benjamin Lindley 所说,最明智的选择是将输入存储在一个容器中(为键创建一个输入队列、列表或布尔映射),然后在你的游戏逻辑中,根据输入,调用你的对象更新方法. 一个简短的 SFML 示例:

  sf::Clock timer;
  sf::Event Event;
  bool isRunning = true;
  while (isRunning)
    {
      Window.clear(sf::Color(255, 255, 255));
      while (Window.pollEvent(Event))
      {
          switch(Event.type)
            {
             case sf::Event::Closed:
             isRunning = false;
             break;

            case sf::Event::KeyPressed:
                    if (Event.key.code == sf::Keyboard::Up)
                    keys[WK] = true;
                        [...]

                case sf::Event::KeyReleased:
                    if (Event.key.code == sf::Keyboard::Up)
                    keys[WK] = false;
                        [...]
                }
          }
      if (keys[WK])
          MyCharacter.move(0, -100 * timer.getElapsedTime().asSeconds());
      Window.draw(MyCharacter);

      Window.display();
      timer.restart();
    }

这是我如何处理我制作的游戏中的输入的一个例子。“keys”是一个布尔数组,我将不同的键设置为真或假,具体取决于它们是否被按下。然后在事件轮询和键更新完成后,我有了我的游戏逻辑(这里我删除了除一行之外的所有内容以简化示例)。请记住使用计时器来保持恒定的游戏玩法。希望这对您有所帮助。

于 2013-05-13T03:55:23.517 回答