Beispiel #1
0
 public MarioEntity(Vector2 location, EventSoundEffects sounds)
 {
     Sounds          = sounds;
     WonGame         = false;
     Factory         = new MarioFactory();
     PowerState      = new MarioStandardState(this);
     ActionState     = new Idling(this);
     Facing          = true;
     Sprite          = Factory.MarioSprite(PowerState, ActionState, Facing, location);
     SpritePosition  = location;
     SpriteVelocity  = new Vector2(0, 0);
     EntityCollision = new MarioCollision(this);
     Live            = 3;
 }
        private void MakeObject(System.Drawing.Color pixel, int x, int y)
        {
            Func <System.Drawing.Color, System.Drawing.Color, bool> sameColor = (c1, c2) => (c1.R == c2.R && c1.G == c2.G && c1.B == c2.B);
            Vector2            position    = new Vector2(x, y);
            AbstractGameObject initializer = null;

            if (!sameColor(pixel, Colors.Empty))
            {
                if (pixel.R == Colors.MarioSpawn.R && pixel.G == Colors.MarioSpawn.G)
                {
                    position = new Vector2(position.X, position.Y - (MarioHeight - 64));
                    Mario mario;
                    if (MarioCloneGame.Player1 == null && pixel.B == 0)
                    {
                        mario = MarioFactory.Create(position);
                        MarioCloneGame.Player1 = mario;
                        MarioCloneGame.HUDs.Add(new HeadsUpDisplay.HUD(mario, MarioCloneGame.Player1Camera));
                        Grid.Add(mario);
                    }
                    else if (MarioCloneGame.Player2 == null && pixel.B == 1 && (MarioCloneGame.Mode == GameMode.MultiPlayer))
                    {
                        mario = MarioFactory.Create(position);
                        MarioCloneGame.Player2 = mario;
                        MarioCloneGame.HUDs.Add(new HeadsUpDisplay.HUD(mario, MarioCloneGame.Player2Camera));
                        Grid.Add(mario);
                    }
                    else if (MarioCloneGame.Player1 != null && pixel.B == 0)
                    {
                        mario = MarioCloneGame.Player1;
                        mario.ResetMario(position);
                        MarioCloneGame.HUDs.Add(new HeadsUpDisplay.HUD(mario, MarioCloneGame.Player1Camera));
                        Grid.Add(mario);
                    }
                    else if (MarioCloneGame.Player2 != null && pixel.B == 1 && (MarioCloneGame.Mode == GameMode.MultiPlayer))
                    {
                        mario = MarioCloneGame.Player2;
                        mario.ResetMario(position);
                        MarioCloneGame.HUDs.Add(new HeadsUpDisplay.HUD(mario, MarioCloneGame.Player2Camera));
                        Grid.Add(mario);
                    }
                }
                else if (sameColor(pixel, Colors.MarioCheckpoint))
                {
                    MarioCloneGame.Player1.Spawns.Add(position);
                    if ((MarioCloneGame.Mode == GameMode.MultiPlayer))
                    {
                        MarioCloneGame.Player2.Spawns.Add(position);
                    }
                }
                else if (sameColor(pixel, Colors.QuestionBlock))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.QuestionBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.QuestionBlockGreenMushroom))
                {
                    initializer = BlockFactory.Instance.Create(BlockType.QuestionBlock, position);
                    ((AbstractBlock)initializer).ContainedPowerup = PowerUpType.GreenMushroom;
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.QuestionBlockFireFlower))
                {
                    initializer = BlockFactory.Instance.Create(BlockType.QuestionBlock, position);
                    ((AbstractBlock)initializer).ContainedPowerup = PowerUpType.Flower;
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (pixel.R == Colors.BrickBlock.R && pixel.G == Colors.BrickBlock.G)
                {
                    initializer = BlockFactory.Instance.Create(BlockType.BreakableBrick, position);
                    ((AbstractBlock)initializer).CoinCount = pixel.B;
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.UsedBlock))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.UsedBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.FloorBlock))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.FloorBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, (initializer.Position.Y + initializer.Sprite.SourceRectangle.Height));
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.StairBlock))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.StairBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.HiddenBlock))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.HiddenBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.Goomba))
                {
                    position             = new Vector2(position.X, position.Y - (GoombaHeight - 64));
                    initializer          = EnemyFactory.Create(EnemyType.Goomba, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.Piranha))
                {
                    initializer          = EnemyFactory.Create(EnemyType.Piranha, position);
                    initializer.Position = new Vector2(initializer.Position.X + Math.Abs(((initializer.Sprite.SourceRectangle.Width - PipeTopWidth) / 2)),
                                                       initializer.Position.Y +
                                                       (initializer.Sprite.SourceRectangle.Height) + PipeTopHeight);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.GreenKoopa))
                {
                    position             = new Vector2(position.X, position.Y);
                    initializer          = EnemyFactory.Create(EnemyType.GreenKoopa, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.RedMushroom))
                {
                    initializer          = PowerUpFactory.Create(PowerUpType.RedMushroom, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.GreenMushroom))
                {
                    initializer          = PowerUpFactory.Create(PowerUpType.GreenMushroom, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.FireFlower))
                {
                    initializer          = PowerUpFactory.Create(PowerUpType.Flower, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.Coin))
                {
                    initializer = PowerUpFactory.Create(PowerUpType.Coin, position);
                    ((AbstractPowerup)initializer).State = new CoinStaticState((AbstractPowerup)initializer);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.PipeSegment))
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.PipeSegment, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.Flagpole))
                {
                    if (MarioCloneGame.Mode != GameMode.SinglePlayer)
                    {
                        initializer          = BlockFactory.Instance.Create(BlockType.Flagpole, position);
                        initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                        Grid.Add(initializer);
                    }
                }
                else if (sameColor(pixel, Colors.PipeTop))
                {
                    PipeTop pipeTop = (PipeTop)BlockFactory.Instance.Create(BlockType.PipeTop, position);
                    pipeTop.Position = new Vector2(pipeTop.Position.X, pipeTop.Position.Y + pipeTop.Sprite.SourceRectangle.Height);
                    if (aboveGround)
                    {
                        pipeTop.LevelArea = 0;
                    }
                    else
                    {
                        String temp = Path.GetFileNameWithoutExtension(file);
                        pipeTop.LevelArea = temp[temp.Length - 1] - '0';
                    }

                    for (int i = (y / BlockHeight) - yOffsetFromUnderground - 1; i < _image.Height; i++)
                    {
                        System.Drawing.Color tempPixel = _image.GetPixel((x / BlockWidth) - xOffsetFromUnderground, i);
                        //"false" will be replaced with pixel.R == Colors.WarpSpot.R && pixel.G == Colors.WarpSpot.G
                        if (aboveGround && tempPixel.R == Colors.WarpPoint.R && tempPixel.G == Colors.WarpPoint.G)
                        {
                            if (danglingWarp != null)
                            {
                                danglingWarp.WarpEnd = pipeTop;
                                pipeTop.WarpEnd      = danglingWarp;
                                danglingWarp         = null;
                            }
                            else
                            {
                                danglingWarp = pipeTop;
                                aboveGround  = false;

                                String newFile    = String.Concat(Path.GetFileNameWithoutExtension(file), tempPixel.B, Path.GetExtension(file));
                                String tempHolder = file;
                                newFile = Path.Combine(Path.GetDirectoryName(file), newFile);

                                using (var stream = new FileStream(newFile, FileMode.Open))
                                {
                                    _image = new Bitmap(stream);
                                }

                                file = newFile;
                                LevelAreas.Add(tempPixel.B,
                                               new Microsoft.Xna.Framework.Rectangle(x, (i + 1) * BlockHeight, _image.Width * BlockWidth, MarioCloneGame.ReturnGraphicsDevice.PreferredBackBufferHeight));
                                CurrentArea            = tempPixel.B;
                                xOffsetFromUnderground = x / BlockWidth;
                                yOffsetFromUnderground = i;

                                BlockFactory.SpriteFactory = SubThemedBlockSpriteFactory.Instance;
                                CreationLoop(x / BlockWidth, i + 1);
                                BlockFactory.SpriteFactory = NormalThemedBlockSpriteFactory.Instance;

                                xOffsetFromUnderground = 0;
                                yOffsetFromUnderground = 0;
                                file        = tempHolder;
                                aboveGround = true;
                                CurrentArea = 0;
                                using (var stream = new FileStream(file, FileMode.Open))
                                {
                                    _image = new Bitmap(stream);
                                }
                            }

                            break;
                        }
                        //"false" will be replaced with pixel.R == Colors.WarpSpot.R && pixel.G == Colors.WarpSpot.G
                        else if (tempPixel.R == Colors.WarpPoint.R && tempPixel.G == Colors.WarpPoint.G)
                        {
                            if (danglingWarp != null)
                            {
                                danglingWarp.WarpEnd = pipeTop;
                                pipeTop.WarpEnd      = danglingWarp;
                                danglingWarp         = null;
                            }
                            else
                            {
                                danglingWarp = pipeTop;
                            }
                        }
                    }

                    Grid.Add(pipeTop);
                }
                else if (sameColor(pixel, Colors.QuestionBlockRedMushroom))
                {
                    initializer = BlockFactory.Instance.Create(BlockType.QuestionBlock, position);
                    ((AbstractBlock)initializer).ContainedPowerup = PowerUpType.RedMushroom;
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.BowserObject))
                {
                    position             = new Vector2(position.X, position.Y);
                    initializer          = EnemyFactory.Create(EnemyType.BowserIdle, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y);
                    Grid.Add(initializer);
                }
                else if (sameColor(pixel, Colors.FireCannonBlock))
                {
                    position             = new Vector2(position.X, position.Y);
                    initializer          = BlockFactory.Instance.Create(BlockType.FireCannon, position);
                    initializer.Position = new Vector2(initializer.Position.X, initializer.Position.Y + initializer.Sprite.SourceRectangle.Height);
                    Grid.Add(initializer);
                }
                else if (pixel.R == Colors.WarpPoint.R && pixel.G == Colors.WarpPoint.G)
                {
                    initializer          = BlockFactory.Instance.Create(BlockType.FloorBlock, position);
                    initializer.Position = new Vector2(initializer.Position.X, (initializer.Position.Y + initializer.Sprite.SourceRectangle.Height));
                    Grid.Add(initializer);
                    //MakeObject(Colors.FloorBlock, (x / BlockWidth) - xOffsetFromUnderground, (y / BlockHeight) - yOffsetFromUnderground - 1);

                    /*if ((x / BlockWidth) - 1 - xOffsetFromUnderground >= 0)
                     * {
                     *  //fill in the blank space with some surrounding to blend in
                     *  MakeObject(_image.GetPixel((x / BlockWidth) - 1 - xOffsetFromUnderground, (y / BlockHeight) - yOffsetFromUnderground - 1), x, y);
                     * }
                     * else if ((x / BlockWidth) + 1 < _image.Width)
                     * {
                     *  MakeObject(_image.GetPixel((x / BlockWidth) + 1 - xOffsetFromUnderground, (y / BlockHeight) - yOffsetFromUnderground - 1), x, y);
                     * }
                     * else
                     * {
                     *  MakeObject(Colors.FloorBlock, (x / BlockWidth) - xOffsetFromUnderground, (y / BlockHeight) - yOffsetFromUnderground - 1);
                     * }*/
                }
            }

            if (initializer != null)
            {
                initializer.LevelArea = CurrentArea;
            }
        }