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

eu_tomat

Модераторы
  • Публикации

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

  • Посещение

  • Победитель дней

    331

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


  1. а разве оно не возвращает просто величину энергии, необходимую на прыжок (точнее коннект) к этой координате и к воображаемым вратам, не зависимо от того, есть ли они там или нет? Или оно все-таки их там проверяет, что они там есть?

    Возвращает nil, "No stargate at address" при отсутствии врат, требует тик времени на проверку. Выжирает ли память сервера такой пинг врат, не знаю.

  2. а откуда врата вообще знают, с кем возможна связь, а с кем нет? Может тех врат там уже давным-давно не существует в природе и их выключили или сломали вообще? Их  прога пингует как-то что-ли? Чего-то я не нашел намека в программке на sg.sendMessage

    Полагаю, sg.energyToDial что-то знает об этом.

  3. Меня все-таки напрягает, что при каждом нажатии в цикле проверяются границы всех кнопок, учитывая, что на пианино их может быть много, а расположены они в строгом порядке. Поэтому я бы постарался избавиться от использования библиотеки. Тем более, пианино должно иметь более одной октавы, а код уже сейчас слишком громоздок.

     

    Так как картинка в целом периодическая, то для изображения клавиш отлично подходит вывод прямоугольников в цикле. Белые клавиши выводятся подряд, а для черных надо будет пропустить третью и седьмую клавишу из каждых семи. Это просто.

     

    С эффективным вычислением номера полутона из координат клика немного сложнее. При небольшой ширине клавиш удобно использовать два массива: для верхней и нижней половины клавиатуры, что позволит за одну операцию получить номер полутона в октаве. В нашем случае массивы содержат 56 значений, по протяженности изображения клавиш октавы на экране:

    TopKey_HT = { 1,1,1,1,1,2,2,2,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5,nil,6,6,6,6,6,7,7,7,7,7,8,8,8,9,9,9,9,9,10,10,10,11,11,11,11,11,12,12,12,12,12}
    BottomKey_HT = { 1,1,1,1,1,nil,3,3,3,3,3,nil,5,5,5,5,5,nil,6,6,6,6,6,nil,8,8,8,8,8,nil,10,10,10,10,10,nil,12,12,12,12,12}
    При каждом клике на экране выбирается нужный массив, а из него сразу извлекается номер полутона. Хранить массивы для других октав не требуется, т. к. номера полутонов повторяются циклично. Для легкого изменения ширины клавиш следует отдать предпочтение автоматическому формированию массивов.

     

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


  4. Обработчик клика проверяет принадлежит ли клик тому или иному компоненту, начиная проверку с более поздних компонентов.

    Как же разумно твоя либа устроена! А я надеялся убедить @kotik_prikol отказаться от ее использования. Придется найти другие подходы.

  5. Если не вызывалась функция redraw(), библиотека forms прорисовывает компоненты в той последовательности, в которой они были созданы. Т.е кнопки, которые были созданы позже будут находиться над кнопками, которые были созданы ранее.

    С отображением понятно. А в какой последовательности запускаются обработчики кликов?

  6. Как я понял тебе нужно узнать количество букв в фразе, пройти по ним брутом (в цикле) и записать в таблицу сколько какая буква использовалась.

    Годное решение для низкоуровневых языков, но в Lua все вызовы обходятся дорого, как бы быстро они не выполнялись. Поэтому в данном случае более предпочтительным будет использовать string.find от позиции последнего вхождения. Такое решение позволит уменьшить количество необходимых итераций с общего количества букв в строке до количества искомых букв и плюс еще одной итерации.

  7. Ну как бы в OpenComputers ограничения по диапазону частот. Он и не должен их играть.

    Ограничения есть, но именно эти частоты воспроизводить должен:

     

    Supports frequencies from 20 to 2000Hz, with a duration of up to 5 seconds.

    Вопрос лишь в том, насколько адекватным будет воспроизведение.

  8. Так?

    Не так. На пианино две клавиши Ля никак не могут находиться рядом. Или я не понял вопроса.

    Что вы тут за велосипеды придумываете? Давно уже есть готовый алгоритм для поиска частот нот разных тональностей в стандартной библиотеке note. Неужели вы не знали?

    Велосипед – понятие, зависящее от контекста. Нет смысла занимать оперативную память подключенной библиотекой, когда частота ноты вычисляется по формуле 440*math.pow(2,offset/12), где offset – смещение полутона относительно ноты Ля первой октавы, положительное – в сторону повышения и отрицательное – с сторону понижения тона

  9. Правильно я понял что мне надо поменять гц

    Именно так.

    Там экспоненциальная зависимость частоты от ноты, вроде.

    Экспоненциальная. В принципе, всё можно вычислить. Частота каждого полутона увеличивается в корень двенадцатой степени из двух. Учитывая, что каждая октава разделена на 12 полутонов, то полутона любой октавы имеют частоту в два раза большую полутонов предыдущей октавы. Ориентиром служит нота Ля первой октавы, равная 440 Гц. Частоты любых других полутонов легко вычисляются из нее.

  10. А что это даст?

    Это позволит тебе оправдать название «Пианино», т. к. без настройки в соответствии с хроматическим звукорядом даже настоящее пианино превращается в ящик со струнами, клавишами и молоточками.
    • Нравится 1

  11. ееее, работает) только вот просьба, можешь помочь это все сделать в виде GUI? Что бы все это было красиво)

    Понимание красоты у каждого своё. Но давай попробуем.

     

    Для начала следует определиться, какая именно информация должна быть изображена на экране в каждый момент времени, и как она должна размещаться. То есть, нужны эскизы.

     

    Если я правильно понимаю задачу, то в нашем случае достаточно двух текстовых сообщений. Что нужно написать и каким цветом? И каким будет соотношение сторон экрана?


  12. Как раз кто-то жаловался, что писать больше нечего, и нет идей.

    Идей-то полно, как раз. А идеи @mercurial совершенно не новы. Те, кто жаловался, просто хотели новизны. Есть куча недописанных или даже вообще ненаписанных программ. Достаточно полисать форум, чтобы это увидеть. Проблема нашего сообщества совсем не в недостатке идей.

  13. осталось только программу написать

    Мне вдруг подумалось, что неспроста тут народ флудит.

    Отрезать путь к отступлению вкусившим полония игрокам – как-то скучновато.

     

    ну если бы меня кто-то научил таким штукам, я бы сам сделал

    А это уже более интересная постановка вопроса. Вдохновившись ею, я набросал код. Он, конечно, неидеален, но твою задачу решает. Для решения использован сенсор из OpenPeripheral. Он немного кривоват, и иногда генерирует исключения, что слегка усложняет код. Но другого сенсора в моей сборке не нашлось. Ты можешь использовать любой другой сенсор, скорректировав программу под его API.

     

     

    -- рабочее пространство ограничено кубом
    -- ! задать координаты относительно сенсора
    local x1,x2,y1,y2,z1,z2 = -5,5, -2,5, -5,5
    -- ! задать сторону редстоуна относительно контроллера
    local side_rs = 3
    -- ! задать паузу между опросами сенсора (в секундах)
    local pause = 5
    
    local time = require"computer".uptime
    local com = require"component"
    local sens = com.openperipheral_sensor
    local rs = com.redstone
    
    local fRadiation  -- флаг наличия зараженного игрока в опасной зоне
    local player_name -- имя неудачника (Родина должна знать своих героев!)
    
    while true do
      fRadiation = false
      -- получить таблицу игроков и перебрать всех
      local players = sens.getPlayers()
      for _,player in pairs(players) do
        -- получить информацию по игроку
        --   обходя возникающее иногда исключение
        local fOk, player = pcall(sens.getPlayerByUUID,player.uuid)
        if fOk then
          local info = player.all()
          local p = info.position
          for _,effect in pairs(info.living.potionEffects) do
            -- если игрок поражен радиацией и находится в опасной зоне
            if effect=="ic2.potion.radiation"
                and x1<=p.x and p.x<=x2
                and y1<=p.y and p.y<=y2
                and z1<=p.z and p.z<=z2 then
              fRadiation = true
              player_name = info.name
              break
            end
          end
        end
        if fRadiation then
          break
        end
      end
      -- управление конечным устройством и вывод сообщения
      rs.setOutput( side_rs, fRadiation and 15 or 0 )
      if fRadiation then
        print( ("%d: Тревога! Игрок %s творит какую-то дичь! Впустить бригаду дронов-дезактиваторов!"):format(time(),player_name) )
      else
        print( ("%d: Чёта скучна..."):format(time()) )
      end
      os.sleep(pause)
    end
    

     

    • Нравится 3

  14. Видимо, да. А вещи потом забрать....Ибо PIM-слишком просто

    Почему сразу вещи? Может, у него режимное предприятие, и роботы будут забрасывать зараженного игрока целебными зельями до полного выздоровления.
    • Одобряю 1

  15. Как файл может быть переменной?

    Даже если переменая может хранить имя, дескриптор открытого файла или даже его содержимое, сам файл в переменную не превращается.

     

    Давай попробуем зайти с другой стороны: зачем может потребоваться превращать файл в переменную?


  16. Честно говоря, не понимал и не пойму никогда назначения этих "скринсейверов".

    В далекие времена, когда компьютерные экраны являлись слегка модифицированными телевизорами, а программы типа NortonCommander, содержащие в своем интерфейсе множество статичных и ярких элементов, распространялись со скоростью вирусов, скринсейверы реально спасали экраны от преждевременного выгорания люминофора. Просто отключать экраны было плохой идеей, т. к. в те времена не только черный экран, но даже просто неподвижная картинка зачастую означали сбой в работе компьютера.

     

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

     

    Искусство доступно далеко не всем, чего не скажешь о суеверии: даже если компьютер не выполняет никакой работы, «скринсейвер» создает иллюзию того, что компьютер включен не зря.

     

    П.С. Увижу у кого-то такой "скринсейвер" на сервере, сразу на компе вместе с экраном (а при рецидиве - вместе с домиком) //set 0 буду применять.

    А когда Золушка запустила скринсейвер в своей карете, Фея ей тыкву засетила.

  17. Только я там не слипы использовал, а геосканер для обнаружения перед роботом блока булыги и сверху сундук, куда кидал редстоун.

    Кабы геосканер мог события генерировать, тогда бы и был в нем смысл, а так он помогает лишь тратить энергию. robot.detect() значительно дешевле обходится.
    • Нравится 4

  18. Notepad++.  Привык уже

    Тоже привык, и ничего удобнее не встречал. Но на прошлой неделе меня вдруг начала раздражать повторяющаяся последовательность: сохранить изменения в файл, переключиться в консоль, запустить код, посмотреть на результат, переключиться обратно в редактор.

     

    К чёрту notepad++, какие-то другие IDE (которые именно с OC Lua работать не могут от слова никак). Юзайте, господа, vim! И да прибудет к вам счастье.

    Никогда не понимал подобных заявлений, а vim открывал лишь для того, чтобы ужаснуться, закрыть и забыть. Но на прошлой неделе я психанул, и, потратив два дня, нагуглил ответы на каждый свой вопрос, прошел vimtutur ru, составил простенький .vimrc для начала, и повесил хоткей на выполнение последовательности из двух команд: сохранить изменения и запустить файл на выполнение.

     

    Так по рецепту @Fingercomp я и обрел свое счастье в vim'е.

    0xbabaf000l.png?1405196201

    • Нравится 1
×
×
  • Создать...