作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我似乎无法让类中的键盘事件正常工作,我有一个 ENTER_FRAME 事件可以正常工作,但永远不会调用键盘事件。有任何想法吗?这是代码
package
{
import flash.display.MovieClip;
import flash.display.Stage;
import flash.events.*;
public class mainGame extends MovieClip
{
var myPlayer:player = new player();
function mainGame():void
{
trace("arg!");
addChild(myPlayer);
addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
addEventListener(Event.ENTER_FRAME, update);
}
function keyDown(evt:KeyboardEvent):void
{
trace("This never happens");
myPlayer.x++;
}
function update(evt:Event):void
{
trace("This happens fine");
}
}
}
提前致谢!
最佳答案
与 AS2 不同,在 AS3 中键盘事件不是全局的。它们被发布到舞台上,并通过显示列表冒泡到任何具有焦点的显示对象。在你的代码中,你的事件监听器被添加到 mainGame
,所以它只会在 mainGame
出现在舞台上并且用户点击(或鼠标点击)时触发超过了,我忘记了)mainGame
影片剪辑。
当你想全局获取键盘事件时,正如我所说,它们都是在冒泡之前从舞台开始的,所以如果你向舞台注册事件,你将获得所有键盘事件。所以正如 kekoav 所说,这样做的方法是
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
但是,您的问题是该代码中的 stage
不是全局变量。它是所有 DisplayObject 共有的属性,但在将对象添加到显示列表之前它为空。
因此,为了省去解释,如果您在将 mainGame
添加到舞台后调用上面的代码,它就会起作用。如果您没有简单的方法来做到这一点,您可以将键盘监听器添加到另一个知道何时触发的监听器中:
function mainGame():void {
//...
addEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
//...
}
private function stageAddHandler(e:Event):void {
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
removeEventListener(Event.ADDED_TO_STAGE, stageAddHandler);
}
关于flash - 类中的 AS3 键盘事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/959917/
我是一名优秀的程序员,十分优秀!