示例#1
0
        public void PlaceRelic(Relic relic, int Tries = 20)
        {
            //TODO: Avoid other relics & doors
            var sides   = Helpers.Rnd.Float() > 0.5f;
            var topleft = Helpers.Rnd.Float() > 0.5f;

            relic.Position = !sides ? new Vector2(Helpers.Rnd.Float() > 0.5f ? Helpers.Rnd.Float(MainArea.Left, -40) : Helpers.Rnd.Float(40, MainArea.Right), topleft ? MainArea.Top - 12 : MainArea.Bottom + 26) :
                             new Vector2(topleft ? MainArea.Left - 16 : MainArea.Right + 16, Helpers.Rnd.Float(MainArea.Top, MainArea.Bottom));

            if (!sides)
            {
                if (!topleft)
                {
                    relic.Rotate(2);
                }
            }
            else
            {
                relic.Rotate(topleft ? 3 : 1);
            }

            // check collision
            bool collision = false;

            Visit(e =>
            {
                if (!collision && e != relic && (e is Relic r || e is Door) && Vector2.DistanceSquared(e.Position, relic.Position) < 30 * 30)
                {
                    collision = true;
                }
            });
            if (collision && Tries > 0)
            {
                PlaceRelic(relic, Tries - 1);
            }
        }
示例#2
0
        public GameLevel(int level)
        {
            LevelNumber = level;
            Add(new Entity()
            {
                TexturePath = $"World/level{Helpers.Rnd.Next(5)}",
                Depth       = Depths.Background,
            });

            MainArea = new Rectangle(-192, -104, 384, 192);
            PlayBounds.Add(MainArea);

            Add(new Fire(Math.Max(25, 180 - level * 2))
            {
                Position = GetFreePosition()
            });

            Settings = LevelGenerator.Generate(level);
            Puzzles  = new Puzzle[Settings.Puzzles.Length];
            for (int i = 0; i < Settings.Puzzles.Length; i++)
            {
                var item = Settings.Puzzles[i];
                Add(Puzzles[i] = new Puzzle(item.Width, item.Height, item.Width * item.PieceSize, item.Height * item.PieceSize, 0, item.Image));
            }
            for (int i = 0; i < Settings.Relics; i++)
            {
                var r = new Relic();
                PlaceRelic(r);
                Add(r);
            }

            _returnDoor = new Door(this, new Vector2(10, 101), 0, p =>
            {
                SetNextLevel(new TransitionLevel(p, this));
                _returnedPlayer = p;
            });
            _returnDoor.Open(true);
            Add(_returnDoor);

            _nextLevelDoor = new Door(this, new Vector2(-10, -101), 2, p => SetNextLevel(new TransitionLevel(!GameOver ? TransitionState.Next : TransitionState.GameOver, this)));
            Add(_nextLevelDoor);

            for (int i = 1; i < Helpers.Rnd.Next(1, 5); i++)
            {
                Add(new Rat());
            }


            Add(new Torch()
            {
                Position = new Vector2(80, -120)
            });
            Add(new Torch()
            {
                Position = new Vector2(180, -120)
            });
            Add(new Torch()
            {
                Position = new Vector2(-80, -120), Effects = SpriteEffects.FlipHorizontally
            });
            Add(new Torch()
            {
                Position = new Vector2(-180, -120), Effects = SpriteEffects.FlipHorizontally
            });
            Add(oldman = new SpritesheetEntity()
            {
                TexturePath = "Player/oldman", FirstFrame = new Rectangle(0, 0, 32, 32), Depth = Depths.Players + 0.0001f, FrameCount = 4, FPS = 2, Position = new Vector2(MainArea.Right - 16, MainArea.Top + 20)
            });
        }