public void Update(Level level, GamePadState newPad, Mortimer player, float mx, float my, bool isChangingX, bool isChangingY) { Tile[,] tiles = level.tiles; bool hitATileWallX = false; bool hitATileWallY = false; for (int i = 0; i < tiles.GetLength(0); i++) { for (int j = 0; j < tiles.GetLength(1); j++) { Rectangle leftRect = new Rectangle((int)(rectangle.X), (int)(rectangle.Y + 5), 5, rectangle.Height - 10); Rectangle rightRect = new Rectangle((int)(rectangle.X + rectangle.Width - 5), (int)(rectangle.Y + 5), 5, rectangle.Height - 10); Rectangle topRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y), rectangle.Width - 10, 5); Rectangle bottomRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y + rectangle.Height - 5), rectangle.Width - 10, 5); Rectangle tileRect = new Rectangle((int)(tiles[i, j].x), (int)(tiles[i, j].y), Tile.TILE_SIZE, Tile.TILE_SIZE); if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(leftRect) || tileRect.Intersects(rightRect))) { hitATileWallX = true; } if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(topRect) || tileRect.Intersects(bottomRect))) { hitATileWallY = true; } } } if (hitATileWallX) { speed.X *= -1; } if (hitATileWallY) { speed.Y *= -1; } if (switchDirectionTime == 0) { switchDirectionTime = rand.Next(30, 400); int x = rand.Next(1, 101); int y = rand.Next(1, 101); if (x > 50) { speed.X *= -1; } if (y > 50) { speed.Y *= -1; } speed.X = (speed.X / Math.Abs(speed.X)) * ((int)(rand.NextDouble() * 3) + 1); speed.Y = (speed.Y / Math.Abs(speed.Y)) * ((int)(rand.NextDouble() * 3) + 1); } else { switchDirectionTime--; } fireTimer++; if (fireTimer % 10 == 0) { double multiplier = fireTimer / 600.0 * 3; bulletHeading = (float)(bulletHeading + rand.NextDouble() * multiplier) % 360; bullets.Add(new Bullet(new Rectangle(rectangle.X + 64, rectangle.Y + 64, 16, 16), bulletTex, 3, bulletHeading)); } // if (rectangle.Right >= screenW) // speed.X *= -1; // else if (rectangle.Left <= 0) // speed.X *= -1; ; // // if (rectangle.Y >= screenH - rectangle.Height) // speed.Y *= -1; // else if (rectangle.Y <= 0) // speed.Y *= -1; rectangle.X += (int)speed.X; rectangle.Y += (int)speed.Y; for (var i = 0; i < bullets.Count; i++) { // bullets[i].Update(); // bullets[i].relationalBulletUpdate(mx, my, isChangingX, isChangingY); if (bullets[i].rectangle.Intersects(player.rect)) { bullets[i] = null; } } while (bullets.Contains(null)) { bullets.Remove(null); } for (int i = bullets.Count - 1; i >= 0; i--) { bool collided = false; for (int x = 0; x < tiles.GetLength(0) & !collided; x++) { for (int y = 0; y < tiles.GetLength(1) && !collided; y++) { Rectangle tileRect = new Rectangle((int)(tiles[x, y].x), (int)(tiles[x, y].y), Tile.TILE_SIZE, Tile.TILE_SIZE); if (tiles[x, y].tileState == TileState.IMPASSABLE && tileRect.Intersects(bullets[i].rectangle)) { collided = true; } } } if (collided) { bullets[i] = null; } else { bullets[i].Update(); bullets[i].relationalBulletUpdate(mx, my, isChangingX, isChangingY); } } while (bullets.Contains(null)) { bullets.Remove(null); } if (catTimer == 420) { catTimer = 0; for (int i = 0; i < 4; i++) { level.enemies.Add(new Cat(level.game, new Vector2(rectangle.X + rand.Next(-60, 60), rectangle.Y + rand.Next(-60, 60)))); } } catTimer++; }
public void Update(Level level, GamePadState newPad, Mortimer player, double mx, double my, bool isChangingX, bool isChangingY) { Tile[,] tiles = level.tiles; bool hitATileWallX = false; bool hitATileWallY = false; for (int i = 0; i < tiles.GetLength(0); i++) { for (int j = 0; j < tiles.GetLength(1); j++) { Rectangle leftRect = new Rectangle((int)(rectangle.X), (int)(rectangle.Y + 5), 5, rectangle.Height - 10); Rectangle rightRect = new Rectangle((int)(rectangle.X + rectangle.Width - 5), (int)(rectangle.Y + 5), 5, rectangle.Height - 10); Rectangle topRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y), rectangle.Width - 10, 5); Rectangle bottomRect = new Rectangle((int)(rectangle.X + 5), (int)(rectangle.Y + rectangle.Height - 5), rectangle.Width - 10, 5); Rectangle tileRect = new Rectangle((int)(tiles[i, j].x), (int)(tiles[i, j].y), Tile.TILE_SIZE, Tile.TILE_SIZE); if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(leftRect) || tileRect.Intersects(rightRect))) { hitATileWallX = true; } if (tiles[i, j].tileState == TileState.IMPASSABLE && (tileRect.Intersects(topRect) || tileRect.Intersects(bottomRect))) { hitATileWallY = true; } } } if (hitATileWallX) { speed.X *= -1; } if (hitATileWallY) { speed.Y *= -1; } if (switchDirectionTime == 0) { switchDirectionTime = rand.Next(30, 400); int x = rand.Next(1, 101); int y = rand.Next(1, 101); if (x > 50) { speed.X *= -1; } if (y > 50) { speed.Y *= -1; } speed.X = (speed.X / Math.Abs(speed.X)) * ((int)(rand.NextDouble() * 3) + 1); speed.Y = (speed.Y / Math.Abs(speed.Y)) * ((int)(rand.NextDouble() * 3) + 1); } else { switchDirectionTime--; } if (fireTimer <= 0 && isOnScreen()) { float angle = (float)Math.Atan2(rectangle.Y - level.player.rect.Y, level.player.rect.X - rectangle.X); bullets.Add(new Bullet(new Rectangle(rectangle.X + rectangle.Width / 2, rectangle.Y + rectangle.Height / 2, 8, 8), bulletTex, 4, angle)); fireTimer = 120; } for (int i = 0; i < bullets.Count; i++) { bullets[i].Update(); bullets[i].relationalBulletUpdate((float)mx, (float)my, isChangingX, isChangingY); } while (bullets.Contains(null)) { bullets.Remove(null); } fireTimer--; // if (rectangle.Right >= screenW) // speed.X *= -1; // else if (rectangle.Left <= 0) // speed.X *= -1; ; // // if (rectangle.Y >= screenH - rectangle.Height) // speed.Y *= -1; // else if (rectangle.Y <= 0) // speed.Y *= -1; rectangle.X += (int)speed.X; rectangle.Y += (int)speed.Y; }