Endlos wiederholter scrollender Hintergrund

Ich habe ein Problem mit AS3 und AIR. Ich arbeite an einem Side-Scrolling-Spiel für Smartphones mit einem Flugzeug und benutze verschiedene Hintergründe als Ebenen.

Vor allem: Ich benutze GPU und nur Bitmaps, die Qualität ist auf niedrig eingestellt. Die Leistungseinstellungen sind also alle für die Verwendung mit Smartphones festgelegt.

Ich habe sie mit der Zeichnungs-API in ein Rechteck eingefügt und den Hintergrund mit einer Matrix verschoben:

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 (

Schau dir das an:http://plasticsturgeon.com/2010/06/infinite-scrolling-bitmap-backgrounds-in-as3/

Ich habe das benutzt, um meine Hintergründe zu erstellen.

Damit kann ich simulieren, dass mein Flugzeug nach rechts fliegt, ohne den gesamten Hintergrund zu verschieben, und ich kann eine kleine einzelne Grafik verwenden, die sich jedes Mal wiederholt (für die Vordergrundebene).

Auch für die Hintergrundebene verwende ich diese Methode, aber mit einer viel größeren Grafik, und ich verschiebe sie nur mit einer geringeren Geschwindigkeit meiner Ebene, um einen fernen Hintergrund zu simulieren.

Meine Verschiebungsmethode befindet sich in einem Enterframe-Ereignis. So kann ich den Hintergrund für jeden Frame mit der "Bewegung" meines Flugzeugs aktualisieren.

)

Die Ebene kann die Höhe der Bitmaps überschreiten. Jedes Mal, wenn die Bitmap in das Fenster / den Bildschirm zurückkehrt, tritt eine große Verzögerung auf. Und wenn das Flugzeug sehr schnell fliegt, verzögert sich auch das Spiel.

Mein erster Ansatz war die Verwendung von .PNG-Dateien (aber sie sind sehr groß: 1-3 MB groß). Mein nächster Ansatz war die Verwendung von .GIF-Dateien (viel weniger Größe).

Bei beiden ist es dasselbe. Das kann es also nicht sein.

Ich habe etwas über draw () und copyPixels () gelesen, aber ich weiß nicht, wie ich diese verwenden kann, um das Bild zu wiederholen.

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);
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage