public Map(Bitmap bMap) { Tiles = new Tile[bMap.Width, bMap.Height]; for(int i = 0; i < Tiles.GetLength(0); ++i) for(int j = 0; j<Tiles.GetLength(1); ++j) { if (bMap.GetPixel(i, j).Equals(white)) { if (r.Next(10) > 7) Tiles[i, j] = new Tile(false, new Vec2f(i, j) * TileSize, "Assets/Textures/tree.png"); else Tiles[i, j] = new Tile(false, new Vec2f(i, j) * TileSize); } else { if (bMap.GetPixel(i, j).Equals(black)) { string Path = ""; bool left; if (i - 1 < 0) left = false; else left = bMap.GetPixel(i - 1, j).Equals(white); bool right; if (i + 1 >= Tiles.GetLength(0)) right = false; else right = bMap.GetPixel(i + 1, j).Equals(white); bool up; if (j - 1 < 0) up = false; else up = bMap.GetPixel(i, j - 1).Equals(white); bool down; if (j + 1 >= Tiles.GetLength(1)) down = false; else down = bMap.GetPixel(i, j + 1).Equals(white); if (!left && !right && !up && !down) Path = "Assets/Textures/ground_without_grass.png"; if (!left && !right && up && down) Path = "Assets/Textures/ground_straight.png"; if (left && right && !up && !down) Path = "Assets/Textures/ground_straight_2.png"; if (left && !right && up && !down) Path = "Assets/Textures/ground_corner_left_up.png"; if (left && !right && !up && down) Path = "Assets/Textures/ground_corner_left_down.png"; if (!left && right && up && !down) Path = "Assets/Textures/ground_corner_right_up.png"; if (!left && right && !up && down) Path = "Assets/Textures/ground_corner_right_down.png"; if (Path != "") Tiles[i, j] = new Tile(true, new Vec2f(i, j) * TileSize, Path); } if (bMap.GetPixel(i, j).Equals(red)) { Vec2f pos = new Vec2f(i, j) * TileSize; Tiles[i, j] = new Tile(true, pos, "Assets/Textures/house_humans.png"); SpawnPosition = new Vec2i(i, j); } if(bMap.GetPixel(i, j).Equals(yellow)) { Vec2f pos = new Vec2f(i, j) * TileSize; Tiles[i, j] = new Tile(true, pos, "Assets/Textures/house.png"); EndPosition = new Vec2i(i, j); } } } Verticies = new List<Vec2f>(); SetMovementVeticies(); }
public void Update(GameTime gTime) { if (IsAlive) { Animate(gTime); LifeBar.Scale = new Vec2f(Life / MaxLife, 1); LifeBar.Position = (Vec2f)sprite.Position + new Vec2f(0, LifeBar.Texture.Size.Y); if (Position.Distance(Verticies[VertexIndex]) < Help.Epsilon) VertexIndex++; sprite.Position = Position + (Verticies[VertexIndex] - Position).GetNormalized() * MovementSpeed * gTime.EllapsedTime.Milliseconds; float x = (Verticies[VertexIndex] - Position).X; float y = (Verticies[VertexIndex] - Position).Y; Vec2i v = new Vec2i((Math.Abs(x) >= 1) ? (int)x / (int)Math.Abs(x) : 0, (Math.Abs(y) >= 1) ? (int)y / (int)Math.Abs(y) : 0); if (v == new Vec2i(1, 0)) Movement = 0; if (v == new Vec2i(-1, 0)) Movement = 1; if (v == new Vec2i(0, -1)) Movement = 2; if (v == new Vec2i(0, 1)) Movement = 3; if (Life <= 0) { IsAlive = false; InGame.Money += Money; } } }
void SetMovementVeticies() { Verticies.Add((Vec2f)SpawnPosition * TileSize); Vec2i d = new Vec2i(1, 0); Vec2i pos = SpawnPosition; while(pos != EndPosition) { for (; pos != EndPosition && Tiles[(pos + d).X, (pos + d).Y].IsPath ;pos += d); if (pos == EndPosition) break; Verticies.Add((Vec2f)pos * TileSize); Vec2i t = -d; if (Tiles[pos.X + 0, pos.Y + 1].IsPath && -d != new Vec2i(0, 1)) d = new Vec2i(0, 1); else if (Tiles[pos.X + 1, pos.Y + 0].IsPath && -d != new Vec2i(1, 0)) d = new Vec2i(1, 0); else if (Tiles[pos.X - 1, pos.Y - 0].IsPath && -d != new Vec2i(-1, 0)) d = new Vec2i(-1, 0); else if (Tiles[pos.X - 0, pos.Y - 1].IsPath && -d != new Vec2i(0, -1)) d = new Vec2i(0, -1); } Verticies.Add((Vec2f)EndPosition * TileSize); }