Author Topic: Повторное нажатие клавиши  (Read 8091 times)

0 Members and 4 Guests are viewing this topic.

opalsmoke

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Повторное нажатие клавиши
« on: November 29, 2015, 09:16:30 PM »
Пишу скрипт для игры. Мне нужно при нажатии на кнопку F6 один раз запустить цикл, при повторном отменить(завершить) цикл.
Code: (Clickermann) [Select]
$a=0

if ((iskeydown(#F6)=1))
if ($a=1)
$a=0
else
$a=1
END_IF
END_IF
// --------------------
WHILE($a=1)
KEYDOWN(#space)
WAITMS(160)
KEYUP(#space)
WAITMS(160)
KEYDOWN(#enter)
WAITMS(160)
KEYUP(#enter)
WAITMS(160)
END_CYC
// --------------------

В других языках программирования я бы просто написал что-то типа
Code: (Clickermann) [Select]
$a = 0
if ((iskeydown(#F6)=1))
$a=!$a
и этого было бы достаточно, чтоб при повторном нажатии на кнопку значение переменной $a возвращало 0.

Помогите!

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Повторное нажатие клавиши
« Reply #1 on: November 29, 2015, 09:40:00 PM »
Только держать F6 придется до момента пока выполнение дойдет до IF(iskeydown(#F6)=1)

Code: (clickermann) [Select]
IF(iskeydown(#F6)=1)
   IF($a = 0)
      $a = $a^1
      // включение
   ELSE
      $a = $a^1
      // выключение
   END_IF
END_IF

// --------------------
IF($a=1)
   KEYDOWN(#space)
   WAITMS(160)
   KEYUP(#space)
   WAITMS(160)
   KEYDOWN(#enter)
   WAITMS(160)
   KEYUP(#enter)
   WAITMS(160)
ELSE
   WAITMS(20)
END_IF

// --------------------

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Повторное нажатие клавиши
« Reply #2 on: November 29, 2015, 09:45:57 PM »
или так
Code: (clickermann) [Select]

$hint = 1 // настройки; выводить сообщения в лог

IF(iskeydown(#F6)=1)
   BEEP(800,200)
   WHILE(iskeydown(#F6)=1)
      WAITMS(100)
   END_CYC
   IF($_stop = 0)
      IF($hint = 1)
         HINTPOPUP(" ","запустить цикл")
      END_IF
      logwrite("запустить цикл")
      INC($_stop,1)
   ELSE
      IF($hint = 1)
         HINTPOPUP(" ","отменить")
      END_IF
      logwrite("отменить")
      INC($_stop,-1)
   END_IF
END_IF

WHILE($_stop=1)
   KEYDOWN(#space)
   WAITMS(160)
   KEYUP(#space)
   WAITMS(160)
   KEYDOWN(#enter)
   WAITMS(160)
   KEYUP(#enter)
   WAITMS(160)
END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Повторное нажатие клавиши
« Reply #3 on: November 29, 2015, 09:46:27 PM »
Можно засунуть анализ "зажатости" F6 в поток, тогда проблем не будет.
Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#F6)=1)
      IF($a = 0)
         $a = $a^1
         HINTPOPUP("Старт")
         // включение
      ELSE
         $a = $a^1
         HINTPOPUP("Стоп")
         // выключение
      END_IF
      WAITMS(20)
   ELSE
      WAITMS(20)
   END_IF
END_THREAD

// --------------------
IF($a=1)
   KEYDOWN(#space)
   WAITMS(160)
   KEYUP(#space)
   WAITMS(160)
   KEYDOWN(#enter)
   WAITMS(160)
   KEYUP(#enter)
   WAITMS(160)
ELSE
   WAITMS(20)
END_IF
// --------------------

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Повторное нажатие клавиши
« Reply #4 on: November 29, 2015, 09:48:42 PM »
или так

Как по твоему выполнение выйдет из цикла WHILE($_stop=1)?  ::)

opalsmoke

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Повторное нажатие клавиши
« Reply #5 on: November 29, 2015, 10:08:19 PM »
Можно засунуть анализ "зажатости" F6 в поток, тогда проблем не будет.
Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#F6)=1)
      IF($a = 0)
         $a = $a^1
         HINTPOPUP("Старт")
         // включение
      ELSE
         $a = $a^1
         HINTPOPUP("Стоп")
         // выключение
      END_IF
      WAITMS(20)
   ELSE
      WAITMS(20)
   END_IF
END_THREAD

// --------------------
IF($a=1)
   KEYDOWN(#space)
   WAITMS(160)
   KEYUP(#space)
   WAITMS(160)
   KEYDOWN(#enter)
   WAITMS(160)
   KEYUP(#enter)
   WAITMS(160)
ELSE
   WAITMS(20)
END_IF
// --------------------
Благодарю Вас! Очень красивый и чистый код у Вас получился! Все работает прекрасно!
P.S Сегодня впервые узнал о подобной программе как Clickermann и в голове уже столько идей для ее применения появилось! Потрясающая программа!

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Повторное нажатие клавиши
« Reply #6 on: November 29, 2015, 10:10:53 PM »
или так

Как по твоему выполнение выйдет из цикла WHILE($_stop=1)?  ::)

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

opalsmoke

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Повторное нажатие клавиши
« Reply #7 on: November 29, 2015, 10:26:30 PM »
Так так, поторопился ребята. Код постоянно проскакивает. Приходится по нескольку раз нажимать чтобы включить или выключить его снова. Сейчас пытаюсь разобраться в чем же дело...

opalsmoke

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Повторное нажатие клавиши
« Reply #8 on: November 29, 2015, 10:32:24 PM »
Все подправил! :) Нужно было просто ввести дополнительно строчку
Code: (Clickermann) [Select]
KEYUP(#F6)Что бы отпустить клавишу)

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Повторное нажатие клавиши
« Reply #9 on: November 29, 2015, 10:37:53 PM »
просто нужно объяснить кликеру, чтоб дождался когда  барин соизволют  клавишу отпустить, а не насиловать его сигналами об отпускании физически нажатой клавиши.
WHILE(iskeydown(#F6)=1)
     WAITMS(100)
  END_CYC

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Повторное нажатие клавиши
« Reply #10 on: November 30, 2015, 06:30:34 AM »
Да, тут такая маленькая задержка что пока ты жмешь F6 переключатель успевает несколько раз включить и выключить.

Code: (clickermann) [Select]
THREAD(t)
   IF(iskeydown(#F6)=1)
      WHILE(iskeydown(#F6)=1) // цикл сдержит выполнение пока клавиша не будет отпущена
      END_CYC
      IF($a = 0)
         $a = $a^1
         HINTPOPUP("Старт")
         // включение
      ELSE
         $a = $a^1
         HINTPOPUP("Стоп")
         // выключение
      END_IF
   ELSE
      WAITMS(20)
   END_IF
END_THREAD

// --------------------
IF($a=1)
   KEYDOWN(#space)
   WAITMS(160)
   KEYUP(#space)
   WAITMS(160)
   KEYDOWN(#enter)
   WAITMS(160)
   KEYUP(#enter)
   WAITMS(160)
ELSE
   WAITMS(20)
END_IF
// --------------------