// ReSharper disable RedundantCheckBeforeAssignment protected override void DoUpdate(SAMTime gameTime, InputState istate) { if (!FloatMath.FloatEquals(Size.Width, HUD.Width)) { Size = new FSize(HUD.Width, Height); } var sel = ((GDWorldHUD)HUD).SelectedNode; if (sel == null && progressMove > 0) { // DISAPPEAR if (!(FloatMath.IsOne(progressMove) && istate.IsRealDown)) { FloatMath.ProgressDec(ref progressMove, gameTime.ElapsedSeconds * SPEED_MOVE); FloatMath.ProgressInc(ref progressBlend, gameTime.ElapsedSeconds * SPEED_BLEND); } if (FloatMath.IsZero(progressMove)) { displayNode = null; progressMove = 0; progressBlend = 1; } } else if (sel != null && displayNode == null) { // START APPEAR displayNode = sel; progressMove = 0; progressBlend = 1; text.Text = "Level " + displayNode.Blueprint.Name + " : " + displayNode.Blueprint.FullName; } else if (sel != null && sel != displayNode) { // BLEND AWAY FROM CURRENT FloatMath.ProgressInc(ref progressMove, gameTime.ElapsedSeconds * SPEED_MOVE); FloatMath.ProgressDec(ref progressBlend, gameTime.ElapsedSeconds * SPEED_BLEND); if (FloatMath.IsZero(progressBlend)) { displayNode = sel; text.Text = "Level " + displayNode.Blueprint.Name + " : " + displayNode.Blueprint.FullName; } } else if (sel != null && sel == displayNode && (progressBlend < 1 || progressMove < 1)) { // BLEND INTO OTHER | APPEAR FloatMath.ProgressInc(ref progressMove, gameTime.ElapsedSeconds * SPEED_MOVE); FloatMath.ProgressInc(ref progressBlend, gameTime.ElapsedSeconds * SPEED_BLEND); } var rp = new FPoint(0, (1 - progressMove) * -Height); if (rp != RelativePosition) { RelativePosition = rp; Revalidate(); } text.TextColor = FlatColors.TextHUD * progressBlend; IsVisible = FloatMath.IsNotZero(progressMove); }