gpt4 book ai didi

flash - 类中的 AS3 键盘事件?

转载 作者:行者123 更新时间:2023-12-02 05:24:27 26 4
gpt4 key购买 nike

我似乎无法让类中的键盘事件正常工作,我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com