Бесконечный повторяющийся фон прокрутки
У меня проблема с 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);
}
UPDATE2 (
Взгляните на это:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/
Я использовал это, чтобы создать свой фон.
При этом я могу смоделировать, что моя плоскость летит вправо, не перемещая весь фон, и я могу использовать маленький отдельный рисунок, который повторяется каждый раз (для слоя переднего плана).
Для фонового слоя я также использую этот метод, но с гораздо большим графиком и перемещаю его только с меньшей скоростью моей плоскости, чтобы имитировать дальний фон.
Мой метод move находится на событии enterframe. Таким образом, я могу обновить фон каждого кадра с помощью «движения» моего самолета.
)
Плоскость может превышать высоту растровых изображений. Каждый раз, когда растровое изображение возвращается в окно / экран, происходит очень длительное отставание. И когда самолет летит очень быстро, игра тоже начинает лагать.
Моим первым подходом было использование файлов .PNG (но они очень большие: размер 1-3 МБ). Следующим моим подходом было использование файлов .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);
}