Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   кнопка на клавиатуре нажимает кнопку на сцене (http://www.flasher.ru/forum/showthread.php?t=133296)

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 символа-кнопки:
Код AS1/AS2:

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

Цитата:

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

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

Цитата:

Сообщение от veles2008 (Сообщение 869608)
Когда нажимаем мышкой на кнопку срабатывает её внутренний "Down" . Это как то можно добавить?

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

veles2008 02.12.2009 00:07

ок. Спасибо

dimarik 02.12.2009 00:08

Код AS1/AS2:

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

Добавлено через 3 минуты
Цитата:

Сообщение от mooncar (Сообщение 869611)
1. Заменяете кнопку-Button на кнопку - MovieClip, в нем два кадра: обычное и нажатое состояние.

Внимательно читаем хелп по AS2, поискав по кючевым словам "_up", "_over" или "_down".
Даже я нашел "Creating movie clips with button states".

veles2008 02.12.2009 00:21

А можно
Код AS1/AS2:

var keyListener_obj:Object = new Object();

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

mooncar 02.12.2009 00:24

Цитата:

Сообщение от veles2008 (Сообщение 869617)
А можно
Код AS1/AS2:

var keyListener_obj:Object = new Object();

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

Вопрос не понятен.

mooncar 02.12.2009 00:37

Вложений: 1
См. пример (тестируйте исходник в среде разработки, там trace есть)
Код AS1/AS2:

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
Вот мой код и исходник.
Если нажимать мышкой то увеличение координат и текст увеличивается на 1. Если клавиатурой то в прогрессии
Код AS1/AS2:

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

Без слушателя никуда! Но, вот лишний объект убрать можно - мувиклип слушает клаву и мышь изначально, как объект предопределенного класса.
Код AS1/AS2:

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" итд


Часовой пояс GMT +4, время: 21:05.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.