首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >香蕉落地- C#游戏

香蕉落地- C#游戏
EN

Stack Overflow用户
提问于 2016-02-06 22:41:58
回答 1查看 123关注 0票数 0

我在做一场2d比赛。香蕉(picturBox)从屏幕上掉下来,你必须抓住它们,否则它就落地了,你就会丢分。要动画香蕉,我改变它的Y-Location使用的timer,其间隔为5ms(平滑动画)。

Y下降速度是根据屏幕的分辨率变化的.由于香蕉是移动1 1px5ms的基础分辨率,即720,它需要改变速度,采取相同的时间在不同的分辨率。

代码:

代码语言:javascript
复制
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:

改变间隔而不是速度。它仍然不能在完全相同的时间落在地上。我不能将间隔更改为一个大的数字,因为这会使动画变得不稳定。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-06 22:46:37

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

一个简单的解决方案是在类中将位置存储为双倍,并将所有逻辑转换为double,然后在完成所有计算之后,将该类中的double转换为int,并将其设置为图片框位置,这样,double将以相同的速度增长,而不依赖于屏幕大小。

下面是一个浮点逻辑的示例(足够满足您的需要):

代码语言:javascript
复制
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忙,它会改变它的速度,对于一个真正的游戏,正常的不是使用计时器,而是一个循环,检查经过的时间并乘以它的速度(以秒为单位)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35247414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档