Подозреваю, что smart_read планируется для реализации многооконного ввода с которого всё и началось. Тогда у меня вопрос, а зачем обрабатываются события типа CTRL+клавиша?Написал свою реализацию read(), назвал её smart_read
[1.7.10] ComputerCraft [1.74]
#2361
Написал 25.07.2013 - 10:46
#2362
Написал 25.07.2013 - 15:04
Я бы выбрал read.
#2363
Написал 25.07.2013 - 16:06
Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?На сколько я понял Апокалипса, таким образом событие, перехваченное основной программой, передается в сопрограмму.
Подозреваю, что smart_read планируется для реализации многооконного ввода с которого всё и началось. Тогда у меня вопрос, а зачем обрабатываются события типа CTRL+клавиша?
функция завершения ввода по какой-то кнопке... я не знаю куда это приткнуть
У меня в программе есть несколько мест, где нужно принимать значение, как read(), но в тоже время реагировать на остальные не "буквенно-цифровые" клавиши. Пример: нужно сохранить файл под новым именем(save as), но при нажатию tab отменить, и вернуться в главное меню. Пример2: нужно создать новый файл; три поля(имя, ширина, высота), и кнопка(-> create <-), между ними переключаемся стрелочками(вверх-вниз). Я думаю, это можно решить с помощью smart_read().Я бы выбрал read.
А суть моей программы, попытаюсь в двух словах: это редактор, шаблонов, для другой моей программы, которая строит по этим шаблонам.
Что-бы получить char, если это возможно. Иначе не определить какая была нажата клавиша, буквенно-цифровая, или другая(alt,arrows,shift..). Когда нажимается клавиша, и если она букв-цифр то происходит два события(key, char), одно за другим.Зачем ты ловишь key, а потом char, если не реализуешь ctrl?
local event,key=os[paste][/paste]pullEvent("key") os[paste][/paste]startTimer(0[paste][/paste]1) local event2,key2=os[paste][/paste]pullEvent()Пример, нажата 'a', первое событие словит её цифровой код, второе её human-readable представление('a'). Другой пример, нажата стрелочка(208), первое событие словит её цифровой код, а второе словит таймер. За тем:
if event2 ~= "timer" then event,key=event2,key2 endЕсли пойман char, то записываем его в первое событие, event2,key2 далее не используются.
Жаль, цикл я не могу убрать..Курсор не мигает из-за цикла
Но переменная будет увеличиваться, и текст будет "за экраном". Так можно записать почти бесконечную строку.И текст больше длины экрана не введешь.
И насчёт ctrl-а, так как я узнал, как возвращаются значения(одно за другим), может я пойму как работает тот твой код.
#2364
Написал 25.07.2013 - 16:50
Да, спасибо, что объяснил мне то, что я объяснялКогда нажимается клавиша, и если она букв-цифр то происходит два события(key, char), одно за другим.
local event,key=os[paste][/paste]pullEvent("key") os[paste][/paste]startTimer(0[paste][/paste]1) local event2,key2=os[paste][/paste]pullEvent()
if event2 ~= "timer" then event,key=event2,key2 endТы используешь код, который я писал для обработки ctrl, но не для того. Можно сделать проще и быстрее:
e, p1 = os[paste][/paste]pullEvent("key")name = keys[paste][/paste]getName(p1)if name and string[paste][/paste]len(name) == 1 then e = "char" p1 = nameend
Только не видно что пишешь.Но переменная будет увеличиваться, и текст будет "за экраном". Так можно записать почти бесконечную строку.
Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?
На сколько я понял Апокалипса, таким образом событие, перехваченное основной программой, передается в сопрограмму.
#2365
Написал 25.07.2013 - 17:29
Я тогда не так понял, я думал что возвращается два(по два) значение в массиве, ты тогда не сказал что они идут поочередно.Да, спасибо, что объяснил мне то, что я объяснял тебе.
Работа того кода для меня оставалась загадкой, этот я написал для захвата обеих значений.Ты используешь код, который я писал для обработки ctrl, но не для того.
Действительно, до такой string.len(name) == 1 проверки я не додумался, тогда действительно два pullEvent-а не нужно(но всё равно, они остаются рабочей альтернативой).Можно сделать проще и быстрее:
Так, стоп, создается такая сопрограмма:Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?
На сколько я понял Апокалипса, таким образом событие, перехваченное основной программой, передается в сопрограмму.
user = coroutine[paste][/paste]create( function() return read() end)Как я понял аргумент переданный сопрограмме, передается её функции, function() ничего не принимает. Зачем передавать?
UPD: Через твой способ не печатаются цифры, нужно добавить две лишних проверки 2<=p1<=11
#2366
Написал 26.07.2013 - 02:27
#2367
Написал 26.07.2013 - 17:49
Дело в том, что user и pass используют read, а read наверняка работает через os.pullEvent. Да вот только события о нажатии клавиш на прямую до user и pass не доходят, поскольку перехватываются и обрабатываются основной программой. Поэтому то, при вызове resume, вторым параметром передается только что полученное событие. В результате это событие возвращается функцией yield, которая, как я полагаю используется в pullEvent, а от туда уже попадает в read. Вот как накручено.Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?
#2368
Написал 26.07.2013 - 19:02
#2369
Написал 26.07.2013 - 19:41
Там всё накручено даже больше, лучше не вникать. Любые значение переданные после нити в resume выбрасывают событие.Ага, благодарю, теперь всё понятно.
Хочу посмотреть, как она устроенна.
function read( _sFormat ) if _sFormat and _sFormat ~= "*l" then error( "Unsupported format" ) end return _G[paste][/paste]read()end
private Varargs ioread(IoLib[paste][/paste]File var1, Varargs var2) throws IOException { int var4 = var2[paste][/paste]narg(); LuaValue[] var5 = new LuaValue[var4]; int var3 = 0; while(true) { if(var3 < var4) { LuaValue var7; LuaValue var6; label32: switch((var6 = var2[paste][/paste]arg(var3 + 1))[paste][/paste]type()) { case 3: var7 = freadbytes(var1, var6[paste][/paste]toint()); break; case 4: LuaString var8 = var6[paste][/paste]checkstring(); if(var8[paste][/paste]m_length == 2 && var8[paste][/paste]m_bytes[var8[paste][/paste]m_offset] == 42) { switch(var8[paste][/paste]m_bytes[var8[paste][/paste]m_offset + 1]) { case 97: var7 = freadall(var1); break label32; case 108: var7 = freadline(var1); break label32; case 110: var7 = freadnumber(var1); break label32; } } default: return argerror(var3 + 1, "(invalid format)"); } if(!(var5[var3++] = var7)[paste][/paste]isnil()) { continue; } } return (Varargs)(var3 == 0?NIL:varargsOf(var5, 0, var3)); } }
#2370
Написал 29.07.2013 - 10:55
Я думал, в resume можно передавать любые данные, не только события. А как нить будет их трактовать, это ее проблемы.Любые значение переданные после нити в resume выбрасывают событие.
#2371
Написал 29.07.2013 - 15:19
function foo(a) while true do print('arg: '[paste][/paste][paste][/paste]a) e = os[paste][/paste]pullEvent() print('event: '[paste][/paste][paste][/paste]e) endendrou = coroutine[paste][/paste]create(foo)coroutine[paste][/paste]resume(rou, 'is_arg')coroutine[paste][/paste]resume(rou, 'is_event')coroutine[paste][/paste]resume(rou, 'is_event_too')
>arg: is_arg>event: is_event>arg: is_arg>event: is_event_tooВсе аргументы, полученные при первом запуске, сохраняются.
#2372
Написал 30.07.2013 - 13:23
#2373
Написал 30.07.2013 - 17:35
#2374
Написал 30.07.2013 - 17:38
#2376
Написал 31.07.2013 - 02:16
while true doturtle[paste][/paste]attack()sleep(0)end
#2377
Написал 02.08.2013 - 14:02
#2378
Написал 02.08.2013 - 16:23
Я правильно понял, ты хочешь запустить worm, но не в терминале компьютера, а на внешнем мониторе? Переписывать программу для этого не надо, нужно запустить ее, например, такПривет апокалипсис слушай составь программу что бы можно было выйти из золотого компа и на улучшенном мониторе играть в worm
monitor left worm
если монитор стоит слева от компьютера.
Вот только как реагировать на нажатия клавиш? Можно, конечно прикрутить редстоун-кнопки, но играть на них это мазохизм.
а вот тут долго думал, но так и не въехал, чё за обновление времении что бы время показывалось на мониторе время с обновлением
#2379
Написал 02.08.2013 - 19:36
while true do term[paste][/paste]clearLine() write(textutils[paste][/paste]formatTime(os[paste][/paste]time(), true)) sleep(1)end
#2380
Написал 05.08.2013 - 10:49
Количество пользователей, читающих эту тему: 1
0 пользователей, 1 гостей, 0 анонимных