标题可能有点误导。看看我的代码,我会解释
public static function loadTile(tileDir:String = "empty"):void
{
if(tileDir != "empty")
{
tPoint = new Point(0,0);
tRect = new Rectangle(0,0,30,30);
//load in tile sheet image
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.INIT,tilesLoadInit);
loader.load(new URLRequest(tileDir));
}
}
private static function tilesLoadInit (e:Event):void {
tileImage = Bitmap(loader.content).bitmapData;
tileReady.dispatchEvent(new Event("TileReady"));
}
var tImage:BitmapData = new BitmapData(30,30);
tileNum = tileNumber;
tPoint.x = 0;
tPoint.y = 0;
tRect.x = 0;
tRect.y = 0;
tImage.copyPixels(tileImage,tRect,tPoint);
this.graphics.beginBitmapFill(tImage);
this.graphics.drawRect(0, 0,tWidth ,tHeight );
我创建了一个名为tImage的空bitMapData。然后我接受一个名为tileImage的预定义变量,它也是一个bitMapData,包含一个图像的图片。 tRect是预定义的,它的宽度和高度是30x30。我复制了一张图片并将其放入tImage中。问题是AS3抛出一个错误,说tImage是一个不正确的类型
ArgumentError: Error #2015: Invalid BitmapData.
但显然不是。我的问题是图形对象接受的bitMapData和bitMapData类型的数据类型有什么不同吗?
我正在尝试用精灵做平铺。我希望我的瓷砖是交互式的,这就是为什么我使用精灵对象而不是使用常规的bitMaps来表示我的瓷砖。您可能想知道为什么我不会使用graphics.beginBitmapFill(tImage);和graphics.drawRect(0,0,tWidth,tHeight);挑选我想要使用的瓷砖。原因很正是因为事实证明drawRect()第一个和第二个参数实际上改变了实际精灵所在的位置。
因此,如果我将精灵的x和y属性设置为x = 20,并且y = 20.那么我设置我的drawRect(20,20)。它实际上为我的精灵的x和y坐标增加了20个像素。我知道原因,我只需要知道更好的方法。很抱歉写了这么多文章,谢谢你的时间!
答案 0 :(得分:0)
这并不是说类型错了,而是说对象无效。如果类型错误,我希望你得到一个TypeError。
您还没有说明错误的确切位置,并假设问题出在第8行的tImage上。看起来问题更像是第7行的tileImage(你没有提供任何细节)。
答案 1 :(得分:0)
这可能是因为Flash内置了BitmapData对象大小的限制。如果像素总数大于16,777,215,则抛出错误#2015。
您可以在文档中阅读:BitmapData,在“查看示例”的正上方。
如果您想尝试一下,以下是一个常用的技巧:BitmapData workaround