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?
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. –
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. –