Exemplo n.º 1
0
    protected override bool CreateStatsDisplay()
    {
        ItemData itemData     = null;
        Sprite   itemIcon     = null;
        Vector2  iconPosition = Vector2.zero;

        if (base.CreateStatsDisplay())
        {
            if (currencyTextObject == null)
            {
                CreateTextDisplayObject("CurrencyValue", player.GetCurrentCoins().ToString(), currencyTextScales, currencyPositionRates,
                                        currencyAnchorAlignment, ref currencyTextObject, ref currencyTextTrans, ref currencyText);
                if ((itemDatabase != null) && (currencyImageObject == null))
                {
                    itemData = itemDatabase.GetItemData(currencyItemID);
                    if (itemData != null)
                    {
                        itemIcon = itemData.itemIcon;
                        if (itemIcon != null)
                        {
                            currencyImageObject  = new GameObject("CurrencyIcon", typeof(RectTransform));
                            currencyImageTrans   = currencyImageObject.GetComponent <RectTransform>();
                            currencyImage        = currencyImageObject.AddComponent <Image>();
                            currencyImage.sprite = itemIcon;
                            currencyImage.SetNativeSize();
                            currencyImageTrans.SetParent(interfaceCanvasTrans, false);
                            currencyImageTrans.localScale = new Vector3(currencyIconScales.x, currencyIconScales.y, 1f);
                            if (currencyTextTrans != null)
                            {
                                iconPosition.x  = currencyTextTrans.anchoredPosition.x;
                                iconPosition.x -= currencyText.GetUIDimensions().x *currencyTextScales.x / 2f;
                                iconPosition.x -= currencyImageTrans.rect.width * currencyIconScales.x;
                                iconPosition.y  = currencyTextTrans.anchoredPosition.y;
                                currencyImageTrans.anchoredPosition = iconPosition;
                            }
                        }
                    }
                }
            }
            return(true);
        }
        return(false);
    }
Exemplo n.º 2
0
    protected void UpdateTextDisplayObject(string objectContent, Vector2 scaleChange, Vector2 positionRates, TextAlignment anchorAlign,
                                           RectTransform readyTransform, SpritedStringUI readyText)
    {
        Vector2 originalUIDimensions = Vector2.zero;

        if (readyText != null)
        {
            readyText.SetValue(objectContent);
            originalUIDimensions = readyText.GetUIDimensions();
            PlaceTransformProperly(readyTransform, originalUIDimensions, scaleChange, positionRates, anchorAlign);
        }
    }
Exemplo n.º 3
0
    protected void CreateTextDisplayObject(string objectName, string objectContent, Vector2 scaleChange, Vector2 positionRates,
                                           TextAlignment anchorAlign, ref GameObject newObject, ref RectTransform newTransform, ref SpritedStringUI newText)
    {
        Vector2 originalUIDimensions = Vector2.zero;

        if (font != null)
        {
            newObject    = new GameObject(objectName, typeof(RectTransform));
            newTransform = newObject.GetComponent <RectTransform>();
            newText      = newObject.AddComponent <SpritedStringUI>();
            newText.SetSymbolSource(font);
            newText.SetValue(objectContent);
            newText.ToggleRaycastTargeting(false);
            originalUIDimensions = newText.GetUIDimensions();
            PlaceTransformProperly(newTransform, originalUIDimensions, scaleChange, positionRates, anchorAlign);
        }
    }
Exemplo n.º 4
0
    private void PlacePageLines()
    {
        Vector2         insertionPosition = Vector2.zero;
        Vector2         linePosition      = Vector2.zero;
        GameObject      textLineObject    = null;
        RectTransform   textLineTrans     = null;
        SpritedStringUI textLineComponent = null;
        float           textLineWidth     = 0f;
        int             linesOnPage       = 0;
        float           insertionX        = 0f;

        if ((pageFirstLineIndex > -1) && (pageLastLineIndex > -1) && (textLineObjects != null) && (pictureObject == null))
        {
            switch (textAlignment)
            {
            case TextAlignment.AlignLeft:
                insertionX = textArea.x;
                break;

            case TextAlignment.AlignMiddle:
                insertionX = textArea.x + textArea.width / 2f;
                break;

            case TextAlignment.AlignRight:
                insertionX = textArea.x + textArea.width;
                break;
            }
            insertionPosition = new Vector2(insertionX, textArea.y - lineHeight / 2f);
            for (int i = pageFirstLineIndex; i < pageLastLineIndex + 1; i++)
            {
                /*halmeida - relying on the coherence of all the "textLine" arrays.*/
                textLineObject    = textLineObjects[i];
                textLineTrans     = textLineTransforms[i];
                textLineComponent = textLineComponents[i];
                if ((textLineObject != null) && (textLineTrans != null) && (textLineComponent != null) && (ownTransform != null))
                {
                    textLineWidth = textLineComponent.GetUIDimensions().x;
                    linePosition  = insertionPosition;
                    switch (textAlignment)
                    {
                    case TextAlignment.AlignLeft:
                        linePosition.x += textLineWidth / 2f;
                        break;

                    case TextAlignment.AlignRight:
                        linePosition.x -= textLineWidth / 2f;
                        break;
                    }
                    textLineTrans.SetParent(ownTransform, false);
                    textLineTrans.anchoredPosition = linePosition;
                    insertionPosition.y           -= (DISTANCE_BETWEEN_LINES_FACTOR + 1.0f) * lineHeight;
                }
            }
            if (autoClose)
            {
                linesOnPage       = pageLastLineIndex - pageFirstLineIndex + 1;
                autoCloseDuration = linesOnPage * AUTO_CLOSE_LINE_TIME;
                autoCloseElapsed  = 0f;
            }
        }
    }
Exemplo n.º 5
0
    private void SplitTextIntoLines()
    {
        GameObject      textLineObject        = null;
        RectTransform   textLineTrans         = null;
        SpritedStringUI textLineComponent     = null;
        string          textLine              = null;
        int             textLineLength        = 0;
        int             textLineIndex         = -1;
        float           textLineWidth         = 0f;
        float           interval              = 0f;
        float           position              = 0f;
        int             lineFirstIndex        = -1;
        int             lineLastIndex         = -1;
        int             lineLastIndexValid    = -1;
        int             lineLastIndexNext     = -1;
        int             lineLastIndexPrevious = -1;
        bool            lineReady             = false;
        bool            allLinesReady         = false;
        bool            spaceFound            = false;

        /*halmeida - to get one line I gotta create a long enough SpritedStringUI that fits
         * exactly into the maxTextWidth. If I don't have enough characters to fill the width,
         * I will just make a shorter line. The problem is that I'm able to see the width of a
         * sprited string only after I set its value with all the characters it is supposed to
         * have. Adding character by character to the SpritedString would be too slow, so I use
         * a sort of bynary search, looking for the maximum valid size for each line.*/
        if ((text != null) && (textLines == null) && (ownTransform != null))
        {
            textLineIndex  = 0;
            lineFirstIndex = 0;
            lineLastIndex  = text.Length - 1;
            while (!allLinesReady)
            {
                lineLastIndexValid = -1;
                interval           = lineLastIndex - lineFirstIndex + 1;
                position           = lineFirstIndex + interval;
                while (!lineReady)
                {
                    if (textLineObject == null)
                    {
                        textLineObject = new GameObject("TextBoxUILine" + textLineIndex, typeof(RectTransform));
                        textLineTrans  = textLineObject.GetComponent <RectTransform>();

                        /*halmeida - we should not add the lines as children of the object yet because the box
                         * image itself has not yet been added as a child of the object. The lines would get behind
                         * it if they were added now.*/
                        textLineComponent = textLineObject.AddComponent <SpritedStringUI>();
                        textLineComponent.SetSymbolSource(symbolDatabase);
                    }
                    textLineLength = lineLastIndex - lineFirstIndex + 1;
                    textLine       = text.Substring(lineFirstIndex, textLineLength);
                    textLineWidth  = symbolDatabase.GetStringWidthUI(textLine);
                    //Debug.Log("Debug : TextBoxUI : attempting text line width "+textLineWidth+".");
                    interval = interval / 2f;
                    if (textLineWidth > maxTextWidth)
                    {
                        position -= interval;
                    }
                    else
                    {
                        lineLastIndexValid = lineLastIndex;
                        position          += interval;
                    }
                    lineLastIndexNext = (int)position;

                    /*halmeida - the position value itself should never be the same, but since it is rounded
                     * to an integer index, we may end up falling back to a previously checked index. When that
                     * happens, it means the interval has become small enough to stop the search.*/
                    if ((lineLastIndexNext == lineLastIndexPrevious) || (lineLastIndexNext == lineLastIndex) ||
                        (lineLastIndexNext > text.Length - 1))
                    {
                        if (lineLastIndexValid == -1)
                        {
                            /*halmeida - after all the searching, no valid size was found. This probably means
                             * the maxTextWidth is just too small to fit even one character. Even so we will
                             * forcibly accept a one character wide line.*/
                            lineLastIndexValid = lineFirstIndex;
                        }
                        if (lineLastIndexValid > lineFirstIndex)
                        {
                            /*halmeida - if there is more than one character in the line, we can check for
                             * word integrity. We cannot break a word into two lines. This means that the last
                             * character in a line that is not the last line has to be an empty space or the
                             * space has to be the first character in the next line.*/
                            if ((lineLastIndexValid + 1) < text.Length)
                            {
                                spaceFound = false;
                                for (int i = (lineLastIndexValid + 1); i > lineFirstIndex; i--)
                                {
                                    if (text[i] == ' ')
                                    {
                                        lineLastIndexValid = i - 1;
                                        spaceFound         = true;
                                    }
                                    else
                                    {
                                        if (spaceFound)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                        lineReady = true;

                        /*halmeida - we didn't necessarily end the search at a valid size, but the last valid
                         * size found is the biggest possible one. So we use that value to build the line.*/
                        textLineLength = lineLastIndexValid - lineFirstIndex + 1;
                        textLine       = text.Substring(lineFirstIndex, textLineLength);
                        textLineComponent.SetValue(textLine);
                        textLineComponent.ToggleAllSymbolVisuals(false);
                        //Debug.Log("Debug : TextBoxUI : line "+textLineIndex+" is \""+textLine+"\".");
                        textLineWidth = textLineComponent.GetUIDimensions().x;
                        //Debug.Log("Debug : TextBoxUI : final text line width "+textLineWidth+".");
                        if (textLineWidth > maxLineWidth)
                        {
                            maxLineWidth = textLineWidth;
                        }
                    }
                    else
                    {
                        lineLastIndexPrevious = lineLastIndex;
                        lineLastIndex         = lineLastIndexNext;
                    }
                }
                UsefulFunctions.IncreaseArray <string>(ref textLines, textLine);
                UsefulFunctions.IncreaseArray <GameObject>(ref textLineObjects, textLineObject);
                UsefulFunctions.IncreaseArray <RectTransform>(ref textLineTransforms, textLineTrans);
                UsefulFunctions.IncreaseArray <SpritedStringUI>(ref textLineComponents, textLineComponent);
                textLine          = null;
                textLineObject    = null;
                textLineTrans     = null;
                textLineComponent = null;
                if (lineLastIndexValid == (text.Length - 1))
                {
                    allLinesReady = true;
                }
                else
                {
                    textLineIndex++;
                    lineFirstIndex = lineLastIndexValid + 1;
                    for (int i = lineFirstIndex; i < text.Length; i++)
                    {
                        if (text[i] == ' ')
                        {
                            lineFirstIndex++;
                            if (lineFirstIndex == text.Length)
                            {
                                allLinesReady = true;
                            }
                        }
                        else
                        {
                            break;
                        }
                    }
                    lineLastIndex = text.Length - 1;
                    lineReady     = false;
                }
            }
        }
    }