了解精灵运动/速度的DIP

时间:2011-10-28 10:38:00

标签: android resolution surfaceview pixels density-independent-pixel

这是我的第一篇文章,所以如果我在提出问题时做错了,我会提前道歉。我已经在网上寻找一个特定的答案,但找不到一个,所以这里就是.....

我正在编写一个基于Surfaceview的游戏,到目前为止,一切进展顺利,但是,我想将我的主精灵移动到例如160DPI屏幕上的1个像素作为基线(所以基本上1个DIP为1个像素在160DPI屏幕上= 1 DIP正确吗?)

我正在使用以下论坛:

private static final float spritemovestep = 1f;
final float scale = getResources().getDisplayMetrics().density;
MoveX = (int) (spritemovestep * scale + 0.5f);

然后......类似

SpriteX=SpriteX+MoveX

第一个问题 - 这是正确的吗?

如果是,有人可以解释+ .05f实际上是什么,我已经读到它是'向上舍入到最接近的数字'但是....

如果spritemovestep = 1,那么在120DPI屏幕上(按照我认为的比例返回.75),它可以解决:1 x .75 + .5?这将是1.25?那么什么是.5 for?

当它被转换为int值时,结果是什么?

在某些情况下,最终结果在低密度屏幕上似乎为“0”,因此精灵根本不会移动。

另外一些应该以不同速度移动的精灵在某些密度下以相同的速度移动。

我确定我在这里愚蠢而且遗漏了一些东西,但我无法理解这是怎么回事。如果我想在MDPI屏幕上将我的精灵移动1个DIP /物理像素,那么它如何在LDPI屏幕上移动少于1个像素?

此外,我一直看到的这个公式是什么:

px = dp * (dpi / 160) - When is this used?

如果有人能回答我的问题,我真的很感激。

全部谢谢

1 个答案:

答案 0 :(得分:1)

如你所说,+ 0.5f是向上舍入到最近的nukber。理想情况下,当数字按比例缩小为ldpi时,值1变为0.75,当转换为int时,表示为小于1或〜= 0。通过添加舍入数字,该数字被提高到1.25,当作为int转换时,该数字产生<2或〜= 1。通过这种方式,您的精灵应该以最小的1移动绘制。精灵以不同的速度移动的唯一原因是移动相同的速度,如果它们非常接近,当圆形时,它们会使用比例缩小相同的大小你给了。总而言之,你的等式与我见过的其他人非常相似。我正在为我所工作的公司制作一个使用surfaceview的游戏,虽然我不能详细了解代码,但你的问题是我在一段时间内努力奋斗的问题。我不确定你的物理更新,但也许你应该检查一下,具体来说,它如何计算你的游戏计时器的滴答。可能是你的应用程序正在读取它的距离太近而无法达到在转换为int后移动1.25或1的点,因此你的精灵似乎不会移动。我简要地经历了这个问题,起初看着我的速度,直到我发现错误在计时器中。我注意到的另一件事是你的算法收集密度。在mdpi设备上,这会返回1还是160?这可能会产生很大的不同,但我不确定,因为我使用的等式是不同的。您找到的另一个等式是android.developer.com开发指南中列出的等式的解释,用于描述os如何将像素转换为dip。人们倾向于引用这一点,即提供一个参考,以帮助其他人构建他们自己的算法,以适合他们的应用程序的智能。希望这有帮助,因为它真的是我现在可以给出的最佳答案。对于任何输入错误,我发送电子邮件

非常抱歉