我需要使用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);
}
对此有什么想法吗?
感谢您提前
答案 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)
有三个潜在问题可能导致键盘事件无法正常工作;
html页面中的flash对象未处于活动状态(即未对焦)。这可以通过上面的javascript解决方案来解决,但通常情况下,您需要用户在需要键盘输入之前点击应用中的内容。
您已将KeyboardEvent添加到的对象未处于焦点位置。要解决此问题,请将侦听器添加到舞台。
如果您正在使用“包装器”或“加载器”swf加载到主应用程序中并且第一次也是唯一一次单击是在包装器swf中,那么您将遇到对象焦点问题app inits和KeyboardEvents被添加,将舞台的焦点对象设置为舞台(this.stage.focus = this.stage)。