Endloses Draggen von 360°-Panoramen

In der nachfolgenden swf-Datei kann man bei gedrückter Maustaste das Panorama nach links oder rechts ziehen ohne an eine Grenze zu stoßen.
 

 

Skript (panorama360_drag.fla):

Das Skript wird wieder im ersten Frame des Mainmovies platziert.
Das Draggen der Movieclipinstanz panorama_mc wird wie in Kapitel 1 mit startDrag realisiert, das bei  MOUSE_DOWN aktiviert und bei MOUSE_UP mit stopDrag deaktiviert wird.
Neu hinzu gefügt wurde eine ENTER_FRAME-Eventhandler rotierePanorama, der wie im vorhergehenden Kapitel, die Neupositionierung des Panoramas übernimmt.

this.stage.addEventListener(MouseEvent.MOUSE_DOWN, containerZiehen);
 
function containerZiehen(e:MouseEvent):void {
panorama_mc.startDrag(false, new Rectangle (int.MIN_VALUE/4,0,int.MAX_VALUE,0));
}
 
this.stage.addEventListener(MouseEvent.MOUSE_UP, containerLoslassen);
 
function containerLoslassen(e:MouseEvent):void {
panorama_mc.stopDrag();
}
 
panorama_mc.addEventListener(Event.ENTER_FRAME, rotierePanorama);
 
function rotierePanorama(e:Event) {
if (e.target.x+e.target.width < stage.stageWidth) {
e.target.x+=e.target.width-stage.stageWidth;
} else if (e.target.x > 0) {
e.target.x-=e.target.width-stage.stageWidth;
}
}

 

Erklärungen zum Skript

In diesem Fall muss man den Container beliebig weit nach links bzw. rechts ziehen können. Nach oben und unten darf er aber nicht verschoben werden. D.h. der Container darf sich nur entlang einer "unbegrenzt" langen horizontalen Linie bewegen.
Diese Linie können wir durch ein Rechteck mit der Höhe 0 definieren, das seinen Ursprung "ganz weit" links hat. Die kleineste mögliche ganze Zahl ist für ActionScript durch int.MIN_VALUE festgelegt. Das Rechteck soll "sehr lang" sein. Die größte mögliche ganze Zahl ist für ActionScript durch int.MAX_VALUE festgelegt.
Wenn man den Ursprungs des Rechtecks auf (int.MIN_VALUE|0), die Länge mit int.MAX_VALUE und die Höhe mit 0 festlegt, funktioniert es noch nicht richtig. Erst bei int.MIN_VALUE/4 erreicht man den gewünschten Dragvorgang. Der Faktor 1/4 wurde durch Probieren ermittelt.

panorama_mc.startDrag(false, new Rectangle (int.MIN_VALUE/4,0,int.MAX_VALUE,0));

 
Das Panorama abonniert das ENTER_FRAME-Ereignis mit dem rotierePanorama-Eventhandler.
Es wird wieder, wie in den Funktionen nachRechts und nachLinks aus dem Vorkapitel, geprüft, ob durch den Dragvorgang einer der beiden Panoramakanten in der Bühne liegt. Wenn das der Fall ist, wird das Panorama um (Panoramabreite - Bühnenbreite) verschoben.

panorama_mc.addEventListener(Event.ENTER_FRAME, rotierePanorama);
function rotierePanorama(e:Event) {
if (e.target.x+e.target.width < stage.stageWidth) {
e.target.x+=e.target.width-stage.stageWidth;
} else if (e.target.x > 0) {
e.target.x-=e.target.width-stage.stageWidth;
}
}