6

首先,我会说这里的上下文是 Actionscript 3.0 (IDE: Flashbuilder) 以及Starling Framework

所以,我想创建一个可用于平台游戏或类似游戏的平铺地图。

我想在 800x600 像素舞台上使用 8x8 像素图块,我遇到的问题是我不知道如何在不显着降低帧速率的情况下将这些 7500 多个图块对象添加到舞台。

我发现性能下降来自于将每个图块添加到舞台,而不是初始化每个图块对象。

我知道我没有提供太多具体信息,但我要问的是是否有一种标准化的方法可以在不损失性能的情况下将数千个静态对象绘制到舞台上。我觉得有一种方法,我只是还没有找到它。

更新:

在您的所有善意帮助之后,我找到了似乎是一个很好的解决方案。起初我想实现 Amy 的解决方案,使用 copyPixels() 和 draw() 为整个地图制作一个大的位图数据,然后将其渲染到屏幕上。然后,虽然,我想知道是否有与此等效的 Starling,因为如果我不必将 Starling 与 Native Flash 混合,一切都会简单得多。

再次感谢 Amy,我进一步研究了 Starling 的 RenderTexture 类,发现使用它的“drawBundled()”和“draw()”方法,我可以轻松地将所有图块绘制到 RenderTexture 中,然后将 RenderTexture进入一个图像(Starling 的图像类),然后将该图像添加到屏幕上。

该解决方案比我之前尝试过的愚蠢的慢速解决方案快一百万倍,具有扁平化的精灵等。它的初始化时间更快,而且当 renderTexture 的图像在屏幕上时,帧率似乎没有下降。

我想测试的一件事是在游戏过程中是否可以轻松更新图块的图形。比如说,如果水从源头(或某物)扩散,并且“草”图块必须变成“水”图块,那么 RenderTexture 和它的图像是否能够在没有某种延迟峰值或性能故障的情况下改变它们的外观。我很快就会对此进行测试。

谢谢大家的帮助!

4

2 回答 2

9

不要在舞台上添加那么多对象。相反,创建一个与舞台大小相同的 BitmpaData 并使用 copyPixels() 或 draw() 在其上绘制。这是一篇可以帮助您入门的文章。然后,您可以使用您在该帖子中学到的概念,并学习您需要做的任何具体未涉及的事情(flashandmath.com 有很多关于像素操作的好教程)

于 2012-08-12T02:07:57.290 回答
3

您需要管理在游戏中移动时需要添加和删除的图块。仅添加到屏幕中心 800 像素内的舞台图块。一旦瓷砖距离中心超过 800 像素,将其移除。这应该使一切顺利进行。祝你好运。

或查看将您的图块绘制/复制到一个位图中。您将基本上将您的图块压印到新的位图上。以下是 adobe 中的示例:

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.geom.Point;

var bmd1:BitmapData = new BitmapData(40, 40, false, 0x000000FF);
var bmd2:BitmapData = new BitmapData(80, 40, false, 0x0000CC44);

var rect:Rectangle = new Rectangle(0, 0, 20, 20);
var pt:Point = new Point(10, 10);
bmd2.copyPixels(bmd1, rect, pt);

var bm1:Bitmap = new Bitmap(bmd1);
this.addChild(bm1);
var bm2:Bitmap = new Bitmap(bmd2);
this.addChild(bm2);
bm2.x = 50;

有关 bitmapData 类的更多信息。我认为 copyPixels 是您所追求的。

于 2012-08-12T00:37:18.977 回答