我在做一场2d比赛。香蕉(picturBox)从屏幕上掉下来,你必须抓住它们,否则它就落地了,你就会丢分。要动画香蕉,我改变它的Y-Location使用的timer,其间隔为5ms(平滑动画)。
Y下降速度是根据屏幕的分辨率变化的.由于香蕉是移动1 1px每5ms的基础分辨率,即720,它需要改变速度,采取相同的时间在不同的分辨率。
代码:
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.当决议被更改为一个小数目的ex时,。800x600。双转换为int,即使(1 * 600 / 720)四舍五入为1,香蕉也不会移动。
2.由于速度总是四舍五入,香蕉落地所需的时间急剧变化!1920x1080和10.6在1280x720。我怎么才能做到同样的呢?
Tried:
改变间隔而不是速度。它仍然不能在完全相同的时间落在地上。我不能将间隔更改为一个大的数字,因为这会使动画变得不稳定。
发布于 2016-02-06 22:46:37
您的方法是不正确的,因为您可以看到它会改变速度,因为int没有十进制,因此速度会发生变化。
一个简单的解决方案是在类中将位置存储为双倍,并将所有逻辑转换为double,然后在完成所有计算之后,将该类中的double转换为int,并将其设置为图片框位置,这样,double将以相同的速度增长,而不依赖于屏幕大小。
下面是一个浮点逻辑的示例(足够满足您的需要):
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忙,它会改变它的速度,对于一个真正的游戏,正常的不是使用计时器,而是一个循环,检查经过的时间并乘以它的速度(以秒为单位)。
https://stackoverflow.com/questions/35247414
复制相似问题