public bool TileCollisions(bool tileCollide = true, bool tileTrigger = true, float wallDrag = 0.9f) { bool collided = false; for (int i = -1; i < 2; i++) { for (int j = -1; j < 2; j++) { //if (position == oldPosition) // return collided; disabled because may cause issues with OnCollide hooks on some tiles, enable later and try again Point currentTilePos = Center.WorldToTileCoords() + new Point(i, j); if (currentWorld.IsTileInWorld(currentTilePos)) { //these are by reference iirc FloorBase floorBase = currentWorld.floorLayer[currentTilePos.X, currentTilePos.Y].Base; if (Collide(currentTilePos, floorBase.CollisionRect(), tileCollide ? floorBase.IsSolid() : false) && tileTrigger) { //TODO TODO } WallBase wallBase = currentWorld.wallLayer[currentTilePos.X, currentTilePos.Y].Base; if (Collide(currentTilePos, wallBase.CollisionRect(), tileCollide ? wallBase.IsSolid() : false) && tileTrigger) { //TODO TODO } ObjectBase objectBase = currentWorld.objectLayer[currentTilePos.X, currentTilePos.Y].Base; if (Collide(currentTilePos, objectBase.CollisionRect(), tileCollide ? objectBase.IsSolid() : false) && tileTrigger) { //TODO //tileBase.OnCollide(this) } } } } return(collided); bool Collide(Point location, Rectangle[] rectList, bool solid) { bool hasCollided = false; foreach (Rectangle tileRect in rectList) { Rectangle testRect = new Rectangle(location.TileToWorldCoords() + tileRect.Location, tileRect.Size); if (testRect.Intersects(Rect)) { if (solid)//if solid, so position changing stuff, else just return { if (testRect.Intersects(OldRect)) { //anti-stuck position += Vector2.Normalize((Rect.Center - testRect.Center).ToVector2()) * 2; //multiplier at the ned is the distance it moves (speed) } else { if (testRect.Intersects(new Rectangle(new Point((int)position.X, (int)oldPosition.Y), size.ToPoint()))) { position.X = oldPosition.X; velocity.X = 0; velocity.Y *= wallDrag; } if (testRect.Intersects(new Rectangle(new Point((int)oldPosition.X, (int)position.Y), size.ToPoint()))) { position.Y = oldPosition.Y; velocity.Y = 0; velocity.X *= wallDrag; } } } hasCollided = true; } } if (hasCollided) { collided = true; } return(hasCollided); } }