Пишем функцию для рендера текста

Статус
В этой теме нельзя размещать новые ответы.

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,687
5,164
Все прекрасно понимают что произвольный текст нереально подогнать под DrawBox. Текст постоянно меняет длину и бывает что вылезает за пределы бокса. Для себя написал такую функцию:
Код:
function setInformer(text, showTime)
    local lineLen = 26
    local count = math.floor(text:len() / lineLen)
    local newText = ""
    local nLine = ""
    if(count > 0 and #text ~= lineLen)then
        for i = 0, count do
            if(i > 0)then
                nLine = "\n"
            else
                nLine = ""
            end
            newText = newText .. nLine .. string.gsub(string.sub(text, i*lineLen+1, (i*lineLen)+lineLen), "^ *(.*) *$", "%1")
        end
        text = newText
    end
    Informer.text = string.gsub(text, "^\n*(.*)\n*$", "%1")
    Informer.time = os.time() + showTime
    return
end
её цель подгонять текст под бокс шириной 200. Проблема функции в дотошности, она банально считает символы. Я проверил что с размером шрифта 9 в строку влезает 26 символов. Функция обрезает слова, тоесть если на один больше, даже точку, и он улетит на некст строку. Что подскажите? Можно ли написать перенос по словам? Искать ближайший пробел?
 

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,687
5,164
Где получение длины текста, которое зависит от самого шрифта и получение высоты шрифта в пикселях? Через него куда проще делать же.
Я и пртщел за советом. Думаю плотно развить функцию.
 

ufdhbi

Известный
Проверенный
1,455
861
можно изично сделать, но наоборот. подогнать бокс под текст.
+++ будет лучше\

и вообще автор, подумай как сделать анимацию драв бокса, плавный уезд за границу экрана например)
 

AnWu

Guardian of Order
Автор темы
Всефорумный модератор
4,687
5,164
+++ будет лучше\

и вообще автор, подумай как сделать анимацию драв бокса, плавный уезд за границу экрана например)
А что мешает смещать бокс по коордам пока ге достигнет нужного места. Легчайше делается
 

4el0ve4ik

Известный
Всефорумный модератор
1,548
1,338
+++ будет лучше\

и вообще автор, подумай как сделать анимацию драв бокса, плавный уезд за границу экрана например)
лень делать, напиши)
Схуяли кто то должен делать что то за тебя? тебе надо ты и пиши, ну или плати.
 

Dark_Knight

Me, me and me.
Друг
4,062
2,077
Lua:
-----------------------------
-- Логика работы функции.
-- Сначала заполняем таблицу из строк из входящей строки. Символ-разделитель являеться "\n"
-- Далее находим настоящую высоту диалога через размер шрифта в пикселях и количество елементов в таблице.
-- После получения рисуем фон, а потом текст
-- Плюсы : Не надо ни с чем мучатся, а только передать нужные параметры и рендерить
-- Минусы: Возможно уйдет в вечный цыкл из-за while true do и из-за постоянного заполнения таблицы возможно будет неплохая нагрузка на обработчик.
-- Советы по оптимазации(ИМХО): Вместо передаваемого текста передавать таблицу и сделать через работу с указателями переменными ширины и высоты
-- PS: Функция на работоспособность в мунлоадере не проверялась
function DrawDialogBox(zstring text, int x, int y, int width, int height, int font, int TextColor, int bgColor)
local add_str, finder, current_len
local tHeight, TableSize, fHeight
array = {}
    while true do
        finder = string.find(text, "\n")
        if finder ~= nil
        then
            add_str = string.sub(text, 0, finder - 1)
            text = string.sub(text, finder + 1)
            current_len = renderGetFontDrawTextLength(font, add_str)
            if width < current_len
            then
                width = current_len -- Устанавливаем новую длину, если старая меньше новой. Ахуенно описал, да?
            end
            table.insert(array, add_str)
        else
            if(string.len(text) > 0)
            then       
                table.insert(array, text)
            end
            break
        end
    end
    fHeight = renderGetFontDrawHeight(font)
    tHeight = fHeight * table.maxn(array)
    -- Возможно вместо "table.maxn(array)" нужно использовать "#array".
    height = tHeight > height and tHeight or height
    renderDrawBox(x, y, width, height, bgColor)
    for k, v in pairs(array) do
        renderFontDrawText(font, v, x, y + fHeight * (k - 1), TextColor)
    end
 
end
 
  • Нравится
Реакции: romacaddy

ufdhbi

Известный
Проверенный
1,455
861
Lua:
-----------------------------
-- Логика работы функции.
-- Сначала заполняем таблицу из строк из входящей строки. Символ-разделитель являеться "\n"
-- Далее находим настоящую высоту диалога через размер шрифта в пикселях и количество елементов в таблице.
-- После получения рисуем фон, а потом текст
-- Плюсы : Не надо ни с чем мучатся, а только передать нужные параметры и рендерить
-- Минусы: Возможно уйдет в вечный цыкл из-за while true do и из-за постоянного заполнения таблицы возможно будет неплохая нагрузка на обработчик.
-- Советы по оптимазации(ИМХО): Вместо передаваемого текста передавать таблицу и сделать через работу с указателями переменными ширины и высоты
-- PS: Функция на работоспособность в мунлоадере не проверялась
function DrawDialogBox(zstring text, int x, int y, int width, int height, int font, int TextColor, int bgColor)
local add_str, finder, current_len
local tHeight, TableSize, fHeight
array = {}
    while true do
        finder = string.find(text, "\n")
        if finder ~= nil
        then
            add_str = string.sub(text, 0, finder - 1)
            text = string.sub(text, finder + 1)
            current_len = renderGetFontDrawTextLength(font, add_str)
            if width < current_len
            then
                width = current_len -- Устанавливаем новую длину, если старая меньше новой. Ахуенно описал, да?
            end
            table.insert(array, add_str)
        else
            if(string.len(text) > 0)
            then      
                table.insert(array, text)
            end
            break
        end
    end
    fHeight = renderGetFontDrawHeight(font)
    tHeight = fHeight * table.maxn(array)
    -- Возможно вместо "table.maxn(array)" нужно использовать "#array".
    height = tHeight > height and tHeight or height
    renderDrawBox(x, y, width, height, bgColor)
    for k, v in pairs(array) do
        renderFontDrawText(font, v, x, y + fHeight * (k - 1), TextColor)
    end
 
end
[20:22:39.894963] (error) opcode '0B6C' call caused an unhandled exception
[20:22:39.932494] (error) dlgsave.lua: cannot resume non-suspended coroutine
[20:22:39.932494] (error) dlgsave.lua: Script died due to error. (18F590B4)
 
Статус
В этой теме нельзя размещать новые ответы.