示例#1
0
        private void CleanDeletedObjects()
        {
            List <IGameObject> deletedObjects = GameObjects.Where(x => x.ToBeRemoved).ToList();

            foreach (var obj in deletedObjects)
            {
                GameObjects.Remove(obj);
                if (obj is CollidableObject)
                {
                    ColliderGrid.Remove(obj as CollidableObject);
                }
            }
        }
示例#2
0
 protected override void UpdateCollision(ColliderGrid colliderGrid)
 {
     if (State is BrokenBrickBlock)
     {
         CollisionBox newBox = new CollisionBox();
         colliderGrid.Update(this, CollisionBox, newBox);
         CollisionBox.Min = newBox.Min;
         CollisionBox.Max = newBox.Max;
     }
     else
     {
         base.UpdateCollision(colliderGrid);
     }
 }
示例#3
0
        public TileMap(string filename, Game1 game)
        {
            Game = game;

            string     json = File.ReadAllText(filename);
            RawTileMap raw  = JsonConvert.DeserializeObject <RawTileMap>(json);

            MapWidth  = raw.MapWidth * 16;
            MapHeight = raw.MapHeight * 16;

            IsOutside = raw.IsOutside;

            ColliderGrid = new ColliderGrid(MapWidth, MapHeight, Utils.GCD(MapWidth, MapHeight));

            ToSpawn = new List <IGameObject>();

            GameObjects = new List <IGameObject>();

            GameObjects.Add(Avatar = new Avatar(this, new Vector2(raw.Avatar.X * 16, raw.Avatar.Y * 16)));
            CheckpointPosition     = new Vector2(raw.Avatar.X * 16, raw.Avatar.Y * 16);

            if (raw.Enemies != null)
            {
                if (raw.Enemies.Goombas != null)
                {
                    foreach (var enemy in raw.Enemies.Goombas)
                    {
                        GameObjects.Add(new Goomba(this, new Vector2(enemy.X * 16, enemy.Y * 16)));
                    }
                }

                if (raw.Enemies.Piranahs != null)
                {
                    foreach (var enemy in raw.Enemies.Piranahs)
                    {
                        GameObjects.Add(new Piranah(this, new Vector2(enemy.X * 16, enemy.Y * 16)));
                    }
                }

                if (raw.Enemies.Koopas != null)
                {
                    foreach (var enemy in raw.Enemies.Koopas)
                    {
                        if (enemy.Color.ToLower() == "red")
                        {
                            GameObjects.Add(new Koopa(this, new Vector2(enemy.X * 16, enemy.Y * 16), new RedKoopa()));
                        }
                        else if (enemy.Color.ToLower() == "green")
                        {
                            GameObjects.Add(new Koopa(this, new Vector2(enemy.X * 16, enemy.Y * 16), new GreenKoopa()));
                        }
                    }
                }

                if (raw.Enemies.MiniCovids != null)
                {
                    foreach (var enemy in raw.Enemies.MiniCovids)
                    {
                        GameObjects.Add(new MiniCovid(this, new Vector2(enemy.X * 16, enemy.Y * 16)));
                    }
                }

                if (raw.Enemies.CovidBosses != null)
                {
                    foreach (var enemy in raw.Enemies.CovidBosses)
                    {
                        GameObjects.Add(new CovidBoss(this, new Vector2(enemy.X * 16, enemy.Y * 16)));
                    }
                }
            }

            if (raw.Obstacles != null)
            {
                if (raw.Obstacles.QuestionBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.QuestionBlocks)
                    {
                        List <IGameObject> hiddenItems = new List <IGameObject>();
                        if (obstacle.HiddenItems != null)
                        {
                            for (int i = 0; i < obstacle.HiddenItems.Coins; i++)
                            {
                                hiddenItems.Add(new Item(this, new Vector2(), new Coin()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.FireFlowers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Flower()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.SuperMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new SuperMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Starmans; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Starmans()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.LifeMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new LifeMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Sanitizers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Sanitizer()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Masks; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Mask()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Vaccines; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Vaccine()));
                            }
                        }

                        GameObjects.Add(new QuestionBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new IdleQuestionBlock(), hiddenItems));
                    }
                }

                if (raw.Obstacles.UsedBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.UsedBlocks)
                    {
                        GameObjects.Add(new QuestionBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new UsedQuestionBlock(), new List <IGameObject>()));
                    }
                }

                if (raw.Obstacles.BrickBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.BrickBlocks)
                    {
                        List <IGameObject> hiddenItems = new List <IGameObject>();
                        if (obstacle.HiddenItems != null)
                        {
                            for (int i = 0; i < obstacle.HiddenItems.Coins; i++)
                            {
                                hiddenItems.Add(new Item(this, new Vector2(), new Coin()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.FireFlowers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Flower()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.SuperMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new SuperMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Starmans; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Starmans()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.LifeMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new LifeMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Sanitizers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Sanitizer()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Masks; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Mask()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Vaccines; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Vaccine()));
                            }
                        }

                        bool isBlue = obstacle.Color != null && obstacle.Color.ToLower() == "blue";
                        GameObjects.Add(new BrickBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new IdleBrickBlock(), hiddenItems, isBlue));
                    }
                }

                if (raw.Obstacles.FloorBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.FloorBlocks)
                    {
                        bool isBlue = obstacle.Color != null && obstacle.Color.ToLower() == "blue";
                        GameObjects.Add(new FloorBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), isBlue));
                    }
                }

                if (raw.Obstacles.Clouds != null)
                {
                    foreach (var obstacle in raw.Obstacles.Clouds)
                    {
                        if (obstacle.Type.Equals("Single"))
                        {
                            GameObjects.Add(new SingleCloud(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new Vector2(obstacle.XSpeed, obstacle.YSpeed), new Vector2(0, 0)));
                        }
                        else if (obstacle.Type.Equals("Double"))
                        {
                            GameObjects.Add(new DoubleCloud(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new Vector2(obstacle.XSpeed, obstacle.YSpeed), new Vector2(0, 0)));
                        }
                        else if (obstacle.Type.Equals("Triple"))
                        {
                            GameObjects.Add(new TripleCloud(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new Vector2(obstacle.XSpeed, obstacle.YSpeed), new Vector2(0, 0)));
                        }
                    }
                }

                if (raw.Obstacles.StairBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.StairBlocks)
                    {
                        GameObjects.Add(new StairBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16))
                        {
                            IsDoor = obstacle.IsDoor
                        });
                    }
                }

                if (raw.Obstacles.HiddenBlocks != null)
                {
                    foreach (var obstacle in raw.Obstacles.HiddenBlocks)
                    {
                        List <IGameObject> hiddenItems = new List <IGameObject>();
                        if (obstacle.HiddenItems != null)
                        {
                            for (int i = 0; i < obstacle.HiddenItems.Coins; i++)
                            {
                                hiddenItems.Add(new Item(this, new Vector2(), new Coin()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.FireFlowers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Flower()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.SuperMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new SuperMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Starmans; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Starmans()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.LifeMushrooms; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new LifeMushroom()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Sanitizers; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Sanitizer()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Masks; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Mask()));
                            }

                            for (int i = 0; i < obstacle.HiddenItems.Vaccines; i++)
                            {
                                hiddenItems.Add(new PowerUp(this, new Vector2(), new Vaccine()));
                            }
                        }

                        bool isBlue = obstacle.Color != null && obstacle.Color.ToLower() == "blue";
                        GameObjects.Add(new BrickBlock(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new HiddenBrickBlock(), hiddenItems, isBlue));
                    }
                }

                if (raw.Obstacles.Castle != null)
                {
                    foreach (var obstacle in raw.Obstacles.Castle)
                    {
                        GameObjects.Add(new Castle(this, new Vector2(obstacle.X * 16, obstacle.Y * 16)));
                    }
                }

                if (raw.Obstacles.Flagpole != null)
                {
                    foreach (var obstacle in raw.Obstacles.Flagpole)
                    {
                        GameObjects.Add(Flagpole = new Flagpole(this, new Vector2(obstacle.X * 16, obstacle.Y * 16)));
                        GameObjects.Add(new Flag(this, Flagpole));
                    }
                }

                if (raw.Obstacles.Peach != null)
                {
                    GameObjects.Add(Peach = new Peach(this, new Vector2(raw.Obstacles.Peach.X * 16, raw.Obstacles.Peach.Y * 16)));
                }

                if (raw.Obstacles.Gate != null)
                {
                    GameObjects.Add(Gate = new Gate(this, new Vector2(raw.Obstacles.Gate.X * 16, raw.Obstacles.Gate.Y * 16)));
                }

                if (raw.Obstacles.WarpPipes != null)
                {
                    foreach (var obstacle in raw.Obstacles.WarpPipes)
                    {
                        if (obstacle.Part.ToLower() == "end")
                        {
                            GameObjects.Add(new WarpPipe(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new End(), obstacle.WarpTo));
                        }
                        else if (obstacle.Part.ToLower() == "middle")
                        {
                            GameObjects.Add(new WarpPipe(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new Middle(), null));
                        }
                        else if (obstacle.Part.ToLower() == "side")
                        {
                            GameObjects.Add(new WarpPipe(this, new Vector2(obstacle.X * 16, obstacle.Y * 16), new Side(), obstacle.WarpTo));
                        }
                    }
                }
            }

            if (raw.PowerUps != null)
            {
                if (raw.PowerUps.SuperMushrooms != null)
                {
                    foreach (var powerUp in raw.PowerUps.SuperMushrooms)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new SuperMushroom()));
                    }
                }

                if (raw.PowerUps.LifeMushrooms != null)
                {
                    foreach (var powerUp in raw.PowerUps.LifeMushrooms)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new LifeMushroom()));
                    }
                }

                if (raw.PowerUps.FireFlowers != null)
                {
                    foreach (var powerUp in raw.PowerUps.FireFlowers)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new Flower()));
                    }
                }

                if (raw.PowerUps.Starmans != null)
                {
                    foreach (var powerUp in raw.PowerUps.Starmans)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new Starmans()));
                    }
                }

                if (raw.PowerUps.Sanitizers != null)
                {
                    foreach (var powerUp in raw.PowerUps.Sanitizers)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new Sanitizer()));
                    }
                }

                if (raw.PowerUps.Masks != null)
                {
                    foreach (var powerUp in raw.PowerUps.Masks)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new Mask()));
                    }
                }

                if (raw.PowerUps.Vaccines != null)
                {
                    foreach (var powerUp in raw.PowerUps.Vaccines)
                    {
                        GameObjects.Add(new PowerUp(this, new Vector2(powerUp.X * 16, powerUp.Y * 16), new Vaccine()));
                    }
                }
            }

            if (raw.Items != null && raw.Items.Coins != null)
            {
                foreach (var item in raw.Items.Coins)
                {
                    GameObjects.Add(new Item(this, new Vector2(item.X * 16, item.Y * 16), new Coin()));
                }
            }
        }
示例#4
0
        private void UpdateCollisions()
        {
            var movingObjects = new HashSet <CollidableObject>(GameObjects.Where(x => x is CollidableObject && (x as CollidableObject).Velocity.Length() > 0).Cast <CollidableObject>());
            HashSet <Tuple <CollidableObject, CollidableObject> > possibleCollisions = ColliderGrid.GetPossibleCollisionPairs(movingObjects);
            List <Collision> actualCollisions = new List <Collision>();

            foreach (var pair in possibleCollisions)
            {
                CollidableObject objA = pair.Item1;
                CollidableObject objB = pair.Item2;

                if (objA.CollisionBox.Intersects(objB.CollisionBox))
                {
                    actualCollisions.Add(new Collision(objA, objB));
                }
            }

            foreach (var coll in actualCollisions)
            {
                coll.UpdatePostCollision();
            }
        }