屏幕尺寸计算不正确

4

最近我尝试使用类似于著名的 LunarLander 的方法来实现我的第一个 Android 游戏。我正在自己渲染图形,没有使用游戏引擎,这似乎是目前为止最复杂的部分。

问题

我确定了屏幕的宽度,并将该信息转发到一个算法中,该算法根据宽度和一些其他边距值(参见下面的 calculateMaxBeadsInWidth() )确定可以水平渲染的最大图像数量。但是,计算出的值似乎与算法计算的值不匹配。基本上,它确定只能显示 X 张图片,当实际上屏幕上可以轻松显示 X+2 张图片。

计算

我已经解析了许多调试输出,显示屏幕的实际宽度为800像素,图像宽度为44像素。因此,给定边距为100像素50像素在最左侧和50像素在最右侧),还剩下700像素 可以使用。现在,floor(700 / 44) = 15,因此只显示15张图片。但是,有明显的空间可以容纳更多图片(见图片)!

代码

我的算法:

private int calculateMaxBeadsInWidth() {

    float eff_width = screenWidth - (BOARD_MARGIN_HORIZONTAL * 2);

    return (int) (eff_width / bead_width);
}

请注意,BOARD_MARGIN_HORIZONTAL的值为50.0f

一些图片

这是我的算法生成的内容:

enter image description here

但是,正如你所看到的,很明显你可以在行末轻松地再放置至少两个珠子(在右侧)。例如,当我将一行中的珠子数量硬编码为比算法生成的多两个时,下面的图片展示了会发生什么:

enter image description here

下面的图片详细展示了边距的红线。正如你所看到的,还有很多空间:

enter image description here

补充信息

我正在Google Nexus 7上测试此应用程序。

我使用getResources().getDisplayMetrics().widthPixels;来获取屏幕的宽度。也许问题就出在这里?

我的问题

是否有一些分辨率值我没有考虑到,从而影响了结果?为什么计算结果如此不准确?

如果需要更多信息,我会很乐意提供。非常感谢您的帮助!


当我忘记考虑像素密度时,我遇到了类似的问题。不确定这是否与您正在做的相关,但值得研究一下。 - jprofitt
是的,这正是我在考虑的。像素密度和分辨率异常可能会导致空间丢失。然而,我对追求这条路持谨慎态度,除非我非常确定这是原因,因为独立于像素密度渲染图形涉及到的复杂性。 - Squagem
请查看这些答案以获取一些快速的转换方法:点击此处 - jprofitt
非常有趣的帖子 - 已收藏!我尝试实现这些方法,但不幸的是,它们只是极大地膨胀或缩小了我的图像。我认为这是一个很好的探索方向,我将继续测试,直到找到解决方案! - Squagem
1个回答

2
你的边距值不正确。你上传了全尺寸的图像,但如果你在50px和750px处画垂直线,它们会穿过绘图区域。所以,你要么在计算中使用了错误的值,要么在别处绘制了应该是边距的内容。 enter image description here

你能稍微换一下说法吗?我对你的意思感到困惑。不过在此期间,让我画几条线。 - Squagem
嗯,我按照你说的实现了边缘处的线条(请参见编辑后的答案,第三张图片),虽然它们确实是以边缘为中心绘制的,但这并不能解释丢失了两列额外的列?还是我还是漏掉了什么? - Squagem
哦,我明白你的意思了。由于红线(边缘)与图中的两个珠子相交,因此它们不会被我的算法计算,这就解释了为什么我短了2颗珠子。 在游戏循环的绘图部分没有考虑边缘。 - Squagem
1
@Squagem 是的,它解释了这个问题。你的眼睛可能也会被欺骗——700/44=15.9,因此当你平衡边距时,左侧的空白空间将是珠子的90%,看起来可能可以放下一个珠子,但它不会完全适合。 - iagreen
非常感谢!看起来这就是问题所在。我需要重新设计我的游戏引擎,以正确适应边距。眼力真好! - Squagem
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接