游戏编程最佳实践,课堂内外运动?

时间:2013-05-12 13:51:48

标签: c++ sfml

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

我正在考虑将sf::Event传递给更新功能以读取按钮并在类中进行移动。但我不确定这是一个聪明的举动。代码将变得干净,但我记得在某个地方读取按钮按下之类的东西不应该在类中完成。问题是我不知道为什么,如果它甚至是真的。

有人可以给我一些关于此的提示吗?

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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”是一个布尔数组,我将不同的键设置为true或false,具体取决于它们是否被按下。然后在事件轮询和密钥更新完成后,我有我的游戏逻辑(这里我删除了除了一行之外的所有内容以简化例程)。请记住使用计时器来保持不变的游戏玩法。 希望这会对你有所帮助。