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

Game programming best practice, movement in or outside class?

本文关键字:课堂内外 运动 编程 最佳 游戏      更新时间:2023-10-16

我现在正在用c++ (SFML 2.0)制作我的第一款游戏,我正试图让它尽可能干净。在摆弄了一些代码之后,我打算把它转换成面向对象的代码,但是移动让我思考。

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

有没有人可以给我一些提示?

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

是的,正如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,这取决于它们是否被按下。然后在事件轮询和键更新完成后,我就有了我的游戏逻辑(这里我删除了所有内容,只保留一行来简化示例)。记得使用计时器来保持游戏的持续性。