2009-05-11 5 views
0

私は外部SWFを読み込んでさまざまな方法でコントロールするFlash AS3プロジェクトを持っています。ロードされたSWFファイルには、新しいプレゼンテーションに進むための「次の選択」ボタンがあります。外部にロードされた主なSWFには、コードがあります。AS3 - ディスパッチイベントの問題

setTimeout(function() {dispatchEvent(new Event("nextPresentation", false));}, 4000); 

これは自動的にセット内の次の選択に移動します。このコードは、私が望むように正確に動作します。

次回読み込まれたSWFでは、タイムアウトする代わりに、すべてのタイムラインの最後に次の選択を示すボタンが表示されます。そこで、次のコードを追加しました:

function nextSelectionClick(evt:MouseEvent) { 
    trace('here123'); 
    dispatchEvent(new Event("nextPresentation", false)); 
} 

何らかの理由で、このイベントがSWFをロードしたファイルに決して送られません。私はトレースを取得するので、私はクリックイベントになっていると確信していますが、イベントはタイムアウトとまったく同じ動作でなければならないように思えます。私はここで何が欠けていますか?なぜ、そのコードはボタンのクリックとタイムアウトの動作が異なるのでしょうか?アプリケーション内で起こっている他に何の巨大な疑問を残し

おかげ

答えて

3

彼らは同じように機能しなければならないという点で、あなたは正しいです、。問題はここにはないが、それ以外のところにあるようだ。

このような質問は嫌ですが、ルート表示オブジェクトからイベントが発生していることは確かですか?そこから発射されていなければ、外部からは聞こえません。

申し訳ありませんが、より多くの実際のコードを見たり、状況を詳しく知ることはできません。

タイラー。

+0

おかげで、あなたは私の質問に答えました。このイベントは、問題を引き起こしていたルートから解雇されていませんでした。 –

1

bubbles属性をfalseに設定したと思います。これは、それが常駐コンテナよりも任意の更なるまで泡立てるからのイベントを防ぐことができます

代わりにこれを試してみてください:。

dispatchEvent(new Event("nextPresentation", true)); 

を、組織については、私はPresentationEventクラスを作成し、SKIP_PREVIOUSSKIP_NEXTイベントを持っていると思いますそれらの定数。これは、ActionScriptが使用するイベントモデルと一貫性があり、冗長性を削減します。この方法で、現在のプレゼンテーションやその他の便利なプレゼンテーション関連のデータをイベントの一部として渡すことができます。

+0

彼は両方の点で正しいです。表示リストを上に移動させるには、バブルをtrueに設定する必要があります。または、SWFのルートから送出します。カスタムイベントを持つように、バブルを持つ方が望ましいです。 –

0

ディスパッチカスタムイベントも使用していますが、時には動作している場合もありますが、時にはそうではありません。たとえば:

private function rollBackAction 
{ 
    var atd:Class = getDefinitionByName("com.utils."+CreateList.currentClass) as Class; 
    dispatchEvent(new AppEvent("RollBackAction",{})); 

} 

と使用機能

package com.utils 
{ 

import com.components.mouseOverAct; 
import com.model.CreateList; 
import com.SequenceCheck.SeqCheck; 
import com.events.AppEvent; 


import flash.display.MovieClip; 

import flash.events.MouseEvent; 

import flash.events.Event; 


public class RightRotate extends mouseOverAct 
{ 
    private var rotateBool:Boolean; 
    private var XposIntial:Number; 
    private var A:Number; 
    private var An:Number; 
    private var angle:Number; 
    var mc:MovieClip; 
    private var frameCount:int; 

    public function RightRotate() 
    { 
     trace("main") 
     this.buttonMode = true; 
     this.addEventListener("RollBackAction",rollingBack); 
     knob_mc.addEventListener(MouseEvent.MOUSE_DOWN,turn); 
    } 
    private function rollingBack(e:AppEvent) 
    { 
     trace("Abc") 
     knob_mc.rotation = An; 
     rotation_01.gotoAndStop(A); 
    } 
    private function turn(e:MouseEvent):void 
    { 
     mc = simulator.activityAssets.spw.neddle; 
     CreateList.excerciseName = "Right_Bottom_Right"; 
     CreateList.currentClass = "RightRotate"; 
     A = rotation_01.currentFrame; 
     An = knob_mc.rotation; 
     this.stage.addEventListener(MouseEvent.MOUSE_MOVE,turn); 
     this.stage.addEventListener(MouseEvent.MOUSE_UP,endTurn); 
     var position:Number = Math.atan2((mouseY - knob_mc.y),mouseX - knob_mc.x); 
     //trace(position); 
     angle = (position/Math.PI) * 180; 
     knob_mc.rotation = angle; 
     if (CreateList.stepId >= 3) 
     { 
      if (mc.currentFrame > 3) 
      { 
       mc.gotoAndStop(mc.currentFrame + 5); 

      } 
     } 
     mainProcess(); 
    } 

    private function endTurn(e:MouseEvent):void 
    { 
     rotateBool = false; 
     rotation_01.gotoAndStop(rotation_01.currentFrame); 
     knob_mc.removeEventListener(MouseEvent.MOUSE_DOWN,turn); 
     this.stage.removeEventListener(MouseEvent.MOUSE_MOVE,turn); 
     knob_mc.addEventListener(MouseEvent.MOUSE_DOWN,turn); 
     var sqChck:SeqCheck = new SeqCheck(CreateList.stepId); 

    } 

    private function mainProcess() 
    { 
     if (! rotateBool) 
     { 
      rotateBool = true; 
      rotation_01.gotoAndPlay(rotation_01.totalFrames/2 + rotation_01.currentFrame); 
     } 
    } 


} 

} 
関連する問題