1

我有一个游戏,在其中一个关卡中,羊会被地雷炸毁。爆炸动画是通过在一个 512x515 png 文件中包含一个 4x4 爆炸图像数组的 png 来控制的……见下文。

在此处输入图像描述

然后我使用以下代码为爆炸设置动画:

            exp_bitmap_number_to_draw = (int)(time_since_death / 100);

            if (exp_bitmap_number_to_draw < 16)
            {
                explosion_dst_rect.left = b2sx(sheep_x[i]) - sheep_radius * 5;
                explosion_dst_rect.right = b2sx(sheep_x[i]) + sheep_radius * 5;

                explosion_dst_rect.bottom = b2sy(sheep_y[i]) + sheep_radius * 5;
                explosion_dst_rect.top = b2sy(sheep_y[i]) - sheep_radius * 5;

                explosion_src_rect.left = 128 * (exp_bitmap_number_to_draw % 4);
                explosion_src_rect.top = 128 * (exp_bitmap_number_to_draw / 4);

                explosion_src_rect.right = explosion_src_rect.left + 128;
                explosion_src_rect.bottom = explosion_src_rect.top + 128;

                canvas.drawBitmap(explosion_bitmap, explosion_src_rect, explosion_dst_rect, null);
            }

其中explosion_src_rect 是一个Rect,explosion_dst_rect 是一个RectF。b2sx() 和 b2sy() 是从“运动场”上绵羊的绝对坐标转换为屏幕坐标的函数——它只是添加了一个偏移量。

该代码在我尝试过的几部手机上都能完美运行,包括 nexus S 和 Galaxy S II。但刚才有朋友在三星galaxy tab 8.9上试了代码,发现爆炸显得很傻。他给我发了这个部分截屏:

在此处输入图像描述

知道是什么原因造成的吗?

4

3 回答 3

4

如果资源在正确的密度下不可用,系统会加载默认资源并根据需要放大或缩小它们以匹配当前屏幕的密度。在某些情况下,您可能不希望 Android 预缩放资源。避免预缩放的最简单方法是将资源放在具有nodpi配置限定符的资源目录中。例如: res/drawable-nodpi/icon.png。所以你必须把你的位图放到`res/drawable-nodpi/文件夹中。看看:http: //developer.android.com/guide/practices/screens_support.html

于 2012-06-01T17:12:46.337 回答
0

您的目标矩形的宽度,而不是您所说的爆炸框架之一的大小,被设置为画布/ 4的宽度。手机通常具有相似的大小,但较大的平板电脑具有更大的屏幕尺寸 - 正如文档中所说:

绘制指定的位图,自动缩放/平移以填充目标矩形 [...] 此函数忽略与位图关联的密度。这是因为源和目标矩形坐标空间具有各自的密度,因此必须已经应用了适当的缩放因子。

因此,未缩放到画布大小的位图是从 src Rect 开始绘制的,但会扩展到 src 的边界之外,因为它被告知填充 DST,而忽略了两个位置的密度。

至于解决方案,我不确定,确切地说 - 将各种尺寸的图像放在你的/res. 根据您加载位图的方式,您可能能够使位图缩放,但是您在位图上的固定宽度转换必须变得更加动态。

希望以某种方式有所帮助:)

于 2012-06-01T17:23:45.617 回答
0

我有同样的问题,我在这里问过,我的答案是像这样加载我的位图,而不是正常的方式:

getResources().openRawResource(imageId)

于 2012-06-01T17:29:42.880 回答