예제 #1
0
        Vector2 _lastPixelSize; // For dirty state detection

        public DialogFrame(IUiElement child)
        {
            On <BackendChangedEvent>(_ =>
            {
                _sprite?.Dispose();
                _sprite = null;
            });
            Children.Add(child);
        }
예제 #2
0
        void RenderItemInHandCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 normPosition)
        {
            var held           = Resolve <IInventoryManager>().ItemInHand;
            var itemAmountText = GetAmountText();

            if (_lastItemAmountText != itemAmountText)
            {
                var tm = Resolve <ITextManager>();
                _lastItemAmountText = itemAmountText;
                _itemAmountSprite?.Dispose();
                _itemAmountSprite = itemAmountText == null
                    ? null
                    : tm.BuildRenderable(new TextBlock(itemAmountText), DrawLayer.MaxLayer, null, this);
            }

            if (_cursorId != CoreSpriteId.CursorSmall) // Inventory screen, check what's being held.
            {
                _itemSprite?.Dispose(); _itemSprite             = null;
                _itemAmountSprite?.Dispose(); _itemAmountSprite = null;
                return;
            }

            int      subItem = 0;
            ITexture texture = null;

            switch (held.Item)
            {
            case Gold _: texture = assets.LoadTexture(CoreSpriteId.UiGold); break;

            case Rations _: texture = assets.LoadTexture(CoreSpriteId.UiFood); break;

            case ItemData item:
            {
                ItemSpriteId spriteId = (ItemSpriteId)((int)item.Icon + _frame % item.IconAnim);
                texture = assets.LoadTexture(spriteId);
                subItem = (int)spriteId;
                break;
            }
            }

            if (texture == null)
            {
                _itemSprite?.Dispose();
                _itemSprite = null;
                return;
            }

            if (texture != _itemSprite?.Key.Texture)
            {
                _itemSprite?.Dispose();

                var key = new SpriteKey(texture, DrawLayer.Cursor,
                                        SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);

                _itemSprite = sm.Borrow(key, 1, this);
            }

            var subImage = texture.GetSubImageDetails(subItem);

            // TODO: Quantity text
            var instances = _itemSprite.Access();

            instances[0] = SpriteInstanceData.TopMid(
                normPosition + new Vector3(window.UiToNormRelative(6, 6), 0),
                window.UiToNormRelative(subImage.Size),
                subImage, 0);

            if (_itemAmountSprite != null)
            {
                _itemAmountSprite.Position = normPosition + new Vector3(window.UiToNormRelative(6, 18), 0);
            }
        }
예제 #3
0
 protected override void Unsubscribed()
 {
     _sprite?.Dispose();
     _sprite = null;
 }
예제 #4
0
        void RenderItemInHandCursor(IAssetManager assets, ISpriteManager sm, IWindowManager window, Vector3 normPosition)
        {
            var held           = Resolve <IInventoryManager>().ItemInHand;
            var itemAmountText = GetAmountText();

            if (_lastItemAmountText != itemAmountText)
            {
                var tm = Resolve <ITextManager>();
                _lastItemAmountText = itemAmountText;
                _itemAmountSprite?.Dispose();
                _itemAmountSprite = itemAmountText == null
                    ? null
                    : tm.BuildRenderable(new TextBlock(itemAmountText), DrawLayer.MaxLayer, null, this);
            }

            if (_cursorId != Base.CoreSprite.CursorSmall) // Inventory screen, check what's being held.
            {
                _itemSprite?.Dispose(); _itemSprite             = null;
                _itemAmountSprite?.Dispose(); _itemAmountSprite = null;
                return;
            }

            int      subItem = 0;
            ITexture texture = null;

            switch (held.Item)
            {
            case Gold: texture = assets.LoadTexture(Base.CoreSprite.UiGold); break;

            case Rations: texture = assets.LoadTexture(Base.CoreSprite.UiFood); break;

            case ItemData item:
            {
                texture = assets.LoadTexture(item.Icon);
                subItem = item.IconSubId + _frame % item.IconAnim;
                break;
            }
            }

            if (texture == null)
            {
                _itemSprite?.Dispose();
                _itemSprite = null;
                return;
            }

            if (texture != _itemSprite?.Key.Texture)
            {
                _itemSprite?.Dispose();

                var key = new SpriteKey(texture, SpriteSampler.Point, DrawLayer.Cursor, SpriteKeyFlags.NoDepthTest | SpriteKeyFlags.NoTransform);
                _itemSprite = sm.Borrow(key, 1, this);
            }

            var subImage = texture.Regions[subItem];

            bool lockWasTaken = false;
            var  instances    = _itemSprite.Lock(ref lockWasTaken);

            try
            {
                // TODO: Quantity text
                instances[0] = new SpriteInstanceData(
                    normPosition + new Vector3(window.UiToNormRelative(6, 6), 0),
                    window.UiToNormRelative(subImage.Size),
                    subImage, SpriteFlags.TopMid);
            }
            finally { _itemSprite.Unlock(lockWasTaken); }

            if (_itemAmountSprite != null)
            {
                _itemAmountSprite.Position = normPosition + new Vector3(window.UiToNormRelative(6, 18), 0);
            }
        }