2011-08-24 66 views
0

我需要使用flash as3创建一个游戏,并且我试图使用3层来加载我的swf。我的游戏位于第三层,第一层和第二层只是一个预加载器脚本。为什么我的KeyboardEvent在我的游戏中不起作用?

我的问题是当游戏加载到第一层的阶段时我的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); 


} 

在这个任何想法的游戏脚本代码?

感谢提前

+0

尝试手动设置http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/Stage.html#focus – www0z0k

+0

出于安全原因,我不相信这是可能的瑞士法郎强迫自己集中注意力。 – TheDarkIn1978

回答

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> 
+0

或使用swfobject(http:// blog。deconcept.com/swfobject/)来嵌入你的swf – midhunhk

+0

有趣的信息:AS2允许你使用Key.isDown来捕捉哪些按键被关闭,即使它们没有焦点。这是一个巨大的安全漏洞。我认为它仍然没有修补AVM1 – apscience

+0

这个脚本不工作,但是任何东西,谢谢你的帮助 – wyman

1

有三个潜在的问题,可以导致键盘事件无法按预期工作;

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

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

  3. 如果您使用'wrapper'或'loader'swf加载主应用程序,并且第一次也是唯一一次点击处于包装swf中,那么您将遇到对象焦点问题,因此当您的主应用程序inits和KeyboardEvents被添加,将舞台的焦点对象设置为舞台(this.stage.focus = this.stage)。

相关问题