JaggerDer
-
Публикации
34 -
Зарегистрирован
-
Посещение
-
Победитель дней
6
Сообщения, опубликованные пользователем JaggerDer
-
-

Библиотека CURSOR
...позволяет создавать виртуальный курсор и предоставляет набор функций для управления им. Предполагается, что библиотека будет использоваться для создания различных текстовых полей, текстовых редакторов и т.п.
Что умеет?
Умеет перемещать курсор по тексту! А так же реализует основные возможности простейшего текстового редактора, такие как удалить символ, вставить символ, перенос строки, слияние двух строк...
Немного о устройстве
Библиотека позволяет создавать несколько независимых друг от друга курсоров, каждый из которых имеет свою позицию на тексте в трех экземплярах:
- Абсолютное положение
- Относительное положение
- Разность абсолютного и относительного - иначе просто дельта
Кроме того каждый курсор хранит в себе массив строк.
Получить мультикурсор как в SublimeText у вас скорее всего не выйдет. Можно конечно попытаться, присвоив массиву строку второго курсора массив строк первого(в lua массивы передаются по ссылке).
Абсолютные координаты для определения курсора в тексте;
Относительные координаты используются только в пределах зоны редактирования текста;
Дельта говорит нам о том насколько сильно разошлись эти значения: эта информация полезна для отрисовки текста.
Вот и все, такая небольшая библиотека вышла.Описание функций
Все функции описаны в файле с кодом.
Выдержка:Описание функций библиотеки cursor: 1. Служебное: 1.1. range(_, bottom:number, top:number, value:number, step:number):number 1.2. isPositive(_, value:number):boolean 1.3. isPositive_zero(_, value:number):number or boolean 2. Функции библиотеки: 2.1. cursor.add([x:number, y:number, width:number, height:number]):table создает и инциализирует объект cursor, который содержит информацию о местоположении курсора, размере и положении поля ввода и массив с обрабатываемыми строками. Возвращает готовый объект. 2.2. addString(value:string, [position:number]):nil добавляет строку value в массив строк в позицию position(если не указано, то вставляет строку в конец). Кроме того функция вызывает перерасчет позиции курсора. 2.3. removeString([position:number]):nil удаляет из массива строку строку в позиции position(если не указано, то удаляется последняя строка). Вызывает перерасчет позиции курсора. 2.4. replaceString(value:string, [position:number]):nil заменяет строку в позиции position(если не указано, то заменяет последнюю строку) на строку value. Вызывает перерасчет позиции курсора. 2.5. insertChar(value:string):nil вставляет строку value в разрыв строки на которой находится курсор. Вызывает перерасчет позиции курсора. 2.6. replaceChar(value:string):nil заменяет символ в позиции курсора на строку value. Вызывает перерасчет позиции курсора. 2.7. removeChar():nil удаляет символ в позиции курсора. Вызывает перерасчет позиции курсора. 2.8. splitLine():nil разрывает строку в позиции курсора и переносит вторую разорванную часть на новую строку. Вызывает перерасчет позиции курсора. 2.9. concatLine():nil соединяет текущую строку с предыдущей. Вызывает перерасчет позиции курсора. 2.10. cursor:onEndLine():boolean проверяет, находится ли курсор в конце строки. Если да, то возвращается true, а false в противном случае. 2.11. cursor:onHomeLine():boolean проверяет, находится ли курсор в начале строки. Если да, то возвращается true, а false в противном случае. 2.12. cursor:onBottom():boolean проверяет, находится ли курсор на последней строке. Если да, то возвращается true, а false в противном случае. 2.13. cursor:onTop():boolean проверяет, находится ли курсор на первой строке. Если да, то возвращается true, а false в противном случае. 2.14. cursor:checkLine(step:number):boolean, boolean проверяет, сможет ли курсор переместиться на step шагов. Возвращет true, если возможно, а false в противном случае. Второе возвращаемое значение говорит о том, меньше ли текущая строка проверяемой строки. 2.14. set(absolute_x:number, absolute_y:number):nil устанавливает курсор в абсолютную позицию x, y. Вызывает перерасчет позиции курсора. 2.15. move(step_x:number, step_y:number):nil перемещает курсор на x, y шагов, если это возможно. Вызывает перерасчет позиции курсора. 2.16. cursor:moveHome():nil перемещает курсор на начало текущей строки. 2.17. cursor:moveEnd():nil перемещает курсор в конец текущей строки. 2.18. cursor:moveHomeNextLine(step:number):nil перемещает курсор на начало следующей строки, если это возможно. 2.19. cursor:moveEndNextLine(step:number):nil перемещает курсор в конец следующей строки, если это возможно. 2.20. cursor:moveEndPrevLine(step:number):nil перемещает курсор в конец предыдущей строки, если это возможно.
Скачать
https://github.com/Pirnogion/OpenComputers_library/blob/master/cursor/cursor.lua
https://github.com/Pirnogion/OpenComputers_library/blob/master/cursor/cursor-demo.lua
Библиотека: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/cursor/cursor.lua lib/cursor.lua -f Демонстрация: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/cursor/cursor-demo.lua cursor-demo.lua -f
-
5
-
Как я понял, преобразование convert24BitTo8Bit осуществляется путем перебора массива стандартных цветов с целью поиска ближайшего. А нельзя ли для этого использовать дихотомию?
И еще, если сделать так:
local palette = { [0]=0x000000, 0x000040, ... }то можно избавиться от -1 +1
Нет. Тут немного не так. Требуется найти наиболее близкий по оттенку цвет к нужному, а не просто ближайший к нему цвет. Если начать искать ближайший цвет, то получится "немного" странные оттенки. Например я задам темнозеленый, а мне вернет непонятный оттенок красного.
И да, эта функция очень медленная... Как ускорить ее мы не знаем. Простой поиск близкого по значению цвета дает не те результаты.
-
То же похвастаюсь. Сделал прогу, чтобы управлять роботом, которая делает карту местности и позволяет контролить инвентарь и отдавать простейшие команды роботу. Но отчего-то мне лень ее доделывать, очень лень.
На планшет та же программа, но более мелкий интерфейс и другие цвета.




А еще есть шняжка, которая привязывает робота к компу
по разрешению.



-
3
-
-
А для чего нужна среда? Если не считать автозагрузку библиотек - интересная фича. Вон слушатели событий есть и в стандартных либах: http://ocdoc.cil.li/api:event.
-
А мой почти понимать)
h изначально 0, и условие h == 50 никогда не будет верным.
Но комментарии в коде всегда полезны.
Или хотя бы здесь пояснить алгоритм.
Слушай, а ты похоже прав. Плюс прога в вечный цикл уйдет.
-
Какую ошибку кидает? Если ошибок не кидает, то что именно не работает? Что задумывалось? Слишком сложна, мой экстрасенс не понимать.
-
LeshaInc, успокойся. Уже можно не паниковать, т.к. все работает - проверено.

-
Спокойно. Без паники. Только спокойствие. Исправил. Последние две функции я переписывал с JavaScript и немного накосячил. На всякий случай сейчас проверю их в майне.
-
У меня в закромах завалялся небольшой файлик с функциями для работы с прямоугольниками. Лично мне эта библиотечка понадобилась всего пару раз(для создания кнопок). И я посчитал, что, может быть, все эти функции могут кому-то понадобиться.
Как всегда приведу краткое описание функций:
-
CreateRectXYWH(name:string, x:number, y:number, width:number, height:number):table
Создает структуру прямоугольника используя информацию о местоположении(x, y),высоте и ширине. - CreateRectXYXY(name:string, sx:number, sy:number, ex:number, ey:number):table
Создает структуру прямоугольника используя информацию о местоположении двух точкек. -
CreateVoidRect(name:string):table
Создает "пустой" прямоугольник, т.е. структуру с нулевыми значениями.
-
PointInRectFree(x:number, y:number, sx:number, sy:number, ex:number, ey:number):boolean
Проверяет, лежит ли точка(x, y) внутри прямоугольника заданного двумя точками. Возвращает true, если точка лежит внутри прямоугольника, а false в противном случае. -
PointInRect(x:number, y:number, rect:table):boolean
Делает то же самое что и PointInRectFree, только с использованием структуры прямоугольника. -
bIntersectRects(rect1:table, rect2:table):boolean
Проверяет, пересеклись ли два прямоугольника, возвращает true, если да. False - если нет. - IntersectRects(rect1:table, rect2:table):table
Делает то же самое, что и bIntersectRects, но возвращает прямоугольник образованный пересечением двух заданных.
Структура прямоугольника выглядит следующим образом:
local _rectangle = { ["name"] = name, ["sx"] = x, ["sy"] = y, ["ex"] = x+width, ["ey"] = y+height, ["width"] = width, ["height"] = height, ["area"] = width * height }- name - название прямоугольника.
- sx, sy - первая точка прямоугольника.
- ex, ey - вторая точка прямоугольника.
- width, height - ширина высота.
- area - площадь прямоугольника.
То что мне нравиться тут, так это то, что мы можем задать прямоугольник как x, y, width, height и такие параметры как sx, sy, ex, ey вычислятся автоматически. :3
Так же я написал "небольшой" пример, который использует все функции библиотеки и выдает следующее:


Скачать можно с репозитория гитхаба или установив с помощью следующей строки:
Библиотека: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/others/rectangle.lua lib/rectangle.lua Пример: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/others/rectExample rectExample
-
6
-
CreateRectXYWH(name:string, x:number, y:number, width:number, height:number):table
-
В стародавние времена я делал нечто подобное на Python(там все это дело делается относительно легко), когда писал плагин для SublimeText2. С помощью плагина можно изменять пасты на пастебине. Но мне кажется это неудобным, т.к. при способе "косить под браузер", через настоящий браузер придется перелогиниваться. Но ведь мне, как пользователю такого приложения, не хочется терять свою сессию в браузере... Короче, все это жутко неудобно.
Посему считаю, что польза от такого приложения будет невелика, относительно гемморя, который придется испытать при его использовании и написании, и, следовательно, лучше заняться чем-нибудь более полезным. Например изучить как взимодействовать с гитхабом. Или изучением русского языка.
-
Еще можно написать велосипед. Но это на тот случай, если захочется изучить как в ОС скрипты писать или просто на lua(в данном случае), или понять самому как все эти библиотеки работают(примерно) - гемморой одним словом. Зато скилл повышает. Мне кажется, что все проходили через стадию написания своей GUI библиотеки

Про то как это сделать могу описать примерно, как говорится в двух словах, т.к. возможных вариантов реализации о-о-очень много. Самый легкий спопоб это просто ловить эвент нажатия кнопки мыши в вечном цикле. Далее из эвента вытаскивать координаты и проверять лежит ли эта координата внутри некого прямоугольника, которым в нашем случае является кнопка.
Код примерно такой:
--Подгрузка нужных API local event = require "event" --Штука которая позволяет ловить события, например нажатия кнопок и пр. local gpu = require "component".gpu --Наша видеокарта, с посощью которой будут отрисовываться кнопки. --Находится ли заданная точка внутри прямоугольника. local function PointInRect(x, y, sx, sy, ex, ey) if (x >= sx) and (x <= ex) and (y >= sy) and (y <= ey) then return true end return false end --"Создаем" наши кнопки. Точнее мы просто записываем в "массив" информацию о местоположении и размерх кнопки. local button1 = { x = 10, y = 10, width = 5, height = 6 } local button2 = { x = 20, y = 30, width = 20, height = 10 } --Установить цвет экрана на красный(таким цветом отрисуется наша кнопка) gpu.setBackground(0xff0000) gpu.fill( button1.x, button1.y, button1.width, button1.height, ' ' ) --Установить цвет экрана на зеленый gpu.setBackground(0x00ff00) gpu.fill( button2.x, button2.y, button2.width, button2.height, ' ' ) --Восстановить цвет экрана на черный gpu.setBackground(0) --Вечный цикл, в котором мы будем ловить эвенты для отлова нажатия на нашу кнопку while true do --Ловим эвент touch, т.е. эвент нажатия кнопки --touch(screenAddress: string, x: number, y: number, button: number, playerName: string) local _, x, y, button = event.pull( "touch" ) --Если мы нажали на левую кнопку мыши if ( button == 0 ) then --Если мы кликнули по первой кнопке, то вывести сообщение на экран(то есть координаты точки(x, y), куда мы кликнули находятся внутри прямоугольника) if ( PointInRect( x, y, button1.x, button1.y, button1.width+button1.x, button1.height+button1.y ) ) then print("Button1 pressed!") elseif ( PointInRect( x, y, button2.x, button2.y, button2.width+button2.x, button2.height+button2.y ) ) then --а если мы кликнули по второй кнопке, то вывести сообщени о попадании на вторую кнопку print("Button2 pressed!") end end endДанный код я не тестировал, может не работать. Написал чисто для примера. Единственное что тут наверняка работает, так это функция PointInRect.
Информацию о всяких эвентах и встроенных библиотеках можно найти тут: http://ocdoc.cil.li.
-
Сразу возникла мысль, а нельзя ли сделать графический редактор, пиксель в котором не символ, а полусимвол? Таким образом, пиксели будут квадратными, а не вытянутыми по вертикали прямоугольниками.
Идея интересная, но все же, если так сделать, то не будет возможности нарисовать любой другой символ.
-
Elisegaa докажет.
Какая разница кто там докажет. Просто допили скрипт свой, а когда посчитаешь, что программа уже готова, то можно смело выкладывать. Ругать точно никто не будет.
-
1
-
-
Порой необходимо использовать много маленьких картинок, держать их в отдельных файлах не целесообразно из-за того, что загружать через http.get по отдельности довольно долгое занятие. Будет очень удобным возможность собирать пакеты десятков картинок в одном файле, а при запуске программы загружать разом в один массив
Интересная идея, мне понравилась. Уже сделал
Можно хранить до 255 картинок в одном файле(выделить больше 1 байта на кол-во картинок не позволила большая жаба).-
1
-
-
OC, для мониторов тир3, юзает стандартную программную 8-битную палитру 6*8*5+16
Внутри кода sicot.lua есть простая формула генерации, и комментарии по безопасной палитре.
Но монитор третьего уровня почему-то выводит больше чем 240 цветов и больше 16 цветов grayscale. Но за формулу все-равно спасибо. Вот таблица цветов, которую я сгенерировал по вашей формуле. Может быть я где-то накосячил.
Код генерации таблицы:
local f = io.open("colors", "w") local line = 0 local x = 0 f:write( "colors = {\n" ) for r=0,5 do for g=0,7 do for b=0,4 do line = " [" .. x .. "] = 0x" .. string.format("%X", r*0x330000 + g*0x2400 + b*0x3F) .. ",\n" f:write( line ) x = x + 1 end end end for i=1, 15, 1 do line = " [" .. 240+i .. "] = 0x" .. string.format("%X", gpu.getPaletteColor(i)) .. ",\n" f:write( line ) end f:write( "}\n" ) f:close() -
Сделал пару обновлений библиотеки. Добавил альфа-канал и провел пару оптимизаций.
Кстати, насчет того, что нельзя засунуть в 1 байт целый цвет. Оказывается я ошибался и кодировал цвета в 24 битном формате, что очень избыточно для 8 битного цвета, который используется в OpenComputers. Можно цвет закодировать и 1 байтом. Проверено на практике. А совсем недавно пытался доказать паре человек обратное

Достижение получено
Написать и придумать РАБОЧИЙ формат картинок
-
2
-
-
"Недавно" почитал о формате .png и под впечатлением(ради чего сделал бесполезную семибайтную подпись файла) решил придумать свой формат изображения для OpenComputers и, естественно библиотеку для работы с ним.
Изображение закодированное в этом формате имеет малый размер, поддерживает альфа-канал и в нем возможно закодировать utf8 символ на "пискель".
Картинки:



Библиотека для работы с .ocif
Конечно же я сделал библиотеку для работы с форматом. Точнее сказать библиотека сделала формат, но это неважно.
Сама же библиотека умеет делать три тривиальные вещи:
- Кодировать изображение и записывать в файл: write( filename:string, image:table, full_array:bool ):nil
filename - название файла, в который запишется закодированное изображение
image - массив изображения; может быть представлен в двух форматах: удобном для восприятия и оптимизированным для уменьшения занимаемой оперативной памяти
full_array - выбор формата массива: true - "удобный" массив, в ином случае оптимизированный
- Читать изображение: read( filename:string, full_array:bool ):table
filename - название файла, который будет прочитан и декодирован. Результат возвращается в виде оптимизированного формата массива -
full_array - выбор формата массива: true - "удобный" массив, в ином случае оптимизированный
- Рисовать прочитанное изображение: draw(image:table, frame:number, rawPosX:number, drawPosY:number, gpu:table ):nil
image - принимает оптимизированный формат изображения
frame - выбор фрейма, который будет отрисован.
drawPosX, drawPosY - позиция с которой происходит отрисовка
gpu - ваша видеокарта
Функция неоптимизирована и нестабильна!
Так же теперь есть небольшие настройки:
- Выбор режима работы: setMode( mode:string ):bool
на данный момент режима только два, это: "24bit" - 24bit формат, и стандартный: "8bit" или nil - то есть 8bit.
24bit требует больше места для хранения, но точно передает все доступные цвета; 8bit занимет меньше места на диске, но у него хромает цветопередача(240 цветных оттенков + 16 оттенков серого). - Выбор месторасположения файла ралитры: setPalette( palette_path:string ):nil
выбирает местораположение файла с палитрой, т.к. вам, вероятно, будет неудобен стандартный вариант с расположением в корне и названием "palette.cia".
В режиме 8bit необходимо загружать палитру этой функцией!
Это собственно и все, что она умеет делать.
.OCIF - Open Computers Image Format
Так как объяснить как работает данный формат стало тяжело даже мне, я решил удалить этот раздел, пока не придумаю как описать то, что происходит в этой адской системе.
Но вкраце расскажу. "Пиксель" в данном формате кодируется 4 байтами в лучшем случае и 9 байтами в худшем(т.к размер utf8 символа в байтах имеет переменную длину). Первый байт кодирует цвет символа, второй - цвет фона, третий - альфа-канал, а остальными байтами кодируется символ. В файл также записывается такая служебная информация как подпись формата и ширина с высотой изображения.
Расскажу немного о массивах, в которых у нас хранится раскодированное изображение.
Таких массива у нас два: обычный и оптимизированный. В первом массиве очень удобно редактировать нашу картинку, иначе он прост для восприятия, относительно; второй массив является оптимизированным, то есть его невозможно читать. Оптимизированный вид массива сделан для того, чтобы он занимал меньше места в оперативной памяти, так как изображения в памяти занимают достаточно много места.
Так же данный формат поддерживает альфа-канал.
Вот так выглядит обыный массив:
--Константы(можно скопипастить)-- local IMAGE_WIDTH = 1 local IMAGE_HEIGHT = 2 local IMAGE_FRAMES = 3 local IMAGE = 4 --Сырое изображение, т.е. массив(первый формат, удобен для редактирования из редактора) local ocif_image_raw = { [IMAGE_WIDTH] = 8, --Ширина изображения [IMAGE_HEIGHT] = 4, --Высота изображения [IMAGE_FRAMES] = 2, --Кол-во изображений [IMAGE] = { 0xffffff, 0x000000, 0, '┌', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x000000, 0, '┐', 0xffffff, 0x114B96, 120, '╞', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, 'O', 0xffffff, 0x114B96, 120, 'C', 0xffffff, 0x114B96, 120, 'I', 0xffffff, 0x114B96, 120, 'F', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '╡', 0xffffff, 0x114B96, 120, '╞', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, 'L', 0xffffff, 0x114B96, 120, 'I', 0xffffff, 0x114B96, 120, 'B', 0xffffff, 0x114B96, 120, 'R', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '╡', 0xffffff, 0x114B96, 120, '└', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '─', 0xffffff, 0x114B96, 120, '┘' }, [IMAGE+1] = { 0xffffff, 0x000000, 0, '┌', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x000000, 0, '┐', 0xffffff, 0x114B96, 0, '╞', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, 'O', 0xffffff, 0x114B96, 0, 'C', 0xffffff, 0x114B96, 0, 'I', 0xffffff, 0x114B96, 0, 'F', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '╡', 0xffffff, 0x114B96, 0, '╞', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, 'L', 0xffffff, 0x114B96, 0, 'I', 0xffffff, 0x114B96, 0, 'B', 0xffffff, 0x114B96, 0, 'R', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '╡', 0xffffff, 0x114B96, 0, '└', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '─', 0xffffff, 0x114B96, 0, '┘' } }А так оптимизированный:
local IMAGE_WIDTH = 1 local IMAGE_HEIGHT = 2 local IMAGE = 3 local image_raw_optimized { [IMAGE_WIDTH] = 8, [IMAGE_HEIGHT] = 5, [IMAGE] = { 65480,"1", 65480,"0", 65480,"З", 65480,"0", 65480,"1", 2760," ", 2760," ", 2760," ", 2560," ", 14745344,"1", 65280,"0", 65280,"1", 65280,"0", 65280,"1", 2560," ", 2560," ", 2560," ", 2560," ", 65280,"1", 65280,"0", 65280,"1", 65280,"0", 65280,"1", 2560," ", 65280,"P", 65280,"A", 65280,"S", 65280,"░", 65280,"Ж", 65280,"B", 65280,"I", 65280,"N", 22783," ", 22783," ", 22783," ", 22728," ", 22728," ", 22728," ", 22728," ", 22728," " } }Думаю это наглядно объяснит, почему лучше не надо редактировать во втором формате массива?
Установка
Установка библиотеки: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/ocif/ocif.lua lib/ocif.lua Установка цветовой палитры: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/ocif/palette.cia lib/palette.cia Установка примера: wget https://raw.githubusercontent.com/Pirnogion/OpenComputers_library/master/ocif/example.lua /example
В завершение
Весь исходный код можно посмотреть на GitHub: https://github.com/Pirnogion/OpenComputers_library/tree/master/ocif
З.Ы. Насчет бита-терминатора - так его обозвали в википедии, ко мне никаких претензий.
З.Ы.Ы. Насчет моего английского - ОТСТАНЬТЕ!
Во всем виноват Google translate.Обновления
Обновление 1:
- Добавил альфа-канал, теперь есть возможность делать изображение полупрозрачными.
- Так же изменил "форму" массива(сырого изображения) для того, чтобы он занимал меньше оперативной памяти, к сожалению массив стал менее понятным "из кода".
- Добавил пример, который показывает как пользоваться библиотекой.
Обновление 2:
- Изменил способ кодировки, теперь файл занимает вдвое меньший размер на диске.
- Добавил оптимизированный формат массива сырого изображения.
- Сделал возможность передавать массив в двух форматах.
- Небольшой фикс примера.
Обновление 3:
- Изменил способ конвертации цветов при помощи формулы на таблицу цветов.
- Теперь для работы нужен файл цветовой палитры.
- Появились небольшие цветопотери. Неясно почему.
Обновление 4:
- Исправил ситуацию с потерей цветов.
- Теперь можно выбирать режим работы 24bit(без цветопотерь) или 8bit(с небольшой потерей цветов). В первом случае размер файла выходит больше, а во-втором, соответственно, меньше.
Обновление 5:
- Выловил кучу багов и сделал некоторые оптимизации
Обновление 6:
- Добавил по предложению одного человека, возможность записывать в один файл до нескольких изображений.
- Добавил возможность чтения изображения в "удобной", неоптимизированной формате массива.
- Убрал принудительную загрузку палитры. Теперь ее необходимо прогружать функцией setPalette.
-
7
- Кодировать изображение и записывать в файл: write( filename:string, image:table, full_array:bool ):nil
-
Пытаюсь в сингле выполнить при помощи КБ команды, показанные в видео - реакция нулевая. Может какие то для них разрешения нужны?
В сингле разрешения для КБ не нужны, только режим креатива. Если на сервере то нужен режим креатива, опка и разрешение в конфиге.
Кстати, в КБ при малейшей ошибке в NBT данных всяк команда перестает работать. Может где запятую не поставил или закрывающую скобку. В длинных командах можно и пропустить нечаянно. Или просто кусочек реда пропустил, из-за чего вся система КБ не пашет.
Есть вопрос. Какая именно команда не пашет? Или ни одна не работает?
-
Долго думал, как сделать ствол орудия поворачивающимся. Не придумал ничего лучше, чем нарисовать его в голопроекторе.
Можно сделать 3-4 паттерна пушки. Если бы я делал пушку исключительно на КБ, то я бы так и сделал, и хранил паттерны в мире. А с компами круче. Компьютер - это своего рода огромный носитель информации в одном блоке, куда можно занести все паттерны. Если КБ блок компьютером обновляется достаточно быстро, то можно весь тир сделать с помощью одного КБ и одного компьютера.
Игрок майнкрафта вряд ли будет расстроен пушкой из блоков. Это как старые пиксельные игры: на экране нарисовано два или три пиксела с двумя кадрами анимации, а воспринимаются они как полноценное "высокодетализированное" оружие. И этого достаточно. Стреляешь вправо - пушка вправо, влево - пушка влево, где то по центру - пушка по центру.
Голопроектор же, скорее будет восприниматься как HD модель, и следовательно требования будут предъявляться к нему жестче. Неосознанно глаз будет цепляться за такие моменты как малое количество вокселей, недостаточности анимации, детализации и бог знает чего еще. По аналогии с тем, что было написано в предыдущем абзаце, голопроектор можно сравнить с новыми играми где одна мутная текстурка в углу уровня портит впечатление от всего игрового левела. А если учесть, что делать анимацию, детализацию, раскраску и прочее нужно вручную, т.е. писать кучу кода, а это еще и множество технических сложностей, по типу сжатия кадров анимации или просчета поворота модельки, да и время разработки такого чуда может затянуться черт знает на сколько.
-
Ммм... Попробую сделать такую штукенцию.
-
Но, что плохого в том если придет и mouse_click и mouse_double_click?
У меня в программе по клику мыши по GUI выбирается цвет bg, а по даблклику цвет символа. Выходит так, что цвет символа и фона становятся одинаковыми.
Спасибо за ответы.
-
Я здесь и у меня несколько вопросов.
- Где можно посмотреть как работают стандартные события os.pullEvent и os.pullEventRaw, другими словами хочу посмотреть на их исходный код.
- Я хочу сделать свое событие mouse_double_click. Я его сделал. Работает. Да. С костылями. С костылями по типу parallel и отправки второго кастомного события mouse_click_checked(тот же самый mouse_click, только с окончанием _checked). В чем проблема? Проблема в том, что без костыля mouse_event_checked, события mouse_double_click и mouse_click начинают конкурировать, причем mouse_click выигрывет эту войну. Возможно ли как то переписать mouse_click так, чтобы при двойном щелчке отправлялось мое событие mouse_double_click, а mouse_click подавлялось? Если двойного щелчка нет, то mouse_click не подавляется, а mouse_double_click не отправляется в пул. Повторюсь. Алгоритм двойного щелчка у меня есть. Как переписать событие mouse_click?
-
Хочу знать, что делает вот это: os.pullEventRaw=SingleThread или os.pullEventRaw=MultiThread. Получается то, что мы присваиваем "не понимаю чему, но судя по названию пулу" pullEventRaw указатель на функцию SingleThread или MultiThread? Почему и зачем это нужно?
А так же зачем нужно делать вот это:
if coroutine.status( co ) == "dead" then filter[co],co=nil,next(filter,co) else
То есть, если подпрограмма остановлена, то получаем список её аргументов из filters. Затем удаляем указатель на подпрограмму, чтобы её потом скушал сборщик мусора. Затем получаем следующие аргументы для последующей подпрограммы. Зачем нужно получать аргументы подпрограммы co если эти полученные значения в данный момент не используются? Или тут какое то хитромудреное присваивание? Просто я никак не могу понять, что эта строка делает...
-
Интересная тема, на днях то же посетила подобная идея, только с придумыванием головоломок есть сложность. Компьютеры позволяют делать все что хочешь, так что ограничивать игрока достаточно сложно, так как можно будет придумать 1001 способ обхода мимо головоломки: самый нехороший, по моему мнению, это подправить код головоломки. Так что, наверное, придется использовать связку сервер-клиент: пишем на клиент-компьютере программу и она отсылается на сервер на выполнение.

Таймер
в Программы новичков
Опубликовано: · Изменено пользователем JaggerDer
Вон в стандартном event есть таймер считающий в секундах.
Этот таймер еще может выполнятся на "фоне". Велосипед написал, ИМХО.
К слову... Слушатели событий и таймеры позволяют творить чудеса без излишнего геммороя с coroutine.