2016-04-01 11 views
1

Ich bin neu in Action-Skript. Ich habe versucht, einen endlosen Scroll-Hintergrund zu schaffen, der natürlich vertikal von oben nach unten verläuft. Ich versuchte es mit dem Erstellen eines Movieclips, indem ich das Bild in einen Movieclip legte und etwas Code anwendete, es funktionierte wie ein Zauber, aber ich bemerkte einige Lecks. Daher habe ich eine andere Methode ausprobiert, die ich im Stack-Committee gefunden habe, und die vorgeschlagen hat, die newBitmapData-Methode zu verwenden. Die Frage, die ich fand, bestand darin, dass ein Hintergrund sich von links nach rechts bewegt, ich habe es versucht, es war perfekt.
Ich habe versucht, alle Variablen und Faktoren darin zu verstehen, um es zu ändern und es von oben nach unten zu scrollen, aber ich stehe jedes Mal mit einem seltsamen Verhalten aus der Flash-Datei. Ich bin mir sicher, dass ich etwas falsch mache. Ich würde wirklich die Hilfe schätzen .. ich bin begierig zu lernen.
THis ist Stack Quelle Ausschuss Link i aus, die Antwort bekam:
The link and the answerEndless Repeating scrolling Hintergrund as3 Adobe Air

Hier ist der gleiche Code, den ich zu implementieren bin versucht, über den Link kopiert:

package { 
    import flash.display.MovieClip; 
    import flash.display.Bitmap; 
    import flash.display.BitmapData; 
    import flash.events.Event; 
    import flash.geom.Rectangle; 
    import flash.geom.Point; 


    public class EndlessBG extends MovieClip{ 
     //this one stays stationary, we're getting the pixels for the right side of the pic from here 
     private var _source:BitmapData; 
     //this is the one moving to the left (the pixels for the right side are not visible except for once a cycle); 
     private var _movingPixels:BitmapData; 
     private var _canvas:Bitmap; 
     private var _xOffset:int = 0; 
     private var _rect:Rectangle = new Rectangle();; 
     private var _point:Point = new Point(); 

     public function EndlessBG() { 
      super(); 
      _source = new BathroomStillLife(); 
      _canvas = new Bitmap(new BitmapData(_source.width, _source.height)); 
      _canvas.bitmapData.draw(_source); 
      _canvas.x = stage.stageWidth/2 - _canvas.width/2; 
      _canvas.y = 5; 
      addChild(_canvas); 
      addEventListener(Event.ENTER_FRAME, gameLoop); 
      setGeometryDefaults(); 
      _movingPixels = new BitmapData(_source.width, _source.height); 
      _movingPixels.copyPixels(_source, _rect, _point); 
      //turn this on to watch red pixels be drawn where the source pixels are coming in 
      //_source = new BitmapData(_source.width, _source.height, false, 0xFF0000); 
     } 

     private function gameLoop(e:Event):void { 
      _xOffset--;//where the background is moving to 
      if (_xOffset < -_source.width) { 
       _xOffset = 0; 
       //this doesn't seem to work correctly: 
       //_movingPixels.scroll(_source.width, 0); 
       _movingPixels = new BitmapData(_source.width, _source.height); 
       _movingPixels.copyPixels(_source, _rect, _point); 
      } 
      trace(_xOffset); 
      setGeometryDefaults(); 
      _movingPixels.scroll(-1, 0); 
      //draw the moved part of the canvas 
      _canvas.bitmapData.copyPixels(_movingPixels, _rect, _point); 
      //If we stop here, we get a smear to the right 
      //so, get the remaining pixels directly from the source 
      //1) reset our rect and point to be to the right side 
      _rect.x = 0; 
      _rect.width = -_xOffset; 
      _point.x = _source.width + _xOffset; 
      //2) copy from the source 
      _canvas.bitmapData.copyPixels(_source, _rect, _point); 
     } 
     private function setGeometryDefaults():void { 
      _rect.x=0; 
      _rect.y=0; 
      _rect.width = _source.width; 
      _rect.height = _source.height; 
      _point.x = 0; 
      _point.y = 0; 
     } 

    } 

} 

ich wirklich zu schätzen die Hilfe ... eifrig zu lernen.

+1

Vorschlag: Anstatt komplizierte Bitmap-Operationen durchzuführen, sollten Sie 2 Bilder übereinander auf Ihrer Bühne haben. Scrolle sie mit der gleichen Geschwindigkeit. Sobald ein Bild unter dem Bildschirm ist, bewegen Sie es sozusagen über den Bildschirm. – DodgerThud

+0

danke für deine antwort .. ich würde es lieber durch code tun, es wäre eine win win situation, ich würde lernen und es besser halten :) –

+0

Fairer Punkt, ich werde es selbst versuchen und eine Antwort posten, wenn es mir gelingt . – DodgerThud

Antwort

0

Ich bin nicht allzu vertraut mit Adobe Air, aber das war ein Problem, das ich auch hatte. Ich benutze flashdevelop, aber, zusammen mit der FlashPunk-Bibliothek (beide sind völlig kostenlos) und ich fand eine Lösung here.

Viel Glück!

1

Im Allgemeinen möchten Sie nur Bitmaps verschieben oder anzeigen und ausblenden, wenn Ihre Animation ausgeführt wird. Sie sollten nicht zeichnen oder Copypixels, wenn die Animation ausgeführt wird. Du machst das während des "Ladens", weil es deine fps verlangsamen kann. Konvertiere alles in Bitmaps und lösche alle Quellgrafiken (jpg, png, Text und Vektorbilder) bevor deine Animation startet.

Für einen Bildlaufhintergrund sollten Sie zwei Kopien einer Bitmap in einem Movieclip verwenden und den Movieclip verschieben.

Sie sollten das wiederholbare Hintergrundbild (jpg, png) in einen Movieclip einfügen oder den Hintergrund in einem Movieclip mit Vektoren erstellen. Zeichne diesen Movieclip in eine Bitmap. Entfernen Sie den ursprünglichen MovieClip. Erstellen Sie zwei Kopien der Bitmapdaten. Staple die zwei Ende-zu-Ende in einem MovieClip. Dann blättern Sie den Movieclip die Länge des Hintergrundbildes - bei 0 beginnen und blättern, bis die zweite Kopie des Hintergrunds erreicht 0. Dann die ersten auf 0 zurückgesetzt

Hier ist Beispielcode, der oben tut:

public function Main() { 

    nBackgroundSpeed = 1; 

    iBitmapWidth = mcBackground.mcBackgroundSource.width; 
    iBitmapHeight = mcBackground.mcBackgroundSource.height; 

    var bdBackground: BitmapData = new BitmapData(iBitmapWidth, iBitmapHeight, true, 0x00000000); 
    bdBackground.draw(mcBackground.mcBackgroundSource, null, null, null, null, true); 
    var bmpBackground0: Bitmap = new Bitmap(bdBackground, "auto", false); 
    var bmpBackground1: Bitmap = new Bitmap(bdBackground, "auto", false); 

    mcBackground.removeChild(mcBackground.mcBackgroundSource); 
    mcBackground.mcBackgroundSource = null; 

    mcBackground.addChild(bmpBackground0); 
    bmpBackground0.x = 0; 
    bmpBackground0.y = 0; 

    mcBackground.addChild(bmpBackground1); 
    bmpBackground1.x = 0; 
    bmpBackground1.y = iBitmapHeight; 

    addEventListener(Event.ENTER_FRAME, fEnterFrame); 
} 


private function fEnterFrame(event: Event): void { 
    if (mcBackground.y > (0 - iBitmapHeight)) { 
     mcBackground.y -= nBackgroundSpeed; 
    } else { 
     mcBackground.y = 0; 
    } 
} 

Lassen Sie mich von irgendwelchen Fragen wissen.