Author Topic: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()  (Read 11356 times)

0 Members and 1 Guest are viewing this topic.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Когда я только начал, я вообще не понял - почему этого метода не имеется в наличии?
Как мне кажется его присутствие вполне закономерно, логично и интуитивно понятно. Почему я, чтобы написать обычный переключатель (включение/выключение чего-либо(скрипта)), должен лезть в дебри этого кликерманна, думать над многопоточностью и другой ерундистикой.

К слову о ерундистике, так как если и введут эту фичу, то довольно-таки нескоро, то уж извольте, пожалуйста, форумчане, помочь мне с возникшей трудностью.
Пишу я скрипт для пвп в игре майнкрафт))) В новой версии игры, максимальный урон оружие наносит, только после небольшого кулдауна - приблизительно 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.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
после нажатия клавиши V, ваш скрипт каждые полсекунды начинает кликать в место нахождения курсора и повторными нажатиями он не останавливается, только выключением программы.
Ничего он не кликает. Просто зависает программа. Закрывается только через диспетчер.

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.
Извините-конечно но в вашем сообщении сплошной сумбур.
 Может, Вы как-то коротко перефразируете свою задачу, без эмоций и вас можно будет понять?

Если вы про IsKeyPressed, то я хочу чтобы был такой метод, который выводил 1, в момент, когда клавиша была нажата(предварительно опущена, а после поднята), и выводил 0, во всех остальных случаях.
Если вы про мой скрипт, то я хочу, чтобы при нажатии кнопки запускался скрипт:
Code: (clickermann) [Select]
   lclick($_xmouse, $_ymouse)
   WAITMS(550)
При повтороном, скрипт выключался, и ждал, пока его снова вызовут.

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Метод над чем? у нас даже пользовательских функций нет)
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
подпрограмма, процедура, но точно не функция
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Функции можно использовать в условных операторах, в операторе присвоения и т.д. и т.п Если функция не может вернуть своё значение, то уже по определению не функция
« Last Edit: July 12, 2019, 03:14:56 PM by Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Там примеры сильно и слабо типизированных языков, функции которых могут быть типа Void. Еще я заметил пример на Visual Basic с оператором SUB, который является процедурой. Да и вообще, какой смысл в ссылках как контр аргументах? Нужно было читать до того как вступал в диспут.
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Обычно ссылки дают в качестве сопровождения или подтверждения к высказанному мнению в одном сообщении.

Хоть я и не уповаю на авторитетные источники, вот тебе цитата с твоей ссылки.
Code: (clickermann) [Select]
Функции, которые возвращают пустое значение, часто называют процедурами.
Но как я сказал выше, там примеры типизированных языков, которые могут принимать разные типы возвращаемых значений. SUB  в кликере подобен Visual basic"y, но Visual basic имеет оператор Function, который возвращает значение через оператор Return. В принципе всё, Я тоже закончил.   :)
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Я и не подумал, что количество аргументов важнее содержания. :D
Прежде всего я хотел сказать, что использование глобальной переменной внутри SUB не сопоставимо оператору Return.
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Posts: 265
    • View Profile
Как раз таки важно, в этом и есть различие функций и процедур, но как когда то сказал мой брат, чего не дано, значит того и не надо)
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
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. Наверное я что-то не так понимаю, распишите подробнее, потому что ваш код правда работает, но я не понимаю - как?
« Last Edit: July 12, 2019, 07:45:25 PM by EGGGOOSE »

EGGGOOSE

  • Зашел в гости
  • *
  • Posts: 9
  • Глупец
    • View Profile
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)
всего на полтора процента! С чем это связано?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile

Кстати, этот код, при выполнении нагружает процессор аж до 30%, тогда как этот:..
всего на полтора процента! С чем это связано?
В коде не должно быть пустых циклов или пустых потоков. На пустом нагрузка поднимается до 25-30%.
Самый первый твой код содержит пустой while с ожиданием отпускания кнопки. Там нужно вставить минимальную задержку.
В этом коде из вопроса, внешний поток (main) содержит условие и задержки только внутри. При a=0 внутрь условия не заходим и получается пустой цикл. Нужно добавить задержку или вне условия или блоком ELSE.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Как много текста ...  ??? (я все прочитать не осилил, может что и пропустил) А в справку кликермана кто-нибудь глянул?

"Что такое процедуры вы уже знаете (см. Пример #1). Типичная процедура это lclick(x, y). Где lclick - это имя процедуры, а в скобках указаны ее параметры: x и y.
Функции, как и процедуры, так же имеют свои собственные имена и набор параметров. При этом, функция, по аналогии с переменной, возвращает свое значение в то место, где она была вызвана." И, как по мне, это самое главное отличие нашей продпрограммы SAB от функции.