コード例 #1
0
        internal void Add(pDrawable p)
        {
            if (p == null)
            {
                return;
            }

            if (ForwardPlayOptimisedAdd && p.Transformations.Count > 0)
            {
                int index = forwardPlayList.BinarySearch(p);

                if (index < 0)
                {
                    forwardPlayList.Insert(~index, p);
                }
                else
                {
                    forwardPlayList.Insert(index, p);
                }
                return;
            }

            lock (SpriteLock)
            {
                int index = SpriteList.BinarySearch(p, pDrawableDepthComparer);
                //if (p.HoverPriority >= 0) p.HoverPriority = hoverPriorityCurrent++;
                SpriteList.Insert(index < 0 ? ~index : index, p);
            }
        }
コード例 #2
0
ファイル: MainMenu.cs プロジェクト: indefined/osu-stream
        private void explode(int beat, float strength = 1)
        {
            pDrawable explosion = explosions[beat];

            if (explosion.Alpha == 0 && !menuBackgroundNew.IsAwesome && osuLogo.ScaleScalar >= 0.6f)
            {
                explosion.ScaleScalar *= 1.3f;
                explosion.FadeIn(100);
            }

            if (!menuBackgroundNew.IsAwesome)
            {
                float adjust = beat == 0 ? (1 - 0.1f * strength) : (beat == 1 ? (1 + 0.05f * strength) : 1);
                if (osuLogo.Transformations.Count != 0 && osuLogo.Transformations[0] is TransformationBounce)
                {
                    ((TransformationBounce)osuLogo.Transformations[0]).EndFloat *= adjust;
                }
                else
                {
                    osuLogo.ScaleScalar *= adjust;
                    osuLogo.ScaleTo(0.625f, 500, EasingTypes.In);
                }
            }

            explosion.FlashColour(ColourHelper.Lighten2(explosion.Colour, 0.4f * strength), 350);
            explosion.ScaleScalar *= 1 + (0.2f * strength);
            explosion.ScaleTo(sizeForExplosion(beat), 400, EasingTypes.In);
        }
コード例 #3
0
        private void Option_OnClick(object sender, EventArgs e)
        {
            if (!IsAwesome)
            {
                return;
            }

            pDrawable d = sender as pDrawable;

            d.Colour = Color4.White;
            d.FadeColour((Color4)d.Tag, 600);

            ScaleTo(1.3f, 600);
            MoveTo(new Vector2(-75, 14), 600);

            AudioEngine.PlaySample(OsuSamples.MenuHit);

            if (sender == yellow)
            {
                Director.ChangeMode(OsuMode.Tutorial);
            }
            else if (sender == orange)
            {
                Director.ChangeMode(OsuMode.SongSelect);
            }
            else if (sender == blue)
            {
                Director.ChangeMode(OsuMode.Store);
            }
            else if (sender == pink)
            {
                Director.ChangeMode(OsuMode.Options);
            }
        }
コード例 #4
0
        internal virtual void Display()
        {
            if (IsDisplayed)
            {
                return;
            }

            if (ChatEngine.IsVisible && !AllowChatOverlay)
            {
                ChatEngine.HideChat();
                chatToggle = true;
            }

            for (int i = spriteManager.SpriteList.Count - 1; i > -1; i--)
            {
                pDrawable s = spriteManager.SpriteList[i];

                if (s.Transformations.Count > 0 && s.Transformations[0].Time2 < GameBase.Time)
                {
                    s.Transformations.ForEach(t => { t.Time1 += GameBase.Time; t.Time2 += GameBase.Time; });
                }

                if (s.Transformations.Count == 0 && s.InitialColour != Color.TransparentWhite)
                {
                    s.FadeInFromZero(300);
                }
            }

            IsDisplayed = true;
        }
コード例 #5
0
        /// <summary>
        /// Handle input for all sprites contained in this handler.
        /// </summary>
        /// <returns>true if input was handled</returns>
        internal bool CheckInput(bool highPass, bool alreadyHandled)
        {
            if (!HandleInput)
            {
                return(false);
            }

            if (highPass != HandleOverlayInput)
            {
                return(false);
            }

            if (Alpha < 0.01f || Bypass)
            {
                return(false);
            }

            pSprite lastHoverSprite = CurrentHoverSprite;

            resetHoverSprite();

            lock (SpriteList)
            {
                for (int i = 0; i < SpriteList.Count; i++)
                {
                    pDrawable s = SpriteList[i];

                    if (s.Bypass)
                    {
                        continue;
                    }

                    if (!alreadyHandled)
                    {
                        CheckHover(s);
                    }
                    else
                    {
                        s.Hovering = false;
                    }
                }
            }

            if (CurrentHoverSprite != null)
            {
                CurrentHoverSprite.Hovering = true;
            }

            if (lastHoverSprite != null && lastHoverSprite != CurrentHoverSprite)
            {
                lastHoverSprite.Hovering = false;
            }

            return(CurrentHoverSprite != null);
        }
コード例 #6
0
        public override void Initialize()
        {
            spriteManager.CheckSpritesAreOnScreenBeforeRendering = true;

            GameBase.Config.SaveConfig();

            InputManager.OnMove += InputManager_OnMove;
            InputManager.OnDown += InputManager_OnDown;

            InitializeBeatmaps();

            background =
                new pSprite(TextureManager.Load(OsuTexture.songselect_background), FieldTypes.StandardSnapCentre, OriginTypes.Centre,
                            ClockTypes.Mode, Vector2.Zero, 0, true, new Color4(56, 56, 56, 255));
            background.Scale.X    = background.DrawWidth / GameBase.BaseSize.X;
            background.AlphaBlend = false;
            spriteManager.Add(background);

            s_Header          = new pSprite(TextureManager.Load(OsuTexture.songselect_header), new Vector2(0, 0));
            s_Header.OnClick += delegate { };
            topmostSpriteManager.Add(s_Header);

            s_Footer = new pSprite(TextureManager.Load(OsuTexture.songselect_footer), FieldTypes.StandardSnapBottomRight, OriginTypes.BottomRight, ClockTypes.Mode, new Vector2(0, -100), 0.98f, true, Color4.White)
            {
                Alpha    = 0,
                Rotation = 0.04f,
                Position = new Vector2(-60, -85)
            };

            s_Footer.OnClick += footer_onClick;

            spriteManager.Add(s_Footer);

            topmostSpriteManager.Add(s_ButtonBack = new BackButton(onBackPressed, Director.LastOsuMode == OsuMode.MainMenu));

            if (Player.Beatmap != null)
            {
                showDifficultySelection(panels.Find(p => p.Beatmap != null && p.Beatmap.ContainerFilename == Player.Beatmap.ContainerFilename), true);
            }
            else
            {
                InitializeBgm();

                s_Header.Transform(new TransformationV(new Vector2(0, -15), Vector2.Zero, 0, 800, EasingTypes.In));
                s_Header.Transform(new TransformationF(TransformationType.Rotation, -0.06f, 0, 0, 800, EasingTypes.In));

                Vector2 pos = new Vector2(400, 0);
                foreach (BeatmapPanel p in panels)
                {
                    p.MoveTo(pos, 0);
                    pos.Y += BeatmapPanel.PANEL_HEIGHT + 10;
                    pos.X += 300;
                }
            }
        }
コード例 #7
0
        private void onStartButtonPressed(object sender, EventArgs args)
        {
            if (State == SelectState.Starting)
            {
                return;
            }

            if (Player.Difficulty == Difficulty.Expert && mapRequiresUnlock && !Player.Autoplay)
            {
                GameBase.Notify(LocalisationManager.GetString(OsuString.ExpertUnlock), delegate { pendingModeChange = false; });
                return;
            }

            AudioEngine.PlaySample(OsuSamples.MenuHit);

            State = SelectState.Starting;

            pDrawable activatedSprite = null;

            switch (Player.Difficulty)
            {
            case Difficulty.Easy:
                s_ModeButtonStream.FadeOut(200);
                s_ModeButtonExpert.FadeOut(200);
                activatedSprite = s_ModeButtonEasy;
                break;

            case Difficulty.Normal:
                s_ModeButtonEasy.FadeOut(200);
                s_ModeButtonExpert.FadeOut(200);
                activatedSprite = s_ModeButtonStream;
                break;

            case Difficulty.Expert:
                s_ModeButtonStream.FadeOut(200);
                s_ModeButtonEasy.FadeOut(200);
                activatedSprite = s_ModeButtonExpert;
                break;
            }

            activatedSprite.Transform(new TransformationBounce(Clock.ModeTime, Clock.ModeTime + 500, 1.2f, 0.4f, 1));

            activatedSprite.AdditiveFlash(800, 0.8f).Transform(new TransformationF(TransformationType.Scale, 1, 1.5f, Clock.Time, Clock.Time + 800, EasingTypes.In));

            background.FlashColour(new Color4(200, 200, 200, 255), 800);

            s_ModeArrowLeft.FadeOut(200);
            s_ModeArrowRight.FadeOut(200);

            s_Footer.AdditiveFlash(500, 0.5f);

            GameBase.Scheduler.Add(delegate { Director.ChangeMode(OsuMode.Play); }, 800);
        }
コード例 #8
0
        internal void Remove(pDrawable p)
        {
            if (p != null)
            {
                lock (SpriteLock)
                    SpriteList.Remove(p);

                if (p.IsDisposable)
                {
                    p.Dispose();
                }

                p.IsVisible = false;
            }
        }
コード例 #9
0
ファイル: Results.cs プロジェクト: indefined/osu-stream
        private void initializeTransition()
        {
            pDrawable fill = pSprite.FullscreenWhitePixel;

            fill.Scale.X   *= (float)RankableScore.count300 / RankableScore.totalHits + 0.001f;
            fill.Scale.Y    = fill_height;
            fill.DrawDepth  = 0.9f;
            fill.Alpha      = 1;
            fill.AlwaysDraw = true;
            fill.Colour     = new Color4(1, 0.63f, 0.01f, 1);
            fillSprites.Add(fill);

            fill            = pSprite.FullscreenWhitePixel;
            fill.Position.X = fillSprites[fillSprites.Count - 1].Position.X + fillSprites[fillSprites.Count - 1].Scale.X;
            fill.Scale.X   *= (float)RankableScore.count100 / RankableScore.totalHits + 0.001f;
            fill.Scale.Y    = fill_height;
            fill.DrawDepth  = 0.9f;
            fill.Alpha      = 1;
            fill.AlwaysDraw = true;
            fill.Colour     = new Color4(0.55f, 0.84f, 0, 1);
            fillSprites.Add(fill);

            fill            = pSprite.FullscreenWhitePixel;
            fill.Position.X = fillSprites[fillSprites.Count - 1].Position.X + fillSprites[fillSprites.Count - 1].Scale.X;
            fill.Scale.X   *= (float)RankableScore.count50 / RankableScore.totalHits + 0.001f;
            fill.Scale.Y    = fill_height;
            fill.DrawDepth  = 0.9f;
            fill.Alpha      = 1;
            fill.AlwaysDraw = true;
            fill.Colour     = new Color4(0.50f, 0.29f, 0.635f, 1);
            fillSprites.Add(fill);

            fill            = pSprite.FullscreenWhitePixel;
            fill.Position.X = fillSprites[fillSprites.Count - 1].Position.X + fillSprites[fillSprites.Count - 1].Scale.X;
            fill.Scale.X   *= (float)RankableScore.countMiss / RankableScore.totalHits + 0.001f;
            fill.Scale.Y    = fill_height;
            fill.DrawDepth  = 0.9f;
            fill.Alpha      = 1;
            fill.AlwaysDraw = true;
            fill.Colour     = new Color4(0.10f, 0.10f, 0.10f, 1);
            fillSprites.Add(fill);

            spriteManager.Add(fillSprites);
        }
コード例 #10
0
        public override void Update()
        {
            base.Update();

            //set the x scale back to the default value (override the bounce transformation).
            float lastPos = 0;

            for (int i = 0; i < fillSprites.Count; i++)
            {
                pDrawable fill = fillSprites[i];

                fill.Scale.Y = GameBase.BaseSizeFixedWidth.Y + 1;

                if (lastPos != 0)
                {
                    fill.Position.X = lastPos;
                }
                lastPos = fill.Position.X + fill.Scale.X;

                fill.UpdateFieldPosition();
                fill.UpdateFieldScale();
            }
        }
コード例 #11
0
        public override void Initialize()
        {
            arrowLarge          = new pSprite(TextureManager.Load(OsuTexture.stream_changing_arrow), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, Vector2.Zero, 0.95f, true, Color4.White);
            arrowLarge.Additive = true;
            //arrowLarge.Offset = new Vector2(100, 0);

            arrowSmall             = arrowLarge.Clone();
            arrowSmall.DrawDepth   = 0.9f;
            arrowSmall.ScaleScalar = 0.5f;

            text           = arrowLarge.Clone();
            text.DrawDepth = 1;
            text.Additive  = false;

            spriteManager.Add(arrowLarge);
            spriteManager.Add(arrowSmall);
            spriteManager.Add(text);

            //start hidden
            spriteManager.Sprites.ForEach(s => s.Alpha = 0);

            base.Initialize();
        }
コード例 #12
0
        internal void UpdateStarDifficultyDisplay(bool instant)
        {
            if (!IsLoaded || Beatmap == null || state < TreeItemState.ExtrasVisible)
            {
                return;
            }

            double stars = Math.Min(Beatmap.StarDisplay, 10.0); // We don't want to deal with more than 10 stars in this display

            if (currentlyVisibleStars == stars)
            {
                return;
            }

            double previouslyVisibleStars = currentlyVisibleStars;

            currentlyVisibleStars = stars;

            UpdateDifficultyText();

            // We want the -1 placeholder for "inexistant difficulty" to be treated like 0 stars here
            if (stars < 0)
            {
                stars = 0;

                int BackgroundStarSpritesEndIndex = starSpritesBeginIndex + AMOUNT_STARS;
                for (int i = starSpritesBeginIndex; i < BackgroundStarSpritesEndIndex; ++i)
                {
                    pDrawable starSprite = SpriteCollection[i];
                    starSprite.FadeOut(instant ? 0 : (OldLayout ? 1000 : 600));
                }
            }
            // ... with the exception of the background stars appearing. We want these to only appear once difficulty has been computed. (for looking good!)
            else
            {
                int BackgroundStarSpritesEndIndex = starSpritesBeginIndex + AMOUNT_STARS;
                for (int i = starSpritesBeginIndex; i < BackgroundStarSpritesEndIndex; ++i)
                {
                    pDrawable starSprite = SpriteCollection[i];
                    starSprite.FadeIn(instant ? 0 : (OldLayout ? 1000 : 600));
                }
            }



            int StarSpritesEndIndex = starSpritesBeginIndex + AMOUNT_STARS * 2;

            for (int i = starSpritesBeginIndex + AMOUNT_STARS; i < StarSpritesEndIndex; ++i)
            {
                int     starIndex  = i - (starSpritesBeginIndex + AMOUNT_STARS);
                double  starsLeft  = stars - starIndex;
                pSprite starSprite = SpriteCollection[i] as pSprite;

                starSprite.Transformations.Clear();

                if (OldLayout)
                {
                    int targetWidth = (int)(starSprite.Width * starsLeft);

                    // It is important to also clip the width to negative values so the animation is delayed when the stars potentially appear again after the difficulty has been computed.
                    // Don't optimize this and set to 0!
                    starSprite.ClipWidthTo(targetWidth, instant ? 0 : 500, EasingTypes.OutCubic);
                }
                else
                {
                    float newScale          = starsLeft <= 0 ? 0 : star_scale * (float)Math.Max(0.5f, Math.Min(1, starsLeft) + starIndex * 0.04f);
                    int   amountStarsScaled = (int)Math.Floor(starIndex - Math.Min(stars, previouslyVisibleStars));

                    if (instant)
                    {
                        starSprite.ScaleTo(newScale, 0);
                    }
                    else
                    {
                        int timeAddition = previouslyVisibleStars <= stars ? amountStarsScaled : (int)Math.Floor(previouslyVisibleStars - stars) - amountStarsScaled - 1;
                        int startTime    = GameBase.Time + timeAddition * 80 + 50;
                        starSprite.Transformations.Add(new Transformation(TransformationType.Scale, starSprite.Scale, newScale, startTime, startTime + 500, EasingTypes.OutBack));
                    }
                }
            }
        }
コード例 #13
0
        internal ScorePanel(Score score, EventHandler action)
        {
            Score = score;

            base_depth += 0.0001f * score.OnlineRank;

            s_BackingPlate = new pRectangle(Vector2.Zero, new Vector2(GameBase.BaseSize.X, PANEL_HEIGHT), true, base_depth, new Color4(0, 0, 0, 40))
            {
                Tag = this
            };

            s_BackingPlate.OnHover     += delegate { s_BackingPlate.FadeColour(new Color4(83, 156, 224, 80), 100); };
            s_BackingPlate.OnHoverLost += delegate { s_BackingPlate.FadeColour(new Color4(0, 0, 0, 40), 100); };

            Sprites.Add(s_BackingPlate);

            if (action != null)
            {
                s_BackingPlate.OnClick += action;
            }

            s_BackingPlate.HandleClickOnUp = true;

            pSpriteText rankNumber = new pSpriteText(score.OnlineRank.ToString(), "score", 0, FieldTypes.Standard, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(100, 100, 100, 255));

            rankNumber.Offset = new Vector2(GameBase.SuperWidePadding + 20, PANEL_HEIGHT / 2);
            rankNumber.TextConstantSpacing = true;
            rankNumber.SpacingOverlap      = 8;
            rankNumber.ZeroAlpha           = 0.5f;
            rankNumber.ScaleScalar         = 0.5f;
            Sprites.Add(rankNumber);

            pSprite rankingSprite = new pSprite(score.RankingTextureTiny, Vector2.Zero)
            {
                Origin    = OriginTypes.CentreLeft,
                DrawDepth = base_depth + 0.06f,
                Offset    = new Vector2(GameBase.SuperWidePadding + 23, PANEL_HEIGHT / 2)
            };

            Sprites.Add(rankingSprite);

            if (!score.guest)
            {
                pSpriteWeb avatar = new pSpriteWeb(@"https://api.twitter.com/1/users/profile_image/" + score.Username)
                {
                    Offset = new Vector2(GameBase.SuperWidePadding + 80, PANEL_HEIGHT / 2),
                    Origin = OriginTypes.Centre
                };
                Sprites.Add(avatar);
            }


            s_Text        = new pText(score.Username, 26, Vector2.Zero, Vector2.Zero, 0.5f, true, score.guest ? Color4.LightGray : Color4.White, false);
            s_Text.Bold   = true;
            s_Text.Offset = new Vector2(GameBase.SuperWidePadding + 100, 0);
            Sprites.Add(s_Text);

            pSpriteText scoreText = new pSpriteText("000000", "score", 0, FieldTypes.StandardSnapRight, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(255, 166, 0, 255));

            scoreText.Offset = new Vector2(GameBase.SuperWidePadding + 200, PANEL_HEIGHT / 2);
            scoreText.ShowInt(score.totalScore, 6, true);
            scoreText.TextConstantSpacing = true;
            scoreText.ZeroAlpha           = 0.5f;
            scoreText.ScaleScalar         = 0.8f;
            Sprites.Add(scoreText);

            pSpriteText accuracy = new pSpriteText((score.accuracy * 100).ToString("00.00", GameBase.nfi) + "%", "score", 0, FieldTypes.StandardSnapRight, OriginTypes.CentreRight, ClockTypes.Mode, Vector2.Zero, 0.9f, true, new Color4(0, 180, 227, 255));

            accuracy.Offset              = new Vector2(GameBase.SuperWidePadding + 20, PANEL_HEIGHT / 2);
            accuracy.ScaleScalar         = 0.8f;
            accuracy.TextConstantSpacing = true;
            Sprites.Add(accuracy);
        }
コード例 #14
0
 internal void ResortDepth(pDrawable p)
 {
     Remove(p);
     Add(p);
 }
コード例 #15
0
        internal void SetDisplay(int countdown)
        {
            bool didChangeTexture = true;

            switch (countdown)
            {
            case 0:
                text.Texture = TextureManager.Load(OsuTexture.countdown_go);
                spriteManager.FadeOut(400);
                AudioEngine.PlaySample(OsuSamples.countgo);
                HasFinished = true;
                break;

            case 1:
                text.Texture = TextureManager.Load(OsuTexture.countdown_1);
                AudioEngine.PlaySample(OsuSamples.count1);
                break;

            case 2:
                text.Texture = TextureManager.Load(OsuTexture.countdown_2);
                AudioEngine.PlaySample(OsuSamples.count2);
                break;

            case 3:
                text.Texture = TextureManager.Load(OsuTexture.countdown_3);
                AudioEngine.PlaySample(OsuSamples.count3);
                break;

            case 4:
            case 5:
            case 6:
            case 7:
                text.Texture = TextureManager.Load(OsuTexture.countdown_ready);
                if (spriteManager.Alpha == 0)
                {
                    spriteManager.FadeIn(200);
                }
                didChangeTexture = countdown == 7;
                break;

            default:
                return;
            }

            if (countdown < 4)
            {
                text.Transformations.RemoveAll(t => t is TransformationBounce);
                background.Transformations.RemoveAll(t => t is TransformationBounce);

                text.Transform(new TransformationBounce(Clock.AudioTime, Clock.AudioTime + 300, Math.Max(1, text.ScaleScalar), 0.2f, 3));
                background.Transform(new TransformationBounce(Clock.AudioTime, Clock.AudioTime + 300, Math.Max(1, background.ScaleScalar), 0.2f, 3));

                if (OnPulse != null)
                {
                    OnPulse();
                }
            }

            if (didChangeTexture)
            {
                pDrawable flash = text.AdditiveFlash(300, 0.5f);
                flash.Transform(new TransformationF(TransformationType.Scale, 1, 1.2f, Clock.AudioTime, Clock.AudioTime + 400));
                flash.Transform(new TransformationF(TransformationType.Rotation, 0, 0.1f, Clock.AudioTime, Clock.AudioTime + 400));
            }
        }
コード例 #16
0
ファイル: Notification.cs プロジェクト: ReiFan49/osu-stream
        private void AddControls(NotificationStyle style)
        {
            const int button_height = 95;

            switch (style)
            {
            case NotificationStyle.Okay:
            {
                pDrawable additiveButton = null;

                okayButton = new pSprite(TextureManager.Load(OsuTexture.notification_button_ok), new Vector2(0, button_height))
                {
                    Field           = FieldTypes.StandardSnapCentre,
                    Origin          = OriginTypes.Centre,
                    Clocking        = ClockTypes.Game,
                    DimImmune       = true,
                    DrawDepth       = 0.99f,
                    HandleClickOnUp = true
                };
                okayButton.OnHover += delegate { additiveButton = okayButton.AdditiveFlash(10000, 0.4f); };

                okayButton.OnHoverLost += delegate
                {
                    if (additiveButton != null)
                    {
                        additiveButton.FadeOut(100);
                    }
                };

                okayButton.OnClick += delegate { dismiss(true); };

                Add(okayButton);

                pText okayText = new pText(LocalisationManager.GetString(OsuString.Okay), 24, new Vector2(0, button_height), Vector2.Zero, 1, true, Color4.White, true)
                {
                    Field     = FieldTypes.StandardSnapCentre,
                    Origin    = OriginTypes.Centre,
                    Clocking  = ClockTypes.Game,
                    DimImmune = true
                };

                Add(okayText);
            }
            break;

            case NotificationStyle.YesNo:
            {
                pDrawable additiveButton = null;

                okayButton = new pSprite(TextureManager.Load(OsuTexture.notification_button_yes), new Vector2(-140, button_height))
                {
                    Field           = FieldTypes.StandardSnapCentre,
                    Origin          = OriginTypes.Centre,
                    Clocking        = ClockTypes.Game,
                    DimImmune       = true,
                    DrawDepth       = 0.99f,
                    HandleClickOnUp = true
                };

                okayButton.OnHover += delegate { additiveButton = okayButton.AdditiveFlash(10000, 0.4f); };

                okayButton.OnHoverLost += delegate
                {
                    if (additiveButton != null)
                    {
                        additiveButton.FadeOut(100);
                    }
                };

                okayButton.OnClick += delegate { dismiss(true); };

                Add(okayButton);

                pText okayText = new pText(LocalisationManager.GetString(OsuString.Yes), 24, new Vector2(-140, button_height), Vector2.Zero, 1, true, Color4.White, true)
                {
                    Field     = FieldTypes.StandardSnapCentre,
                    Origin    = OriginTypes.Centre,
                    Clocking  = ClockTypes.Game,
                    DimImmune = true
                };

                Add(okayText);
            }
                {
                    pDrawable additiveButton = null;

                    cancelButton = new pSprite(TextureManager.Load(OsuTexture.notification_button_no), new Vector2(140, button_height))
                    {
                        Field           = FieldTypes.StandardSnapCentre,
                        Origin          = OriginTypes.Centre,
                        Clocking        = ClockTypes.Game,
                        DimImmune       = true,
                        DrawDepth       = 0.99f,
                        HandleClickOnUp = true
                    };
                    cancelButton.OnHover += delegate { additiveButton = cancelButton.AdditiveFlash(10000, 0.4f); };

                    cancelButton.OnHoverLost += delegate
                    {
                        if (additiveButton != null)
                        {
                            additiveButton.FadeOut(100);
                        }
                    };

                    cancelButton.OnClick += delegate { dismiss(false); };

                    Add(cancelButton);

                    pText cancelText = new pText(LocalisationManager.GetString(OsuString.No), 24, new Vector2(140, button_height), Vector2.Zero, 1, true, Color4.White, true)
                    {
                        Field     = FieldTypes.StandardSnapCentre,
                        Origin    = OriginTypes.Centre,
                        Clocking  = ClockTypes.Game,
                        DimImmune = true
                    };

                    Add(cancelText);
                }
                break;
            }
        }
コード例 #17
0
ファイル: MainMenu.cs プロジェクト: indefined/osu-stream
        public override void Initialize()
        {
            int initial_display = firstDisplay ? 2950 : 0;

            //spriteManagerBehind.Add(menuBackground);

            menuBackgroundNew          = new MenuBackground();
            menuBackgroundNew.Clocking = ClockTypes.Mode;

            const int logo_stuff_v_offset = -20;

            Transformation logoBounce = new TransformationBounce(initial_display, initial_display + 2000, 0.625f, 0.4f, 2);

            osuLogo = new pSprite(TextureManager.Load(OsuTexture.menu_osu), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(0, logo_stuff_v_offset), 0.9f, true, Color4.White);
            osuLogo.Transform(logoBounce);
            osuLogo.OnClick += osuLogo_OnClick;
            menuBackgroundNew.Add(osuLogo);

            //gloss
            osuLogoGloss          = new pSprite(TextureManager.Load(OsuTexture.menu_gloss), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(0, logo_stuff_v_offset), 0.91f, true, Color4.White);
            osuLogoGloss.Additive = true;
            menuBackgroundNew.Add(osuLogoGloss);

            Transformation explosionFade = new TransformationF(TransformationType.Fade, 0, 1, initial_display + 500, initial_display + 700);

            pSprite explosion = new pSprite(TextureManager.Load(OsuTexture.menu_circle), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(-90 * 0.625f, -90 * 0.625f + logo_stuff_v_offset), 0.8f, true, new Color4(112, 58, 144, 255));

            explosion.ScaleScalar = sizeForExplosion(0);
            explosion.Transform(explosionFade);
            explosions.Add(explosion);
            menuBackgroundNew.Add(explosion);

            explosion             = new pSprite(TextureManager.Load(OsuTexture.menu_circle), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(170 * 0.625f, 10 * 0.625f + logo_stuff_v_offset), 0.8f, true, new Color4(242, 25, 138, 255));
            explosion.ScaleScalar = sizeForExplosion(1);
            explosion.Transform(explosionFade);
            explosions.Add(explosion);
            menuBackgroundNew.Add(explosion);

            explosion             = new pSprite(TextureManager.Load(OsuTexture.menu_circle), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(-130 * 0.625f, 88 * 0.625f + logo_stuff_v_offset), 0.8f, true, new Color4(254, 148, 4, 255));
            explosion.ScaleScalar = sizeForExplosion(2);
            explosion.Transform(explosionFade);
            explosions.Add(explosion);
            menuBackgroundNew.Add(explosion);

            Transformation fadeIn = new TransformationF(TransformationType.Fade, 0, 1, initial_display, initial_display);

            spriteManager.Sprites.ForEach(s => s.Transform(fadeIn));

            stream = new pSprite(TextureManager.Load(OsuTexture.menu_stream), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(0, 180), 0.95f, true, Color4.White);
            stream.Transform(new TransformationF(TransformationType.Fade, 0, 1, initial_display + 900, initial_display + 1300));
            spriteManager.Add(stream);

            additiveStream           = stream.Clone();
            additiveStream.Additive  = true;
            additiveStream.DrawDepth = 0.96f;
            additiveStream.Transform(new TransformationF(TransformationType.Fade, 0, 1, initial_display + 1000, initial_display + 1200)
            {
                Looping = true, LoopDelay = 5000
            });
            additiveStream.Transform(new TransformationF(TransformationType.Fade, 1, 0, initial_display + 1200, initial_display + 2000)
            {
                Looping = true, LoopDelay = 4400
            });
            spriteManager.Add(additiveStream);

            osuLogoSmall          = new pSprite(TextureManager.Load(OsuTexture.menu_logo), FieldTypes.Standard, OriginTypes.TopLeft, ClockTypes.Mode, new Vector2(5, 5), 0.9f, true, Color4.White);
            osuLogoSmall.OnClick += delegate
            {
                if (State == MenuState.Select)
                {
                    Director.ChangeMode(OsuMode.MainMenu);
                }
            };
            osuLogoSmall.Alpha = 0;
            spriteManager.Add(osuLogoSmall);

            NewsButton = new NewsButton();
            spriteManager.Add(NewsButton);
            NewsButton.Alpha = 0;

            menuBackgroundNew.Transform(fadeIn);

            osuLogo.Transform(fadeIn);

            InitializeBgm();

            menuBackgroundNew.Transform(new TransformationBounce(initial_display, initial_display + 2000, menuBackgroundNew.ScaleScalar, 0.8f, 2));

            if (firstDisplay)
            {
                pDrawable whiteLayer = pSprite.FullscreenWhitePixel;
                whiteLayer.Alpha    = 0;
                whiteLayer.Clocking = ClockTypes.Mode;
                spriteManager.Add(whiteLayer);

                whiteLayer.Transform(new TransformationF(TransformationType.Fade, 0, 0.125f, 800, initial_display - 200));
                whiteLayer.Transform(new TransformationF(TransformationType.Fade, 0.125f, 1f, initial_display - 200, initial_display));
                whiteLayer.Transform(new TransformationF(TransformationType.Fade, 1, 0, initial_display, initial_display + 1200, EasingTypes.In));

                pSprite headphones = new pSprite(TextureManager.Load(OsuTexture.menu_headphones), FieldTypes.StandardSnapCentre, OriginTypes.Centre, ClockTypes.Mode, new Vector2(0, 0), 0.9f, false, Color4.White);
                headphones.Additive = true;
                headphones.Transform(new TransformationF(TransformationType.Fade, 0, 1, 50, 200));
                headphones.Transform(new TransformationF(TransformationType.Fade, 1, 1, 1000, initial_display));
                spriteManager.Add(headphones);

#if !DIST
                headphones.OnClick += delegate
                {
                    GameBase.Mapper = true;
                    pText t = new pText("ENABLED MAPPER MODE", 24, new Vector2(0, 30), 1, false, Color4.Red)
                    {
                        Field  = FieldTypes.StandardSnapTopCentre,
                        Origin = OriginTypes.Centre
                    };
                    t.FadeOutFromOne(1500);
                    spriteManager.Add(t);
                };
#endif

                pDrawable add = headphones.Clone();
                add.Additive = true;
                add.Transform(new TransformationF(TransformationType.Fade, 0, 0.1f, 50, 200));
                add.Transform(new TransformationF(TransformationType.Fade, 0.1f, 0.2f, 1000, initial_display));
                add.Transform(new TransformationF(TransformationType.Scale, 1, 1.12f, 1000, initial_display, EasingTypes.Out));
                spriteManager.Add(add);

                add          = headphones.Clone();
                add.Additive = true;
                add.Transform(new TransformationF(TransformationType.Fade, 0, 0.1f, 50, 200));
                add.Transform(new TransformationF(TransformationType.Fade, 0.1f, 0.2f, 1000, initial_display));
                add.Transform(new TransformationF(TransformationType.Scale, 1, 1.04f, 1000, initial_display, EasingTypes.Out));
                spriteManager.Add(add);

                add          = headphones.Clone();
                add.Additive = true;
                add.Transform(new TransformationF(TransformationType.Fade, 0, 0.1f, 50, 200));
                add.Transform(new TransformationF(TransformationType.Fade, 0.1f, 0.2f, 1000, initial_display));
                add.Transform(new TransformationF(TransformationType.Scale, 1, 1.08f, 1000, initial_display, EasingTypes.Out));
                spriteManager.Add(add);

                GameBase.Scheduler.Add(delegate
                {
                    AudioEngine.PlaySample(OsuSamples.MainMenu_Intro);
                    GameBase.Scheduler.Add(delegate
                    {
                        if (AudioEngine.Music != null)
                        {
                            AudioEngine.Music.Play();
                        }
                    }, 2950);
                }, true);

                if (GameBase.Config.GetValue("firstrun", true))
                {
                    Notification notification = new Notification(
                        LocalisationManager.GetString(OsuString.FirstRunWelcome),
                        LocalisationManager.GetString(OsuString.FirstRunTutorial),
                        NotificationStyle.YesNo,
                        delegate(bool answer)
                    {
                        if (answer)
                        {
                            AudioEngine.PlaySample(OsuSamples.MenuHit);
                            Director.ChangeMode(OsuMode.Tutorial);
                        }

                        GameBase.Config.SetValue("firstrun", false);
                        GameBase.Config.SaveConfig();
                    });

                    GameBase.Scheduler.Add(delegate { GameBase.Notify(notification); }, initial_display + 1500);
                }
            }
            else
            {
                if (Director.LastOsuMode == OsuMode.Tutorial)
                {
                    AudioEngine.Music.SeekTo(0);
                }
                AudioEngine.Music.Play();
            }

            string username = GameBase.Config.GetValue <string>("username", null);

            bool hasAuth = GameBase.HasAuth;

            firstDisplay = false;
        }
コード例 #18
0
        public override void Initialize()
        {
            spriteManager.CheckSpritesAreOnScreenBeforeRendering = true;

            Difficulty = Difficulty.None;
            Beatmap    = null;

            Clock.ResetManual();

            InitializeBgm();

            base.Initialize();

            playfieldBackground.Colour = new Color4(33, 81, 138, 255);

            s_ButtonBack = new BackButton(delegate { Director.ChangeMode(OsuMode.Options); }, false);
            topMostSpriteManager.Add(s_ButtonBack);

            int time = Clock.ModeTime;

            const int speed          = 17000;
            const int spacing        = 1800;
            const int header_spacing = 2100;
            const int image_spacing  = 2500;

            int len = creditsRoll.Length;

            for (int i = 0; i < len; i++)
            {
                string drawString = creditsRoll[i];

                if (drawString.Length == 0)
                {
                    continue;
                }

                bool isHeader = false;
                if (drawString[0] == '*')
                {
                    drawString = drawString.Substring(1);
                    isHeader   = true;
                }

                pDrawable text;

                if (isHeader)
                {
                    text = new pText(drawString, 30, Vector2.Zero, SpriteManager.drawOrderFwdPrio(i), true, new Color4(255, 168, 0, 255))
                    {
                        Field    = FieldTypes.StandardSnapTopCentre,
                        Origin   = OriginTypes.Centre,
                        Clocking = ClockTypes.Manual,
                        RemoveOldTransformations = false,
                        Alpha = 1
                    };

                    if (i > 0)
                    {
                        time += header_spacing - spacing;
                    }

                    text.Transform(new TransformationV(new Vector2(text.Position.X, GameBase.BaseSizeFixedWidth.Y + height_extra), new Vector2(0, -100), time, time + speed));
                    time += header_spacing;
                }
                else if (drawString.StartsWith("OsuTexture."))
                {
                    text = new pSprite(TextureManager.Load((OsuTexture)Enum.Parse(typeof(OsuTexture), drawString.Replace("OsuTexture.", ""))), Vector2.Zero)
                    {
                        Field    = FieldTypes.StandardSnapTopCentre,
                        Origin   = OriginTypes.Centre,
                        Clocking = ClockTypes.Manual,
                        RemoveOldTransformations = false,
                        Alpha = 1
                    };

                    if (i > 0)
                    {
                        time += image_spacing - spacing;
                    }

                    text.Transform(new TransformationV(new Vector2(text.Position.X, GameBase.BaseSizeFixedWidth.Y + height_extra), new Vector2(0, -100), time, time + speed));
                    time += image_spacing;
                }
                else
                {
                    string[] split = drawString.Split('-');

                    if (split.Length == 1)
                    {
                        text = new pText(drawString, 26, Vector2.Zero, SpriteManager.drawOrderFwdPrio(i), true, Color4.White)
                        {
                            Field    = FieldTypes.StandardSnapTopCentre,
                            Origin   = OriginTypes.Centre,
                            Clocking = ClockTypes.Manual,
                            RemoveOldTransformations = false,
                            TextShadow = true,
                            Alpha      = 1
                        };
                    }
                    else
                    {
                        text = new pText(split[0].Trim(), 22, new Vector2(-10, 0), SpriteManager.drawOrderFwdPrio(i), true, i % 2 == 0 ? new Color4(187, 230, 255, 255) : new Color4(255, 187, 253, 255))
                        {
                            Field    = FieldTypes.StandardSnapTopCentre,
                            Origin   = OriginTypes.CentreRight,
                            Clocking = ClockTypes.Manual,
                            RemoveOldTransformations = false,
                            Alpha = 1
                        };

                        pText text2 = new pText(split[1].Trim(), 16, new Vector2(10, 0), new Vector2(300, 0), SpriteManager.drawOrderFwdPrio(i), true, i % 2 == 0 ? new Color4(200, 200, 200, 255) : new Color4(240, 240, 240, 255), false)
                        {
                            Field    = FieldTypes.StandardSnapTopCentre,
                            Origin   = OriginTypes.CentreLeft,
                            Clocking = ClockTypes.Manual,
                            RemoveOldTransformations = false,
                            Alpha = 1
                        };

                        text2.Transform(new TransformationV(new Vector2(text2.Position.X, GameBase.BaseSizeFixedWidth.Y + height_extra), new Vector2(text2.Position.X, -100), time, time + speed));
                        spriteManager.Add(text2);
                    }

                    text.Transform(new TransformationV(new Vector2(text.Position.X, GameBase.BaseSizeFixedWidth.Y + height_extra), new Vector2(text.Position.X, -100), time, time + speed));
                    time += spacing;
                }

                spriteManager.Add(text);
                lastText = text;
            }

            InputManager.OnMove += InputManager_OnMove;
        }
コード例 #19
0
        /// <summary>
        ///   Draws this instance.
        /// </summary>
        internal bool Draw()
        {
            lock (SpriteLock)
            {
                if (FirstDraw)
                {
                    HandleFirstDraw();
                }

                int spriteListCount = SpriteList.Count;
                PixelsDrawn = 0;

                //Setup view rectangle
                if (viewRectangleCustom)
                {
                    ViewRectangleScaled =
                        new RectangleF(
                            (float)Math.Floor((WidescreenAutoOffset ? GameBase.WindowManager.NonWidescreenOffsetX : 0) + ViewRectangle.X * GameBase.WindowManager.Ratio),
                            (float)Math.Floor(ViewRectangle.Y * GameBase.WindowManager.Ratio),
                            (float)Math.Ceiling(ViewRectangle.Width * GameBase.WindowManager.Ratio),
                            (float)Math.Ceiling(ViewRectangle.Height * GameBase.WindowManager.Ratio));
                }
                else if (WidescreenAutoOffset)
                {
                    ViewRectangleScaled = new RectangleF(
                        GameBase.WindowManager.NonWidescreenOffsetX + ViewRectangle43.X * GameBase.WindowManager.Ratio,
                        ViewRectangle43.Y * GameBase.WindowManager.Ratio,
                        ViewRectangle43.Width * GameBase.WindowManager.Ratio, ViewRectangle43.Height * GameBase.WindowManager.Ratio);
                }
                else
                {
                    ViewRectangleScaled = new RectangleF(ViewRectangleCurrent.X * GameBase.WindowManager.Ratio,
                                                         ViewRectangleCurrent.Y * GameBase.WindowManager.Ratio,
                                                         ViewRectangleCurrent.Width * GameBase.WindowManager.Ratio,
                                                         ViewRectangleCurrent.Height * GameBase.WindowManager.Ratio);
                }

                ClipRectangle = new Rectangle((int)ViewRectangleScaled.X, (int)ViewRectangleScaled.Y, (int)Math.Ceiling(ViewRectangleScaled.Width), (int)Math.Ceiling(ViewRectangleScaled.Height));

                if (spriteListCount == 0 && !ForwardPlayOptimisations)
                {
                    return(false);
                }

                if (Alpha < 0.01f || Bypass)
                {
                    for (int m = 0; m < spriteListCount; m++)
                    {
                        SpriteList[m].IsVisible = false;
                    }
                    return(false);
                }

                LastFrameRendered = GameBase.TotalFramesRendered;

                if (BlacknessTarget >= 0)
                {
                    if (BlacknessTarget > Blackness)
                    {
                        Blackness = Math.Min(BlacknessTarget, Blackness + 0.018f * (float)GameBase.FrameRatio);
                    }
                    else if (BlacknessTarget < Blackness)
                    {
                        Blackness = Math.Max(BlacknessTarget, Blackness - 0.018f * (float)GameBase.FrameRatio);
                    }
                }

                int gameTime  = GameBase.Time;
                int audioTime = AudioEngine.Time;

                if (ForwardPlayOptimisations)
                {
                    while (forwardPlayQueue.Count > 0)
                    {
                        pDrawable i = forwardPlayQueue.Peek();
                        if (i.Transformations.Count > 0 && i.Transformations[0].Time1 > (i.Clock == Clocks.Game ? gameTime : audioTime))
                        {
                            break;
                        }

                        if (i.Transformations.Count == 0)
                        {
                            forwardPlayQueue.Dequeue().Dispose();
                            continue;
                        }

                        Add(forwardPlayQueue.Dequeue());
                        spriteListCount++;
                    }

                    if (AudioEngine.SeekedBackwards)
                    {
                        //if we are seeking backwards, re-add any previousyl removed items.
                        while (forwardPlayPast.Count > 0)
                        {
                            pDrawable i = forwardPlayPast.Peek();
                            if (i.Transformations.Count > 0)
                            {
                                int lastTransform = i.Transformations[i.Transformations.Count - 1].Time2;
                                if (lastTransform < audioTime)
                                {
                                    if (audioTime - lastTransform > 5000)
                                    {
                                        break; //allowance for out-of-order additions to this queue.
                                    }
                                }
                            }

                            i = forwardPlayPast.Pop();

                            //if (i.Clock != Clocks.AudioOnce)
                            {
                                Add(i);
                                spriteListCount++;
                            }
                        }
                    }
                }

                startBatch();

#if !DEBUG
                try
                {
#endif
                bool firstDraw = true;

                //Keep track of the OGL rectangle
                Rectangle currentClipRectangle = Masking ? ClipRectangle : OsuGlControl.ViewportZeroBased;

                //In most cases we won't be clipping more than at a spritemanager level
                //so we can save on rectangle copies/ogl calls by resetting the initial scissor rectangle here
                OsuGlControl.ResetScissor(new System.Drawing.Rectangle(OsuGlControl.Viewport.Left + currentClipRectangle.Left, OsuGlControl.Viewport.Top + GameBase.WindowManager.Height - currentClipRectangle.Bottom, currentClipRectangle.Width, currentClipRectangle.Height));

                if (SpriteBatch != null)
                {
                    SpriteBatch.ResetCounters();
                }

                for (int m = 0; m < spriteListCount; m++)
                {
                    pDrawable s = SpriteList[m];

                    if (s.Bypass)
                    {
                        continue;
                    }

#if DEBUG
                    TotalSprites++;
#endif

                    switch (s.Update())
                    {
                    case UpdateResult.Discard:
                        SpriteList.RemoveAt(m--);
                        spriteListCount--;

                        if (ForwardPlayOptimisations && s.Clock != Clocks.Game && AllowRewind)
                        {
                            forwardPlayPast.Push(s);
                        }
                        else
                        {
                            s.Dispose();
                        }
                        break;

                    case UpdateResult.NotVisible:
                        break;

                    case UpdateResult.Visible:
#if DEBUG
                        TotalSpritesVisible++;
#endif

                        if (!s.UsesSpriteBatch)
                        {
                            endBatch();
                        }

                        if (currentClipRectangle != s.ClipRectangleScaled)
                        {
                            SpriteBatch.Draw();
                            currentClipRectangle = s.ClipRectangleScaled;
                            OsuGlControl.ResetScissor(new System.Drawing.Rectangle(OsuGlControl.Viewport.Left + currentClipRectangle.Left, OsuGlControl.Viewport.Top + GameBase.WindowManager.Height - currentClipRectangle.Bottom, currentClipRectangle.Width, currentClipRectangle.Height));
                        }

                        s.Draw();
                        firstDraw = false;
                        break;
                    }
                }

                if (hasBegun)
                {
                    //there's an occasional case where blending mode is transferred outside of SpriteBatches (DirectX only).
                    //this is a safety call to reset to alpha blending.
                    SetBlending(false);
                }

                endBatch(true);

                OsuGlControl.ResetScissor();
#if !DEBUG
                exceptionCount = 0;
            }
            catch (Exception e)
            {
                /* TODO: Figure out why dialog popups are causing XNA exceptions
                 * See https://gist.github.com/324f5de475b438f48416. */

                try
                {
                    endBatch(true);
                }
                catch { }

                if (!(e is InvalidOperationException) || ++exceptionCount > 1)
                {
                    throw;
                }
            }
#endif
            }


            return(true);
        }
コード例 #20
0
        private void checkObject(HitObject nextObject)
        {
            pDrawable preferred = null;

            float leftPart  = GameBase.GamefieldBaseSize.X / 11f * 4;
            float rightPart = GameBase.GamefieldBaseSize.X / 11f * 7;

            float distFromLeft  = pMathHelper.Distance(nextObject.Position, ((HitObject)leftFinger.Tag)?.EndPosition ?? leftFinger.Position);
            float distFromRight = pMathHelper.Distance(nextObject.Position, ((HitObject)rightFinger.Tag)?.EndPosition ?? rightFinger.Position);

            if (nextObject.connectedObject != null)
            {
                //if there is a connected object, always use the correct L-R arrangement.
                if (nextObject.Position.X == nextObject.connectedObject.Position.X)
                {
                    // if same x we'll assign the closest finger to each note
                    float connectedDistFromLeft  = pMathHelper.Distance(nextObject.connectedObject.Position, ((HitObject)leftFinger.Tag)?.EndPosition ?? leftFinger.Position);
                    float connectedDistFromRight = pMathHelper.Distance(nextObject.connectedObject.Position, ((HitObject)rightFinger.Tag)?.EndPosition ?? rightFinger.Position);

                    float smallest = Math.Min(Math.Min(connectedDistFromLeft, connectedDistFromRight), Math.Min(distFromLeft, distFromLeft));
                    preferred = smallest == distFromLeft || smallest == connectedDistFromRight ? leftFinger : rightFinger;
                }
                else if (nextObject.Position.X < nextObject.connectedObject.Position.X)
                {
                    preferred = leftFinger;
                }
                else
                {
                    preferred = rightFinger;
                }
            }
            else
            {
                if (distFromLeft < 20)
                {
                    //stacked objects (left finger)
                    preferred = leftFinger;
                }
                else if (distFromRight < 20)
                {
                    //stacked objects (right finger)
                    preferred = rightFinger;
                }

                else if (lastObject != null && lastObject != nextObject && !(lastObject is Slider) && !(nextObject is Slider) && nextObject.StartTime - lastObject.EndTime < 150)
                {
                    //fast hits; always alternate fingers
                    preferred = lastFinger == leftFinger ? rightFinger : leftFinger;
                }

                /*
                 * else if (nextObject.Position.X > nextObject.Position2.X && nextObject.Position.X < rightPart && Math.Abs(nextObject.Position.Y - nextObject.Position2.Y) < 20)
                 *  //sliders that start right and end left, centered towards the left
                 *  preferred = leftFinger;
                 * else if (nextObject.Position.X < nextObject.Position2.X && nextObject.Position.X > leftPart && Math.Abs(nextObject.Position.Y - nextObject.Position2.Y) < 20)
                 *  //sliders that start left and end right, centered towards the right
                 *  preferred = rightFinger;
                 */

                else if (nextObject.Position.X < leftPart)
                {
                    //starts in left 1/3 of screen.
                    preferred = leftFinger;
                }
                else if (nextObject.Position.X > rightPart)
                {
                    //starts in right 1/3 of screen.
                    preferred = rightFinger;
                }
                else if (nextObject.Position2.X < leftPart)
                {
                    //ends in left 1/3 of screen.
                    preferred = leftFinger;
                }
                else if (nextObject.Position2.X > rightPart)
                {
                    //ends in right 1/3 of screen.
                    preferred = rightFinger;
                }

                else if (lastObject is HoldCircle)
                {
                    //hold note; always alternate fingers
                    preferred = lastFinger == leftFinger ? rightFinger : leftFinger;
                }

                else
                {
                    //fall back to the closest finger.
                    preferred = distFromLeft < distFromRight ? leftFinger : rightFinger;
                }

                if (preferred == leftFinger && nextObject.Position.X > rightFinger.Position.X && rightFinger.Tag == null)
                {
                    //if we're about to use left finger but the object is wedged between the right finger and right side of screen, use right instead.
                    preferred = rightFinger;
                }
                else if (preferred == rightFinger && nextObject.Position.X < leftFinger.Position.X && leftFinger.Tag == null)
                {
                    //if we're about to use right finger but the object is wedged between the left finger and left side of screen, use left instead.
                    preferred = leftFinger;
                }
            }

            pDrawable alternative = preferred == leftFinger ? rightFinger : leftFinger;

            if (preferred.Tag == null)
            {
                preferred.Tag = nextObject;
                preferred.Transformations.Clear();
                preferred.FadeIn(300);
            }
            else
            {
                //finger is busy...
                HitObject busyObject = preferred.Tag as HitObject;

                if (busyObject.EndTime > nextObject.StartTime - 80)
                {
                    alternative.Tag = nextObject;
                    alternative.Transformations.Clear();
                    alternative.FadeIn(300);
                }
            }

            lastObject = nextObject;
        }
コード例 #21
0
        private void Option_OnHoverLost(object sender, EventArgs e)
        {
            pDrawable d = sender as pDrawable;

            d.FadeColour((Color4)d.Tag, 600);
        }
コード例 #22
0
        public override void Initialize()
        {
            startTime = Clock.Time;

            background = new pSprite(TextureManager.Load(OsuTexture.cleared), FieldTypes.StandardSnapCentre, OriginTypes.CentreLeft,
                                     ClockTypes.Game, Vector2.Zero, 1, true, Color4.White);
            background.Position.X -= background.DrawWidth * GameBase.SpriteToBaseRatio / 2;

            background.Alpha = 0;
            background.Transform(new TransformationF(TransformationType.Fade, 0, 1, Clock.Time, Clock.Time + 1700, EasingTypes.OutDouble));

            background.Additive = true;
            spriteManager.Add(background);

            pDrawable fill = pSprite.FullscreenWhitePixel;

            fill.Clocking = ClockTypes.Game;
            fill.Scale.X *= (float)Results.RankableScore.count300 / Results.RankableScore.totalHits + 0.001f;
            fill.Colour   = new Color4(1, 0.63f, 0.01f, 1);
            fillSprites.Add(fill);

            fill          = pSprite.FullscreenWhitePixel;
            fill.Clocking = ClockTypes.Game;
            fill.Scale.X *= (float)Results.RankableScore.count100 / Results.RankableScore.totalHits + 0.001f;
            fill.Colour   = new Color4(0.55f, 0.84f, 0, 1);
            fillSprites.Add(fill);

            fill          = pSprite.FullscreenWhitePixel;
            fill.Clocking = ClockTypes.Game;
            fill.Scale.X *= (float)Results.RankableScore.count50 / Results.RankableScore.totalHits + 0.001f;
            fill.Colour   = new Color4(0.50f, 0.29f, 0.635f, 1);
            fillSprites.Add(fill);

            fill          = pSprite.FullscreenWhitePixel;
            fill.Clocking = ClockTypes.Game;
            fill.Scale.X *= (float)Results.RankableScore.countMiss / Results.RankableScore.totalHits + 0.001f;
            fill.Colour   = new Color4(0.10f, 0.10f, 0.10f, 1);
            fillSprites.Add(fill);

            int i = 0;

            foreach (pDrawable p in fillSprites)
            {
                p.Alpha = 1;
                //p.Additive = true;
                p.DrawDepth  = 0.98f;
                p.AlwaysDraw = true;

                int offset = Clock.Time + i++ *time_between_fills;

                p.Transform(new TransformationC(ColourHelper.Darken(p.Colour, 0.4f), ColourHelper.Darken(p.Colour, 0.7f), Clock.Time, Clock.Time + 1400));
                p.Transform(new TransformationC(Color4.White, p.Colour, Clock.Time + 1600, Clock.Time + 3000));
                //force the initial colour to be an ambiguous gray.

                p.Transform(new TransformationBounce(offset, offset + end_bouncing * 2, p.Scale.X, p.Scale.X, 5));
            }

            GameBase.Scheduler.Add(delegate { AudioEngine.PlaySample(OsuSamples.RankBling); }, 1600);

            spriteManager.Add(fillSprites);

            base.Initialize();
        }
コード例 #23
0
        private void Option_OnHover(object sender, EventArgs e)
        {
            pDrawable d = sender as pDrawable;

            d.FadeColour(Color4.White, 150);
        }