为什么我的KeyboardEvent在我的游戏中不起作用?

时间:2011-08-24 05:36:35

标签: flash actionscript-3 keyboard

我需要使用flash as3来创建游戏,我尝试使用3层来加载我的swf。我的游戏在第三层,第一层和第二层只是一个预加载器脚本。

我的问题是当游戏加载到第一层的舞台上时,我的KeyboardEvent功能在我按下舞台之前无效。

我尝试使用Event.ADDED_TO_STAGE来解决它,但我也遇到了同样的错误。

这是我的预加载器代码

var request:URLRequest = new URLRequest("game.swf");
var loader:Loader = new Loader();

loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, loadProgress);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

function loadProgress(event:ProgressEvent):void
{
    var percentLoaded:Number = event.bytesLoaded / event.bytesTotal;
    percentLoaded = Math.round(percentLoaded * 100);

    //this.percentLoaded.text = String(uint(percentLoaded)) + "%";
}

function loadComplete(event:Event):void
{
    trace("Load Complete");
}

loader.load(request);
this.addChild(loader);

这是我在时间轴上的游戏脚本

if(stage != null) {
    stageAddHandler(null);
} else {
    addEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
}

function stageAddHandler(e:Event = null):void {

stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownHandler);
stage.addEventListener(KeyboardEvent.KEY_UP,keyUpHandler);


}

对此有什么想法吗?

感谢您提前

2 个答案:

答案 0 :(得分:2)

这是Flash Player的常规安全功能。用户必须首先单击以在舞台上设置焦点才能接收键盘事件。

您可以设计解决此限制的方法,例如,让您的用户在文本字段中输入他们的名字,他们必须先用鼠标选择,或者让他们点击“开始游戏”!游戏开始前的按钮。

<强> [编辑] 解决方法可能涉及通过ExternalInterface调用javascript函数,该函数将重点放在嵌入式swf上。我没有测试过这个,但是这个(或类似的东西)应该可以工作:

<强>的ActionScript:

package
{
    //Imports
    import flash.display.Sprite;
    import flash.external.ExternalInterface;

    //Class
    public class AS3DocumentClass extends Sprite
    {
        //Constructor
        public function AS3DocumentClass()
        {
            init();
        }

        //Initialize
        private function init():void
        {
            var extInterface = new ExternalInterface();
            extInterface.call("initSwfFocus");
        }
    }
}

<强> JavaScript的:

<script type="text/javascript" language="javascript">
    function initSwfFocus()
    {
        document.getElementById("mySWF").focus();
    }
</script>

答案 1 :(得分:1)

有三个潜在问题可能导致键盘事件无法正常工作;

  1. html页面中的flash对象未处于活动状态(即未对焦)。这可以通过上面的javascript解决方案来解决,但通常情况下,您需要用户在需要键盘输入之前点击应用中的内容。

  2. 您已将KeyboardEvent添加到的对象未处于焦点位置。要解决此问题,请将侦听器添加到舞台。

  3. 如果您正在使用“包装器”或“加载器”swf加载到主应用程序中并且第一次也是唯一一次单击是在包装器swf中,那么您将遇到对象焦点问题app inits和KeyboardEvents被添加,将舞台的焦点对象设置为舞台(this.stage.focus = this.stage)。