Автор Тема: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()  (Прочитано 1486 раз)

0 Пользователей и 1 Гость просматривают эту тему.

EGGGOOSE

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

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

Код: Clickermann
  1. THREAD(t)
  2.   IF(iskeydown(#V) = 1)
  3.      WHILE(iskeydown(#V) = 1)
  4.      END_CYC
  5.  
  6.      IF(iskeydown(#V) = 0)
  7.         $a = 1
  8.      END_IF
  9.         // включение
  10.      If(iskeydown(#V) = 1)
  11.         $a = 0
  12.         // выключение
  13.      END_IF
  14.   ELSE
  15.  
  16.   END_IF
  17. END_THREAD
  18.  
  19. If($a = 1)
  20.   lclick($_xmouse, $_ymouse)
  21.   WAITMS(500)      
  22. End_If
  23.  

Когда запускаешь мою писанину, то кликерманн просто зависает. Скорее всего из-за While в начале, хотя фиг его знает. Этот While нужен был для того, чтобы тред не закончился сразу же как начался, ведь, когда выполняется проверка на нажатость кнопки, сразу за ней идет еще одна проверка зажатости этой кнопки. Сейчас я проверил, и поставил вместо While KeyUp(#V), и все равно кликерманн завис намертво. Так что проблема, думаю, не в While.

EGGGOOSE

  • Зашел в гости
  • *
  • Сообщений: 9
  • Глупец
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #1 : Июль 12, 2019, 12:47:43 pm »
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.

EGGGOOSE

  • Зашел в гости
  • *
  • Сообщений: 9
  • Глупец
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #2 : Июль 12, 2019, 01:42:22 pm »
после нажатия клавиши V, ваш скрипт каждые полсекунды начинает кликать в место нахождения курсора и повторными нажатиями он не останавливается, только выключением программы.
Ничего он не кликает. Просто зависает программа. Закрывается только через диспетчер.

EGGGOOSE

  • Зашел в гости
  • *
  • Сообщений: 9
  • Глупец
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #3 : Июль 12, 2019, 01:51:43 pm »
Если кто-нибудь мне пояснит, как можно реализовать этот переключатель, то думаю, что надобность в KeyPressed() отпадает.
Извините-конечно но в вашем сообщении сплошной сумбур.
 Может, Вы как-то коротко перефразируете свою задачу, без эмоций и вас можно будет понять?

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

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #4 : Июль 12, 2019, 02:37:22 pm »
Метод над чем? у нас даже пользовательских функций нет)
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #5 : Июль 12, 2019, 02:45:30 pm »
подпрограмма, процедура, но точно не функция
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #6 : Июль 12, 2019, 03:13:17 pm »
Функции можно использовать в условных операторах, в операторе присвоения и т.д. и т.п Если функция не может вернуть своё значение, то уже по определению не функция
« Последнее редактирование: Июль 12, 2019, 03:14:56 pm от Космич »
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #7 : Июль 12, 2019, 05:24:23 pm »
Там примеры сильно и слабо типизированных языков, функции которых могут быть типа Void. Еще я заметил пример на Visual Basic с оператором SUB, который является процедурой. Да и вообще, какой смысл в ссылках как контр аргументах? Нужно было читать до того как вступал в диспут.
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #8 : Июль 12, 2019, 05:56:58 pm »
Обычно ссылки дают в качестве сопровождения или подтверждения к высказанному мнению в одном сообщении.

Хоть я и не уповаю на авторитетные источники, вот тебе цитата с твоей ссылки.
Код: Clickermann
  1. Функции, которые возвращают пустое значение, часто называют процедурами.

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

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #9 : Июль 12, 2019, 06:49:38 pm »
Я и не подумал, что количество аргументов важнее содержания. :D
Прежде всего я хотел сказать, что использование глобальной переменной внутри SUB не сопоставимо оператору Return.
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

Космич

  • Активный участник
  • ***
  • Сообщений: 247
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #10 : Июль 12, 2019, 07:31:48 pm »
Как раз таки важно, в этом и есть различие функций и процедур, но как когда то сказал мой брат, чего не дано, значит того и не надо)
«Иногда ты ваяешь до тех пор, пока до тебя не дойдёт, что именно ты делаешь.»

EGGGOOSE

  • Зашел в гости
  • *
  • Сообщений: 9
  • Глупец
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #11 : Июль 12, 2019, 07:37:33 pm »
Код: Clickermann
  1. // 12.07.2019
  2. #name "управление"
  3.  
  4. THREAD(t,1)
  5.   IF(iskeydown(#V) = 1)
  6.      LOGWRITE ("нажато")
  7.      WHILE(iskeydown(#V) = 1)
  8.         WAITMS(10)
  9.      END_CYC        
  10.  
  11.      If($a = 0)
  12.         LOGWRITE ("запущено")
  13.         $a = 1    // включение
  14.      ELSE
  15.         LOGWRITE ("отключено")
  16.         $a = 0  // выключение
  17.      END_IF
  18.   END_IF
  19.   WAITMS(10)
  20. END_THREAD
  21.  
  22. If($a = 1)
  23.   lclick($_xmouse, $_ymouse)
  24.   WAITMS(500)
  25. End_If
  26.  
  27.  
удачи в minecraft

Поправьте если не прав. Клавиша нажата и отпущена, идет проверка: если $а = 0, то $а = 1, но так как $а еще не было присвоено, то выполняется else - $a = 0. waitms(10)(кстати для чего он нужен здесь?), и первый цикл потока окончен, начинается новый: проверка на нажатие клавиши не проходит, ведь клавиша уже отпущена,(ведь в предыдущем ходе цикла while(iskeydown(#V) = 1), дожидался пока её отпустят) так как должен запуститься основной скрипт,
 
Код: Clickermann
  1. If($a = 1)
  2.   lclick($_xmouse, $_ymouse)
  3.   WAITMS(500)
  4. End_If
  5.  
если уже после первого нажатия он должен начаться, а $a все еще = 0. Наверное я что-то не так понимаю, распишите подробнее, потому что ваш код правда работает, но я не понимаю - как?
« Последнее редактирование: Июль 12, 2019, 07:45:25 pm от EGGGOOSE »

EGGGOOSE

  • Зашел в гости
  • *
  • Сообщений: 9
  • Глупец
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #12 : Июль 12, 2019, 08:05:03 pm »
Код: Clickermann
  1. // 12.07.2019
  2. #name "управление"
  3.  
  4. THREAD(t,1)
  5.   IF(iskeydown(#V) = 1)
  6.      LOGWRITE ("нажато")
  7.      WHILE(iskeydown(#V) = 1)
  8.         WAITMS(10)
  9.      END_CYC        
  10.  
  11.      If($a = 0)
  12.         LOGWRITE ("запущено")
  13.         $a = 1    // включение
  14.      ELSE
  15.         LOGWRITE ("отключено")
  16.         $a = 0  // выключение
  17.      END_IF
  18.   END_IF
  19.   WAITMS(10)
  20. END_THREAD
  21.  
  22. If($a = 1)
  23.   lclick($_xmouse, $_ymouse)
  24.   WAITMS(500)
  25. End_If
  26.  
  27.  
удачи в minecraft

Кстати, этот код, при выполнении нагружает процессор аж до 30%, тогда как этот:
Код: Clickermann
  1. THREAD(t,0)
  2.   LCLICK($_xmouse, $_ymouse)
  3.   WAITMS(500)
  4. END_THREAD
  5.  
  6. IF(iskeydown(#V) = 1)
  7.   WHILE(iskeydown(#V) = 1)
  8.   END_CYC
  9.   IF($t = 0)
  10.      BEEP(2000,200) // звуковой сигнал
  11.      $t = $t^1 // включение
  12.      SETTHREAD (t, 1)
  13.   ELSE
  14.      BEEP(1000,200)
  15.      $t = $t^1 // выключение
  16.      SETTHREAD (t, 2)
  17.   END_IF
  18. END_IF
  19. WAITMS(20)
  20.  
всего на полтора процента! С чем это связано?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Сообщений: 3421
  • Лечу куда хочу. cman 4.13.014x32, W10, W7
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #13 : Июль 13, 2019, 03:47:35 pm »

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


dramster

  • Герой форума
  • *****
  • Сообщений: 1027
    • Просмотр профиля
Re: Добавьте метод аналогичный IsKeyDown(): IsKeyPressed()
« Ответ #14 : Июль 17, 2019, 04:29:06 pm »
Как много текста ...  ??? (я все прочитать не осилил, может что и пропустил) А в справку кликермана кто-нибудь глянул?

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