kremnev8 12 Опубликовано: 2 марта, 2015 Интересует каким образом реализованна команда read из СС . Где можно посмотреть исходники таких команд ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
NEO 541 Опубликовано: 2 марта, 2015 (изменено) bios файл называется,находиться в jar файле мода,assets/computercraft/lua. function read( _sReplaceChar, _tHistory ) term.setCursorBlink( true ) local sLine = "" local nHistoryPos local nPos = 0 if _sReplaceChar then _sReplaceChar = string.sub( _sReplaceChar, 1, 1 ) end local w = term.getSize() local sx = term.getCursorPos() local function redraw( _sCustomReplaceChar ) local nScroll = 0 if sx + nPos >= w then nScroll = (sx + nPos) - w end local cx,cy = term.getCursorPos() term.setCursorPos( sx, cy ) local sReplace = _sCustomReplaceChar or _sReplaceChar if sReplace then term.write( string.rep( sReplace, math.max( string.len(sLine) - nScroll, 0 ) ) ) else term.write( string.sub( sLine, nScroll + 1 ) ) end term.setCursorPos( sx + nPos - nScroll, cy ) end while true do local sEvent, param = os.pullEvent() if sEvent == "char" then -- Typed key sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 ) nPos = nPos + 1 redraw() elseif sEvent == "paste" then -- Pasted text sLine = string.sub( sLine, 1, nPos ) .. param .. string.sub( sLine, nPos + 1 ) nPos = nPos + string.len( param ) redraw() elseif sEvent == "key" then if param == keys.enter then -- Enter break elseif param == keys.left then -- Left if nPos > 0 then nPos = nPos - 1 redraw() end elseif param == keys.right then -- Right if nPos < string.len(sLine) then redraw(" ") nPos = nPos + 1 redraw() end elseif param == keys.up or param == keys.down then -- Up or down if _tHistory then redraw(" ") if param == keys.up then -- Up if nHistoryPos == nil then if #_tHistory > 0 then nHistoryPos = #_tHistory end elseif nHistoryPos > 1 then nHistoryPos = nHistoryPos - 1 end else -- Down if nHistoryPos == #_tHistory then nHistoryPos = nil elseif nHistoryPos ~= nil then nHistoryPos = nHistoryPos + 1 end end if nHistoryPos then sLine = _tHistory[nHistoryPos] nPos = string.len( sLine ) else sLine = "" nPos = 0 end redraw() end elseif param == keys.backspace then -- Backspace if nPos > 0 then redraw(" ") sLine = string.sub( sLine, 1, nPos - 1 ) .. string.sub( sLine, nPos + 1 ) nPos = nPos - 1 redraw() end elseif param == keys.home then -- Home redraw(" ") nPos = 0 redraw() elseif param == keys.delete then -- Delete if nPos < string.len(sLine) then redraw(" ") sLine = string.sub( sLine, 1, nPos ) .. string.sub( sLine, nPos + 2 ) redraw() end elseif param == keys["end"] then -- End redraw(" ") nPos = string.len(sLine) redraw() end elseif sEvent == "term_resize" then -- Terminal resized w = term.getSize() redraw() end end local cx, cy = term.getCursorPos() term.setCursorBlink( false ) term.setCursorPos( w + 1, cy ) print() return sLine end Изменено 2 марта, 2015 пользователем NEO Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 563 Опубликовано: 2 марта, 2015 (изменено) Интересует каким образом реализованна команда read из СС . Где можно посмотреть исходники таких команд ? Оболочка к этой команде, насколько я понимаю находится здесь: ComputerCraft1.65.jar\assets\computercraft\lua\rom\apis\io Однако она упирается в _G.read(), а это значит что сама реализация скрыта в исходниках мода. Вот тут есть пример самописного ввода данных (с ограничением максимальной длинны ввода дополнительно): http://www.computercraft.info/forums2/index.php?/topic/7945-max-input-length/ Плюс, посмотреть ввод данных на эвентах можно в OpenOS - Term API (для OpenComputers). Изменено 2 марта, 2015 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Интересует каким образом реализованна команда read из СС .
Где можно посмотреть исходники таких команд ?
Поделиться сообщением
Ссылка на сообщение
Поделиться на других сайтах