2016-04-10 7 views
1

私はフラッシュは初めてではありませんが、flashsc(またはむしろアニメーションcc)でアプリを作成しようとすると、ユーザーの音楽理論(音楽の読み方など)。私が望むのは、ユーザーがスワイプできる別の「スクリーン」を使って、別々のフレームに異なるレッスンを持たせることです。私は、adobeがスワイプギャラリーテンプレートで提供するスワイプコードの複数のコピーを使用しています。actionscriptのeventlistenerを削除する際の問題

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

もボタンがあります:フレーム5に

、私は次のように使用しますスワイプされているムービークリップ "lsn112"の一部としてそれがポイントに正常に動作しますが、私はイベントリスナーが適切に削除されていないと思う

stop(); 

fwdtest.addEventListener(MouseEvent.CLICK, GoRootNext112); 

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

:これが関連しているかいないが、コードがある場合に知ってはいけません。ユーザーがギャラリーをスワイプすると、期待通りに機能します。その後、次のギャラリーに移動することができます。次のギャラリーも期待通りに機能します。これまでのところエラーはありません。彼らはその後、ギャラリーに戻って、メニューに戻って、しかし、もし、私は、エラーコード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()

何私を混乱することは、私はこの時点でフレーム5を使用していますということです、まだ私が取得しますエラーはフレーム6を参照しています。フラッシュは、フレーム5にあるにもかかわらず、フレーム6のイベントリスナにジェスチャを送信しようとしているように見えます。しかし、コードに慣れていないので、コードを壊さずにいつeventListenerを削除するのか分かりません。

関連する.fla、.swf、および.xmlファイルを含むzipへのリンクです。 http://speedy.sh/5JP7c/MusicTheorySwipe.zip

これは多くのフレームにわたって使用したい方法であるため、私は本当にあなたの時間を感謝し、これを解決するのに役立ちます。

EDIT

[OK]を、私は、試してみて、どの容疑者を排除することができる最高のようなコードを簡素化しました。

フレーム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(); 

そして、それが今、まだそれはまだ動作していないすべてのActionScriptです。何か案は?

+1

フレーム5でリスナーTransformGestureEvent.GESTURE_SWIPEを定義し、フレーム6でリスナーを定義しました。フレーム6に達すると、両方が実行を開始します。あなたがそれらを必要としないときにそれらを削除する必要があります –

+0

ええ、それはイベントリスナーとは何かと思っていた、私はちょうど何らかの理由で間違ったものに焦点を当てていた。先端に感謝します。 –

答えて

0

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

+0

ありがとうSnukus。私はエラーメッセージを解決するremoveEventListenerをテストしましたが、次のフレームに到達すると、コードは正常ですが、スワイプジェスチャは機能しません。なぜどんなアイデア?スワイプジェスチャーで移動しているムービークリップ内のボタンを使用して、次のフレームまたはメインタイムライン上の他のフレームに移動することもできます。私は 'MovieClip(root).nextFrame();'でこれを行う方法を知っていますが、フレームを離れる前にイベントリスナーを削除する必要があります。私は1120未定義のプロパティへのアクセス –

+0

SwipeToGoToNextPreviousFrameAとBの両方を削除しましたか?もしそうなら、スワイプはもはや動かないでしょう。フレーム6を離れるときにAを削除し、フレーム5を離れるときにBを削除する必要があります。 – Snukus

+0

スワイプはフレーム5で大きく機能しますが、フレーム6に取り込まれるともう機能しません。 私が追加しました: \t '(currentGalleryItem == totalGalleryItems)であれば{ \t \t stage.removeEventListener(TransformGestureEvent.GESTURE_SWIPE、onSwipe113)。 \t \t \t \t nextFrame() \t \tは} ' はそうだとすれば、ユーザは、それが次のフレームにユーザをとり、左にスワイプし、左にスクロールするムービークリップのもうありません。それは動作し、私はエラーが報告されることはありません。ただし、次のフレームでは、新しいイベントリスナーをステージに追加したにもかかわらず、スワイプ関数が機能しません。 –

0

複数のフレームでリスナーを削除する必要があります。

リスナー

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA); 

があなたの前frame6にこの行を書く定義する前に、すべてのコード

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameA); 

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB); 

書き込みframe5上でこの行の後フレーム2にこれらの行を書きますリスナーを定義する

stage.removeEventListener (TransformGestureEvent.GESTURE_SWIPE, fl_SwipeToGoToNextPreviousFrameB); 

他のフレームから両方を削除すると、フレーム5とフレーム6からジャンプできます。

+0

私はそれが事実かもしれないと思っていましたが、私はちょうどそれを試して、それは動作しませんでした。私はそれが動作していないaddEventListenerかremoveEventListenerかどうかわかりませんが、何らかの理由でフレーム1では動作しますがフレーム2では動作しません。 –

+0

フレーム1での作業とフレーム2での作業はどういう意味ですか? –

+0

申し訳ありませんが、スワイプジェスチャーがフレーム*** 5 ***では動作していて、フレーム6では動作していないことを意味します。 –

関連する問題