我有一个游戏,其中一个级别,绵羊可以被地雷炸毁。爆炸动画是通过在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。但刚才一位朋友在三星星系标签8.9上尝试了这个代码,发现爆炸似乎很糟糕。他给我发了这个部分屏幕抓取:
知道可能导致这种情况的原因吗?
答案 0 :(得分:4)
如果资源的密度不正确,系统会加载默认资源并根据需要向上或向下缩放以匹配当前屏幕的密度。
在某些情况下,您可能不希望Android预先扩展资源。避免预缩放的最简单方法是将资源放在具有nodpi
配置限定符的资源目录中。例如:
res/drawable-nodpi/icon.png
。所以你必须把你的位图放到`res/drawable-nodpi/
文件夹中。
看看:http://developer.android.com/guide/practices/screens_support.html
答案 1 :(得分:0)
你的目标矩形的宽度,而不是你所说的一个爆炸帧的大小,被设置为画布/ 4的宽度。电话通常具有相似的大小,但更大的平板电脑有更大的屏幕尺寸 - 正如文档中所述:
绘制指定的位图,自动缩放/平移以填充目标矩形[...] 此函数忽略与位图关联的密度。这是因为源和目标矩形坐标空间各自的密度,因此必须已经应用了适当的比例因子。
所以你的位图,不是缩放到画布大小,是从src Rect开始绘制的,但是扩展超出了src的范围,因为它被告知要填充DST,忽略两个位置的密度。
至于解决方案,我不确定 - 确切地说 - 只是让所有尺寸的图像都可以更好地进入你的/res
。根据您加载位图的方式,您可能能够对位图进行缩放,但是在位图上的固定宽度平移必须变得更加动态。
希望有所帮助:)
答案 2 :(得分:0)
我遇到的问题与我在这里提出的问题相同,我的答案是加载我的位图,而不是正常方式:
getResources()。openRawResource(图像标识)