1

私はフラッシュを初めて使用するわけではありませんが、ユーザーに音楽理論 (音楽の読み方) を (うまくいけば) 教えてくれるアプリをフラッシュ プロ (またはアニメーション cc) で構築しようとして、アクション スクリプトには少し慣れていません。など)。私が望むのは、ユーザーがスワイプできる個別の「画面」を使用して、個別のフレームでさまざまなレッスンを行うことです。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: null オブジェクト参照のプロパティまたはメソッドにアクセスできません。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 にいるにもかかわらず、フラッシュがフレーム 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

フレーム 2 でフレーム 6 に切り替えると、ステージにイベント リスナー fl_SwipeToGoToNextPreviousFrameA() があるかどうかを確認し、ある場合は削除します。これでエラーが修正されるはずです。

于 2016-04-10T11:58:01.580 に答える