public bool collidesWithWall(Vector2 position) { int x = (int)position.X; int y = (int)position.Y; if (x <= 0 || y <= 0) { return(true); } int levelX = x / Level.TEX_SIZE; // get which level you are in int levelY = y / Level.TEX_SIZE; if (levelX >= MAX_LEVELS || levelY >= MAX_LEVELS) { return(true); } Level level = RetroGame.getLevels()[levelX, levelY]; if (level == null) { return(true); } int tileX = (x % Level.TEX_SIZE) / Level.TILE_SIZE; // get which tile you are moving to int tileY = (y % Level.TEX_SIZE) / Level.TILE_SIZE; LevelContent.LevelTile tile = level.grid[tileX, tileY]; switch (tile) { case LevelContent.LevelTile.Wall: return(true); default: break; } return(false); }
public bool attemptScroll(Entity entity, Vector2 offset) { Vector2 topEdge = (entity.getTop() + offset); Vector2 bottomEdge = (entity.getBottom() + offset); Vector2 leftEdge = entity.getLeft() + offset; Vector2 rightEdge = entity.getRight() + offset; Vector2 leadEdge = Vector2.Zero; Direction dir = Direction.None; if (offset.X < 0 && offset.X != 0) { dir = Direction.Left; leadEdge = leftEdge; } else if (offset.X > 0 && offset.X != 0) { dir = Direction.Right; leadEdge = rightEdge; } else if (offset.Y < 0 && offset.Y != 0) { dir = Direction.Up; leadEdge = topEdge; } else if (offset.Y > 0 && offset.Y != 0) { dir = Direction.Down; leadEdge = bottomEdge; } int x = (int)leadEdge.X; int y = (int)leadEdge.Y; if (x <= 0 || y <= 0) { return(false); } int levelX = x / Level.TEX_SIZE; // get which level you are going to int levelY = y / Level.TEX_SIZE; if (levelX >= MAX_LEVELS || levelY >= MAX_LEVELS) { return(false); } Level level = RetroGame.getLevels()[levelX, levelY]; if (level == null) { return(false); } int tileX = (x % Level.TEX_SIZE) / Level.TILE_SIZE; // get which tile you are moving to int tileY = (y % Level.TEX_SIZE) / Level.TILE_SIZE; LevelContent.LevelTile tile = level.grid[tileX, tileY]; if (tile == LevelContent.LevelTile.Wall) { return(false); } else if (entity is Enemy && level.enemyGrid[tileX, tileY] != null && level.enemyGrid[tileX, tileY] != entity) { return(false); } return(true); }
public override LevelContent Process(Texture2DContent tex, ContentProcessorContext context) { string name = context.OutputFilename.Split('\\').Last().Split('.')[0]; tex.ConvertBitmapType(typeof(PixelBitmapContent <Color>)); PixelBitmapContent <Color> grid = (PixelBitmapContent <Color>)tex.Mipmaps[0]; LevelContent level = new LevelContent(); int w = grid.Width; int h = grid.Height; if (w == LevelContent.LEVEL_SIZE * CELL_SIZE && h == LevelContent.LEVEL_SIZE * CELL_SIZE) { level.Init(name, LevelContent.Type.Full); } else if (w == LevelContent.LEVEL_SIZE_HALF * CELL_SIZE && h == LevelContent.LEVEL_SIZE * CELL_SIZE) { level.Init(name, LevelContent.Type.HalfVertical); } else if (w == LevelContent.LEVEL_SIZE * CELL_SIZE && h == LevelContent.LEVEL_SIZE_HALF * CELL_SIZE) { level.Init(name, LevelContent.Type.HalfHorizontal); } else if (w == LevelContent.LEVEL_SIZE_HALF * CELL_SIZE && h == LevelContent.LEVEL_SIZE_HALF * CELL_SIZE) { level.Init(name, LevelContent.Type.Corner); } else { throw new ArgumentException("Texture " + tex.Name + " is " + w + "x" + h + "; should be a combination of " + (LevelContent.LEVEL_SIZE_HALF * CELL_SIZE) + " and " + (LevelContent.LEVEL_SIZE * CELL_SIZE)); } //Process cell int levelWidth = level.levelWidth; int levelHeight = level.levelHeight; //System.Diagnostics.Debugger.Launch(); for (int i = 0; i < levelWidth; i++) { for (int j = 0; j < levelHeight; j++) { //Individual cell Dictionary <Color, int> colorCount = new Dictionary <Color, int>(); for (int k = i * CELL_SIZE; k < (i + 1) * CELL_SIZE; k++) { for (int l = j * CELL_SIZE; l < (j + 1) * CELL_SIZE; l++) { Color pixel = grid.GetPixel(k, l); if (colorCount.ContainsKey(pixel)) { colorCount[pixel] = colorCount[pixel] + 1; } else { colorCount.Add(pixel, 1); } // System.Diagnostics.Debugger.Launch(); // use top-leftmost pixel for level's color unless already specified if (k == 0 && l == 0) { level.setColor(pixel); } } } // modeColor = most "popular" color in a given cell Color modeColor = Color.White; int minCount = 0; foreach (KeyValuePair <Color, int> pair in colorCount) { if (pair.Value > minCount) { minCount = pair.Value; modeColor = pair.Key; } } LevelContent.LevelTile finalTile = LevelContent.LevelTile.Floor; double minDistance = double.PositiveInfinity; foreach (KeyValuePair <LevelContent.LevelTile, Color> pair in LevelContent.TILE_TO_COLOR) { Color c = pair.Value; double distance = Math.Sqrt(Math.Pow(((int)modeColor.R - c.R), 2) + Math.Pow(((int)modeColor.G - c.G), 2) + Math.Pow(((int)modeColor.B - c.B), 2)); if (distance < minDistance) { minDistance = distance; finalTile = pair.Key; } } level.grid[i + j * levelWidth] = finalTile; } } return(level); }