2016-04-10 21 views
1

Ich bin zu blinken nicht neu, aber ich bin ein bisschen ein Noob mit Actionscript, versuchen, eine App in Flash Pro zu bauen (oder besser gesagt, animieren cc), die (hoffentlich) teach die Benutzer Musiktheorie (wie man Musik liest, etc.). Was ich will, ist, verschiedene Lektionen auf separaten Rahmen zu haben, mit separaten "Bildschirmen", durch die der Benutzer hindurch wischen kann. Ich verwende mehrere Kopien des Swipe-Codes, den Adobe in seiner Swipe-Galerie-Vorlage bietet.Ausgabe mit dem Entfernen von Eventlistener in Action

Am Rahmen 5, verwende ich die folgenden:

stop() 

Multitouch.inputMode = MultitouchInputMode.GESTURE; 

var currentGalleryItem:Number = 1; 
var totalGalleryItems:Number = 10; 

stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB); 

function fl_SwipeToGoToNextPreviousFrameB(event:TransformGestureEvent):void 
{ 
    if(event.offsetX == 1) 
    { 
     if(currentGalleryItem > 1){ 
      currentGalleryItem--; 
      slideRight(); 
     } 
    } 
    else if(event.offsetX == -1) 
    { 
     if(currentGalleryItem < totalGalleryItems){ 
      currentGalleryItem++; 
      slideLeft(); 
     } 
    } 
} 
var slideCounter:Number = 0; 
function slideLeft(){ 
    lsn112.addEventListener("enterFrame", moveGalleryLeft); 
} 
function slideRight(){ 
    lsn112.addEventListener("enterFrame", moveGalleryRight); 
} 

function moveGalleryLeft(evt:Event){ 
    lsn112.x -= 128; 
    slideCounter++; 
    if(slideCounter == 10){ 
     lsn112.removeEventListener("enterFrame", moveGalleryLeft); 
     slideCounter = 0; 
    } 
} 
function moveGalleryRight(evt:Event){ 
    lsn112.x += 128; 
    slideCounter++; 
    if(slideCounter == 10){ 
     lsn112.removeEventListener("enterFrame", moveGalleryRight); 
     slideCounter = 0; 
    } 
} 

Home112.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_22); 

function fl_ClickToGoToAndStopAtFrame_22(event:MouseEvent):void 
{ 
    gotoAndStop(2); 
} 

stop() 

Rahmen 6 ist fast identisch, nur mit unterschiedlichen Namen für Variablen, Funktionen, etc .:

stop() 

Multitouch.inputMode = MultitouchInputMode.GESTURE; 

var currentGalleryItemA:Number = 1; 
var totalGalleryItemsA:Number = 11; 

stage.addEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA); 

function fl_SwipeToGoToNextPreviousFrameA(event:TransformGestureEvent):void 
{ 
    if(event.offsetX == 1) 
    { 
     if(currentGalleryItemA > 1){ 
      currentGalleryItemA--; 
      slideRightA(); 
     } 
    } 
    else if(event.offsetX == -1) 
    { 
     if(currentGalleryItemA < totalGalleryItemsA){ 
      currentGalleryItemA++; 
      slideLeftA(); 
     } 
    } 
} 
var slideCounterA:Number = 0; 
function slideLeftA(){ 
    lsn113.addEventListener("enterFrame", moveGalleryLeftA); 
} 
function slideRightA(){ 
    lsn113.addEventListener("enterFrame", moveGalleryRightA); 
} 

function moveGalleryLeftA(evt:Event){ 
    lsn113.x -= 128; 
    slideCounterA++; 
    if(slideCounterA == 10){ 
     lsn113.removeEventListener("enterFrame", moveGalleryLeftA); 
     slideCounterA = 0; 
    } 
} 
function moveGalleryRightA(evt:Event){ 
    lsn113.x += 128; 
    slideCounterA++; 
    if(slideCounterA == 10){ 
     lsn113.removeEventListener("enterFrame", moveGalleryRightA); 
     slideCounterA = 0; 
    } 
} 

Home113.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_23); 

function fl_ClickToGoToAndStopAtFrame_23(event:MouseEvent):void 
{ 
    gotoAndStop(2); 
} 

stop() 

Es gibt auch eine Schaltfläche als Teil des Movieclips "lsn112", der gerade geklaut wird. Sie wissen nicht, ob dies relevant ist oder nicht, aber der Code ist:

stop(); 

fwdtest.addEventListener(MouseEvent.CLICK, GoRootNext112); 

function GoRootNext112(event:MouseEvent):void 
{ 
    MovieClip(root).nextFrame(); 
} 

Es wird zu einem Punkt funktioniert gut, aber ich denke, ein Eventlistener nicht richtig entfernt wird. Wenn der Benutzer durch die Galerie wischt, funktioniert es wie erwartet. Sie können dann in die nächste Galerie wechseln, was ebenfalls wie erwartet funktioniert. Bisher keine Fehler. Allerdings, wenn sie dann in das Menü zurück, und dann in die Galerie zurück, ich einen Fehlercode erhalten 1009:

TypeError: Error #1009: Cannot access a property or method of a null object reference. at MusicTheorySwipe_fla::MainTimeline/slideRightA()[MusicTheorySwipe_fla.MainTimeline::frame6:32] at MusicTheorySwipe_fla::MainTimeline/fl_SwipeToGoToNextPreviousFrameA()[MusicTheorySwipe_fla.MainTimeline::frame6:16] at runtime::ContentPlayer/simulationSendGestureEvent() at runtime::SimulatedContentPlayer/clientSocketDataHandler()

Was mich verwirrt ist, dass ich Rahmen 5 an dieser Stelle verwende, aber ich erhalte eine Fehler Referenzrahmen 6. Es scheint mir, dass Flash versucht, eine Geste an den Eventlistener in Frame 6 zu senden, obwohl ich auf Frame 5 bin, was vermutlich darauf hinausläuft, dass ein Eventlistener nicht entfernt wird. Da ich jedoch neu im Code bin, weiß ich nicht, wann ich den Eventlistener entfernen soll, ohne den Code zu unterbrechen.

Hier ist ein Link zu einer ZIP-relevanten fla, swf und XML-Dateien enthält.

Da dies die Methode ist, die ich gerne über viele, viele Frames verwenden würde, würde ich Ihre Zeit und Hilfe bei der Lösung dieses Problems sehr schätzen.

EDIT

Ok, habe ich den Code so gut vereinfacht kann ich, alle Verdächtigen zu versuchen und zu beseitigen.

Rahmen 5:

Multitouch.inputMode = MultitouchInputMode.GESTURE; 

stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeA); 
var currentGalleryItemA:Number = 1; 
var totalGalleryItemsA:Number = 5; 
function onSwipeA (e:TransformGestureEvent):void{ 

//User swiped towards right 
if (e.offsetX == 1) { 
    if(currentGalleryItemA > 1){ 
     currentGalleryItemA--; 
     lsn113.x += 1280; 
    } 
} 

//User swiped towards left 
if (e.offsetX == -1) { 
    if(currentGalleryItemA < totalGalleryItemsA){ 
    currentGalleryItemA++; 
    lsn113.x -= 1280; 
     if(currentGalleryItemA == totalGalleryItemsA){ 
     nextFrame() 
     } 
    } 
} 
} 
stop(); 

Rahmen 6:

stage.removeEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeA); 

Multitouch.inputMode = MultitouchInputMode.GESTURE; 

stage.addEventListener(TransformGestureEvent.GESTURE_SWIPE , onSwipeB); 
var currentGalleryItemB:Number = 1; 
var totalGalleryItemsB:Number = 11; 
function onSwipeB (e:TransformGestureEvent):void{ 

//User swiped towards right 
if (e.offsetX == 1) { 
    if(currentGalleryItemB > 1){ 
     currentGalleryItemB--; 
     lsn112.x += 1280; 
    } 
} 

//User swiped towards left 
if (e.offsetX == -1) { 
    if(currentGalleryItemB < totalGalleryItemsB){ 
     currentGalleryItemB++; 
     lsn112.x -= 1280; 
    } 
    if(currentGalleryItemB == totalGalleryItemsB){ 
     nextFrame() 
    } 
} 
} 

stop(); 

Und das ist alles, das Actionscript gibt es jetzt, aber es funktioniert immer noch nicht. Irgendwelche Ideen?

+1

Sie haben einen TransformerGestureEvent.GESTURE_SWIPE-Listener in Frame 5 und dann in Frame 6 definiert. Sobald Sie auf Frame6 zugreifen, wird mit der Ausführung begonnen. Sie müssen diese entfernen, wenn Sie sie nicht brauchen. –

+0

Ja, ich hatte gedacht, dass es etwas mit einem Eventlistener zu tun hat, ich habe mich aus irgendeinem Grund nur auf den falschen konzentriert. Danke für den Tipp. –

Antwort

0

Am Rahmen 2, wenn Sie Schalter 6 Kontrolle zu gestalten, wenn Stufe den Ereignis-Listener fl_SwipeToGoToNextPreviousFrameA hat(), und wenn es so entfernen. Das sollte deinen Fehler beheben.

+0

Danke Snukus. Ich habe einen removeEventListener getestet, der die Fehlermeldung behebt, aber jetzt, wenn ich zum nächsten Frame komme, obwohl der Code in Ordnung ist, funktioniert die Wischgeste nicht. Irgendwelche Ideen warum? Ich möchte auch Schaltflächen innerhalb des Movieclips verwenden, die durch die Wischgeste bewegt werden, um zum nächsten Bild oder zu anderen Bildern auf der Hauptzeitleiste zu navigieren. Ich weiß, wie man das mit 'MovieClip (root) .nextFrame();' macht, aber ich muss den Event-Listener entfernen, bevor ich den Frame verlasse, und ich weiß nicht, wie ich das tun soll, da ich nur einen 1120 bekomme Zugriff auf nicht definierte Eigenschaft, was auch immer ich versuche. –

+0

Haben Sie sowohl SwipeToGoToNextPreviousFrameA als auch B entfernt? Wenn das der Fall ist, wird der Wischvorgang nicht mehr funktionieren. Sie müssen A entfernen, wenn Sie Frame 6 verlassen und B entfernen, wenn Sie Frame 5 verlassen. – Snukus

+0

Swipe funktioniert großartig auf Frame 5, aber einmal in Frame 6 aufgenommen, funktioniert es nicht mehr. Ich habe hinzugefügt: \t 'if (currentGalleryItem == totalGalleryItems) { \t \t stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, onSwipe113); \t \t \t \t nextframe() \t \t} ' Also, wenn der Benutzer klaut nach links, und es gibt nicht mehr von dem Movieclip nach links zu bewegen, nimmt er den Benutzer zum nächsten Bild. Es funktioniert, und ich bekomme keinen Fehler gemeldet. Im nächsten Frame funktioniert die Swipe-Funktion jedoch nicht, obwohl ich der Bühne einen neuen EventListener hinzugefügt habe. –

0

Sie müssen den Hörer paar Frames entfernen.

schreiben diese Zeilen auf frame2 nach all Ihren Code

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA); 

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB); 

schreiben diese Linie auf frame5 bevor Sie Hörer definieren

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA); 

schreiben diese Linie auf frame6, bevor Sie Definiere Listener

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB); 

und entfernen Sie beide von anderen Frames, die Sie von Frame5 und Frame6 springen können.

+0

Ich hatte vermutet, dass das der Fall sein könnte, aber ich habe es einfach versucht und es hat nicht funktioniert. Ich weiß nicht, ob es der addEventListener oder removeEventListener ist, der nicht funktioniert, aber aus irgendeinem Grund funktioniert es auf Frame 1, aber nicht Frame 2. –

+0

Was meinst du mit Frame 1 arbeiten und nicht mit Frame 2 arbeiten? –

+0

Entschuldigung, ich meine, die Swipe-Geste funktioniert bei Frame *** 5 ***, aber nicht bei Frame 6. –

Verwandte Themen