Keyboard Control

2007/07/22 – alpha release
The code needs some cleanup, but everything is here.
Suggestions welcome in the forum.

Prototype’s Cross-Browser Event System.

Listen for Keypress Events

Delegate Events to a Screen Instance

// Screen ////////////////////////////////////////

Screen = Class.create();
Screen.prototype = {
    initialize : function (id) {
        this.id = id;
    },
    
    keyDown : function (e) {
    },
    
    keyUp : function(e) {
    },
    
    keyPress : function(e) {
    },
    

}

@TODO: use Event.observe from prototype

// Console ///////////////////////////////////////

Console = Class.create();
Console.prototype = {

    initialize : function (startScreen, tickSpeed) {
        this.tickSpeed = tickSpeed || 1; // milliseconds between ticks
        this.screen = startScreen;
    },
    
    start : function() {
        _con = this;
        document.onkeydown = function (e) { _con.keyDown(e) };
        document.onkeyup = function (e) { _con.keyUp(e) };
        document.onkeypress = function (e) { _con.keyPress(e) };
    },

    keyDown : function(e) {
        this.screen.keyDown(e);
    },
    
    keyUp : function(e) {
        this.screen.keyUp(e);
    },

    keyPress : function(e) {
        this.screen.keyPress(e);
    },
    
    


}
var gameconsole;
    gameconsole = new Console(GAME_SCREEN);
    gameconsole.start();
var GAME_SCREEN = Object.extend(new Screen('game'), {

});

how we dispatch to the game

browser sends events to the console

console sends events to current screen

the paddle should not know about the keyboard!

alternative: browser talks directly to screen

Every time we switch screens, we’ll need to change the browser’s event handling.

  • what happens on tick
  • what div/graphics to show
  • what happens on keypress

in other games:

  • what happens on mouse movement
  • on browser resize ( esp for full window games)

We need something to handle this, and to wire up each screen to the browser’s event system.

The console objects handles all this routing for us, but at the cost of an extra method call for each event and each tick.

An alternative might be more akin to a switchboard: when switching screens, it would simply reset the browser’s event handlers so they talk directly to the selected screen. It would gain us some speed at the expense of a little more work.

The nice thing is that we have a choice. As long as the FastConsole conformed to the same interface as the current Console object for switching screens, we would not have to change our application – only the constructor that we choose for Console.

@TODO: wire events directly to screen with observe/stopObserving

Move Left on Left Arrow, Right on Right Arrow

prototype provides Event.KEY_UP etc

case Event.KEY_LEFT:
            paddle.moveBy(-10,0);
            break;
        case Event.KEY_RIGHT:
            paddle.moveBy(+10,0);
            break;
    keyDown : function (e) {
        switch (e.keyCode) {
        case Event.KEY_LEFT:
            paddle.moveBy(-10,0);
            break;
        case Event.KEY_RIGHT:
            paddle.moveBy(+10,0);
            break;
        default:
            console.log('key ' + e.keyCode + ' pressed');
            break;
        }
    },

Keep the Paddle Inside the Console

getW : function() {
        return this.node.offsetWidth;
    },
    
    getH : function() {
        return this.node.offsetHeight;
    },
var game;

initialization function

game = new Sprite(); game.id=”game”; game.node=$(“game”);

Firebug: Observing Events

how do you know when the user does something?

browser sends an event

events are complicated by cross browser issues

window.event vs event parameter

Firefox (and most other browsers) follow the w3c spec and send events directly to the handler. IE uses a global variable, window.event

which this is this?

document.onkeypress=function(e) { _con.keyPress(e) }

prototype works across browsers

>>> Element.observe(‘paddle’, ‘click’, function(e) { paddle.moveby(10,0); })

Now if you click on the paddle, it will move.

Scroll to Top