Пример #1
0
        public void LoadDynamic(bool firstPass, bool incrementalLoading)
        {
#if !DEBUG
            try
            {
#endif

            EventBreak eb = eventBreaks.Find(e => e.StartTime > AudioEngine.Time);
            int loadPoint = incrementalLoading && eb != null ? eb.EndTime : Int32.MaxValue;

            if (firstPass)
            {
                Sort(); //run this once after loading.

                if (showStoryboard || !incrementalLoading)
                {
                    //First load is done on main thread.
                    foreach (Event e in events)
                    {
                        if (e.Sprite != null)
                        {
                            if (e.Sprite.Transformations.Count != 0 && e.Sprite.Transformations[0].Time1 > loadPoint)
                            {
                                break;
                            }

                            if (!e.Sprite.Bypass || !incrementalLoading)
                            {
                                e.Load();
                            }
                        }

                        dynamicLoadIndex++;
                    }
                }

                InitialLoadComplete = true;

                if (incrementalLoading)
                {
                    dynamicLoadIndex = 0;
                }
                else
                {
                    dynamicLoadCompletedIndex = dynamicLoadIndex;
                }
            }
            else if (dynamicLoadIndex < events.Count)
            {
                if (!InitialLoadComplete)
                {
                    return;
                }

                // Wait for the previous loading task to be completed
                // to avoid queuing them faster than they are processed
                if (dynamicLoadCompletedIndex < dynamicLoadIndex)
                {
                    return;
                }

                // Load events faster in the middle of a break
                bool canLoadMoreEvents = BreakCurrent != null &&
                                         BreakCurrent.StartTime + 1000 < AudioEngine.Time &&
                                         AudioEngine.Time < BreakCurrent.EndTime - 1000;

                bool hasLoadableEvent = false;
                int  startIndex       = dynamicLoadIndex;
                int  endIndex         = startIndex;
                for (; endIndex < events.Count; endIndex++)
                {
                    Event e = events[endIndex];

                    // Skip events that don't need to be loaded
                    if (e.Loaded || e.Sprite == null || e.Sprite.Transformations.Count == 0)
                    {
                        if (!hasLoadableEvent)
                        {
                            startIndex++;
                        }

                        continue;
                    }

                    hasLoadableEvent = true;

                    // Ensure events that are displayed or will be in the next seconds are loaded
                    if (e.StartTime < AudioEngine.Time + (canLoadMoreEvents ? 10000 : 2000))
                    {
                        continue;
                    }

                    // Stop loading when it reaches the load point
                    if (e.StartTime > loadPoint)
                    {
                        break;
                    }

                    // Load some events each time
                    if (endIndex - startIndex >= (canLoadMoreEvents ? 4 : 1))
                    {
                        break;
                    }
                }

                int loadCount = endIndex - startIndex;
                if (hasLoadableEvent && loadCount > 0)
                {
#if DEBUG
                    if (loadCount > 4)
                    {
                        Debug.Print("Dynamically loading " + loadCount + " event(s).");
                    }
#endif

                    // Dynamic loads can be shuffled to a second thread.
                    GameBase.RunBackgroundThread(delegate
                    {
                        for (int i = startIndex; i < endIndex; i++)
                        {
                            Event e = events[i];
                            if (!e.Loaded)
                            {
                                e.Load();
                            }
                        }

                        dynamicLoadCompletedIndex = endIndex;
                    });
                }
                else
                {
                    dynamicLoadCompletedIndex = endIndex;
                }

                dynamicLoadIndex = endIndex;

#if DEBUG
                if (dynamicLoadIndex == events.Count)
                {
                    Debug.Print("Finished loading all events.");
                }
#endif
            }

            dynamicLoadIndex = Math.Min(dynamicLoadIndex, events.Count);

#if !DEBUG
        }

        catch
        {
            //ensure we continue loading the next events if anything bad happens loading a single event.
            dynamicLoadIndex++;
        }
#endif
        }
Пример #2
0
        internal void Update()
        {
            bool breakMode = false;

            if (GameBase.Mode == Modes.Play &&
                AudioEngine.Time < HitObjectManager.hitObjects[0].StartTime - HitObjectManager.PreEmpt)
            {
                breakMode = true;
            }

            for (int i = 0; i < eventBreaks.Count; i++)
            {
                EventBreak e = eventBreaks[i];
                if (AudioEngine.Time >= e.StartTime && AudioEngine.Time <= e.EndTime)
                {
                    breakMode    = true;
                    BreakCurrent = e;

                    break;
                }
            }

            if (GameBase.Mode == Modes.Play && Player.Passing != passingCurrent)
            {
                passingCurrent = Player.Passing;

                for (int i = 0; i < storyLayerSets[(int)StoryLayer.Failing].Count; i++)
                {
                    Event e = storyLayerSets[(int)StoryLayer.Failing][i];
                    switch (e.Type)
                    {
                    case EventTypes.Sprite:
                    case EventTypes.Animation:
                        if (Player.Passing)
                        {
                            spriteManagerFG.Remove(e.Sprite);
                        }
                        else
                        {
                            spriteManagerFG.Add(e.Sprite);
                        }
                        break;

                    case EventTypes.Sample:
                        if (Player.Passing)
                        {
                            AudioEngine.SampleEvents.Remove(((EventSample)e).SampleCache);
                        }
                        else
                        {
                            AudioEngine.SampleEvents.Add(((EventSample)e).SampleCache);
                        }
                        break;
                    }
                }

                if (!firstRun)
                {
                    for (int i = 0; i < storyLayerSets[(int)StoryLayer.Passing].Count; i++)
                    {
                        Event e = storyLayerSets[(int)StoryLayer.Passing][i];
                        switch (e.Type)
                        {
                        case EventTypes.Sprite:
                        case EventTypes.Animation:
                            if (Player.Passing)
                            {
                                spriteManagerFG.Add(e.Sprite);
                            }
                            else
                            {
                                spriteManagerFG.Remove(e.Sprite);
                            }
                            break;

                        case EventTypes.Sample:
                            if (Player.Passing)
                            {
                                AudioEngine.SampleEvents.Add(((EventSample)e).SampleCache);
                            }
                            else
                            {
                                AudioEngine.SampleEvents.Remove(((EventSample)e).SampleCache);
                            }
                            break;
                        }
                    }
                }
                firstRun = false;
            }

            BreakMode = breakMode;

            if (!breakMode)
            {
                BreakCurrent = null;
            }

            //foregroundTexture.CurrentScale = GameBase.s_fadeScreen.CurrentScale;

            if (GameBase.Mode == Modes.Play && SkinManager.Current.SpinnerFadePlayfield && Player.IsSpinning && spriteManagerBG.Blackness < 1)
            {
                spriteManagerBG.Blackness += 0.04F;
                spriteManagerFG.Blackness += 0.04F;
            }
            else if (spriteManagerBG.Blackness > 0.3F)
            {
                spriteManagerBG.Blackness -= 0.04F;
                spriteManagerFG.Blackness -= 0.04F;
            }
            else if (!breakMode && spriteManagerBG.Blackness < 0.25F)
            {
                spriteManagerBG.Blackness += 0.04F;
                spriteManagerFG.Blackness += 0.04F;
                if (GameBase.Mode == Modes.Play && breakTop.TagNumeric == 1)
                {
                    breakTop.TagNumeric = 0;
                    breakTop.Transformations.Add(
                        new Transformation(TransformationType.Fade, 1, 0, GameBase.Time - 1, GameBase.Time + 200));
                    breakBottom.Transformations.Add(
                        new Transformation(TransformationType.Fade, 1, 0, GameBase.Time - 1, GameBase.Time + 200));
                }
            }
            else if (breakMode && (spriteManagerBG.Blackness > 0 || breakTop.TagNumeric == 0))
            {
                spriteManagerBG.Blackness -= 0.04F;
                spriteManagerFG.Blackness -= 0.04F;
                if (GameBase.Mode == Modes.Play && breakTop.TagNumeric == 0)
                {
                    breakTop.TagNumeric = 1;
                    breakTop.Transformations.Add(
                        new Transformation(TransformationType.Fade, 0, 1, GameBase.Time - 1, GameBase.Time + 200));
                    breakBottom.Transformations.Add(
                        new Transformation(TransformationType.Fade, 0, 1, GameBase.Time - 1, GameBase.Time + 200));
                }
            }

            VideoPlaying = false;

            //Handle video playback.
            for (int i = 0; i < videoSprites.Count; i++)
            {
                pVideo v = videoSprites[i];
                if (AudioEngine.AudioState == AudioEngine.AudioStates.Playing || AudioEngine.Time < 0)
                {
                    VideoPlaying = true;
                    if (!v.Triggered && AudioEngine.Time >= v.StartTime)
                    {
                        v.Start();
                        v.SeekToCurrent();
                    }
                }
                else
                {
                    if (v.Triggered)
                    {
                        v.Pause();
                    }
                }

                if (v.Triggered)
                {
                    if ((Math.Abs(v.video.offset) > 1000) ||
                        (v.video.offset != -1 &&
                         Math.Abs(v.video.lastSample - (AudioEngine.Time - v.StartTimeOffset)) > 500))
                    {
                        v.SeekToCurrent();
                    }
                }
            }
        }
Пример #3
0
        internal void Update()
        {
            float targetAlpha        = backgroundIsReady && showStoryboard ? 1 : 0;
            float maskingTargetAlpha = WidescreenStoryboard ? 0 : targetAlpha;

            if (GameBase.Mode == OsuModes.Edit)
            {
                spriteManagerFG.Alpha      = spriteManagerBG.Alpha = targetAlpha;
                spriteManagerMasking.Alpha = maskingTargetAlpha;
            }
            else
            {
                if (spriteManagerFG.Alpha != targetAlpha)
                {
                    spriteManagerBG.Alpha = spriteManagerFG.Alpha = OsuMathHelper.Clamp(spriteManagerFG.Alpha + ((targetAlpha < spriteManagerFG.Alpha ? -0.07f : 0.07f) * (float)GameBase.FrameRatio), 0, 1);
                }

                if (spriteManagerMasking.Alpha != maskingTargetAlpha)
                {
                    spriteManagerMasking.Alpha = OsuMathHelper.Clamp(spriteManagerMasking.Alpha + ((maskingTargetAlpha < spriteManagerMasking.Alpha ? -0.07f : 0.07f) * (float)GameBase.FrameRatio), 0, 1);
                }
            }

            bool breakMode = false;

            if (hitObjectManager.hitObjectsCount > 0)
            {
                if (beforeGameplay && AudioEngine.Time > hitObjectManager.EarliestHitObject.HittableStartTime - hitObjectManager.PreEmpt)
                {
                    beforeGameplay = false;
                }
                else if (!afterGameplay && AudioEngine.Time > hitObjectManager.LatestHitObject.HittableEndTime + hitObjectManager.HitWindow50)
                {
                    afterGameplay = true;
                }
            }
            else
            {
                beforeGameplay = true;
                afterGameplay  = false;
            }

            if (GameBase.Mode == OsuModes.Play && (beforeGameplay || afterGameplay))
            {
                breakMode = true;
            }

            for (int i = 0; i < eventBreaks.Count; i++)
            {
                EventBreak e = eventBreaks[i];

                if (AudioEngine.Time < e.StartTime || AudioEngine.Time > e.EndTime)
                {
                    continue;
                }

                breakMode    = true;
                BreakCurrent = e;

                break;
            }

            if (GameBase.Mode == OsuModes.Play && Player.Passing != passingCurrent)
            {
                passingCurrent = Player.Passing;

                if (passingCurrent)
                {
                    InvokeOnPassing();
                }
                else
                {
                    InvokeOnFailing();
                }

                //Sprites
                for (int i = 0; i < storyLayerSprites[(int)StoryLayer.Fail].Count; i++)
                {
                    Event e = storyLayerSprites[(int)StoryLayer.Fail][i];

                    e.Sprite.Bypass = passingCurrent;
                }

                //Samples
                for (int i = 0; i < storyLayerSamples[(int)StoryLayer.Fail].Count; i++)
                {
                    EventSample e = (EventSample)storyLayerSamples[(int)StoryLayer.Fail][i];

                    if (passingCurrent)
                    {
                        AudioEngine.SampleEvents.Remove(e.SampleCache);
                    }
                    else
                    {
                        AudioEngine.SampleEvents.Add(e.SampleCache);
                    }
                }

                if (!firstRun)
                {
                    //Sprites
                    for (int i = 0; i < storyLayerSprites[(int)StoryLayer.Pass].Count; i++)
                    {
                        Event e = storyLayerSprites[(int)StoryLayer.Pass][i];
                        e.Sprite.Bypass = !passingCurrent;
                    }

                    //Samples
                    for (int i = 0; i < storyLayerSamples[(int)StoryLayer.Pass].Count; i++)
                    {
                        EventSample e = (EventSample)storyLayerSamples[(int)StoryLayer.Pass][i];

                        if (passingCurrent)
                        {
                            AudioEngine.SampleEvents.Add(e.SampleCache);
                        }
                        else
                        {
                            AudioEngine.SampleEvents.Remove(e.SampleCache);
                        }
                    }
                }
                firstRun = false;
            }

            if (GameBase.Mode == OsuModes.Play && Player.Loaded && breakMode != BreakMode && !InputManager.ReplayMode)
            {
                //toggles go here. are only run on switching mode.
                if (!breakMode)
                {
                    NotificationManager.ClearMessageMassive();
                    //Clear any displaying messages when gameplay starts.
                }
            }

            BreakMode = breakMode;

            if (!breakMode)
            {
                BreakCurrent = null;
            }

            UpdateVideo();

            UpdateDimming();

            if (GameBase.SixtyFramesPerSecondFrame && showStoryboard)
            {
                LoadDynamic(false, true);
            }
        }