Автокликер Clickermann :: Форум

Основной раздел => Предложения => Topic started by: EGGGOOSE on July 12, 2019, 12:46:06 PM

Title: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 12:46:06 PM
Когда я только начал, я вообще не понял - почему этого метода не имеется в наличии?
Как мне кажется его присутствие вполне закономерно, логично и интуитивно понятно. Почему я, чтобы написать обычный переключатель (включение/выключение чего-либо(скрипта)), должен лезть в дебри этого кликерманна, думать над многопоточностью и другой ерундистикой.

К слову о ерундистике, так как если и введут эту фичу, то довольно-таки нескоро, то уж извольте, пожалуйста, форумчане, помочь мне с возникшей трудностью.
Пишу я скрипт для пвп в игре майнкрафт))) В новой версии игры, максимальный урон оружие наносит, только после небольшого кулдауна - приблизительно 550мс. В идеале скрипт должен работать так: нажал я кнопку "V" на клавиатуре, скрипт включился, и если я зажимаю ЛКМ, то скрипт жмет на ЛКМ раз в 550мс, если отпускаю, то ничего не делает. Повторное нажатие "V" останавливает скрипт. Не знаю реализуема ли вообще фишка с тем, чтобы просто зажать кнопку мыши, но если нет,
то мне достаточно будет того, что если я нажму "V" скрипт прожимал ЛКМ раз в 550мс. Собственно, что я и пытался реализовать.

Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#V) = 1)
      WHILE(iskeydown(#V) = 1)
      END_CYC
     
      IF(iskeydown(#V) = 0)
         $a = 1
      END_IF
         // включение
      If(iskeydown(#V) = 1)
         $a = 0
         // выключение
      END_IF
   ELSE
     
   END_IF
END_THREAD

If($a = 1)
   lclick($_xmouse, $_ymouse)
   WAITMS(500)     
End_If

Когда запускаешь мою писанину, то кликерманн просто зависает. Скорее всего из-за While в начале, хотя фиг его знает. Этот While нужен был для того, чтобы тред не закончился сразу же как начался, ведь, когда выполняется проверка на нажатость кнопки, сразу за ней идет еще одна проверка зажатости этой кнопки. Сейчас я проверил, и поставил вместо While KeyUp(#V), и все равно кликерманн завис намертво. Так что проблема, думаю, не в While.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 12:47:43 PM
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 01:42:22 PM
после нажатия клавиши V, ваш скрипт каждые полсекунды начинает кликать в место нахождения курсора и повторными нажатиями он не останавливается, только выключением программы.
Ничего он не кликает. Просто зависает программа. Закрывается только через диспетчер.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 01:51:43 PM
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.
Извините-конечно но в вашем сообщении сплошной сумбур.
 Может, Вы как-то коротко перефразируете свою задачу, без эмоций и вас можно будет понять?

Если вы про IsKeyPressed, то я хочу чтобы был такой метод, который выводил 1, в момент, когда клавиша была нажата(предварительно опущена, а после поднята), и выводил 0, во всех остальных случаях.
Если вы про мой скрипт, то я хочу, чтобы при нажатии кнопки запускался скрипт:
Code: (clickermann) [Select]
   lclick($_xmouse, $_ymouse)
   WAITMS(550)
При повтороном, скрипт выключался, и ждал, пока его снова вызовут.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 02:37:22 PM
Метод над чем? у нас даже пользовательских функций нет)
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 02:45:30 PM
подпрограмма, процедура, но точно не функция
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 03:13:17 PM
Функции можно использовать в условных операторах, в операторе присвоения и т.д. и т.п Если функция не может вернуть своё значение, то уже по определению не функция
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 05:24:23 PM
Там примеры сильно и слабо типизированных языков, функции которых могут быть типа Void. Еще я заметил пример на Visual Basic с оператором SUB, который является процедурой. Да и вообще, какой смысл в ссылках как контр аргументах? Нужно было читать до того как вступал в диспут.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 05:56:58 PM
Обычно ссылки дают в качестве сопровождения или подтверждения к высказанному мнению в одном сообщении.

Хоть я и не уповаю на авторитетные источники, вот тебе цитата с твоей ссылки.
Code: (clickermann) [Select]
Функции, которые возвращают пустое значение, часто называют процедурами.
Но как я сказал выше, там примеры типизированных языков, которые могут принимать разные типы возвращаемых значений. SUB  в кликере подобен Visual basic"y, но Visual basic имеет оператор Function, который возвращает значение через оператор Return. В принципе всё, Я тоже закончил.   :)
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 06:49:38 PM
Я и не подумал, что количество аргументов важнее содержания. :D
Прежде всего я хотел сказать, что использование глобальной переменной внутри SUB не сопоставимо оператору Return.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Космич on July 12, 2019, 07:31:48 PM
Как раз таки важно, в этом и есть различие функций и процедур, но как когда то сказал мой брат, чего не дано, значит того и не надо)
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 07:37:33 PM
Code: (clickermann) [Select]
// 12.07.2019
#name "управление"

THREAD(t,1)
   IF(iskeydown(#V) = 1)
      LOGWRITE ("нажато")
      WHILE(iskeydown(#V) = 1)
         WAITMS(10)
      END_CYC       
     
      If($a = 0)
         LOGWRITE ("запущено")
         $a = 1    // включение
      ELSE
         LOGWRITE ("отключено")
         $a = 0  // выключение
      END_IF
   END_IF
   WAITMS(10)
END_THREAD

If($a = 1)
   lclick($_xmouse, $_ymouse)
   WAITMS(500)
End_If

удачи в minecraft

Поправьте если не прав. Клавиша нажата и отпущена, идет проверка: если $а = 0, то $а = 1, но так как $а еще не было присвоено, то выполняется else - $a = 0. waitms(10)(кстати для чего он нужен здесь?), и первый цикл потока окончен, начинается новый: проверка на нажатие клавиши не проходит, ведь клавиша уже отпущена,(ведь в предыдущем ходе цикла while(iskeydown(#V) = 1), дожидался пока её отпустят) так как должен запуститься основной скрипт,
 
Code: (clickermann) [Select]
If($a = 1)
   lclick($_xmouse, $_ymouse)
   WAITMS(500)
End_If
если уже после первого нажатия он должен начаться, а $a все еще = 0. Наверное я что-то не так понимаю, распишите подробнее, потому что ваш код правда работает, но я не понимаю - как?
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: EGGGOOSE on July 12, 2019, 08:05:03 PM
Code: (clickermann) [Select]
// 12.07.2019
#name "управление"

THREAD(t,1)
   IF(iskeydown(#V) = 1)
      LOGWRITE ("нажато")
      WHILE(iskeydown(#V) = 1)
         WAITMS(10)
      END_CYC       
     
      If($a = 0)
         LOGWRITE ("запущено")
         $a = 1    // включение
      ELSE
         LOGWRITE ("отключено")
         $a = 0  // выключение
      END_IF
   END_IF
   WAITMS(10)
END_THREAD

If($a = 1)
   lclick($_xmouse, $_ymouse)
   WAITMS(500)
End_If

удачи в minecraft

Кстати, этот код, при выполнении нагружает процессор аж до 30%, тогда как этот:
Code: (clickermann) [Select]
THREAD(t,0)
   LCLICK($_xmouse, $_ymouse)
   WAITMS(500)
END_THREAD
 
IF(iskeydown(#V) = 1)
   WHILE(iskeydown(#V) = 1)
   END_CYC
   IF($t = 0)
      BEEP(2000,200) // звуковой сигнал
      $t = $t^1 // включение
      SETTHREAD (t, 1)
   ELSE
      BEEP(1000,200)
      $t = $t^1 // выключение
      SETTHREAD (t, 2)
   END_IF
END_IF
WAITMS(20)
всего на полтора процента! С чем это связано?
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Vint on July 13, 2019, 03:47:35 PM

Кстати, этот код, при выполнении нагружает процессор аж до 30%, тогда как этот:..
всего на полтора процента! С чем это связано?
В коде не должно быть пустых циклов или пустых потоков. На пустом нагрузка поднимается до 25-30%.
Самый первый твой код содержит пустой while с ожиданием отпускания кнопки. Там нужно вставить минимальную задержку.
В этом коде из вопроса, внешний поток (main) содержит условие и задержки только внутри. При a=0 внутрь условия не заходим и получается пустой цикл. Нужно добавить задержку или вне условия или блоком ELSE.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: dramster on July 17, 2019, 04:29:06 PM
Как много текста ...  ??? (я все прочитать не осилил, может что и пропустил) А в справку кликермана кто-нибудь глянул?

"Что такое процедуры вы уже знаете (см. Пример #1). Типичная процедура это lclick(x, y). Где lclick - это имя процедуры, а в скобках указаны ее параметры: x и y.
Функции, как и процедуры, так же имеют свои собственные имена и набор параметров. При этом, функция, по аналогии с переменной, возвращает свое значение в то место, где она была вызвана." И, как по мне, это самое главное отличие нашей продпрограммы SAB от функции.
Title: Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
Post by: Graubart on July 18, 2019, 01:45:31 PM
 Дискуссия явно зашла не в ту степь. Автор топика не смог внятно объяснить, что он хочет. А ведь рациональное зерно в его идее есть. Нужен аналог "Press any key". Я предлагаю Джонни в следующем релизе в функцию ISKEYDOWN внести маленькое изменение: ISKEYDOWN(0) возвращает 1 если в момент вызова функции зажата любая клавиша или кнопка мыши и 0 - если все отпущены.
 Конечно, "Press any key" легко осуществить через GETKEYSDOWN. Но скорость реагирования на порядок меньше. Массивы уступают по скорости прямым функциям. Пример:
Code: (clickermann) [Select]
  GETKEYSDOWN($presskey)
   WHILE($presskey=0)
  GETKEYSDOWN($presskey)
 ..... // исполняемый скрипт
  WAIT(.05)
   END_CYC