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

Zer0Galaxy

Гуру
  • Публикации

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

  • Посещение

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

    189

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


  1. Вот пример работы того, о чем я говорил

    forms=require("forms") --подключаем либу
    Form1=forms.addForm()  --создаем форму
    
    Label1=Form1:addLabel(2,2,"0") -- создаем метку
    
    local Lmax=0 -- тут будем хранить крайнее значение метки
    
    function onTime()
      if Label1.caption>=Lmax then Timer1:stop() return end -- если достигли конца, тормозим таймер
      Label1.caption=Label1.caption+1                       -- иначе, увеличиваем метку
      Label1:redraw()
    end
    
    Timer1=Form1:addTimer(1,onTime) -- создаем таймер с периодом 1 секунда
    Timer1:stop()                   -- пока притормозим его
    
    Edit1=Form1:addEdit(10,10, function() -- создаем поле ввода, по которому
       Label1.caption=0                   -- сбрасываем метку в ноль
       Lmax=tonumber(Edit1.text)          -- задаем крайнее значение
       Timer1:run()                       -- и запускаем таймер
    end)
    
    forms.run(Form1) -- старт всей конструкции
    

    А вот пример с computer.energy

    forms=require("forms") --подключаем либу
    Form1=forms.addForm()  --создаем форму
    
    Label1=Form1:addLabel(2,2) -- создаем метку
    
    Timer1=Form1:addTimer(1,function() -- создаем таймер с периодом 1 секунда
      Label1.caption=computer.energy() -- в котором обновляем значение метки
      Label:redraw()                   -- и перерисовываем ее
    end)
    
    forms.run(Form1) -- старт всей конструкции
    

  2. Вызывать в цикле функцию addLabel нет необходимости. Каждый вызов такой функции создает новый компонент-метку, тебе же нужно просто изменить надпись на уже существующей метке. Сделать это можно изменив поле caption и перерисовав метку:

    Label1.caption="New caption"
    Label1:redraw()
    

    Теперь о том по какому событию происходит смена надписи. Если ты просто вставишь эту смену в цикл

    for i=1,10 do
      Label1.caption=i
      Label1:redraw()
    end
    

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

    Можешь для этого использовать компонент-таймер


  3. Я решаю работу с "кнопками" так:

     

    ...

    Тут надо учитывать, что при выполнении команды event.pull("touch") программа замирает пока не кликнешь по экрану. Т.е. надо обрабатывать не только "touch", но и другие события.


  4. а как можно открыть реднет на планшете с вайфаем т. е. какую сторону надо прописывать в rednet.open()?

    Узнать сторону к которой подключен модем можно запустив такой код:

    for n,sSide in ipairs( rs.getSides() ) do
      if peripheral.getType( sSide )=='modem' then
        print(sSide)
      end
    end
    

    А вообще, переходите на OpenComputers. Там таких проблем нет, зато есть другие.

    • Нравится 2

  5. Реальными компами :)

    Что то я не понял, если майнить реальные биткойнты реальными компами, то почему тема называется "Аналог BitCoint"?

    Или предлагается установить на сервере ОС-компьютер, который будет принимать от игроков комбинации цифр и выдавать взамен UU-шки или ресы? А как игроки будут вычислять эти комбинации, это уже вопрос игроков.

    • Нравится 1

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


  7. На счет рекламы:

    Вариант №1: Рекламный компьютер с периодом, скажем 10 минут, пишет в чат рекламные объявления по одному. Если пользователь не хочет их видеть, он набирает команду /nospam. Текст объявлений, разумеется, должен проходить цензуру.

    Вариант №2: В чат автоматически ничего не пишется. Что бы почитать рекламу, пользователь набирает команду /news и получает в чат (только он) пачку рекламок.

    • Нравится 1

  8. Ты создаешь конструктор: используя двоеточие

    function GuiObject:CreateNew(x, y, w, h, listeners, container)
                      ^
                      |
    

    Это синтаксический сахар Луа, который следует понимать как неявная передача в функцию еще одного параметра. Например, испльзуемое тобой определение конструктора, равнозначно вот такому (без двоеточия):

    function GuiObject.CreateNew(self, x, y, w, h, listeners, container)
    

    При вызове конструктора через двоеточие, первым параметром (self) передается сам вызывающий объект. Однако ты вызываешь конструктор без двоеточия, поэтому туда где должен быть объект попадает значение х, равное 1 и так далее со сдвижкой на один параметр. Вот ты и получаешь вместо listeners значение container={}. А container вообще остается не определен.

    Либо опиши конструктор без двоеточия, либо вызывай его через двоеточие.

    • Нравится 2

  9.  

     

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

    Во-вторых, это сильно упростит управление турелью. Обнаружил-шмальнул.

    Есть датчик, который обнаруживает. Есть турель, которая стреляет. Есть компьютер, который всем этим управляет. Давай не лепить всё в одну кучу.

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

    • Нравится 2

  10. Чего то не выходит.


    Во-первых, id у меня другие:


    1. геолайзер (id:684)


    2. терминал для очков (id:710)


    3. сами очки (id:4496)


    Во-вторых, запускаю прогу и получаю вот такую ошибку


    post-7-0-86291600-1464668085_thumb.png


    Сама установка выглядит так


    post-7-0-86906700-1464668124_thumb.png


    Помогите!  :smile25:


    Я тоже хочу читерить!



  11. Как сравнивать числа?

    mn=require("metanum")
    A=mn(2)
    B=mn(1)
    if A>B then print("2>1")
           else print("1>2")
    end
    

    При необходимости сравнить метачисло с числом, приводим их к одному типу. Например, так:

    A=mn(2)
    B=1
    if A:tonumber()>B then -- Приводим метачисло к числу
    

    или так:

    A=mn(2)
    B=1
    if A>mn(B) then -- Приводим число к метачислу
    

  12. Попробуйте угадать, что будет выведено на экран в результате выполнения нижеприведенного кода:

    N=1e16
    if N+1 > N then print("Норма")
               else print("Лажа")
    end

    Если вы твердо уверены, что N+1 заведомо больше N и ваш ответ "Норма", то вы, наверное, будете несколько удивлены, когда выполните этот код на компьютере.

    Дело в том, что Луа хранит числовые значения в формате с плавающей запятой. Это означает, что каким бы большим число ни было, оно всегда занимает в памяти компьютера одинаковое место, а значит, чем больше число, тем меньше точность, с какой оно хранится. И при достаточно большом N точности, что бы увеличить его на единицу оказывается недостаточно.

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

     

    Метачисло может быть создано при помощи библиотеки metanum

    pastebin get PsMFQame lib/metanum.lua

    Библиотека содержит единственную функцию – функцию создания метачисла.

    metanum([num[,divprec]])

    Параметр num определяет начальное значение метачисла и может быть обычным числом, строкой или другим метачислом. Если параметр отсутствует, будет создано метачисло равное нулю.

    Параметр divprec ограничивает точность метачисла при выполнении операции деления. При делении некоторых чисел, скажем 1 на 3, может возникнуть бесконечная дробь, которая без такого ограничения заняла бы всю память компьютера. Чем больше divprec, тем больше значащих цифр может содержать метачисло. По умолчанию это число равняется 32.

     

    Мета числа можно складывать, вычитать, умножать и делить, как между собой, так и с обычными числами. Результатом такой операции всегда будет метачисло.

    Метачисла можно возводить в степень, но степенью должно быть обычное число.

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

     

    Пример нахождения факториала 300:

    mn=require("metanum") –- подключаем библиотеку
    f=mn(1)               -- создаем метачисло, равное 1
    for i=1,300 do
      f=f*i               -- выполняем умножение 300 раз
    end
    print(f)              -- выводим результат

    Пример нахождения степени двойки:

    mn=require("metanum") –- подключаем библиотеку
    two=mn(2)             -- создаем метачисло, равное 2
    print(two^1024)       -- возводим в степень и выводим результат

    Как видим, после создания метачисла, с ним можно не задумываясь работать так же, как и с обычным числом.

    Но, к сожалению, над метачислами не могут быть выполнены функции библиотеки math. Однако, метачисла обладают некоторыми собственными функциями. К примеру, если мы имеем некое метачисло М, над ним можно выполнить такие действия:

    M:tonumber() – преобразует метачисло в число. Внимание! Возможна потеря точности.
    M:floor([n]) – возвращает целую часть метачисла. Если задан параметр n, отсекает, оставляя n знаков после запятой.
    M:abs() – возвращает абсолютное значение (модуль) метачисла.
    M:toexp() – преобразует метачисло к экспоненциальному виду.

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

    • Нравится 8

  13.  

     

    П.С. кстати, в КК была функция гетРанингПрогКакой-тоИлиКакЕёТам(), которая возвращала имя запущенной проги. В ОС такого нет?  Или на худой конец написать Использование:  имя_программы  <ширина> <длина>

     

     

     

    • process.running([level: number]): string, table, string

    Возвращает путь к текущей запущенной программе (т.е. последней, которая была запущена функцией process.load).

    Параметр level по желанию может использоваться для доступа к родительскому процессу. По умолчанию этот параметр равен 1 (текущая программа). Значение 2 будет означать родителя текущей программы (т.е. ту программу, которая вызвалаprocess.load, чтобы запустить текущую) и т.д.

    Второе возвращаемое значение — окружение процесса.

    Третье возвращаемое значение — это название процесса (т.е. параметр name функцииprocess.load). Для программ запущенных шеллом, это будет команда которая ее запустила.

    Например: для программы запущенной командой ls -l, первое полученное значение будет ls, а третье — ls -l.

    • Нравится 4

  14. будет ли обновление редактора с добавлением возможности вставки в какие-либо поля ввода ?

    не очень удобно "от руки" вводить, например, множество одинаковых цветов или "править" их уже в сгенерированном коде

    Можно сделать вставку из клипбоарда. Но как в клипбоард что-то помещать? Средства ОС этого не позволяют.

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