Actionscript Key Listener Tutorial AS3

    Overview

    Allowing users to use the keyboard as well as the mouse is a great way to incite interaction with your flash. This tutorial will show how to code it and what you can do with some keyboard events. This changed with actionscript 3, note this tutorial is AS3.
    altKeY (Boolean) Indicates whether the Alt key is active (true) or inactive (false).
    charCode (uint) Contains the character code value of the key pressed or released.
    ctrlKey (Boolean) Indicates whether the Control key is active (true) or inactive (false).
    keyCode (uint) The key code value of the key pressed or released. KeyboardEvent
    keyLocation (uint) Indicates the location of the key on the keyboard. KeyboardEvent
    shiftKey (Boolean) Indicates whether the Shift key modifier is active (true) or inactive (false).

    Steps

    1. import KeyboardEvent,
      import flash.events.KeyboardEvent;
    2. assign any keycodes
      //keycodes
      var left:uint = 37;
      var up:uint = 38;
      var right:uint = 39;
      var down:uint = 40;
    3. add event listener KeyboardEvent.KEY_DOWN
      stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownListener);
    4. respond to keys
      function keyDownListener(e:KeyboardEvent) {
              trace(e.keyCode.toString());
      }

      or

      function keyDownListener(e:KeyboardEvent) {
              if (e.keyCode==left){
      		ship.x-=10;
      		ship.rotation = 90;
      	}
      	if (e.keyCode==up){
      		ship.y-=10;
      		ship.rotation = 180;
      	}
      	if (e.keyCode==right){
      		ship.x+=10;
      		ship.rotation = 270;
      	}
      	if (e.keyCode==down){
      		ship.y+=10;
      		ship.rotation = 0;
      	}
      }

    Example

    Here we have a swf with the keyboard event listener on the stage, and feedback boxes to give us all we can know about the event. It will tell us about certain keys (alt, ctrl (cmd), and shift) with a Boolean, it will tell us the keyCode and the charCode. The keyCode is the number that is tied to the actual button pressed or key, and the charCode relates to the character represented by the button(s) pressed. So hitting ‘s’ and then hitting ‘shift + s’ will tell you different charCodes, ‘s’ and ‘S’. but you’ll see that the s key has the same keyCode (you’ll also see the ‘shift’ keyCode as well). If needed you can use the String.fromCharCode function to determine what the charCode for something is. The location on the keyboard is even reported, this helps distinguish between the left shift and the right shift and even the numbers across the qwerty and the numpad on the right of the screen.

    Get Adobe Flash player

    Actionscript

    import flash.events.KeyboardEvent;

    //keycodes
    var left:uint = 37;
    var up:uint = 38;
    var right:uint = 39;
    var down:uint = 40;

    stage.addEventListener(KeyboardEvent.KEY_DOWN,keyDownListener);

    function keyDownListener(e:KeyboardEvent) {

    feedbackAlt.text = e.altKey.toString();
    feedbackCharCode.text = e.charCode.toString();
    feedbackChar.text = String.fromCharCode(feedbackCharCode.text);
    feedbackCtrl.text = e.ctrlKey.toString();
    feedbackKey.text = e.keyCode.toString();
    feedbackLoc.text = e.keyLocation.toString();
    feedbackShift.text = e.shiftKey.toString();

    if (e.keyCode == left){
    ship.x-=10;
    ship.rotation = 90;
    }
    if (e.keyCode == up){
    ship.y-=10;
    ship.rotation = 180;
    }
    if (e.keyCode == right){
    ship.x+=10;
    ship.rotation = 270;
    }
    if (e.keyCode == down){
    ship.y+=10;
    ship.rotation = 0;
    }
    }

    Download

    source file download: key-listener.fla

    This entry was posted in tutorial and tagged , , , , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

    17 Comments

    1. Twanneman
      Posted August 2, 2008 at 4:45 am | Permalink
    2. Posted August 2, 2008 at 10:59 am | Permalink

      Thanks for pointing that out, Twanneman! My bad… link is fixed now. Enjoy

    3. DJC
      Posted September 1, 2008 at 7:36 pm | Permalink

      Seems the ALT key is intercepted by the OS or app (Flash, browser, etc) in many cases and thus does not generate an event.

    4. Darwin M
      Posted October 29, 2008 at 9:04 am | Permalink

      Hi Evans,

      Great article! It seems like DJC is correct about Mac OS alt(option) key does not respond to the flashplayer. It works with firefox browser, but it does not work in Safari. Is there a way to fix that issue?

      Thanks.

    5. Posted May 1, 2009 at 2:58 pm | Permalink

      Nice post! Thanks for writing this up. Just a little suggestion though… might be more efficient to replace your multiple if() conditional statements with a switch-case statement inside keyDownListener. That way you will perform a minimum number of checks every time the listener is called.

    6. Posted May 2, 2009 at 12:02 pm | Permalink

      True. I guess I just copied pasted the first if statement, should at least be else ifs, but a switch would be the best for the job. Thanks!

    7. WORMSS
      Posted August 27, 2009 at 2:35 am | Permalink

      I was just wondering why you are storing left, right, up & down and not using Keyboard.LEFT, Keyboard.RIGHT, Keyboard.UP & Keyboard.DOWN?

    8. Nguyen Ho Thanh
      Posted January 12, 2010 at 3:58 pm | Permalink

      I don’t understand that at all. I did exactly like what you’ve shown and it reports error like “1120: Acceess of undefined property “.

      what should I put into the property of the movie clip.

    9. Kirill Panshin
      Posted January 24, 2011 at 9:52 am | Permalink

      In the demo on this webpage I have ‘Alt’ key ‘False’ with all keys except Alt + Ctrl

    10. Gus
      Posted May 1, 2011 at 9:27 am | Permalink

      Notice how when you hold an arrow the ship moves once, then there is a pause, then it begins moving quickly again… How do I remove the pause for smoothness?

      Number two, How do you register two keypresses at once???

      Any help would be excellent

      • Posted May 3, 2011 at 11:44 am | Permalink

        Hey Gus,
        Check out this discussion, the pause isn’t the “fault” of flash, but the OS. I’m guessing it was by design so if you’re typing and are slow to lift your finger on a key, you don’t end up having the character repeaaaated. There is a suggestion listed that may help that looks ok, but I haven’t tried it: http://board.flashkit.com/board/showthread.php?threadid=815876
        Regarding having multiple keys pressed simultaneously, it seems to me that they work, but when it doesn’t (and I suspect this is what you’re after) is when you hold two keys down and are expecting them to both continue firing. Like moving left and up together to go diagonally. The above link may still help and it seems the reasoning is the same per the OS controlling the actual keyboard events of the UI apparatus.

        • Gus
          Posted May 9, 2011 at 6:28 am | Permalink

          Thanks anyway, but I found an AS3 package that re-creates the old AS2 Key.isDown functionality, but with AS3. Its at
          If anyone is looking for it, (and my god its useful), find it here

          com.senocular.utils.KeyObject.as

    11. Posted May 3, 2011 at 1:00 pm | Permalink

      Your online version works perfectly. It gives different keycodes for the number pad versus the same character on the main keyboard. However, when I use the code and build my own .fla and then publish it, it the keycodes for the same character are identical on both the keypad and the main keyboard. How can I make the code work correctly like your online version does?

      • Posted May 3, 2011 at 11:53 am | Permalink

        Are you sure you’re looking at the charCode vs the keyCode? If you hit the ’1′ key in the keyboard and the ’1′ key on the number pad you should get the same charCode but a different keyCode.

    12. Posted June 17, 2011 at 10:54 am | Permalink

      This is exactly what I’ve been looking for! Thank you…someone finally wrote it in a way that makes sense to me.

    13. Trent
      Posted August 16, 2011 at 12:07 am | Permalink

      Nice to see a simple tutorial that actually works.

    Post a Comment

    Your email is never published nor shared. Required fields are marked *

    *
    *

    You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    • Recent Posts

      WordPress updates plugin directory

      New additions to the plugin directory include: favorites, incorporating support forums into it's own tab for each plugin as well as support stats being displayed! Great! I think we also need the ability to give plugins ratings and reviews (bonus points if it can be done from within a wordpress admin dashboard when installing plugins). [...]

      Short Head

      Use zipf's short head to tune your website rather than redesign the whole thing. To make a website successful it needs to meet the needs of the users. Find out what those needs are by using the short head philosophy to equate most searched things as the biggest needs of the users. Use personas to [...]

      Img Set?

      Great article at a list apart discusing the state of the industry regarding responsive images. This picks apart the set attribute of the img element from a surprisingly objective view coming from someone so close to the picture element. Insightful discussion about the principle behind the proposals than the actual solution too. If the working [...]

      Triudo

      A mesmerizing animated triangle-ish shape form. Embedded Link triduo triduo Tweet

      Git – the paradigm shift

      A great developer story about the differences on what Git is vs other version control and what Git is not. This is how we should learn it. I heard over and over that it was distributed, but never grasped what that meant, so here are a few links and explanations that will help unlearn version [...]

      Tweening Lib comes to Javascript!

      I'm very excited to share the news that the tween library from GreenSock (hands down the best tweening library I used in flash) is not ported for use in javascript! This will be great! I missed that simple syntax from as3 when animating javascript, and now I can have my cake and eat it too. [...]

      Responsive CSS Tricks

      Here are a few useful css tricks to remember when building responsive design sites from web designer wall Embedded Link 5 Useful CSS Tricks for Responsive Design Making the design to be responsive is very easy as shown in my Responsive Design in 3 Steps tutorial, but maintaining the elements to look aesthetically balanced on [...]

      Picture element of srcset attribute?

      Bruce details the reasons and story behind the srcset attribute which is now introduced as an alternative to the picture element. Some aspects of the attribute are nice (like the fact that it's an attribute and not a new element, so it's creating up new elements with for problems. It's adapting currently used elements to [...]

      SVG Preloader with Raphael JS

      Here's a very creative use of using a newly available technology. Using svg graphics which are very lightweight, for a website preloader. I like the animation used as well. Embedded Link Make a stylish preloader with SVG | Tutorial | .net magazine Many sites neglect users with slow connections. Ian Culshaw explains how to use [...]

      CSS3 Button/Icon set

      I've been secretly hoping to see a few of these pop up once the whole icon font idea spread through the nets. I really like this idea and it's a very nice implementation too! I only see some quality issues on a couple of the icons (such as youtube), but it's awesome and I hope [...]

    • Recent Comments

      Bruce Brownlee

      Bruce Brownlee

      Ah IE6. I'd have 2 more years of sleep without IE6. Margin doubling, no properties,...
      versaena

      versaena

      how to give color at runtime…… thank you
      Mobile Websites

      Mobile Websites

      I disagree, mobile websites are the future – desktop websites and mobile websites...
      Matt Fasick

      Matt Fasick

      That's cool. I like the ripple effect as well.
      Nico

      Nico

      hi! really great job guy! very impressive.. just a question… do u have a solution to do a refresh...
      Evan Mullins

      Evan Mullins

      Agreed! I've just seen some people get pretty heated about separating all functionality...