1

我对 Flash 并不陌生,但我有点像 actionscript 的菜鸟,试图在 flash pro(或者更确切地说,动画 cc)中构建一个应用程序,这将(希望)教用户音乐理论(如何阅读音乐, ETC。)。我想要的是在不同的框架上有不同的课程,用户可以在不同的“屏幕”上滑动。我正在使用 adobe 在其滑动库模板中提供的滑动代码的多个副本。

在第 5 帧上,我使用以下内容:

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()

第 6 帧几乎相同,只是变量、函数等的名称不同:

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()

还有一个按钮作为正在滑动的电影剪辑“lsn112”的一部分。不知道这是否相关,但代码是:

stop();

fwdtest.addEventListener(MouseEvent.CLICK, GoRootNext112);

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

它在某种程度上可以正常工作,但我认为事件监听器没有被正确删除。当用户在图库中滑动时,它会按预期工作。然后他们可以移动到下一个画廊,这也可以按预期工作。到目前为止没有错误。但是,如果他们然后返回菜单,然后返回画廊,我会收到错误代码 1009:

TypeError:错误 #1009:无法访问空对象引用的属性或方法。在 MusicTheorySwipe_fla::MainTimeline/slideRightA()[MusicTheorySwipe_fla.MainTimeline::frame6:32] 在 MusicTheorySwipe_fla::MainTimeline/fl_SwipeToGoToNextPreviousFrameA()[MusicTheorySwipe_fla.MainTimeline::frame6:16] 在运行时::ContentPlayer/simulationSendGestureEvent() 在运行时: :SimulatedContentPlayer/clientSocketDataHandler()

让我感到困惑的是,此时我正在使用第 5 帧,但在引用第 6 帧时出现错误。在我看来,即使我在第 5 帧,flash 正试图在第 6 帧中向事件监听器发送手势,我猜这是因为没有删除事件监听器。但是,作为代码新手,我不知道何时在不破坏代码的情况下删除事件监听器。

这是包含相关 .fla、.swf 和 .xml 文件的 zip 的链接。 http://speedy.sh/5JP7c/MusicTheorySwipe.zip

由于这是我想在很多很多帧上使用的方法,我非常感谢您的时间和帮助解决这个问题。

编辑

好的,我已经尽我所能简化了代码,以尝试消除任何嫌疑人。

第 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();

第 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();

这就是现在所有的动作脚本,但它仍然无法正常工作。有任何想法吗?

4

2 回答 2

0

On frame 2 when you switch to frame 6 check if stage has the event listener fl_SwipeToGoToNextPreviousFrameA() and if so remove it. That should fix your error.

于 2016-04-10T11:58:01.580 回答
0

您需要在几帧时删除侦听器。

在所有代码之后在frame2上写下这些行

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA);

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB);

在定义监听器之前在frame5上写下这一行

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA);

在定义侦听器之前在frame6上写下这一行

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB);

并从您可以从第 5 帧和第 6 帧跳转的任何其他帧中删除。

于 2016-04-11T12:53:26.007 回答