AntKarlov / Anthill-Framework

Tiny framework for creating Flash games.
57 stars 16 forks source link

AntLabel.autosize bag? #15

Open Ogimle opened 11 years ago

Ogimle commented 11 years ago

может я не так что делаю, но попробовал дать метке размер шрифта больший чем тот что по умолчанию и споткнулся об предел размера 11, больший размер начинает обрезаться, autosize по умолчанию true, принудительное выставление в true тоже результатов не дает.

для вывода используется встроенный в движок шрифт.

AntKarlov commented 11 years ago

Сейчас точно не скажу, но возможно следует при смене размера шрифта указывать lineHeight:

textField.lineHeight = textField.textHeight;

Только надо убедится, что textHeight возвращает именно максимальную высоту текстовых символов, а не высоту текстового блока, хотя высота текстового блока это height. В любом случае я постараюсь проверить эту проблему сегодня.

Ogimle commented 11 years ago

textField.lineHeight не существует

textField.height = textField.textHeight; результата не дало

AntKarlov commented 11 years ago

А можно посмотреть на скрин с проблемой? Я сейчас попробовал у себя задать размер шрифта при создании текстовой метки:

label = new AntLabel("system", 16);

И выглядит все как нужно: https://dl.dropboxusercontent.com/u/4367016/fontsize.png

Ogimle commented 11 years ago

cropfont

вот так выглядит шрифт размером 16

я создал класс наследник метки, выступает как актер, воссоздается на сцене с помощью recycle, реинициализируется

public function init(_txt:String, _x:int, _y:int, _color:uint=0xAAAAAA, _size:int=16, _font:String="system"):void { text = _txt;

_textFormat.font = _font;
_textFormat.size = _size;
_textFormat.color = _color;
_textField.setTextFormat(_textFormat);

x = _x;
y = _y;

}

Ogimle commented 11 years ago

да, точно, в конструкторе своего класса сделал

super("system", 16, 0xAAAAAA, true);

шрифт вывелся нормально, значит при реинициализации проблема.... вызвал в ините последовательно

calcFrame(); calcBounds(); updateBounds(); resetHelpers();

не помогло

AntKarlov commented 11 years ago

Попробуйте при реинициализации сделать следующим образом:

_textField.text = text = _txt; // Назначаем текстовому полю новый текст.
_textFormat.size = _size;
// .. другие настройки
_textField.setTextFormat(_textFormat);
calcFrame();
AntKarlov commented 11 years ago

Только что проверил: написал тестовый сеттер для AntLabel:

public function set size(aValue:int):void
{
    _textFormat.size = aValue;
    _textField.setTextFormat(_textFormat);
    calcFrame();
}

Далее создал текстовую метку:

_testLabel = new AntLabel("system");
_testLabel.reset(10, 10);
_testLabel.beginChange();
_testLabel.text += "line 1\n";
_testLabel.text += "line 2 \n";
_testLabel.text += "line 3\n";
_testLabel.text += "line 4\n";
_testLabel.endChange();
add(_testLabel);

_testLabel.size = 16;

И все отображается так же как на скрине выше.

PS: Кстати, хорошая идея сделать сеттеры и геттеры для размера шрифта и других его настроек :)

Ogimle commented 11 years ago

у меня чего-то не прокатывает... вот мой класс целиком

public class FlyText extends AntLabel 
{
    private var speed:int = 200;

    public function FlyText() 
    {
        super("system");
    }

    public function init(_txt:String, _x:int, _y:int, _color:uint=0xAAAAAA, _size:int=16, _font:String="system"):void
    {
        alpha = 1;

        _textField.text = text = _txt;

        _textFormat.font = _font;
        _textFormat.size = _size;
        _textFormat.color = _color;
        _textField.setTextFormat(_textFormat);

        calcFrame();

        x = _x;
        y = _y;
    }

    override public function update():void
    {
        super.update();

        alpha -= AntG.elapsed;

        x += speed * AntG.elapsed/20;
        y -= speed * AntG.elapsed/2;

        if (alpha == 0)
        {
            kill();
        }
    }
}

вот тестовый вызов

var ft:FlyText = new FlyText(); ft.init("test", 300, 300); add(ft);

текст появляется обрезанным

AntKarlov commented 11 years ago

Удалось повторить у себя проблему. Попробовал сделать пример и если написать метод init() следующим образом, то все работает хорошо:

public function init(_txt:String, _x:int, _y:int, _color:uint = 0xAAAAAA, _size:int = 16, _font:String = "system"):void
{
    text = _txt;

    _textFormat.font = _font;
    _textFormat.color = _color;
    _textFormat.size = _size;
    _textField.setTextFormat(_textFormat);

    height = _textField.height = _textField.textHeight;
    width = _textField.width = _textField.textWidth;

    resetHelpers();
    calcFrame();

    reset(aX, aY);
}

Если честно, то я пока так и не понял в какой момент происходит сбой размеров. Ведь когда я написал свой set size() для установки размеров шрифта, то размеры текстового поля не страдали. Возможно что проблема возникает именно в момент смены текста, но если указывать текст напрямую через _textField.text = _txt, то проблема остается.

В общем ключевое решение проблемы — это принудительно задать размеру поля новый размер текста.

Ogimle commented 11 years ago

да, отлично работает, только чуть чуть подрезаются справа и снизу буквы, привабил припуск и все ок height = _textField.height = _textField.textHeight + 4; width = _textField.width = _textField.textWidth + 4;

AntKarlov commented 11 years ago

Да, такой сдвиг существует, сталкивался с ним и ранее когда работал с TextField. Насколько я помню смещение зависит от количества символов в строке, поэтому лучше добавлять к ширине в зависимости от длины строки:

width = _textField.width = _textField.text.width + _textField.text.length;

Это конечно грубый пример так как не очень подходит для многострочных текстов, но суть, я думаю, ясна ;)