Перейти к содержимому
BenniShifer919

Незавершенная граф. библиотека

Рекомендуемые сообщения

Делал граф библиотеку, главной идеей которой была сделать более удобную отрисовку. Ведь на СС ты не можешь просто поменять 1 пиксель или узнать его, а если попробуешь - то весь остальной текст сдвинется. Что, как по мне, не очень удобно, поэтому я принялся писать библиотеку. Стало сразу понятно что перерисовывать каждый кадр с нуля - не самая лучшая идея, из-за чего была добавлена двойная буферизация. Скорее всего не самая эффективная, но простая. Вообщем, сначала вроде всё даже шло хорошо, но потом начали появлятся баги, причину и даже место возникновения которых я не мог найти, баги, которые появляются из воздуха которых быть не должно впринципе, из-за чего я забросил это затею. Может кому-то будет интересно потыкать, дополнить, или, может, даже понять в чем проблема и где я свернул не туда.

Тестовый код:

Скрытый текст

local mrl = require("mrl_cc")

local w,h = term.getSize()

local pastFrame,newFrame
=
mrl.generate(w,h),mrl.generate(w,h)

term.setBackgroundColor(colors.black)
term.clear()

while true do
    local colors = {
        colors.white,	
        colors.orange,	
        colors.magenta,	
        colors.lightBlue,
        colors.yellow,
        colors.lime,
        colors.pink,
        colors.gray,
        colors.lightGray,
        colors.cyan,
        colors.purple,
        colors.blue,
        colors.brown,
        colors.green,
        colors.red,
        colors.black,
    }

    local x = math.random(1,w)
    local y = math.random(1,h)
    local color = colors[math.random(1,16)]
    local tColor = colors[math.random(1,16)]
    local symbol = math.random(1,256)-1
    --newFrame = mrl.blit(x,y,string.char(symbol),color,tColor,pastFrame)
    --newFrame = mrl.blit(x,y,"t",colors.black,colors.white,pastFrame)
    --pastFrame = newFrame
    newFrame[y][x] = mrl.fBlit(string.char(symbol),color,tColor)
    mrl.update(pastFrame,newFrame,term)
    sleep(0.001)
end

 

Сама библиотека:

Скрытый текст

local module = {}

local function getDifference(pastFrame,newFrame)
    local changedID = {}
    for i=1,#pastFrame,1 do
        table.insert(changedID,nil)
    end
    for y=1,#pastFrame,1 do
        for x=1,#pastFrame[y],1 do
            if pastFrame[y][x] ~= newFrame[y][x] then
                changedID[y] = x
                break
            end
        end
    end
    return changedID
end

local function redrawLine(y,index,data,trm,w)
    term.setCursorPos(index,y)
    if #data < w-index then
        for i=1,w-index-#data do
            table.insert(data, {cnt = " ", })
        end
    end
    for i=1,#data,1 do
        trm.setBackgroundColor(data[i].bc)
        trm.setTextColor(data[i].tc)
        trm.write(data[i].cnt)
    end
end

--[[function module.blit(x,y,content,backgroundColor,textColor,canvas)
    local nC = canvas
    if #canvas >= y then
        if #canvas[y] >= x then
            nC[y][x] = {cnt = content, tc = textColor, bc = backgroundColor}
            --nC[1][3] = {cnt = "t", tc = colors.white, bc = colors.black}
            return nC
        end
    end
    return false, -1, "Wrong coordinates"
end]]

function module.fBlit(con,bgC,tC)
    return {cnt = con, bc = bgC, tc = tC}
end

function module.fillLine(y,color,canvas)
    if #canvas >= y then
        if #canvas[y] > 0 then
            for i=1,#canvas[y],1 do
                canvas[y][i] = {cnt = " ", tc = color, bc = color}
            end
            return canvas
        end
    end
    return false, -12, "Wrong coordinates"
end

function module.clear(color,canvas)
    if #canvas >= 0 then
        if #canvas[1] > 0 then
            for x=1,#canvas,1 do
                for y=1,#canvas[x],1 do
                    canvas[y][x] = {cnt = " ", tc = color, bc = color}
                end
            end
            return canvas
        end
    end
    return false, -8, "Wrong canvas"
end

function module.update(pastFrame,newFrame,terminal)
    local diff = getDifference(pastFrame,newFrame)
    for i=1,#diff,1 do
        if diff[i] ~= nil then
            local extData = {}
            for x=diff[i],#newFrame[i],1 do
                table.insert(extData, newFrame[i][x])
            end
            redrawLine(i,diff[i],extData,terminal,#pastFrame[1])
        end
    end
end

function module.generate(w,h)
    local canvas = {}
    for y=1,h,1 do
        table.insert(canvas,{})
        for x=1,w,1 do
            table.insert(canvas[y],{cnt = "", tc = colors.white, bc = colors.black})
        end
    end
    return canvas
end

return module

 



Надеюсь, это кому-то как либо поможёт, или будет интересно

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...