# Control Delicacy Control

**URL:** <https://forum.kirupa.com/t/control-delicacy-control/286431>\
**Category:** flash\
**Created:** [April 15, 2009, 12:06pm UTC](https://forum.kirupa.com/t/control-delicacy-control/286431 "2009-04-15T12:06:24Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![The\_X](https://avatars.discourse-cdn.com/v4/letter/t/aeb1de/32.png) [@The\_X](https://forum.kirupa.com/u/The_X)\
**Post date:** [April 15, 2009, 12:06pm UTC](https://forum.kirupa.com/t/control-delicacy-control/286431/1 "2009-04-15T12:06:24Z")

</div>

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](http://x.leetmuffin.com/flash/tetris.html). Is there anyway way to make the controls less sensitive (specifically the left/right controls)?

Code below:

```php
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;
	}
}

```
