public List<StaticObject> GetWalls(Level level)
{
var gridSize = GridSpace.GetGridCoord(level.Size);
var final = new List<StaticObject>();
var walls = new List<StaticObject>();
var rows = new List<StaticObject>[(int)gridSize.Y];
var cols = new List<StaticObject>[(int)gridSize.X];
foreach (var entity in _mEntities)
if (entity.MType == XmlKeys.Walls)
walls.Add(new Tile(_mContent, .8f, entity));
CreateSortedIndicies(walls, rows, false);
for(var i = 0; i < rows.Length; i++)
{
var next = -1;
var collisionType = "";
var wall = new List<StaticObject>();
foreach (var obj in rows[i])
{
var gridLoc = GridSpace.GetGridCoord(obj.MPosition);
if ((gridLoc.X != next || !collisionType.Equals(obj.CollisionType)) && wall.Count > 0)
{
if (wall.Count > 1)
final.Add(new Wall(.8f, wall));
else
walls.Add(wall[0]);
next = -1;
collisionType = "";
wall.Clear();
}
if(wall.Count == 0)
{
walls.Remove(obj);
wall.Add(obj);
next = (int)gridLoc.X + 1;
collisionType = obj.CollisionType;
}
else if (gridLoc.X == next && collisionType.Equals(obj.CollisionType))
{
walls.Remove(obj);
wall.Add(obj);
next++;
}
}
if (wall.Count > 0)
{
if (wall.Count > 1)
final.Add(new Wall(.8f, wall));
else
walls.Add(wall[0]);
wall.Clear();
}
}
CreateSortedIndicies(walls, cols,true);
for (var i = 0; i < cols.Length; i++)
{
var next = -1;
var collisionType = "";
var wall = new List<StaticObject>();
foreach (var obj in cols[i])
{
var gridLoc = GridSpace.GetGridCoord(obj.MPosition);
if ((gridLoc.Y != next || !collisionType.Equals(obj.CollisionType)) && wall.Count > 0)
{
if (wall.Count > 1)
final.Add(new Wall(.8f, wall));
else
walls.Add(wall[0]);
next = -1;
wall.Clear();
}
if (wall.Count == 0)
{
walls.Remove(obj);
wall.Add(obj);
next = (int)gridLoc.Y + 1;
collisionType = obj.CollisionType;
}
else if (gridLoc.Y == next && collisionType.Equals(obj.CollisionType))
{
walls.Remove(obj);
wall.Add(obj);
next++;
}
}
if (wall.Count > 0)
{
if (wall.Count > 1)
final.Add(new Wall(.8f, wall));
else
walls.Add(wall[0]);
wall.Clear();
}
}
final.AddRange(walls);
return final;
}
/// <summary> /// Loads the level from the content manager /// </summary> /// <param name="content">Content Manager to load from</param> public void Load(ContentManager content) { _mObjects.Clear(); Reset(); var importer = new Importer(content); importer.ImportLevel(this); _mPlayer = new Player(content, ref _mPhysicsEnvironment, _mControls, .8f, EntityInfo.CreatePlayerInfo(GridSpace.GetGridCoord(StartingPoint))); _mObjects.Add(_mPlayer); _mObjects.AddRange(importer.GetObjects(ref _mPhysicsEnvironment)); _mPlayerEnd = importer.GetPlayerEnd(); if (_mPlayerEnd != null) _mObjects.Add(_mPlayerEnd); _mObjects.AddRange(importer.GetWalls(this).Cast<GameObject>()); _mRails = importer.GetRails(); _mTrigger.AddRange(importer.GetTriggers()); PrepareCollisionMatrix(); MNumCollected = 0; MNumCollectable = 0; //Clear the collection lists _mCollected.Clear(); _mRemoveCollected.Clear(); foreach (var gObject in _mObjects) { if (gObject.CollisionType == XmlKeys.Collectable) MNumCollectable++; } }