0

これが一般的な文脈です。

Main.asで、Intro screenをロードするコンテナをロードします。このイントロ画面には、最初の Leapmotion インタラクション (ボタンをクリックするだけ) があり、Leapmotion のジェスチャーで制御される新しい画面が読み込まれます。

最初の呼び出しでは、コントローラーはうまく動作しますが、ボタンをクリックして新しい画面が読み込まれると、コントローラーが「切断」され、ジェスチャが認識されなくなります。

編集済み すべての画面用に新しい「ユニバーサル」コントローラーを作成しました。これは UController クラスです。

これが私のコントローラーのセットアップです:

package {   
import com.leapmotion.leap.Controller;
import com.leapmotion.leap.events.LeapEvent;
import com.leapmotion.leap.Frame;
import com.leapmotion.leap.Hand;
import com.leapmotion.leap.Finger;
import com.leapmotion.leap.Vector3;
import com.leapmotion.leap.util.LeapUtil;
import com.leapmotion.leap.Gesture;
import com.leapmotion.leap.SwipeGesture;
import com.leapmotion.leap.ScreenTapGesture;
import com.leapmotion.leap.CircleGesture;
import flash.display.MovieClip;
import com.leapmotion.leap.Pointable;
//import com.leapmotion.leap.Config;


public class UController extends MovieClip {

    public var myController:Controller = new Controller();

    public function UController() {
        myController.addEventListener( LeapEvent.LEAPMOTION_INIT, onInit );
        myController.addEventListener( LeapEvent.LEAPMOTION_CONNECTED, onConnected );
        myController.addEventListener( LeapEvent.LEAPMOTION_DISCONNECTED, onDisconnect );
        myController.addEventListener( LeapEvent.LEAPMOTION_EXIT, onExit );
        myController.addEventListener( LeapEvent.LEAPMOTION_FRAME, onFrame );
    }




    public function onInit(e:LeapEvent):void{
        trace("leap init");
    }

    public function onConnected(e:LeapEvent):void {

        myController.enableGesture( Gesture.TYPE_SWIPE );
        //if(myController.config().setFloat("Gesture.Swipe.MinLength", 200.0) && myController.config().setFloat("Gesture.Swipe.MinVelocity", 500)) myController.config().save();
        myController.enableGesture( Gesture.TYPE_CIRCLE );
        myController.enableGesture( Gesture.TYPE_SCREEN_TAP );
        //if(myController.config().setFloat("Gesture.ScreenTap.MinForwardVelocity", 30.0) && myController.config().setFloat("Gesture.ScreenTap.HistorySeconds", .5) && myController.config().setFloat("Gesture.ScreenTap.MinDistance", 1.0)) myController.config().save();
        trace("leap connected");

    }

    public function onDisconnect(e:LeapEvent):void{
        trace("leap disconnected");
    }

    public function onExit(e:LeapEvent):void{
        trace("leap exit");
    }

    public static function onFrame(e:LeapEvent):void{
        trace("leap frame");
    }

}


}

私のゲーム画面では、onFrame() 関数のみを提供しています...動作しますが、画面全体を完全なアプリケーションとして使用しようとすると、同じ動作が繰り返されます。

最初の画面のみが機能し、2 番目の画面が (Loader() を介して) 読み込まれると、コントローラーは動作を停止します。

どんな助けでも大歓迎です!

4

1 に答える 1

0

LeapMotion コントローラーが 1 つしか存在しない場合は、UI 画面の親スコープ (たとえば Main.as) に配置されるコントローラーを 1 つ作成してみてください。そうすれば、新しいインスタンスの作成にリソースを無駄にせず、アプリケーションの動作が速くなります。

そして、あなたの問題は、イベントへのリスナーが失われたように聞こえます-コントローラーの新しいインスタンスごとにリスナーを追加していますか?

ライブラリのドキュメントDOCSによると、コントローラーに接続するための次のコードがあります。

controller = new Controller();
controller.addEventListener( LeapEvent.LEAPMOTION_INIT, onInit );
controller.addEventListener( LeapEvent.LEAPMOTION_CONNECTED, onConnect );
controller.addEventListener( LeapEvent.LEAPMOTION_DISCONNECTED, onDisconnect );
controller.addEventListener( LeapEvent.LEAPMOTION_EXIT, onExit );
controller.addEventListener( LeapEvent.LEAPMOTION_FRAME, onFrame );

もちろん、関数 onInit、onConnect は自分で作成する必要があります。関数 onFrame が繰り返し呼び出され、コントローラーの状態に関する情報が提供されます。onFrame は、厳密に型指定された (定義済みのオブジェクト型を意味する) プロパティを持つ Frame オブジェクトを受け取ります。

于 2013-11-17T21:48:14.323 に答える