我遇到了 AS3 和 AIR 的问题。我正在为带有飞机的智能手机开发一款横向卷轴游戏,我使用不同的背景作为图层。
首先:我使用 GPU 并且仅使用位图,质量设置为低。因此,性能设置均适合智能手机使用。
我使用绘图 API 将它们放入一个矩形中,并使用矩阵移动背景:
protected var scrollingBitmap:BitmapData;
protected var canvas:Graphics;
protected var matrix:Matrix;
public function move(dx:Number, dy:Number):void {
matrix.translate(dx, dy);
if(dx != 0) matrix.tx %= scrollingBitmap.width;
if(dy != 0) matrix.ty %= scrollingBitmap.height;
drawCanvas();
}
protected function drawCanvas():void {
canvas.clear();
canvas.beginBitmapFill(scrollingBitmap, matrix, true, true);
canvas.drawRect(0, -scrollingBitmap.height, 1404, scrollingBitmap.height);
}
更新2(
看看这个:http:// Plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/ http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
我用它来创建我的背景。
有了这个,我可以模拟我的飞机向右飞行,而不移动整个背景,并且我可以使用每次重复的小单个图形(对于前景层)。
对于背景层,我也使用这种方法,但是对于更大的图形,我仅以较小的飞机速度移动它来模拟远背景。
我的移动方法是在 Enterframe 事件上。所以我可以用飞机的“运动”来更新每一帧的背景。
)
该平面可以超过位图的高度。每次位图返回到窗口/屏幕时,都会出现很长的延迟。当飞机飞得非常快时,游戏也会开始滞后。
我的第一个方法是使用 .PNG 文件(但它们非常大:1-3MB 大小)。
我的下一个方法是使用 .GIF 文件(大小要小得多)。
两者都是一样的。所以不可能是这样的。
我读到了有关 draw() 和 copyPixels() 的内容,但我不知道如何使用它们来重复图像。
UPDATE1:
protected var scrollingBitmap:BitmapData;
protected var canvas:Bitmap;
protected function init(e:Event):void {
removeEventListener(Event.ADDED_TO_STAGE, init);
canvas = new Bitmap(new BitmapData(1404, scrollingBitmap.height, true), "auto", true);
this.addChild(canvas);
drawCanvas();
}
public function move(dx:Number, dy:Number):void {
if(dx != 0) dx %= scrollingBitmap.width;
if(dy != 0) dy %= scrollingBitmap.height;
drawCanvas(dx, dy);
}
protected function drawCanvas(xPos:Number = 0, yPos:Number = 0):void {
canvas.bitmapData.copyPixels(scrollingBitmap, new Rectangle(0, 0, 1404, scrollingBitmap.height), new Point(xPos, yPos), scrollingBitmap);
}