Просмотр полной версии : не понимаю смысл keyDown и keyUp
люди ни фига не получается
хочу чтобы при нажатии на пробел отрабатывалось действие (tween начиная с определенного фрейма мувика)
а при отпускании действие останавливалось на 1 фрейме
причем, все бы хорошо, только вот если удерживать клавишу пробела, действие зацикливается (рука останавливается на высшей точке (на последнем фрейме), а надо чтоб опустилась в исходное положение
onClipEvent(keyDown){
if (Key.isDown(Key.SPACE)){
gotoAndPlay(2);
}
else {
gotoAndStop(1);
}
}
это неправильный код
перепробовала разные варианты
и Key.isDown(Key.SPACE), и Key.getCode()==Key.SPACE
не помогает
Я же вроде писал уже?
onClipEvent(keyDown){
if (Key.isDown(Key.SPACE)){
if(!_root.spacepressed) gotoAndPlay(2);
_root.spacepressed = true;
}
else {
_root.spacepressed = false;
gotoAndStop(1);
}
}
onClipEvent(keyUp){
if (!Key.isDown(Key.SPACE)){
_root.spacepressed = false;
}
}
можно и без флага
onClipEvent(keyDown){
if (Key.getCode()==Key.SPACE){gotoAndPlay(2);}
}
onClipEvent(keyUp){
if (Key.getCode()==Key.SPACE){gotoAndStop(1);}
}
был не прав : без флага не обойтись
А мне вот больше нравится так:function myOnKeyDown() {
if (Key.isDown(Key.SPACE))
gotoAndStop (2)
else gotoAndStop (1);
}
var myListener = {};
myListener.onKeyDown = myOnKeyDown;
Key.addListener( myListener );
ну тогда уж ;)
Key.addListener( k={p:false} );
k.onKeyDown = function() {
if (Key.getCode(Key.SPACE)&&!this.p) {
Key.broadcastMessage("onSpacePressed");
this.p=true;
}
}
this.onKeyUp = function() {
if (Key.getCode(Key.SPACE)){
Key.broadcastMessage("onSpaceReleased");
this.p=false;
}
}
Key.addListener(this);
this.onSpacePressed=function(){this.gotoAndPlay(2);}
this.onSpaceReleased=function(){this.gotoAndStop(1);}
зы: тока надо ли..
Оригинал написал(а) silin
ну тогда уж ;)
....
зы: тока надо ли..
Прости silin, я и вправду не понял, что ты имеешь в виду. Если уж на то пошло, то использование Listener class - гораздо ближе к стандартам ООП, нежели использование несвязанного обработчика событий. И тем более применения флагов... Ещё дедушка Кнут нас учил, что лишняя переменная - всегда зло, а все события должны инкапсулироваться... Объясни что ты имел в виду, если не сложно...
я отнюдь не против Listener'ов (к слову сказать onClipEvent(keyDown) разве не тоже самое)
но тут дело в том, что надо 'чтобы при нажатии на пробел отрабатывалось действие (tween начиная с определенного фрейма мувика) а при отпускании действие останавливалось на 1 фрейме'
при долгом нажатии на клавишу onKeyDown отработает несколько раз :и как ты это без флага обойдешь?
зы:мой код здесь ни причем (хотя может пригодится если на этот пробел должны будут реагировать много объектов)
это я ,собственно, выпендрился так
Для начала - покаюсь. Невнимательно прочитал первый пост. Вот исправленный код.
flag = false;
function myOnKeyDown() {
if (Key.isDown(Key.SPACE)) {
if (!flag) {
trace(2);
flag = !flag;}
} else {
trace(1);
}
}
function myOnKeyUp(){
flag = !flag;
}
var myListener = {};
myListener.onKeyDown = myOnKeyDown;
myListener.onKeyUp = myOnKeyUp;
Key.addListener(myListener);
к слову сказать onClipEvent(keyDown) разве не тоже самое Нет, не тоже, ибе обработчик событий onClipEvent может быть привязан только к мувиклипу. А точнее приаатачен к нему. Такой подход затрудняет навигацию по коду и мешает при разработке больших проектов.
Про "Key.broadcastMessage" я так и подумал, что ты подразумеваешь передачу сообщений нескольким объектам.
ЗЫ надеюсь, без обид
'обработчик событий onClipEvent может быть привязан только к мувиклипу'
а что мувик нельзя заставить слушать Key (он, что уже не объект)?
логика здесь такая:
раз ты к коду с onClipEvent(keyDown) (пример Елё) хочешь добавить еще один (лишний?) объект, слушающий Key(что-там говорил дедушка Кнут ?),
то пусть он походу хотя бы вещает об этом событии, ну и имеющий уши (т.е. подписаный на Key) да услышит..
тогда его существование будет оправдано, а иначе тоже самое может делать и сам мувик..
Дедушка Кнут в третьем томе очень много и пространно говорил о разделении интерфейса и реализации. К сожалению, когда мы привязываем какой-бы то ни было код к мувиклипу, о разделении реализации и интерфейса - и речи быть не может. Это раз. Еще болше и пространнее дедушка Дональд Кнут говорил об инкапсуляции событий. Я не спорю, когда ты помещаешь код внутрь мувиклипа, ты его инкапсулируешь, но в этом случае ты привязываешь код к конкретному ЭКЗЕМПЛЯРУ класса а не к классу в целом. Какая-то кривоватенькая инкапсуляция получается, не находишь? И третье, что нам говорил дедушка Кнут - об экономии ячеек памяти. Но и тут выясняется, что обработчик событий onClipEvent привязан прототипированием к классу MovieClip, а значит, он создаёт внутри этого класса статический неименованный объект (аналог Listener). И получается, что для каждого экземпляра MovieClip при введении обработчика onClipEvent создаётся статический объект внутри класса. И где же тут экономия? В случае с Listener все события валятся на один объект, являющийся экземляром класса Listener, а следовательно в любой момент могут быть удалены сборщиком мусора без особых потерь в производительности (простой финализацией экземпляра Listener). В случае же с onClipEvent сборщику мусора приходится чистить статические объекты внутри класса, а если учесть, что в Java, например, это возможно только при явной финализации класса в целом, то во флэше - это не происходит никогда - ибо для этого придётся финализировать класс MovieClip, а это, как вы понимаете, невозможно. (Чёрт возьми, как всё таки механизмы работы виртуальной машины во Flash Player 7 и в SunJVM похожи - до безобразия).
Вот так. Коротенько. Минут на сорок... ;)
да кто же против, удобнее хранить обработчик в отдельном объекте (к слову сказать, что и в этом случае ' ты привязываешь код к конкретному ЭКЗЕМПЛЯРУ класса а не к классу в целом') и пожалуста
я-то имел ввиду Key.addListener(сам мувик) ну и соответсвенно Key.removeListener(),если уж пойдет борьба за экономию
хотя, согласен, что с объектом работать удобнее
Оригинал написал(а) silin
(к слову сказать, что и в этом случае ' ты привязываешь код к конкретному ЭКЗЕМПЛЯРУ класса а не к классу в целом')
э, не-е-ет. В этом случае я привязываю один ОБЪЕКТ (экземпляр Listener) к другому (экземпляр Object), а никак не КОД (который объектом не является) к экземпляру MovieClip, который в условиях среды разработки является библиотечным символом, а никак не экземпляром класса.
спасибо, уже получается с вашим кодом
можно объяснить что это: _root.spacepressed
я просто вставила код на мувике и вроде как получилось
но никаких флагов нигде не ставлю, ни в самом муве, ни на руте, а все равно рука работает как надо, то есть не поднимается при долгом нажатии на пробел
странное поведение, вообще spacepressed это пользовательское, или зарезервированное (хотя оно не подсвечивается синим в окне программы)
в любом случае спасибо
но это не все, если все время жать быстро быстро на пробел, отпуская и нажимая, то рука дергается (в муве tween на 5 фреймов, соответственно зацикливается)
что можно сделать?
перед gotoAndPlay(2); проверь на каком фрейме находится твой мувик
если он в процессе проигрывания "руки" то gotoAndPlay не вызывай
spacepressed можешь заменить на что угодно
(только все spacepressed на один и тот же кейворд ;-) )
это просто флаг, который после нажатия на клавишу сигнализирует о том что клавиша в нажатом положении (мы сами выставляем там true, посмотри первый if.
Как только пользователь отпускает клавишу мы ставим в нем false - и при мледующем нажатии один раз вызовется "рука"
не уверен что стало понятнее правда....
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.