PDA

Просмотр полной версии : кнопка на клавиатуре нажимает кнопку на сцене


veles2008
01.12.2009, 22:52
Приветствую!

Помогите пожалуйста с проблемой.

На сцене есть кнопка и объект. При нажатии на эту кнопку мышкой кнопка меняет цвет (через внутренний "Down") и объект выполняет какие то действия.

Как сделать чтобы при нажатии кнопки на клавиатуре (например кнопку "UP") нажималась кнопка на сцене?

zurkis
01.12.2009, 23:06
через onKeyUp, в хелпе есть пример

veles2008
01.12.2009, 23:28
Такого примера я не вижу.

Ещё раз сокращённо:

Нужно чтобы кнопка на сцене нажималась и мышкой и кнопкой клавиатуры

mooncar
01.12.2009, 23:34
Естественно, всех выкрутасов хелп не может предусмотреть, да и не должен, комбинировать нужно, программировать.
Пишите одну функцию, которая должна что-то делать, и назначаете ее исполнение на onKeyDown клавиши и onPress символа-кнопки:
function doIt () {
//действие
}

btn.onPress = doIt; //кнопка сцены - прижата, но не отпущена

var keyListener_obj:Object = new Object();
keyListener_obj.onKeyDown = function() { //кнопка клавиатуры - - прижата, но не отпущена
if (Key.getCode() == Key.UP) { //ловит конкретно клавишу UP
doIt ();
}
};
Key.addListener(keyListener_obj);

veles2008
01.12.2009, 23:51
Большое спасибо.

А я там ещё спрашивал:
Когда нажимаем мышкой на кнопку срабатывает её внутренний "Down" . Это как то можно добавить?

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

mooncar
01.12.2009, 23:57
И ещё в данном коде нажимаю на кнопку клавиатуры и действие выполняется пока не отпущу. А можно как то так чтоб нажал на кнопку клавиатуры и действие выполнилось 1 раз и если держать действие не повторялось, а повторилось только при повторном нажатии?

Замените onKeyDown на onKeyUp, и вместо onPress поставьте onRelease - тогда на отпускание будет срабатывать и там и там.


Когда нажимаем мышкой на кнопку срабатывает её внутренний "Down" . Это как то можно добавить?
Надо поколдовать:
1. Заменяете кнопку-Button на кнопку - MovieClip, в нем два кадра: обычное и нажатое состояние. В каждом кадре (или только в первом) пропишите stop();
2. Вносите изменения в код, чтобы правильно анимировать кнопку через btn.gotoAndStop() на нужный кадр. Разберитесь там с событиями клавиатуры сами , поэкспериментируйте.

veles2008
02.12.2009, 00:07
ок. Спасибо

dimarik
02.12.2009, 00:08
if (Key.getCode() == Key.UP && flag) { //ловит конкретно клавишу UP
flag = false;
...
}

Добавлено через 3 минуты
1. Заменяете кнопку-Button на кнопку - MovieClip, в нем два кадра: обычное и нажатое состояние.
Внимательно читаем хелп по AS2, поискав по кючевым словам "_up", "_over" или "_down".
Даже я нашел "Creating movie clips with button states".

veles2008
02.12.2009, 00:21
А можно
var keyListener_obj:Object = new Object();

как то подругому, а то всё хорошо, а действия происходят в геометрической прогрессии?

mooncar
02.12.2009, 00:24
А можно
var keyListener_obj:Object = new Object();

как то подругому, а то всё хорошо, а действия происходят в геометрической прогрессии?
Вопрос не понятен.

mooncar
02.12.2009, 00:37
См. пример (тестируйте исходник в среде разработки, там trace есть)
function doIt () {
//действие
trace('нажато!');
this.gotoAndStop(1);
}

btn.onPress = function () { //нажатие кнопки сцены
this.gotoAndStop(2);
}

btn.onRelease = doIt; //отпускание кнопки сцены

var keyListener_obj:Object = new Object();

keyListener_obj.onKeyDown = function() {
if (Key.getCode() == Key.UP && !wasPressed) { //ловит нажатие UP
btn.gotoAndStop(2);
wasPressed = true ;
}
};
keyListener_obj.onKeyUp = function() {
if (Key.getCode() == Key.UP) { //ловит отпускание UP
doIt ();
btn.gotoAndStop(1);
wasPressed = false ;
}
};
Key.addListener(keyListener_obj);

veles2008
02.12.2009, 10:00
Вот мой код и исходник.
Если нажимать мышкой то увеличение координат и текст увеличивается на 1. Если клавиатурой то в прогрессии
speed=0;
hop=0;

onEnterFrame=function() {
drawing_mc.lineTo(bk._x, bk._y);
var keyListener_obj:Object = new Object();

keyListener_obj.onKeyDown = function() {
if (Key.getCode() == Key.UP && !wasPressed) { //ловит нажатие UP

wasPressed = true ;
}
};
keyListener_obj.onKeyUp = function() {
if (Key.getCode() == Key.UP) { //ловит отпускание UP
doit1 ();

wasPressed = false ;
}
};
Key.addListener(keyListener_obj);

vperod.onRelease = doit1;

function doit1 () {

txt.text +="Вперёд" + "\n";
speed =20;

hop = hop + 1;
korx=hop;
}

bk._x+=speed*(Math.round(Math.sin(0.0175 * bk._rotation))); //увеличиваем координаты по _х в соответствии с углом поворота и скоростью; 0.0175 - это Пи/180 (перевод из градусной меры в радианную)
bk._y+=speed*(Math.round(-Math.cos(0.0175 * bk._rotation))); //увеличиваем координаты по _y в соответствии с углом поворота и скоростью

speed*=0;



}

mooncar
02.12.2009, 13:42
Ну зачем вы все запихали в onEnterFrame, что за дикий код?
onEnterFrame выполняет все, что внутри нее с частотой, равной частоте кадров.
Разве есть необходимость с огромной скоростью непрерывно пересоздавать слушателей и переназначать функции onRelease, onKeyDown и onKeyUp, doit1?
Вытаскивайте все из onEnterFrame, оставляйте там только то, что реально нужно выполнять непрерывно, а все прочие функции выносите из нее.
Чего вы вообще пытаетесь добиться?

Chuck607
02.12.2009, 15:29
Объясните пожалуйста зачем нужен слушатель keyListener_obj? какова его функция ? Ведь без него тоже будет работать

Жень Шень
02.12.2009, 17:41
Без слушателя никуда! Но, вот лишний объект убрать можно - мувиклип слушает клаву и мышь изначально, как объект предопределенного класса.
function doIt() {
trace('нажато!');
this.gotoAndStop(1);
}
btn.onPress = function() {
this.gotoAndStop(2);
};
btn.onRelease = doIt;
btn.onKeyDown = function() {
if (Key.getCode() == Key.UP && !wasPressed) {
btn.gotoAndStop(2);
wasPressed = true;
}
};
btn.onKeyUp = function() {
if (Key.getCode() == Key.UP) {
doIt();
btn.gotoAndStop(1);
wasPressed = false;
}
};
Key.addListener(btn);

veles2008
02.12.2009, 22:32
спасибо mooncar!

mooncar
02.12.2009, 23:52
Получилось? Пожалуйста...

veles2008
03.12.2009, 00:02
Получилось. Но на втором кадре нажатие клавиш сохраняется.

А за решение чтоб не сохранялись спасибо Жень Шень!

odlf3
06.08.2010, 20:33
А как если действие при нажатии кнопки "1" или "2", "3" итд