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

N1nt3nd0

Пользователи
  • Публикации

    6
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем N1nt3nd0


  1. Осмелюсь предложить более удобный "алгоритм" вычисления для данного скрипта, в одну строчку и без условных операторов: 

     local success, result = pcall(load('return ' .. cmd))

     При нажатии на кнопки, формируется строка в переменную cmd, и после нажатия "=", если success, на экранчик выводится result.


  2. Индентация из одного места, задача кода не понятна. Что это? Командная оболочка? Программа управления адронным коллайдером? Рекурсия в бесконечном цикле в рекурсии? Что это з зверь?

    test запускается, в нем бесконечный цикл, потом очередной test при нажатии. Я нажму 100 раз на клаву и прога вылетит, вероятно. А если ничего не трогать, овердофига раз в секунду будет зачем то сетиться надпись. Каждый раз, черт возьми. Непонятна суть листенеров тут, они только ухудшают все.

     

    Решение (лучшее, имхо): ^A; Del; ^S; переписать.

    этот код я набросал для примера. Я хотел реализовать выход из цикла нажатием кнопки Q и возврат в главное меню main(). В оригинале в "меню" вместо "test" намного больше "ссылок" на разные функции из скрипта. А фукцию main() после else я вызываю повторно для того чтобы скрипт не крашнулся если я введу другие варианты кроме предложенных ("test" и "exit"). Я даже убрал main() из функции main() после else, и всеравно возник тот же баг... Как то так...


  3. Здравствуйте! Делая выход из цикла нажатием на клавишу я столкнулся с непонятным мне багом. Опишу его таким вот кодом для примера:

    local c = require('component')
    local term = require('term')
    local event = require('event')
    local keyboard = require('keyboard')
    local gpu = c.gpu
    
    function main()
    	term.clear()
    	io.write('exit >> ')
    	local text = io.read()
        if text == 'exit' then
    	term.clear()		
            os.exit()
        elseif text == 'test' then
        	event.listen('key_down',test)
        	test()
        else
        	main()
        end
    end
    
    function test(name,adress,char,code,player)
            term.clear()	
        while true do
            key = tostring(keyboard.keys[code])
            gpu.set(1,1,'for stop press Q')
            os.sleep(0.0000000001)
            if key == 'q' then break end
        end
            event.ignore('key_down',test)
            term.clear()
            print('test')
            os.sleep(2)
            main()
    end
    
    main()
    
    

    Суть бага: я запускаю скрипт, пишу exit и он закрывается, как положено, но когда я напишу exit после того как запущу и остановлю цикл test, то на экране снова высвечивается 'test' на 2 секунды и возвращается в main() вместо того чтобы закрыться. Почему?? А второй раз когда я пишу exit, то скрипт уже закрывается... Как избавиться от этого??


  4.  

    1. function run()
    2. while check do
    3. pcall(test)
    4. os.sleep(1) -- добавь
    5. end
    6. end

     

     

    Спасибо, помогло) лойс в карму!

    На русской вики уже давно есть инфа по всем библиотекам. Например вот инфа о библиотеки event.

     

    Теперь перейдём к проблеме.

    event.pull() ждёт пока произойдёт событие и до тех пор пока оно не произошло, не реагирует. В скобках указывается собитие и "прямой эфир" (нечто вроде критерия по которому евент будет срабатывать, например на нужную клавишу)

    Пример: tb = {event.pull("key_down")}

    Таким образом комп будет ждать нажатия любой клавиши, когда он произойдёт вся инфа сохранится в пронумерованную таблицу tb и дальше что хочешь делой с этой инфой.

     

    event.lister же работает "в фоне" (по факту в моменты ожидания os.sleep ведётся обработка евентов)

    Пример: создадим функцию local function slowpoke() <какой то код> end далее привяжем эту функцию к нажатию на экран клика мыши event.lister("touch", slowpoke)

    Далее например создадим бесконечный цикл с обработкой евентов while true do os.sleep(10) end

    В таком случае при нажатии на экран будет вызываться функция slowpoke(), а в аргументы будут выводится всё та же инфа о координатах мыши, нике игрока и так далее.

    Это более выгодно по сравнению с event.pull, так как позволяет обрабатывать сразу несколько эвентов параллельно, обрабатываемых при ожидании os.sleep()

    Но нужно помнить что по окончание программы обязательно нужно будет убрать event.lister при помощи event.ignore("событие", название функции)

     

    Если хочешь, могу код какой нибудь скинуть с применением эвентов.

     

    Понял насчёт listen.ignore()

    Спасибо за совет! Я кстати использовал как пример код твоей игрухи OpenClicker, но os.sleep() упустил видимо


  5. Есть следующий код для примера:
     

    local event = require("event")
    local component = require('component')
    local computer = require('computer')
    local gpu = component.gpu
    local check = true
    
    function test()
     store = computer.energy()
     gpu.set(10,10,''..store..'')
    end
    
    function touch(_,_, x, y)
      if x >= 1 and y >= 1 then
       check = false
       os.exit()
      end 
    end
    
    function run()
      while check do
        pcall(test)
      end
    end
    
    event.listen('touch', touch)
    run()
    

     

    Вопрос 1: в коде присутствует event.listen(), но он не работает. Почему?? Что я делаю не так? И как изменить код, чтобы он заработал?

     

    Вопрос 2: когда я делаю тачскрин через event.pull('touch') то все циклы в программе останавливаются. Как этого избежать?

     

    И вообще, дайте совет пожалуйста как лучше всего реализовывать систему тачскрина, чтобы в дальнейшем не наступать на те же грабли... Спасибо!

×
×
  • Создать...