Помощь · Поиск · Пользователи · Календарь
Полная версия этой страницы: Повтор действий при нажатии на клавишу
Flash Zone Forum > Macromedia Flash > Общие вопросы
HaWK
Когда пишешь:
Код
if(Key.isDown(39)) {
   ......
}


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

PS
on(keyPress) - тоже самое, просто с задержкой.
Kuroi
Меня тоже волнует эта проблема. Пока разумного решения не нашел.
Как вариант можно попробовать сделать проверку на частоту нажатий: Если эта же кнопка была уже нажата секунду назад, то действия выполняться не будут.
Но может есть другой способ, более чистый.
HaWK
Цитата
Как вариант можно попробовать сделать проверку на частоту нажатий: Если эта же кнопка была уже нажата секунду назад, то действия выполняться не будут.

Ну и как это реализовать?
chingachgoog
Цитата(HaWK @ 7.12.2009 - 14:24) *
Ну и как это реализовать?


Флаг вам в руки
MustLive
chingachgoog

Веди себе прилично smile.gif.

Или отвечай по теме, или просто её проигнорируй. А на флаги, как и на транспаранты, ссылаться не нужно - они не помогут участникам форума wink.gif. Им нужен дружеский совет.

Цитата
Повтор действий при нажатии на клавишу, Как избавится от этой проблемы?

Ребята там всё реально wink.gif.

Подход в AS тот же, что и в других языках программирования (и без вышеупомянутой проверки частоты нажатий - здесь возможен другой вариант).
HaWK
Цитата
chingachgoog

Веди себе прилично smile.gif.

Он этого не умеет.

Цитата
Им нужен дружеский совет.
Ребята там всё реально wink.gif.

Так может ктонить уже намекнёт как это сделать?

chingachgoog
Про флаг я не зря сказал. Третье значение внизу, кто не понял.
Kuroi
Цитата(MustLive @ 8.12.2009 - 01:31) *
chingachgoog

Ребята там всё реально wink.gif.

Подход в AS тот же, что и в других языках программирования (и без вышеупомянутой проверки частоты нажатий - здесь возможен другой вариант).


MustLive. Напиши, пожалуйста, программный код.
HaWK
Цитата
Про флаг я не зря сказал. Третье значение внизу, кто не понял.

chingachgoog, я знаю как с помощью булиана, отстановить что-то. Но вот с повтором дейтвий у меня не как не получается, может поможешь уже?
У меня появился ещё вопрос: как запретить выполнение функции?
MustLive
Цитата
Так может ктонить уже намекнёт как это сделать?

HaWK

Тебе уже chingachgoog намекнул - что с помощью флага. А я тебе уже намекнул, что это делается в AS точно также, как и в других языках программирования.

Цитата
Про флаг я не зря сказал.

chingachgoog

В том то и дело, что у нас на форуме участники часто намёков не понимают, и им стоит сказать прямо. Например, можно сказать, что в данном случае нужно использовать условный оператор - if который, если кто забыл или не знал smile.gif. Данная формулировка более понятна, чем упоминание флага.

Естественно слова могут иметь разные значение, как в случае слова флаг. Но формулировка "нужно использовать условный оператор" более однозначна, чем "флаг вам в руки".

Цитата
Напиши, пожалуйста, программный код.

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

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

Цитата
Но вот с повтором дейтвий у меня не как не получается

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

Цитата
как запретить выполнение функции?

Точно также, с помощью флага, т.е. условного оператора.
MustLive
HaWK и Kuroi

Рассмотрим метод решения задачи блокировки повторов при нажатии клавиши. В качестве наглядного примера я использую мини-игру о прыгуне на батуте. Приведу два примера AS-кода: без блокировки нажатий и с блокировкой.

Прыгун с повтором при нажатии клавиш (что является нормальным для данной игры):
CODE
var v:Number = 0; // скорость
var g:Number = 1; // ускорение
this.createEmptyMovieClip("jumper",0);
jumper._x = 200;
jumper.lineStyle(1,0x000000);
jumper.moveTo(0,0);
jumper.lineTo(0,10);
jumper.lineTo(10,10);
jumper.lineTo(10,0);
jumper.lineTo(0,0);
this.createEmptyMovieClip("trampoline",1);
trampoline._x = 200;
trampoline._y = 300;
trampoline.lineStyle(1,0x000000);
trampoline.moveTo(0,0);
trampoline.lineTo(0,50);
trampoline.lineTo(50,50);
trampoline.lineTo(50,0);
trampoline.lineTo(0,0);
this.onEnterFrame = function() {
jumper._y += v;
v += g;
if (jumper.hitTest(trampoline)) {
v = -v+2*g;
if (v>0) {
v = 0;
}
}
}
var KbListener:Object = new Object();
KbListener.onKeyDown = function() {
switch (Key.getCode()) {
case 37:
jumper._x -= 2;
break;
case 39:
jumper._x += 2;
break;
}
}
Key.addListener(KbListener);

Прыгун с блокировкой повтора при нажатии клавиш (т.е. прыгун может лишь болтаться туда-сюда, он как бы привязан к центру батута):
CODE
var v:Number = 0; // скорость
var g:Number = 1; // ускорение
this.createEmptyMovieClip("jumper",0);
jumper._x = 220;
jumper.lineStyle(1,0x000000);
jumper.moveTo(0,0);
jumper.lineTo(0,10);
jumper.lineTo(10,10);
jumper.lineTo(10,0);
jumper.lineTo(0,0);
this.createEmptyMovieClip("trampoline",1);
trampoline._x = 200;
trampoline._y = 300;
trampoline.lineStyle(1,0x000000);
trampoline.moveTo(0,0);
trampoline.lineTo(0,50);
trampoline.lineTo(50,50);
trampoline.lineTo(50,0);
trampoline.lineTo(0,0);
this.onEnterFrame = function() {
jumper._y += v;
v += g;
if (jumper.hitTest(trampoline)) {
v = -v+2*g;
if (v>0) {
v = 0;
}
}
}
var kbleft = 0;
var kbright = 0;
var KbListener:Object = new Object();
KbListener.onKeyDown = function() {
switch (Key.getCode()) {
case 37:
if (kbleft == 0) {
jumper._x -= 5;
kbleft = 1;
kbright = 0;
}
break;
case 39:
if (kbright == 0) {
jumper._x += 5;
kbleft = 0;
kbright = 1;
}
break;
}
}
Key.addListener(KbListener);

Вот таким образом с помощью условного оператора реализуется блокировка нажатий клавиш.
HaWK
MustLive, спасибо, буду разбиратся. Когда разбирусь - скажу ещё раз спасибо  biggrin.gif
HaWK
MustLive, твой код эффективен, но не до конца. Потому что, при одном нажатии на клавишу повтор блокируется, но при повторном нажатии на клавишу
код уже не действует. Поэтому я его довёл до конца.
Добавка к твоему коду:
Код
KbListener.onKeyUp = function()  {
    switch (Key.getCode())  {
    case 37 :
        if (kbleft == 1)  {
            kbleft = 0;
            kbright = 0;
        }
        break;
    case 39 :
        if (kbright == 1)  {
            kbleft = 0;
            kbright = 0;
        }
        break;
    }
};


PS А как также поступить с функциями? Чтобы функция не повторялась много раз, а выполнилась один раз при нажатии на клавишу или при событии
MustLive
Цитата
Когда разбирусь - скажу ещё раз спасибо

HaWK

Всегда пожалуйста. Разбирайся, как с алгоритмом блокировки повторных нажатий, так и с использованием его в разных ситуациях. Что при обычной блокировки клавиш, что при блокировке функций подход один и тот же.

Цитата
А как также поступить с функциями?

С функциями точно такой же подход - используй переменные-флаги и условные операторы. Установи их или в теле функции, или в местах вызова функций (как тебе удобней), и проверяй условия.

Цитата
Чтобы функция не повторялась много раз, а выполнилась один раз при нажатии на клавишу или при событии

Если тебе нужно, чтобы вообще один раз выполнялась функция (за всё время работы флешки), используй соответствующий подход к блокировке. Если нужно, чтобы при каждом нажатии клавиши, или при наступлении события - то используй соответствующий алгоритм (т.е. при этом тебе нужно будет сделать, чтобы при каждом последующем нажатии или при каждом наступлении события код снова срабатывал).
HaWK
Попробую разместить в теле функции, спасибо за толчок.
MustLive
HaWK, всегда пожалуйста.

И ещё кое-что по этому поводу.

Цитата
MustLive, твой код эффективен, но не до конца. Потому что, при одном нажатии на клавишу повтор блокируется, но при повторном нажатии на клавишу код уже не действует.

Он срабатывает при каждом новом нажатии клавиши (после того, как была нажата другая клавиша). Что и нужно в данном примере с игрой о прыгуне на батуте - чтобы при поочерёдном нажатии клавиш "Влево" и "Вправо" прыгун болтался туда-сюда.

Т.к. ты в первом посте в этой теме писал, что тебе нужно заблокировать повтор нажатий клавиши, то это я и реализовал в алгоритме. И после того, как клавиша была отпущена (что реализовано проверкой нажатия другой клавиши), блокировка снимается и можно заново нажимать данную клавишу. Если тебе нужна полная блокировка нажатия клавиши - то так и нужно было написать (а не "блокировка повтора" - это разные вещи). И для полной блокировки алгоритм немного отличается (в нём нет кода снятия блокировки).

Цитата
Добавка к твоему коду:

В своей версии кода ты забыл указать смещение при нажатии клавиш "Влево" (jumper._x -= 5;) и "Вправо" (jumper._x += 5;). И не нужно указывать "kbleft = 0; kbright = 0;" при нажатии обеих кнопок, т.к. при нажатии любой из кнопок они обе сразу заблокируются. Нужно блокировать лишь ту кнопку, которая была нажата (т.е. указать "kbleft = 0;" для одной кнопки и "kbright = 0;" для другой кнопки).
Русская версия IP.Board © 2001-2014 IPS, Inc.