香蕉掉落 - C#游戏

本文关键字:游戏 香蕉 | 更新日期: 2023-09-27 18:33:27

我正在做一个2D游戏。在其中,香蕉(picturBox(从屏幕顶部掉落,你必须抓住它们,否则它会撞到地面,你会失去分数。为了使香蕉动画化,我使用间隔为 5 毫秒(平滑动画(的timer更改它的 Y 位置

Y 滴速度根据屏幕分辨率更改。由于香蕉在基本分辨率(即 720(下每 5 毫秒移动 1px,因此它需要改变速度以在不同的分辨率下花费相同的时间。

法典:

private void timer_Tick(object sender, EventArgs e)
{
    double xNanas = nanas.Location.X;
    double yNanas = nanas.Location.Y;
    yNanas += 1 * this.Height / 720;
    nanas.Location = new Point((int)xNanas, (int)yNanas);
    nanas.Refresh();
}

问题:

1. 当分辨率更改为较小的数字(例如 800x600(时。双精度转换为 int,香蕉即使四舍五入为 1 也不会移动。

2.由于速度总是四舍五入,香蕉落地所需的时间差异很大! 1920x1080 为 16.7,1280x720 为 10.6。我怎么会让它一样?

试:

更改间隔而不是速度。它仍然没有同时落地。我无法将间隔更改为较大的数字,因为这会使动画断断续续。

香蕉掉落 - C#游戏

你的方法不正确,正如你所看到的,它会改变速度,因为 int 没有十进制,因此速度会发生变化。

一个简单的解决方案是将位置存储为双精度在类中并在双精度中执行所有逻辑,然后在完成所有计算后将类中的双精度转换为int并将其设置为图片框位置,这样双精度将以相同的速度递增,与屏幕尺寸无关。

下面是一个带有浮点逻辑的示例(足以满足您的需求(:

PointF realPosition = PointF.Empty; //Initialize it to the real position of the pb.
private void timer_Tick(object sender, EventArgs e)
{
    realPosition.Y += 1.0f * this.Height / 720.0f; //note the .0f to instruct the compiler these must be float operations
    nanas.Location = Point.Round(realPosition);
    nanas.Refresh();
}

此外,您还有另一个错误来源,表单计时器不精确,如果 UI 繁忙,它会改变它的速度,对于真正的游戏来说,正常情况不是使用计时器,而是循环并检查经过的时间并将其乘以以秒为单位的速度。