Esempio n. 1
0
        protected override void DrawSelf(SpriteBatch spriteBatch)
        {
            base.DrawSelf(spriteBatch);

            MyPlayer player   = Main.LocalPlayer.GetModPlayer <MyPlayer>();
            float    quotient = GetPlayerResourceQuotient(player);

            Rectangle hitbox = GetInnerDimensions().ToRectangle();

            hitbox.X     += _barDraggableRectangle.X;
            hitbox.Y     += _barDraggableRectangle.Y;
            hitbox.Width  = _barDraggableRectangle.Width;
            hitbox.Height = _barDraggableRectangle.Height;
            _frameTimer++;
            if (_frameTimer >= 20)
            {
                _frameTimer = 0;
            }

            int     frameHeight   = 0;
            int     frame         = _frameTimer / 5;
            Vector2 textureOffset = Vector2.Zero;

            switch (_stat)
            {
            case ResourceBarMode.Ki:
                texture       = GFX.GetKiBar(player).kiBarFrame;
                frameHeight   = texture.Height / 4;
                textureOffset = new Vector2(16, 8);
                _drawPosition = new Vector2(hitbox.X - 6, hitbox.Y - 6);
                break;

            case ResourceBarMode.Overload:
                texture       = GFX.overloadBarFrame;
                frameHeight   = texture.Height / 4;
                textureOffset = new Vector2(18, 6);
                _drawPosition = new Vector2(hitbox.X - 8, hitbox.Y - 4);
                break;

            default: texture = null;
                break;
            }
            Rectangle sourceRectangle = new Rectangle(0, frameHeight * frame, texture.Width, frameHeight);

            spriteBatch.Draw(texture, _drawPosition, sourceRectangle, Color.White);

            Texture2D barSegmentTexture = null;

            switch (_stat)
            {
            case ResourceBarMode.Ki:
                barSegmentTexture = GFX.GetKiBar(player).kiBarSegment;
                break;

            case ResourceBarMode.Overload:
                barSegmentTexture = GFX.overloadBarSegment;
                break;
            }

            // pessimistic doj
            if (barSegmentTexture != null)
            {
                // draw the segments last.
                int actualSegments = (int)Math.Ceiling(_segments * quotient);
                for (int i = 0; i < actualSegments; i += 1)
                {
                    Vector2 segmentOffsetX  = new Vector2(i * 12, 0);
                    Vector2 segmentPosition = _drawPosition + textureOffset + segmentOffsetX;
                    if (i == actualSegments - 1)
                    {
                        float segmentValue     = 1f / _segments;
                        float segmentRemainder = quotient % segmentValue;
                        float segmentQuotient  = segmentRemainder / segmentValue;
                        // if there's no remainder, it's a full segment, render the whole thing.
                        if (segmentQuotient == 0f)
                        {
                            segmentQuotient = 1f;
                        }
                        // we're on a partial segment, render the whole thing.
                        spriteBatch.Draw(barSegmentTexture, segmentPosition, new Rectangle(0, 0, (int)Math.Ceiling(barSegmentTexture.Width * segmentQuotient), barSegmentTexture.Height), Color.White);
                    }
                    else
                    {
                        // we're on a full segment, render the whole thing.
                        spriteBatch.Draw(barSegmentTexture, segmentPosition, new Rectangle(0, 0, barSegmentTexture.Width, barSegmentTexture.Height), Color.White);
                    }
                }
            }
        }