Skip to content

Instantly share code, notes, and snippets.

@jessefreeman
Created March 3, 2011 00:55
Show Gist options
  • Save jessefreeman/852111 to your computer and use it in GitHub Desktop.
Save jessefreeman/852111 to your computer and use it in GitHub Desktop.
A quick test to figure out line of sight in 2d array maps.
import flash.geom.Point;
//0 1 2 3 4
var map:Array = [["#","#","#","#","#"],//0
["#"," "," "," ","#"],//1
["#"," "," "," ","#"],//2
["#","#","#","#","#"],//3
["#"," ","#","#","#"]];//4
//0 1 2 3 4
var visibleMap:Array = [["?","?","?","?","?"],
["?","?","?","?","?"],
["?","?","?","?","?"],
["?","?","?","?","?"],
["?","?","?","?","?"]];
applyLight(map, new Point(4,2));
function applyLight(map:Array, center:Point):void
{
map[center.x][center.y] = "@";
var totalRows:int = map[0].length;
var totalColumns:int = map.length;
var i:int;
// Get top
for (i = 0; i < totalColumns; i++)
{
raytrace(center.x, center.y, 0, i);
raytrace(center.x, center.y, totalRows-1, i);
}
for (i = 0; i < totalRows; i++)
{
raytrace(center.x, center.y, i, 0);
raytrace(center.x, center.y, i, totalColumns-1);
}
trace(mapToString(map));
trace(mapToString(visibleMap));
}
function raytrace(x0:int, y0:int, x1:int, y1:int):void
{
trace(x1,y1);
var dx:int = Math.abs(x1 - x0);
var dy:int = Math.abs(y1 - y0);
var x:int = x0;
var y:int = y0;
var n:int = 1 + dx + dy;
var x_inc:int = (x1 > x0) ? 1 : -1;
var y_inc:int = (y1 > y0) ? 1 : -1;
var error:int = dx - dy;
dx *= 2;
dy *= 2;
var hitWall:Boolean = false;
for (; n > 0; --n)
{
var isWall:Boolean = visit(x, y);
if(isWall)
n=0;
if (error > 0)
{
x += x_inc;
error -= dy;
}
else
{
y += y_inc;
error += dx;
}
}
}
function visit(x:int, y:int):Boolean{
var tile:String = map[x][y];
visibleMap[x][y] = tile;
return tile == "#" ? true : false;
}
function mapToString(map:Array) : String
{
var stringMap : String = "";
var total : int = map.length;
var i : int;
// Render Map
for (i = 0;i < total;i ++)
{
stringMap = stringMap + (map[i] as Array).join() + "\n";
}
return stringMap;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment