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


Фотография

[1.7.10] ComputerCraft [1.74]


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2863

#2361 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 25.07.2013 - 10:46

Написал свою реализацию read(), назвал её smart_read

Подозреваю, что smart_read планируется для реализации многооконного ввода с которого всё и началось. Тогда у меня вопрос, а зачем обрабатываются события типа CTRL+клавиша?

#2362 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 25.07.2013 - 15:04

Ukrainian, да ты же написал обычный read :D функция завершения ввода по какой-то кнопке... я не знаю куда это приткнуть. Зачем ты ловишь key, а потом char, если не реализуешь ctrl? Курсор не мигает из-за цикла. И текст больше длины экрана не введешь.
Я бы выбрал read.
Оффтопик


#2363 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 25.07.2013 - 16:06

На сколько я понял Апокалипса, таким образом событие, перехваченное основной программой, передается в сопрограмму.

Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?

Подозреваю, что smart_read планируется для реализации многооконного ввода с которого всё и началось. Тогда у меня вопрос, а зачем обрабатываются события типа CTRL+клавиша?

функция завершения ввода по какой-то кнопке... я не знаю куда это приткнуть

Я бы выбрал read.

У меня в программе есть несколько мест, где нужно принимать значение, как read(), но в тоже время реагировать на остальные не "буквенно-цифровые" клавиши. Пример: нужно сохранить файл под новым именем(save as), но при нажатию tab отменить, и вернуться в главное меню. Пример2: нужно создать новый файл; три поля(имя, ширина, высота), и кнопка(-> create <-), между ними переключаемся стрелочками(вверх-вниз). Я думаю, это можно решить с помощью smart_read().
А суть моей программы, попытаюсь в двух словах: это редактор, шаблонов, для другой моей программы, которая строит по этим шаблонам.

Зачем ты ловишь key, а потом char, если не реализуешь ctrl?

Что-бы получить char, если это возможно. Иначе не определить какая была нажата клавиша, буквенно-цифровая, или другая(alt,arrows,shift..). Когда нажимается клавиша, и если она букв-цифр то происходит два события(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()
Пример, нажата 'a', первое событие словит её цифровой код, второе её human-readable представление('a'). Другой пример, нажата стрелочка(208), первое событие словит её цифровой код, а второе словит таймер. За тем:
if event2 ~= "timer" then event,key=event2,key2 end
Если пойман char, то записываем его в первое событие, event2,key2 далее не используются.

Курсор не мигает из-за цикла

Жаль, цикл я не могу убрать..

И текст больше длины экрана не введешь.

Но переменная будет увеличиваться, и текст будет "за экраном". Так можно записать почти бесконечную строку.
И насчёт ctrl-а, так как я узнал, как возвращаются значения(одно за другим), может я пойму как работает тот твой код.

#2364 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 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 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 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 Slavkapro

Slavkapro

    Странник

  • Пользователи
  • Сообщений: 1

Написал 26.07.2013 - 02:27

Уважаемый Dimach я предлагаю сотрудничать с нами у вас несомненный талант в програмирование на lua я хочу чтоб вы помогали нашей команде а именно : наша команда хочет создать канал на ютубе где будут выкладываться видео ролики про:редстоун схемы , програмирование , игры на серверах (просто игры или сериалы , голодные игры) а так-же расказы (туториалы) о сложных модах и не , и другое также у нас есть свой raidcallи название нашей группы"LikeСraft"TMжду вашего ответас уважением команда "LikeCraft"TM

#2367 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 26.07.2013 - 17:49

Это понятно, но зачем? Ведь user, и pass не принимают значения, зачем им их передавать?

Дело в том, что user и pass используют read, а read наверняка работает через os.pullEvent. Да вот только события о нажатии клавиш на прямую до user и pass не доходят, поскольку перехватываются и обрабатываются основной программой. Поэтому то, при вызове resume, вторым параметром передается только что полученное событие. В результате это событие возвращается функцией yield, которая, как я полагаю используется в pullEvent, а от туда уже попадает в read. Вот как накручено.

#2368 Ukrainian

Ukrainian

    Странник

  • Пользователи
  • Сообщений: 83

Написал 26.07.2013 - 19:02

Скрытый текст
Ага, благодарю, теперь всё понятно. А где лежат исходники read()? Хочу посмотреть, как она устроенна.

#2369 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 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 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 29.07.2013 - 10:55

Любые значение переданные после нити в resume выбрасывают событие.

Я думал, в resume можно передавать любые данные, не только события. А как нить будет их трактовать, это ее проблемы.

#2371 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 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 Hunter460

Hunter460

    Странник

  • Пользователи
  • Сообщений: 6

Написал 30.07.2013 - 13:23

Кто нибудь может дать или написать программу чтобы черпашка, с гаечным ключом все время нажимала пкм !

#2373 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 30.07.2013 - 17:35

Какой еще ключ? На сколько я знаю, черепашки могут использовать только кирки, мотыги, топоры, лопаты и мечи. А если не секрет, зачем это?

#2374 iFrager

iFrager

    Странник

  • Пользователи
  • Сообщений: 7

Написал 30.07.2013 - 17:38

Advanced Turtles - в чём её особенность, ответьте, пожалуйста, или дайте ссылку на ответ.

#2375 Minik

Minik

    Опечаленный гастами

  • Пользователи
  • Сообщений: 2908
  • Откуда: Rivendell

Написал 30.07.2013 - 17:38

Черепаха с ключом из ThermalExpansion.

#2376 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 31.07.2013 - 02:16

У advanced turtle цветной монитор. По поводу кода черепахи с ключом - вставь в бесконечный цикл функцию, которая отвечает за удар ключом. Я не помню, врод turtle.attack (в описании должно быть).
while true doturtle[paste][/paste]attack()sleep(0)end


#2377 vadimus19991

vadimus19991

    Странник

  • Пользователи
  • Сообщений: 22

Написал 02.08.2013 - 14:02

Привет апокалипсис слушай составь программу что бы можно было выйти из золотого компа и на улучшенном мониторе играть в worm и что бы время показывалось на мониторе время с обновлением

#2378 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 02.08.2013 - 16:23

Привет апокалипсис слушай составь программу что бы можно было выйти из золотого компа и на улучшенном мониторе играть в worm

Я правильно понял, ты хочешь запустить worm, но не в терминале компьютера, а на внешнем мониторе? Переписывать программу для этого не надо, нужно запустить ее, например, так
monitor left worm
если монитор стоит слева от компьютера.
Вот только как реагировать на нажатия клавиш? Можно, конечно прикрутить редстоун-кнопки, но играть на них это мазохизм.

и что бы время показывалось на мониторе время с обновлением

а вот тут долго думал, но так и не въехал, чё за обновление времени

#2379 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 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 vadimus19991

vadimus19991

    Странник

  • Пользователи
  • Сообщений: 22

Написал 05.08.2013 - 10:49

спасибо)) к стати помнишь ты делал программу что бы сервер вырубался??))а да ещё на счёт времени вот мне надо, что бы это время показывалось в мониторе ещё и с автозапуском, и ещё на сколько я видел когда пишешь help index там пишет что то на подобие monitor_sensor что ли?


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных