【问题标题】:EventListener for key combinations in AS3?AS3中组合键的事件监听器?
【发布时间】:2016-06-02 19:41:10
【问题描述】:

我试图找出从 Flash 中退出独立应用程序的“快捷方式”的条件和。我想按下 2 个键,这两个键“C+M”的组合应该退出我的应用程序。 这是我的代码,但它仍然无法正常工作。我试图让舒尔该应用程序允许我同时按下多个按钮,然后我创建了退出功能。 任何答案都很棒。

var keyPressedC:Boolean;  
var keyPressedM:Boolean;       

addEventListener(KeyboardEvent.KEY_DOWN, check_key_down,false,0,true);
addEventListener(KeyboardEvent.KEY_UP, check_key_up,false,0,true);
addEventListener(Event.ENTER_FRAME, check_keys,false,0,true);

function check_keys(event:Event):void
{
    if(keyPressedC)
      trace("pushed C")
    if(keyPressedM)
      trace("pushed M")
}

function check_key_down(event:KeyboardEvent):void
{
    if(event.keyCode == 67)
        keyPressedC = true;
    if(event.keyCode == 77)
        keyPressedM = true;
   }

function check_key_up(event:KeyboardEvent):void
{
    if(event.keyCode == 67)
        keyPressedC = false;
    if(event.keyCode == 77)
        keyPressedM = false;
}
   
import flash.system.fscommand;

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterKeyHandlercm);
 function enterKeyHandlercm(event:KeyboardEvent):void 
{
	if (event.keyCode == Keyboard.C && event.keyCode == Keyboard.M)
	{
		fscommand("quit");
	}
}

已编辑,仍然无法正常工作:

var keyPressedC:Boolean;  
var keyPressedM:Boolean;       

addEventListener(KeyboardEvent.KEY_DOWN, check_key_down,false,0,true);
addEventListener(KeyboardEvent.KEY_UP, check_key_up,false,0,true);
addEventListener(Event.ENTER_FRAME, check_keys,false,0,true);

function check_keys(event:Event):void
{
    if(keyPressedC)
      trace("pushed C")
    if(keyPressedM)
      trace("pushed M")
}

function check_key_down(event:KeyboardEvent):void
{
    if(event.keyCode == 67)
        keyPressedC = true;
    if(event.keyCode == 77)
        keyPressedM = true;
   }

function check_key_up(event:KeyboardEvent):void
{
    if(event.keyCode == 67)
        keyPressedC = false;
    if(event.keyCode == 77)
        keyPressedM = false;
}
   
import flash.system.fscommand;

stage.addEventListener(KeyboardEvent.KEY_DOWN, enterKeyHandlercm);
 function enterKeyHandlercm(event:KeyboardEvent):void 
{
	if (keyPressedM == true && keyPressedC == true)
	{
		fscommand("quit");
	}
}

【问题讨论】:

  • 这有什么问题?你有错误吗?
  • 没有错误,但首先,我没有得到任何跟踪输出“pushed C”或“M”,其次,C+M 的组合没有退出应用程序。

标签: actionscript-3 flash animation actionscript


【解决方案1】:

在您的 enterKeyHandlercm 块中,您的逻辑应该评估 keypressed 值,而不是 keyCode 值。

function enterKeyHandlercm(event:KeyboardEvent):void 
{
    if (keyPressedM == true && keyPressedC == true)
    {
        fscommand("quit");
    }
}

使用此代码,为您的 5 个关键可能性(c up、c down、m up、m down、c+m down)中的每一个添加一个不同的 MC。

package {
    import flash.display.*;
    import flash.events.*;
    import flash.system.fscommand;
    import flash.system.System; //add this if you try System.exit(0);

    public class FlashTest extends MovieClip 
    {

        public function FlashTest() 
        {
            var keyPressedC:Boolean;  
            var keyPressedM:Boolean;       

            // need to add eventListener to stage
            // default values work fine.  
            stage.addEventListener(KeyboardEvent.KEY_DOWN, check_key_down);
            stage.addEventListener(KeyboardEvent.KEY_UP, check_key_up);
            stage.addEventListener(Event.ENTER_FRAME, check_keys);

            function check_key_down(event:KeyboardEvent):void
            {
                if(event.keyCode == 67)
                {
                    keyPressedC = true;
                    newBall(-100);
                }
                if(event.keyCode == 77)
                {
                    keyPressedM = true;
                    newBall();
                }
             }

             function check_key_up(event:KeyboardEvent):void
             {
                 if(event.keyCode == 67)
                 {
                     keyPressedC = false;
                     newBall(-50);
                 }
                 if(event.keyCode == 77)
                 {
                     keyPressedM = false;
                     newBall(50);
                 }
             }

             function enterKeyHandlercm(event:KeyboardEvent):void 
             {
                 if (keyPressedM == true && keyPressedC == true)
                 {
                     newBall(100); 
                     fscommand("quit");
                     // or try System.exit(0);
                 }
              }


              function newBall(x:Number=0):void
              {
                      var ball:Sprite = new Sprite();
                      ball.graphics.lineStyle();
                      ball.graphics.beginFill(0x000000);
                      ball.graphics.drawCircle(0,0,20);
                      ball.graphics.endFill();
                      addChild(ball);
                      ball.x = stage.stageWidth/2+x;
                      ball.y = stage.stageHeight/2;
              }      
          }
      }
  }

请原谅我的冗长,但这样我们就不会遗漏任何东西。我添加球构造函数的原因是因为我只有笔记本电脑,所以我不得不使用在线 IDE,而且我不知道如何找到输出窗口或运行调试器,而且它不需要系统命令。但我可以用 ball 方法确认的是,当“c”和“m”同时按下时,会实例化一个唯一的 MC。这意味着我们的代码现在会在两个键同时按下时使 flash 注册一个唯一事件。

【讨论】:

  • 这应该可以解决您的问题,但要进一步详细说明它为什么不起作用,event.KeyCode 只有一个值,所以它永远不会等于 both Keyboard.M 和Keyboard.C.'
  • 单个语句if's 不需要大括号
  • @BadFeelingAboutThis 谢谢。将我的答案编辑回原来的。我必须开始实现它,这样我才能像老板一样编码!
  • 那么有没有其他方法可以通过按 C+M 按钮从 Flash 重新启动 exe 文件?例如我可以重新配置随机键,所以文件会认为我在按 ctrl + q?
  • stackoverflow.com/questions/9021863/… 已经在这里进行了很好的讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多