No vi nada que pudiera producir un stop del evento a ver si ustedes pueden:
Código:
Borre algunas cosas porque era muy largo//------------------------------------------------------------------------- // base helper methods //------------------------------------------------------------------------- function get(id) { return document.getElementById(id); }; function hide(id) { get(id).style.visibility = 'hidden'; }; function show(id) { get(id).style.visibility = null; }; function html(id, html) { get(id).innerHTML = html; }; function timestamp() { return new Date().getTime(); }; function random(min, max) { return (min + (Math.random() * (max - min))); }; function randomChoice(choices) { return choices[Math.round(random(0, choices.length-1))]; }; if (!window.requestAnimationFrame) { // http://paulirish.com/2011/requestanimationframe-for-smart-animating/ window.requestAnimationFrame = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback, element) { window.setTimeout(callback, 1000 / 60); } } //------------------------------------------------------------------------- // game constants //------------------------------------------------------------------------- var KEY = { ESC: 27, SPACE: 32, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40 }, DIR = { UP: 0, RIGHT: 1, DOWN: 2, LEFT: 3, MIN: 0, MAX: 3 }, stats = new Stats(), canvas = get('canvas'), ctx = canvas.getContext('2d'), ucanvas = get('upcoming'), uctx = ucanvas.getContext('2d'), speed = { start: 0.6, decrement: 0.005, min: 0.1 }, // how long before piece drops by 1 row (seconds) nx = 10, // width of tetris court (in blocks) ny = 20, // height of tetris court (in blocks) nu = 5; // width/height of upcoming preview (in blocks) //------------------------------------------------------------------------- // game variables (initialized during reset) //------------------------------------------------------------------------- var dx, dy, // pixel size of a single tetris block blocks, // 2 dimensional array (nx*ny) representing tetris court - either empty block or occupied by a 'piece' actions, // queue of user actions (inputs) playing, // true|false - game is in progress dt, // time since starting this game current, // the current piece next, // the next piece score, // the current score vscore, // the currently displayed score (it catches up to score in small chunks - like a spinning slot machine) rows, // number of completed rows in the current game step; // how long before current piece drops by 1 row function addEvents() { document.addEventListener('keydown', keydown, false); window.addEventListener('resize', resize, false); }; function keydown(ev) { var handled = false; if (playing) { switch(ev.keyCode) { case KEY.LEFT: actions.push(DIR.LEFT); handled = true; break; case KEY.RIGHT: actions.push(DIR.RIGHT); handled = true; break; case KEY.UP: actions.push(DIR.UP); handled = true; break; case KEY.DOWN: actions.push(DIR.DOWN); handled = true; break; case KEY.ESC: lose(); handled = true; break; } } else if (ev.keyCode == KEY.SPACE) { play(); handled = true; } if (handled) ev.preventDefault(); // prevent arrow keys from scrolling the page (supported in IE9+ and all other browsers) }; //------------------------------------------------------------------------- // GAME LOGIC //------------------------------------------------------------------------- function play() { hide('start'); reset(); playing = true; }; function lose() { show('start'); setVisualScore(); playing = false; }; function setVisualScore(n) { vscore = n || score; invalidateScore(); }; function setScore(n) { score = n; setVisualScore(n); }; function addScore(n) { score = score + n; }; function clearScore() { setScore(0); }; function clearRows() { setRows(0); }; function setRows(n) { rows = n; step = Math.max(speed.min, speed.start - (speed.decrement*rows)); invalidateRows(); }; function addRows(n) { setRows(rows + n); }; function getBlock(x,y) { return (blocks && blocks[x] ? blocks[x][y] : null); }; function setBlock(x,y,type) { blocks[x] = blocks[x] || []; blocks[x][y] = type; invalidate(); }; function clearBlocks() { blocks = []; invalidate(); } function clearActions() { actions = []; }; function setCurrentPiece(piece) { current = piece || randomPiece(); invalidate(); }; function setNextPiece(piece) { next = piece || randomPiece(); invalidateNext(); }; function reset() { dt = 0; clearActions(); clearBlocks(); clearRows(); clearScore(); setCurrentPiece(next); setNextPiece(); }; function update(idt) { if (playing) { if (vscore < score) setVisualScore(vscore + 1); handle(actions.shift()); dt = dt + idt; if (dt > step) { dt = dt - step; drop(); } } }; function handle(action) { switch(action) { case DIR.LEFT: move(DIR.LEFT); break; case DIR.RIGHT: move(DIR.RIGHT); break; case DIR.UP: rotate(); break; case DIR.DOWN: drop(); break; } }; function move(dir) { var x = current.x, y = current.y; switch(dir) { case DIR.RIGHT: x = x + 1; break; case DIR.LEFT: x = x - 1; break; case DIR.DOWN: y = y + 1; break; } if (unoccupied(current.type, x, y, current.dir)) { current.x = x; current.y = y; invalidate(); return true; } else { return false; } }; function rotate(dir) { var newdir = (current.dir == DIR.MAX ? DIR.MIN : current.dir + 1); if (unoccupied(current.type, current.x, current.y, newdir)) { current.dir = newdir; invalidate(); } }; function drop() { if (!move(DIR.DOWN)) { addScore(10); dropPiece(); removeLines(); setCurrentPiece(next); setNextPiece(randomPiece()); clearActions(); if (occupied(current.type, current.x, current.y, current.dir)) { lose(); } } }; function dropPiece() { eachblock(current.type, current.x, current.y, current.dir, function(x, y) { setBlock(x, y, current.type); }); }; function removeLines() { var x, y, complete, n = 0; for(y = ny ; y > 0 ; --y) { complete = true; for(x = 0 ; x < nx ; ++x) { if (!getBlock(x, y)) complete = false; } if (complete) { removeLine(y); y = y + 1; // recheck same line n++; } } if (n > 0) { addRows(n); addScore(100*Math.pow(2,n-1)); // 1: 100, 2: 200, 3: 400, 4: 800 } }; function removeLine(n) { var x, y; for(y = n ; y >= 0 ; --y) { for(x = 0 ; x < nx ; ++x) setBlock(x, y, (y == 0) ? null : getBlock(x, y-1)); } };
Full Code