我现在正在用C ++(SFML 2.0)制作我的第一个游戏,并且我试图尽可能干净。在对代码进行一些摆弄之后,我将把它转换为面向对象的代码,但运动让我思考。
我正在考虑将sf::Event
传递给更新功能以读取按钮并在类中进行移动。但我不确定这是一个聪明的举动。代码将变得干净,但我记得在某个地方读取按钮按下之类的东西不应该在类中完成。问题是我不知道为什么,如果它甚至是真的。
有人可以给我一些关于此的提示吗?
答案 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,具体取决于它们是否被按下。然后在事件轮询和密钥更新完成后,我有我的游戏逻辑(这里我删除了除了一行之外的所有内容以简化例程)。请记住使用计时器来保持不变的游戏玩法。 希望这会对你有所帮助。