Keyboard management

Controls:

  • Use arrow keys to move elements across the screen.
  • Click on actors to select them.

This demo features the following elements:

  • Create events per frame. It is achieved by creating a 'forever' timer and setting a callback on timer tick.
  • Register a CAAT keyListener function.
  • Correctly interpret key events.

This code won't run in jsfiddle since the iframe won't allow to capture for keyboard events.

                        /**
                         * Startup it all up when the document is ready.
                         * Change for your favorite frameworks initialization code.
                         */
                        window.addEventListener(
                                'load',
                                function() {
                                    CAAT.modules.initialization.init(
                                            800, 500,
                                            'experiment-holder',
                                            [],
                                            keys
                                            );
                                },
                                false);


                        function keys(director) {

                            var size=               80;
                            var prevTime=           -1;
                            var pixelsPerSecond=    200;
                            var scene=              director.createScene();
                            var selected=           null;
                            var keys=               [0,0,0,0];

                            /**
                             * function to select on-screen actors.
                             * @param e
                             */
                            var mouseClick= function( e ) {
                                if ( selected ) {
                                    selected.setAlpha(1);
                                    selected.emptyBehaviorList();
                                }
                                this.setAlpha(.5);
                                this.emptyBehaviorList();
                                this.addBehavior(
                                    new CAAT.RotateBehavior().
                                            setValues( 0, 2*Math.PI ).
                                            setFrameTime( 0, 5000 ).
                                            setCycle( true )
                                ).addBehavior(
                                    new CAAT.ScaleBehavior().
                                            setValues( .8, 1.5, .8, 1.5 ).
                                            setFrameTime( 0, 3500 ).
                                            setPingPong().
                                            setCycle( true )
                                );
                                this.parent.setZOrder(this,Number.MAX_VALUE);
                                selected= this;
                            };

                            /**
                             * This timer makes the process to increment actor position based on elapsed time.
                             * it will move pixelsPerSecond pixels on any direction.
                             */
                            scene.createTimer( scene.time, Number.MAX_VALUE, null,
                                function(time, ttime, timerTask) {
                                    if ( !selected ) {
                                        return;
                                    }

                                    var ottime= ttime;
                                    if ( -1!=prevTime ) {
                                        ttime-= prevTime;

                                        selected.x += (ttime/1000)*pixelsPerSecond * (keys[1]-keys[0]);
                                        selected.y += (ttime/1000)*pixelsPerSecond * (keys[3]-keys[2]);

                                        if ( selected.x > director.width-20 ) {
                                            selected.x= director.width-20;
                                        } else if ( selected.x<-20 ) {
                                            selected.x= -20;
                                        }
                                        if ( selected.y > director.height-20 ) {
                                            selected.y= director.height-20;
                                        } else if ( selected.y<-20 ) {
                                            selected.y= -20;
                                        }
                                    }

                                    prevTime= ottime;
                                },
                                null
                            );


                            CAAT.registerKeyListener( function kl( keyEvent ) {

                                if ( !selected ) {
                                    return;
                                }

                                if ( keyEvent.getKeyCode()===CAAT.Keys.UP ) {
                                    keyEvent.preventDefault();
                                    keys[2]= ( keyEvent.getAction()==='up' ) ? 0 : 1;
                                }
                                if ( keyEvent.getKeyCode()===CAAT.Keys.DOWN ) {
                                    keyEvent.preventDefault();
                                    keys[3]= ( keyEvent.getAction()==='up' ) ? 0 : 1;
                                }
                                if ( keyEvent.getKeyCode()===CAAT.Keys.LEFT ) {
                                    keyEvent.preventDefault();
                                    keys[0]= ( keyEvent.getAction()==='up' ) ? 0 : 1;
                                }
                                if ( keyEvent.getKeyCode()===CAAT.Keys.RIGHT ) {
                                    keyEvent.preventDefault();
                                    keys[1]= ( keyEvent.getAction()==='up' ) ? 0 : 1;
                                }

                            });

                            var s0 = new CAAT.Actor().
                                    setFillStyle( '#f00' ).
                                    setBounds( Math.random()*director.width, Math.random()*director.height, size, size );
                            scene.addChild(s0);
                            s0.mouseClick= mouseClick;

                            var s1 = new CAAT.ShapeActor().
                                    setShape( CAAT.ShapeActor.prototype.SHAPE_CIRCLE ).
                                    setFillStyle( '#0f0' ).
                                    setBounds( Math.random()*director.width, Math.random()*director.height, size, size );
                            scene.addChild(s1);
                            s1.mouseClick= mouseClick;

                            var s2= new CAAT.StarActor().
                                    setBounds( Math.random()*director.width, Math.random()*director.height, size, size ).
                                    setStrokeStyle( "#00f" ).
                                    setFilled( false ).
                                    setOutlined( true ).
                                    initialize( 12, size, size/2 );
                            scene.addChild( s2 );
                            s2.mouseClick= mouseClick;

                            s0.mouseClick();
                        }