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); } }
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); }
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); } }
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; }
/// <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); }
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; } } }
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); }
internal void Remove(pDrawable p) { if (p != null) { lock (SpriteLock) SpriteList.Remove(p); if (p.IsDisposable) { p.Dispose(); } p.IsVisible = false; } }
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); }
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(); } }
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(); }
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)); } } } }
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); }
internal void ResortDepth(pDrawable p) { Remove(p); Add(p); }
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)); } }
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; } }
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; }
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; }
/// <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); }
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; }
private void Option_OnHoverLost(object sender, EventArgs e) { pDrawable d = sender as pDrawable; d.FadeColour((Color4)d.Tag, 600); }
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(); }
private void Option_OnHover(object sender, EventArgs e) { pDrawable d = sender as pDrawable; d.FadeColour(Color4.White, 150); }