更换屏幕时跳跃控制器丢失[LeapMotion AS3]

时间:2013-11-17 20:45:21

标签: actionscript-3 flash air leap-motion

这是一般情况。

Main.as 中,我加载了一个加载简介屏幕的容器。 这个简介屏幕有第一个Leapmotion互动(只需点击一个按钮),它可以加载一个用更多Leapmotion手势控制的新屏幕。

在第一次调用中,控制器表现不错,但是当我点击按钮并加载新屏幕时,控制器“断开连接”并且不再识别手势。

EDITED 我为所有屏幕制作了一个新的“通用”控制器,这是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()函数......并且它可以工作,但当我尝试将整个屏幕用作完整的应用程序时,会重复相同的行为。

只有第一个屏幕工作,然后控制器在加载第二个屏幕时停止工作(通过Loader())。

欢迎任何帮助!

1 个答案:

答案 0 :(得分:0)

如果您只有一个LeapMotion控制器,请尝试创建一个位于UI屏幕的父范围内的控制器 - 例如Main.as--这样您就不会在创建新实例时浪费资源,因此您的应用程序将更快地运行。

你的问题听起来像是失去了对事件的监听 - 你是否在控制器的每个新瞬间添加它们?

根据图书馆的文档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,提供有关Controller状态的信息。 onFrame将接收具有强类型(意味着定义的对象类型)属性的Frame对象。