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

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

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,771
5,376
Все прекрасно понимают что произвольный текст нереально подогнать под 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

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,771
5,376
Где получение длины текста, которое зависит от самого шрифта и получение высоты шрифта в пикселях? Через него куда проще делать же.
Я и пртщел за советом. Думаю плотно развить функцию.
 

ufdhbi

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

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

AnWu

https://t.me/anwublog
Автор темы
Всефорумный модератор
4,771
5,376
+++ будет лучше\

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

4el0ve4ik

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

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

Dark_Knight

Me, me and me.
Друг
4,078
2,096
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,460
866
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)
 
Статус
В этой теме нельзя размещать новые ответы.