在Android中实现平铺系统

时间:2012-01-18 10:45:13

标签: java android

我对我正在开发的Android游戏感到有点难过,所以也许有人可以帮助我。不要打扰AndEngine;我已经做到了这一点,如果可能的话,我宁愿继续这条道路。

我正在进行的游戏是一个简单的平台游戏。最初这些级别是作为大量位图加载的,但是一些内存不足错误使得我不得不想出一个更高效的系统。现在,我正在将.tmx文件解析为2d数组,并使用一种方法创建比设备屏幕略大的位图,并使用适当的切片填充它。

问题是访问这个2d阵列1500次(使用16x16磁贴)是非常昂贵的,而且我很难找到一种不这么做的方法。目前,我每次超过16个像素时都需要重新绘制图像。目前的想法包括使用更大的磁贴(更小的数组,但仍然限制级别大小),尝试移动我的位图的内容,只加载即将显示的新行,或使用更大的位图,以便不需要新的图像经常加载。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

除非已经完成或不可能;考虑将背景与前景分开。
如果你使用一个简单的背景(想想超级马里奥纯蓝色背景),你很可能会重复使用那些瓷砖/位图/颜色/渐变比前景元素长得多。
这也将使您的数组包含许多没有前景的空白空间,这意味着您可以折叠数组并仅存储包含切片的部分。折叠阵列的缺点是你必须存储瓷砖的高度属性才能知道它们应该去哪里。
(与前景分开的背景也会产生视差效果(背景以不同于前景的速度移动))

如何更改查找的示例:
考虑游戏是在横向模式下在480x800屏幕上运行 这意味着要查找50 * 30(1500)个瓷砖 每个图块都保存在二维数组中。 当前可见区域如下所示:

  • 地面区域,高4层。
  • 一个平台,高5瓦,宽20瓦,高于地面。
  • 另一个平台3瓷砖高,5瓷砖宽,也在地上。
  • 从地面延伸到屏幕顶部的墙,5个瓷砖宽。

删除背景图块并折叠数组我们只需要查找图块: 地砖:50 * 4
Platform1瓷砖:5 * 20
Platform2瓷砖:3 * 5
墙砖:26 * 5
总查询次数 50 * 4 + 5 * 20 + 3 * 5 + 26 * 5 = 445,不到原1500的三分之一。
现在,当然还需要做一些额外的工作来确定每个图块的位置并绘制背景,但假设一个非常优化的情况,其中这需要花费与查找相同的时间,它仍然比1000次查找的时间更短。

当然,这只是解决问题的方法之一。

还记得像2d数组这样的小事情比'flat'数组慢得多。如果您无法将数据放入1d数组中,请尝试最小化嵌套调用,例如一次获取一行或一列,然后在切换到下一个数组之前执行该数组的查找:

//Really bad:
for(int x=0; x<array.length; x++){
    for(int y=0; y<array[x].length; y++){
        Object o = array[x][y];
    }
}
//Better (can be made even better by using the for(Object o : array)-syntax):
for(int x=0; x<array.length; x++){
    Object[] yArray = array[x];
    for(int y=0; y<yArray.length; y++){
        Object o = yArray[y];
    }
}

答案 1 :(得分:0)

我必须开发这个项目,我们需要从网上下载图像的图块并将它们显示为一个完整的图像。事情是一个随意的滚动会最终崩溃整个应用程序,因为VM会抛出OutOfMemory异常。所以我使用TwoDScrollView和MxN ImageViews开发了一个视图,它只下载了用户视图中的那些视图。当用户滚动时,我们维护缓存并开始分配远离查看区域的图像。它速度较慢但它停止了崩溃。

我无法分享我的部分代码。但这是一个使用相同方法的Github仓库。祝你好运:)

我不能保证他们,但here's a project特别符合您的需求