The best way to do this is using a "tick" system:
Code:
function MovableObject(elm) {
this.elm = elm;
this.x = this.y = 0;
MovableObject.objs.push(this);
}
MovableObject.objs = [];
MovableObject.downKeys = [];
MovableObject.tickThread = null;
MovableObject.tick = function() {
for(var i = 0, o = MovableObject.objs; i < o.length; ++i)
o[i].update();
};
MovableObject.init = function() {
document.onkeydown = MovableObject.keyDownHandler;
document.onkeyup = MovableObject.keyUpHandler;
MovableObject.tickThread = setInterval(MovableObject.tick, 30);
};
MovableObject.keyIsDown = function(key) {
var keycode = (
typeof key === "string" ?
keycode = key.charCodeAt(0) :
key
);
return !!MovableObject.downKeys[keycode];
};
MovableObject.keyDownHandler = function(e) {
MovableObject.downKeys[(e || event).keyCode] = true;
};
MovableObject.keyUpHandler = function(e) {
MovableObject.downKeys[(e || event).keyCode] = false;
};
MovableObject.prototype.move = function(x, y) {
this.x += x;
this.y += y;
};
MovableObject.prototype.keymaps = [
"w" : [0, -1],
"a" : [-1, 0],
"s" : [0, 1],
"d" : [1, 0]
];
MovableObject.prototype.update = function() {
for(var key in this.keymaps)
if(MovableObject.keyIsDown(key))
this.move.apply(
this,
this.keymaps.map(
(function() {
var me = this;
return function(a) {
return a * me.speed;
};
)()
)[key]
);
var e = this.elm.style;
if(e.left !== this.x + "px")
e.left = this.x + "px";
if(e.top !== this.y + "px")
e.top = this.y + "px";
};
onload = function() {
MovableObject.init();
var im = document.createElement("img");
im.src = "1.gif";
document.body.appendChild("1.gif");
new MovableObject(im);
};
Untested. I've an example of this kind of thing at http://www.twey.co.uk/?q=gamekit.
Bookmarks