gpt4 book ai didi

c# - 在简单的 2d 游戏中移动 Sprite 的速度比更新速度快的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 19:30:12 24 4
gpt4 key购买 nike

目前,我有一个任意设置为每秒移动 1 个像素的 Sprite 。代码基本上是这样的(代码根本没有优化,我可以做得更好,但这是我首先要解决的原则:):

private const long MOVEMENT_SPEED = 10000000; // Ticks in 1 second
private long movementTimeSpan = MOVEMENT_SPEED;


protected void PerformMovement(GameTime gameTime)
{
movementTimeSpan -= gameTime.ElapsedGameTime.Ticks;

if (movementTimeSpan <= 0)
{
// Do the movement of 1 pixel in here, and set movementTimeSpan back to MOVEMENT_SPEED
}
}

如您所料,Perform movement 在循环中调用,相当于每秒更新 10 次左右。因此,如果我降低 MOVEMENT_SPEED,我的 Sprite 会加速,但它永远不会超过每秒 10 像素。对于射弹和其他东西,我显然希望它更新得比这快得多。

如果我将移动更改为 2 个像素或更多,则会在计算碰撞等方面产生问题,但这些问题可能会被克服。

另一种方法是将 x 和 y 存储为 float 而不是整数,并将值增加为经过的滴答数的一部分。我不确定这是否会产生平滑的运动,因为仍然需要进行一些舍入。

所以我的问题是,有人知道标准方法吗?

我是否应该将数量增加到 1 个像素以上并将我的碰撞检测更新为递归的,我应该将 X、Y 存储为 float 并按耗时的百分比移动,还是有第三种更好的方法?

最佳答案

标准的方法是不倒计时移动,而是相反:

private const float MOVEMENT_SPEED = 10.0f; //pixels per second
private float time;

protected void PerformMovement(GameTime gameTime)
{
time = (float)gameTime.ElapsedGameTime.TotalSeconds;

character.X += MOVEMENT_SPEED * time;
}

根据耗时做出 Action 。通常使用 float 的原因是为了获得运动的分数值。 Fixed-point是另一种常见的小数表示,但使用 int 代替。

至于碰撞,碰撞可能非常棘手,但一般来说,您绝对不需要为每个运动像素执行一次碰撞(正如您在递归中所建议的那样);那太过分了,很快就会导致糟糕的表现。如果您目前在 2 像素运动方面遇到问题,我会重新评估您的碰撞方式。通常,当您快速移动到跳过薄墙,甚至越过墙壁的“错误一侧”时,这会成为问题,具体取决于您的碰撞设置方式。这被称为“隧道”。有很多方法可以解决这个问题。看here并向下滚动到“防止隧道”。正如文章所述,许多人只是将速度限制在安全值。但另一种常用方法是以比当前传入的更小的时间步长“步进”算法。例如,如果当前耗时为 0.1,则可以在循环中步进 0.01 并检查每个小步。

关于c# - 在简单的 2d 游戏中移动 Sprite 的速度比更新速度快的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9646004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com