Exemplo n.º 1
0
        // called every time the state loads
        public override void Load()
        {
            Game.ClearColor = Veldrid.RgbaFloat.White;
            HasWon          = false;

            Camera      = new Camera2D(new Rectangle(0, 0, ElementGlobals.Window.Width, ElementGlobals.Window.Height));
            Camera.Zoom = 0.5f;

            Registry = new Registry();

            DrawableGroup           = Registry.RegisterGroup <TransformComponent, DrawableComponent>();
            DrawableMaskGroup       = Registry.RegisterGroup <TransformComponent, DrawableMaskComponent>();
            DrawableOverlayGroup    = Registry.RegisterGroup <OverlayComponent>();
            DrawableBackgroundGroup = Registry.RegisterGroup <BackgroundComponent>();
            PhysicsGroup            = Registry.RegisterGroup <TransformComponent, PhysicsComponent>();
            ColliderGroup           = Registry.RegisterGroup <TransformComponent, ColliderComponent>();
            ColliderEventGroup      = Registry.RegisterGroup <ColliderEventComponent>();
            DeathGroup           = Registry.RegisterGroup <DeathTag>();
            StartMovementGroup   = Registry.RegisterGroup <StartMovementComponent, PhysicsComponent, DrawableMaskComponent>();
            StopMovementGroup    = Registry.RegisterGroup <StopMovementComponent, PhysicsComponent, DrawableMaskComponent>();
            SpriteAnimationGroup = Registry.RegisterGroup <SpriteAnimationComponent, SpriteComponent, DrawableMaskComponent>();
            PlayerAnimationGroup = Registry.RegisterGroup <PlayerAnimationComponent, SpriteAnimationComponent, SpriteComponent>();
            MovingPlatformGroup  = Registry.RegisterGroup <MovingPlatformComponent>();
            RecordingsGroup      = Registry.RegisterGroup <RecordingComponent>();

            EntityBuilder.Registry = Registry;

            Player = EntityBuilder.CreatePlayer(new Vector2(50, -100));

            EntityBuilder.CreateBackgrounds();

            LevelGenerator.GenerateLevel(this);
            DebugManager = new DebugManager(this, Player);

            SoundManager.SetVolume(0, 0.25f);
            SoundManager.SetVolume(1, 0.5f);
            SoundManager.Play("Open Your Mind.ogg", 0, loop: true);
        }
Exemplo n.º 2
0
        public static void GenerateLevel(GameStatePlay gameState)
        {
            var rng = new Random();
            var platformsPerRecording = 10;
            var platforms             = (platformsPerRecording * Recordings.Count) + platformsPerRecording;
            var jumpHeight            = 100;
            var jumpLength            = 200;
            var recordingIndex        = 0;

            var prevPlatformPosition = Vector2.Zero;
            var nextPlatformPosition = new Vector2(25, 500);
            var prevMovingPlatform   = false;

            for (var i = 0; i < platforms; i++)
            {
                var     platform = EntityBuilder.CreatePlatform(nextPlatformPosition, PlatformType.Normal);
                ref var drawable = ref platform.GetComponent <DrawableMaskComponent>();

                var drawRect = EntityUtility.GetEntityDrawRect(platform);
                if (drawRect.Bottom > gameState.DeathHeight)
                {
                    gameState.DeathHeight = drawRect.Bottom;
                }

                var platformSize      = drawable.AtlasRect.SizeF * drawable.Scale;
                var verticalDirection = rng.Next(0, 10) < 5 ? -1 : 1;
                var platformOffset    = new Vector2(platformSize.X + jumpLength, verticalDirection * (platformSize.Y + jumpHeight));
                var recordingPlatform = false;

                if (i > 0 && i % platformsPerRecording == 0 && recordingIndex < Recordings.Count)
                {
                    var data      = Recordings[recordingIndex];
                    var recording = EntityBuilder.CreateRecording(data.Asset, drawRect.LocationF, drawRect.LocationF + new Vector2(drawRect.Width / 2 - 200, -450f), recordingIndex == Recordings.Count - 1, recordingIndex == Recordings.Count - 2);
                    recordingIndex   += 1;
                    drawable.Color    = Veldrid.RgbaFloat.Green;
                    recordingPlatform = true;
                }

                if (i > 3 && rng.Next(0, 10) < 3)
                {
                    var secondVerticalDirection = prevPlatformPosition.Y < nextPlatformPosition.Y ? 1 : -1;

                    var secondPlatformPosition = prevPlatformPosition
                                                 + new Vector2(
                        (platformSize.X + jumpLength) / 2,
                        ((platformSize.Y + jumpHeight) / 2) * secondVerticalDirection);

                    EntityBuilder.CreatePlatform(secondPlatformPosition, PlatformType.Death);
                    prevMovingPlatform = false;
                }
                else if (i > 3 && rng.Next(0, 10) < 3 && !prevMovingPlatform && !recordingPlatform)
                {
                    var endPosition = nextPlatformPosition + new Vector2(platformOffset.X * 2f, 0);

                    platform.TryAddComponent(new MovingPlatformComponent()
                    {
                        StartPosition = nextPlatformPosition,
                        EndPosition   = endPosition,
                        Destination   = endPosition,
                        MoveSpeed     = 200,
                        BaseCooldown  = 2f,
                        Cooldown      = 2f,
                    });

                    ref var collider = ref platform.GetComponent <ColliderComponent>();
                    collider.EventType = ColliderEventType.MovingPlatform;

                    nextPlatformPosition = endPosition;
                    prevMovingPlatform   = true;
                }