Articles of timestep

倒计时器真的很简单

我正在制作一个小型的2D坦克游戏,根据点击的位置发射子弹(这已经完成,可以工作)。 我目前正在使用一个简单的函数计时器类,根据input的时间显示一个倒计时。 (这将用于子弹火力延迟)。 bool timer makeTimer(int waitTime) 这是定时器的开始,它是一个简单的布尔函数,当定时器到达0时返回“真”。 我可以减less它,直到它容易到达0,但我遇到的问题正在倒计时基于实际的时间事件,所以每秒一次。 我已经尝试了很多不同的东西,但我不能得到这个部分的工作。 我必须使用的variables是; waitTime // inputted timeDelay sf::Clock // To show the elapsed time per frame sf::seconds(1) // Not too sure if I need this 所以,要结束。 – 我试图从input的时间每秒钟倒计时一次。

可变timeStep不按预期工作

我一直在使用我自己的小型库在javascript / html5(通过打字稿)的游戏。 这个库使用了一个可变的时间步,因为我打算在移动设备上使用它,而且我认为这将有助于两者保持大致相同(我知道这可能是一个争论,但这不是我问)。 问题是,使用我可变的时间步,我得到了非常不同的实体速度。 我正在研究框架花了多长时间来更新和绘制,然后乘以实体速度。 我使用setInterval运行游戏循环。 它设置为以60fps运行,所以一个16(ish)ms间隔。 var now: Date = new Date(); timeInterval = (now.getTime() – Engine.lastUpdate.getTime()) / 1000; Engine.lastUpdate = now; Input.update(); currentScene.update(); draw(); 球员类别: update() { //W:87 S:83 A:65 D:68 this.velocity.y += this.gravity; if (SandLib.Input.isKeyJustDown(16)) { this.gravity *= -1; this.jumpPow *= -1; } this.velocity.x += this.accel; if (this.velocity.x > this.maxVel) { […]

XNA的GameTime.ElapsedGameTime.TotalSeconds不能按预期工作

正如我在很多网站上看到的,处理可变帧频和移动(移动抛射物,怪物,摇摆剑)的最好方法是…看起来像这样: //This position += TotalSpeed * (float)gt.ElapsedGameTime.TotalSeconds; //Or this (direction is being normalized) position += direction * (float)(TotalSpeed * gt.ElapsedGameTime.TotalSeconds); 然后在Game的主构造器(Game1.cs)中: IsFixedTimeStep = false; TargetElapsedTime = TimeSpan.FromSeconds(16.666); //16.666 milliseconds, or about 60 FPS. graphics.SynchronizeWithVerticalRetrace = true; 我开始注意到,每当我的FPS在30时,我的射弹(在这种情况下,箭头)会比全速时慢。 把上面的V-Sync变成false可以解锁帧速率,然后我就可以达到120 FPS。 射弹要快得多。 不幸的是,这适用于其他一切。 我做错了什么,或者是TotalSeconds只是不可靠/破碎? 我打算最终切换到Monogame,但我不确定这是否能解决问题。 另外一个可能相关或不相关的说明:将“IsFixedTimeStep”更改为true会导致我的游戏无法运行 – 没有错误,只是一个空白的窗口(米色 – ish)屏幕。 提前致谢。 编辑:子弹运动代码 direction = new Vector2((float)Math.Cos(rotation), (float)Math.Sin(rotation)); […]

libgdx delta time中使用的公式或algorithm是什么?

我正在研究时间步进algorithm,我需要知道delta时间如何在libgdx中工作,因为我认为delta时间使用某种时间步进algorithm。

DeltaTime不会创造平稳的运动

问题 : 我尝试在游戏中添加deltaTime,当我尝试在游戏中顺利移动对象时,这似乎不起作用。 我如何计算德尔塔时间: Delta时间variables: float elapsedTime = 0; float lastFrameTimeElapsed = 0; float deltaTime = 0; 在游戏循环开始时,我这样做: elapsedTime = SDL_GetTicks(); 在游戏循环结束时,我这样做: deltaTime = elapsedTime – lastFrameElapsedTime; lastFrameTimeElapsed = elapsedTime; 然后游戏循环结束。 我如何尝试使用增量时间移动我的对象: 我的SDL_Rectvariables: 定义: SDL_Rect* m_rect; 初始化: m_rect = new SDL_Rect(); 我的移动function: void Sprite::Move(float offsetX, float offsetY) { m_rect->x += (int)offsetX; m_rect->y += (int)offsetY; } […]

GameTime的replace/包装暂停,慢动作和“快速”

我期待改变游戏使用GameTime运行游戏的方式,以便我可以轻松地暂停游戏( elapsedTime = 0 )或更改游戏元素作为实际时间的缩放器( elapsedTime *= timeScale )。 在我的项目中,我总是假设游戏没有按照固定的时间步长运行,原因有很多。 由于这个原因,任何状态的变化都会从GameTime 。 我希望这意味着我可以简单地模拟慢动作,快速动作,强制短暂冻结(比如当你在TLoZ中杀死一个敌人:Windwaker–有一个短暂的停顿来强调),或者通过干扰GameTime.ElapsedGameTime暂停游戏GameTime.ElapsedGameTime我所有的Update()代码都使用GameTime.ElapsedGameTime 。 我的第一个想法是停止在任何更新代码中使用GameTime ,而是围绕GameTime封装一个新的类( MyTime )。 MyTime将执行以下操作: 分离实时和游戏时间。 实时是系统外的时间stream逝。 游戏时间是游戏世界中时间的stream逝,也就是说,如果缓慢运动起作用,游戏内的时间在慢动作时间内将会降低。 时间缩放既可以开始也可以结束,也可以被要求在一段实时或游戏时间内激活。 时间可以通过手动开始和停止呼叫来暂停或冻结,也可以根据实际时间或游戏时间再次暂停或冻结一段时间。 基于这个讨论 ,在GameTime被重新创建的每一个XNA的基本Game类中,我很想在MyTime存储对GameTime的引用,因为我个人不知道GameTime是如何改变的。 我也不知道“最好”的方法来检索GameTime参考,这个参考在Update()和Draw()调用中是可用的,但是因为在任何派生自Game类的GameTime中都是不可用的,这意味着从那些更新中获取gameTime引用,并不打算进行绘制调用。 我打算如何实现这个系统的正确方法? 将GameTime公开给MyTime什么好处? 我应该实现自己的方式跟踪时间,而不是依赖GameTime吗?

固定Timestep仍然更新太快

我试图弄清楚,如果我正在接近我的简单的固定时间步执行正确,下面的例子: Gaffer (没有RK4)和DeWitters 目前,我有一个游戏对象,其中包含位置和速度数据成员,位置计算由 position = position + (velocity * dt) 但是,除非速度设置为小数点后两位,否则更新会立即改变位置(例如Velocity = 0.05),但这似乎不合逻辑;对我来说Velocity应该> 0;即使是一个值0.5使更新显示即时)。 因此,我得出这样的结论:我错误地实现了游戏循环。 请注意,我使用的是SDL和C ++,但以下是所有Psuedocode: bool quit = false; World world; Uint32 frameTime = SDL_GetTicks(); double accumulator = 0.0; const double dt = 1.0 / 60.0; int fCount = 0; while(!quit){ fCount = 0; double newTime = SDL_GetTicks(); double nextFrameTime = newTime […]

在AS3中使用插值固定时间步长

我正在尝试实施Glenn Fiedlerstream行的固定时间间隔系统,如下所述: http://gafferongames.com/game-physics/fix-your-timestep/ 在Flash中。 我相当肯定,我已经正确地设置了状态插值。 结果是,如果我的角色应该以每帧6像素,每秒35帧=每秒210像素的速度移动,即使帧速率上升或下降,也是如此。 问题是看起来很糟糕。 这个动作非常紧张,看起来不太好。 我发现在我添加到累加器上的ENTER_FRAME事件之间的时间量平均达到了28.5ms(1000/35),但个别帧时间变化很大,有时会出现ENTER_FRAME事件最后16ms,有时42ms。 这意味着在每次graphics重绘时,角色graphics都会移动一个不同的数量,因为自上次绘制以来已经过了不同的时间。 理论上它应该看起来很平滑,但是根本没有。 相比之下,如果我只是使用超简单的系统移动字符6px每一帧,它看起来是完全平滑的,即使在帧时间这些大的差异。 这怎么可能? 我使用getTimer()来衡量这些时间差异,他们甚至可靠吗?

格伦Fiedler的固定时间步与假线程

我已经实施了Glenn Fiedler的Fix Your Timestep! 在单线程游戏中有很多次。 现在我面临着不同的情况:我正在尝试在JavaScript中做到这一点。 我知道JS是单线程的,但我打算使用requestAnimationFrame渲染部分。 这让我有两个独立的假线程:模拟和渲染。 这些线程的时间也是独立的: dt用于模拟和渲染是不一样的。 如果我没有弄错,模拟应该由Fiedler的while循环结束。 在while循环之后, accumulator < dt所以我在模拟线程中留下了一些未使用的时间( accumulator )。 问题出现在绘图/插值阶段: const double alpha = accumulator / dt; State state = currentState*alpha + previousState * ( 1.0 – alpha ); render( state ); 在我的渲染callback中,我有当前的时间戳,我可以减去最后一个物理模拟时间戳,为当前帧添加一个dt 。 我应该忘记这个dt并使用物理线程的accumulator绘制? 这似乎很奇怪,因为,我想插入模拟和渲染之间的消耗时间,对不对? 当然,我希望模拟和渲染是完全独立的,但是我无法解决这个事实,即在Glenn的实现中,渲染器会产生时间,模拟会以离散的dt大小块进行消耗。 一个类似的问题被问到半固定时间步移植到JavaScript,但问题并没有真正到位,并回答指出,从渲染线程(这是我正在做的事情)中删除物理或保持渲染callback中的物理(这是我试图避免的)