游戏编程最佳实践,课堂内外运动
Game programming best practice, movement in or outside class?
我现在正在用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,这取决于它们是否被按下。然后在事件轮询和键更新完成后,我就有了我的游戏逻辑(这里我删除了所有内容,只保留一行来简化示例)。记得使用计时器来保持游戏的持续性。
相关文章:
- 粒子系统:所有粒子都朝同一方向运动
- 如何组合许多连续的图像来模拟逼真的运动模糊?
- 太空入侵者 – 2D 矢量运动算法
- 在虚幻引擎中使用运动控制器组件,C++而不是蓝图
- OpenCV的卡尔曼滤波器过渡矩阵如何处理时间(如t和t^2)进行运动预测?
- 如何在课堂上重用和重新初始化 c++ discrete_distribution?
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 如何使用OpenCV作为运动检测器(而不是寻找视频输出)
- C++来自课堂的内存数据?
- 一维阵列的运动检测(神经网络或其他选项?
- 使用带有 PIR 传感器的米利斯检测连续运动
- 部分课堂上的互斥体
- 课堂上的一行,使整个应用程序坏了. 0xC000005错误
- 如何在课堂上正确使用升压通道(和光纤)?
- 如何在课堂上进行多个打字重载
- 在 GTKMM 中捕捉鼠标运动
- 如何在课堂上访问私有结构
- 使用Mutex,lock_guard,在课堂中正确地lock
- 当记忆分配给课堂时
- 游戏编程最佳实践,课堂内外运动