无法添加键盘事件监听器动作脚本

Posted

技术标签:

【中文标题】无法添加键盘事件监听器动作脚本【英文标题】:Can't add Keyboard Eventlistener actionscript 【发布时间】:2014-01-17 00:58:27 【问题描述】:

我刚开始学习动作脚本,为了帮助习惯语法,我正在挑战自己制作一个简单的游戏,你是一个射击落下的方块的圆圈。

由于某种原因,每次我尝试添加键盘事件侦听器时,游戏都无法运行。

这是我的播放器文件。

package

import flash.display.Sprite;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
public class Player extends Sprite

    //Variables
    private var playerRadius:Number = 50;
    private var playerX:Number = 5;
    private var playerY:Number = 5;
    private var speed:Number = 0;
    private var xvel:Number = 0;

    public function Player()
    
        init(); 
        //Drawing
        drawPlayer();
        //Event Listeners
        this.addEventListener(Event.ENTER_FRAME, updatePlayer);
                    stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);  
    
    //Update
    public function updatePlayer(event:Event):void
        this.x ++;
    
    //Draw
    private function drawPlayer():void
        graphics.beginFill(0xFF0000);
        graphics.drawCircle(10,10,50);
        graphics.endFill();
    
    //Control
    public function controlPlayer(event:KeyboardEvent):void
        if (event.keyCode == Keyboard.RIGHT) 
            speed = 5;
        
    



使用这段代码我只会得到一个白屏,但如果我注释掉

stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);  

它有效,但我无法控制播放器。

我将不胜感激!

【问题讨论】:

【参考方案1】:

使用您的代码,我能够找出您的问题,最终结果证明您的代码存在一些问题。我很惊讶您在测试应用程序时没有在 Flash 的“输出”面板中看到以下错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Player()
at Player_fla::MainTimeline/frame1()
    第一个问题是,当您创建Player 类型的对象时,它还没有添加到舞台,因此它还没有访问stage 对象的权限。 将播放器对象添加到舞台后,您才能将键盘事件的侦听器添加到舞台;但是,要实现这一点,您的Player 类需要知道它的一个实例已添加到舞台中,以便它确切知道何时应该注册键盘事件侦听器。

这是您的代码的更新版本,应该可以解决这些问题:

package

    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.KeyboardEvent;
    import flash.ui.Keyboard;

    public class Player extends Sprite
    
        //Variables
        private var playerRadius:Number = 50;
        private var playerX:Number = 5;
        private var playerY:Number = 5;
        private var speed:Number = 0;
        private var xvel:Number = 0;

        public function Player()
        
            init(); 

            //Drawing
            drawPlayer();

            //Event Listeners
            this.addEventListener(Event.ENTER_FRAME, updatePlayer);
            this.addEventListener(Event.ADDED_TO_STAGE, initKeyboardListener);
        

        public function initKeyboardListener(event:Event) 
            stage.addEventListener(KeyboardEvent.KEY_DOWN, controlPlayer);
        

        //Update
        public function updatePlayer(event:Event):void
            this.x++;
        

        //Draw
        private function drawPlayer():void
            graphics.beginFill(0xFF0000);
            graphics.drawCircle(10,10,50);
            graphics.endFill();
        

        //Control
        public function controlPlayer(event:KeyboardEvent):void 
            if (event.keyCode == Keyboard.RIGHT) 
                this.speed = 5;
            
        

     // end class

 // end package

为了使所有这些工作,不要忘记将播放器对象添加到舞台。我只能假设您已经这样做了,因为您没有共享任何代码来显示您在哪里使用 Player 类,但这里是我所指的示例:

import Player;

var player:Player = new Player();
stage.addChild(player);

此外,键盘监听器只是改变了speed 变量;但是速度变量尚未在您的代码中的其他任何地方实现,因此在修复此问题之前您不会在 GUI 中看到差异。我使用跟踪语句验证了所有侦听器都在正常工作。

【讨论】:

非常感谢,这很有帮助。 很高兴它帮助了你。如果这是您正在寻找的答案,请将答案标记为已接受。干杯。

以上是关于无法添加键盘事件监听器动作脚本的主要内容,如果未能解决你的问题,请参考以下文章

Java事件监听器的Java事件监听器

pyHook无法监听键盘事件?

事件处理机制

Java 键盘事件监听KeyListener

JavaScript键盘鼠标事件处理

Java JTable 添加了一个键盘事件,和鼠标点击事件的监听,如何在我键盘事件起作用时,让鼠标事件失效