So, I have a basic Tetris game, which runs quite happily at 15 fps. However, the controls are slightly too sensitive at the moment, as you’ll probably see here. Is there anyway way to make the controls less sensitive (specifically the left/right controls)?
Code below:
var h:int = 18; //Height
var w:int = 10; //Width
var map = new Array();
for(var i:int = -2; i < w + 2; i++){ //Map out the map in a 2D array.
map* = new Array();
for(var j:int = 0; j < h; j++){
map*[j] = (i < 0 || i >= w) ? 10 : 0; //A few non-rendered columns, to signify edges
}
map*[map*.length] = 10; //Non-rendered row, to signify the bottom.
}
var tiles:Array = new Array();
tiles[0] = [[0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0], [0, 0, 1, 0]]; //I-block
tiles[1] = [[0, 2, 0], [2, 2, 0], [0, 2, 0]]; //T-block
tiles[2] = [[0, 3, 3], [0, 3, 0], [0, 3, 0]]; //L-block
tiles[3] = [[4, 4, 0], [0, 4, 0], [0, 4, 0]]; //J-block
tiles[4] = [[0, 5, 5], [0, 5, 5], [0, 0, 0]]; //O-block
tiles[5] = [[0, 0, 6], [0, 6, 6], [0, 6, 0]]; //S-block
tiles[6] = [[0, 7, 0], [0, 7, 7], [0, 0, 7]]; //Z-block
var colours:Array = new Array(0xDDDDDD, 0xFF0000, 0xFF8800, 0xFFFF00, 0x00FF00, 0x0000FF, 0xFF00FF, 0x00FFFF);
var pos:Array = new Array();
var piece:Array = new Array();
var frames:int = 0;
var down:Boolean = false;
var right:Boolean = false;
var left:Boolean = false;
//END VARS
makeMap();
addNewPiece();
renderMap();
stage.focus = this;
stage.addEventListener(Event.ENTER_FRAME, enterFrameListener);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownListener);
stage.addEventListener(KeyboardEvent.KEY_UP, keyUpListener);
function enterFrameListener(e:Event):void{
frames++;
if(down){
movePiece();
renderMap();
}
else if(frames % 10 == 0){
movePiece();
renderMap();
}
if(right){
movePiece('right');
renderMap();
}
if(left){
movePiece('left');
renderMap();
}
}
function keyDownListener(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.LEFT){
left = true;
}
if(e.keyCode == Keyboard.RIGHT){
right = true;
}
if(e.keyCode == Keyboard.UP){
rotatePiece();
}
if(e.keyCode == Keyboard.DOWN){
down = true;
}
renderMap();
}
function keyUpListener(e:KeyboardEvent):void{
if(e.keyCode == Keyboard.DOWN){
down = false;
}
if(e.keyCode == Keyboard.LEFT){
left = false;
}
if(e.keyCode == Keyboard.RIGHT){
right = false;
}
}
function arrayRotate(array:Array):Array{ //Rotate an array... literally!
var newArray:Array = new Array();
var len:int = array.length;
for(var i:int = 0; i < len; i++){
newArray* = new Array();
for(var j:int = 0; j < len; j++){
newArray*[j] = array[j][len - i - 1];
}
}
return newArray;
}
function renderMap():void{
for(var i = 0; i < w; i++){
for(var j = 0; j < h; j++){
this["map" + i + "_" + j].graphics.clear();
this["map" + i + "_" + j].graphics.beginFill(colours[map*[j]]);
this["map" + i + "_" + j].graphics.drawRect(0, 0, 24, 24);
this["map" + i + "_" + j].graphics.endFill();
}
}
}
function makeMap():void{
for(var i = 0; i < w; i++){
for(var j = 0; j < h; j++){
this["map" + i + "_" + j] = new MovieClip();
addChild(this["map" + i + "_" + j]);
this["map" + i + "_" + j].x = 20 + i * 25;
this["map" + i + "_" + j].y = 20 + j * 25;
}
}
}
function addNewPiece():void{
piece = new Array();
piece = tiles[Math.floor(Math.random() * 7)];
addPiece(piece);
}
function addPiece(piece:Array, x:int=3, y:int=0):void{
for(var i = 0; i < piece.length; i++){
for(var j = 0; j < piece.length; j++){
if(piece*[j] != 0){
map[i + x][j + y] = piece*[j];
}
}
}
pos = [x, y, piece.length]; //co-ords of where the piece is at, and its length
}
function removePiece():void{
for(var i = 0; i < pos[2]; i++){
for(var j = 0; j < pos[2]; j++){
if(piece*[j] != 0){
map[i + pos[0]][j + pos[1]] = 0;
}
}
}
}
function movePiece(dir:String='down'):void{
var newPos:Array = new Array();
var invalid:Boolean;
if(dir == 'left'){
newPos = [pos[0] - 1, pos[1], pos[2]];
}
else if(dir == 'right'){
newPos = [pos[0] + 1, pos[1], pos[2]];
}
else{
newPos = [pos[0], pos[1] + 1, pos[2]];
}
removePiece();
invalid = checkNewPiece(newPos, piece);
pos = invalid ? pos : newPos;
addPiece(piece, pos[0], pos[1]);
if(invalid && dir == 'down'){
checkRows();
addNewPiece();
}
}
function checkNewPiece(pos:Array, piece:Array):Boolean{
for(var i = 0; i < pos[2]; i++){
for(var j = 0; j < pos[2]; j++){
if(map[i + pos[0]][j + pos[1]] != 0 && piece*[j] != 0){
return true;
}
}
}
return false;
}
function rotatePiece():void{
var newPiece:Array = new Array();
removePiece();
newPiece = arrayRotate(piece);
piece = checkNewPiece(pos, newPiece) ? piece : newPiece;
addPiece(piece, pos[0], pos[1]);
}
function checkRows():void{ //Thingy that checks if a whole row's covered
var broken:Boolean = false;
for(var i = 0; i < h; i++){
broken = false;
for(var j = 0; j < w; j++){
if(map[j]* == 0){
broken = true;
break;
}
}
if(!broken){
deleteRow(i);
}
broken = false;
}
}
function deleteRow(row):void{
for(var i:int = 0; i < w; i++){
for(var j:int = row - 1; j >= 0; j--){
map*[j + 1] = map*[j];
}
map*[0] = 0;
}
}