BenniShifer919 14 Опубликовано: 5 ноября, 2023 Делал граф библиотеку, главной идеей которой была сделать более удобную отрисовку. Ведь на СС ты не можешь просто поменять 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 Надеюсь, это кому-то как либо поможёт, или будет интересно Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах