Joh*_*ohn 7 game-engine game-loop
我正在做一个简单的游戏,这是我的第一个游戏项目.
我找到的大多数样本都有一个渲染循环,其中所有的游戏逻辑也是如此,我只是不喜欢这样.假设我有一个X = 0的球,一个X = 10的墙和一个慢机器,第一个循环将球置于X = 7,而在第二个循环中,它将球置于X = 14.它会让游戏崩溃!
这个"渲染循环"是制作游戏的正确方法吗?我应该编写代码来检查每一帧中的这类事情吗?例如,新帧X = 14,最后一帧有X = 7,所以我应该检查是否有从X = 7到X = 14的任何东西?
我当时认为我应该为游戏逻辑和渲染循环设置一个独立的线程,我应该只是"拍摄当前游戏逻辑的快照"并显示,不是吗?
你们这些经验丰富的游戏开发者如何解决这个问题呢?
谢谢!
正如另一个答案所说,你所看到的问题被称为"隧道"这是"子弹穿纸"问题,子弹移动速度快,纸张很薄,你怎么知道碰撞发生了?
如果你的世界边界很简单,这很容易.例如,在俄罗斯方块中,只允许块左右移动直到它们碰到两侧,并且很容易测试最底部的坐标是否击中"地面".这些测试很简单,因为你可以一次做一个轴,而两侧的碰撞意味着不同于与底部碰撞的不同.如果你有一个长方形房间,只要移动物体通过夹住其坐标将其移动到室外,就"停止"移动物体.即如果房间宽度从-3到+3,并且您的对象的X为5,则将其更改为3并且您已完成.
如果你想处理更复杂的世界,那就有点棘手了.你会想要阅读"扫掠"几何碰撞.基本上,如果你有一个圆圈,你需要用胶囊进行碰撞测试,而不是通过从起点到终点"扫过"圆圈来形成的形状.它就像一个两端都有半圆形的矩形.数学是出人意料的直截了当(恕我直言),但要做到正确并真正了解正在发生的事情可能会很棘手.虽然值得!
编辑:在线程问题上 - 不需要复杂化.一个线程很好.跳过更新框架也会变得混乱,并且非常先进,因为您实际上需要弄清楚"未来",然后对所有有趣的值进行插值.我不称之为"渲染"循环,我自己,因为渲染循环只是过程的一部分.
def GameLoop():
while True:
ReadInputs()
FigureOutWhatStuffDoes()
DrawItAll()
Run Code Online (Sandbox Code Playgroud)
编辑2:这似乎是一个有趣的讨论:http://www.gamedev.net/community/forums/topic.asp? topic_id = 482397
根据我在游戏设计和 AI 方面的有限经验,我想说有一个逻辑循环和一个显示循环(很像 XNA 设置)。逻辑循环(XNA 中的 Update 方法)基本上将处理更新位置等,而显示循环(XNA 中的 Draw 方法)将把所有内容绘制到屏幕上。至于碰撞检测,我个人会将其定位到你的球上。当它移动时,让它寻找碰撞并做出适当的反应。
线程是另一个主题,但在我看来,我会说不要将更新和绘制分开。对我来说,1 次更新可能有 2 次抽奖,反之亦然,这似乎本质上是错误的。如果没有任何更新,为什么要绘制...或者为什么要在向用户显示正在发生的情况之前多次更新。
只是我的意见,希望我没有离谱。