Форум 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)
-   -   DoubleClick-extended. Не пинайте. (http://www.flasher.ru/forum/showthread.php?t=68876)

Leezard 07.09.2005 16:19

DoubleClick-extended. Не пинайте.
 
С даблкликом все понятно, но вот беда, необходимо чтобы одиночный клик и даблклик отрабатывались независимо.
То есть:
одиночный клик - действие номер один;
даблклик - действие номер два;

Сделал так, на объекте висит сдедующее:

a.onPress=function(){
//------------------Double CLick---------------------
firstClick = getTimer();
if ((firstClick-secondClick)<450) {
// Тут действие на даблклик
}
secondClick = getTimer();

//------------------End Double CLick------------------------
// Тут действие на один клик


}
выполняется при одиночночном - действие №1
при двойном действие №1+действие №2
Понимаю что можно, но жестоко туплю.
Допомогите! :(

Leezard 07.09.2005 17:37

Спасение утопающих дело неблагодарное, да?
Вот что получилось сделать.
Решение типа "через жопу", но работает.
Код на объекте:
onClipEvent (load) {
delay = 450;
k=0;
}
on (release) {


firstClick = getTimer();
_root.createEmptyMovieClip("testTimer",100);
_root.testTimer.k=0;
_root.testTimer.onEnterFrame = function(){
trace(k);
k++;
if(k>5){
//------Действие 1
_y-=15;
//------Конец Действие 1
k=0;
trace ("YESSS");
//break;
_root.testTimer.removeMovieClip();

}
}
if ((firstClick-secondClick)<delay) {
//------Действие 2
_y+=15;
//------Конец Действие 2
k=0;
_root.testTimer.removeMovieClip();
}
//else{_y-=15;}
secondClick = getTimer();

}
При первом клике создает Мувик _root.testTimer и вешает на него функцию onEnterFrame если прийдет второй клик _root.testTimer убивается и выполняется действие 2. Если второй клик не приходит _root.testTimer отсчитывает положенные кадры и запускает действие 1.

Отцы как ЭТО сделать красиво??? А не как это сделал я :)

Leezard 07.09.2005 18:20

Всем спасибо, все свободны :)
Вот последняя версия DoubleClickExt

На объект:
on (release) {
firstClick = getTimer();
this.obj = new Object();
this.obj.interval = function() {
//------Действие 1
_y-=15;
//------Конец Действие 2
delete obj;
}
setInterval( this.obj, "interval", 200 );
if ((firstClick-secondClick)<200) {
delete obj;
//------Действие 2
_y+=15;
//------Конец Действие 2

}
secondClick = getTimer();
}

В итоге кликаний срабатывает либо Действие 1 либо Действие 2;
Люблю я Flasher.ru

Leezard 08.09.2005 17:08

Посмотрел, подумал - некрасиво, зачем объект, если есть clearInterval?
Последняя версия:

onClipEvent (load) {var intervalDC:Number=0;}

on (press) {
firstClick = getTimer();
var intervalAct = function() {
//------Действие 1

//------Конец Действие 1
clearInterval(intervalDC);
intervalDC=0;
}
if(intervalDC==0){
intervalDC = setInterval(intervalAct, 200);
}
if ((firstClick-secondClick)<200) {
//------Действие 2

//------Конец Действие 2
clearInterval(intervalDC);
intervalDC=0;
}
secondClick = getTimer();
}

};

Leezard 08.09.2005 17:22

А теперь вопрос к профи, если все это приводить в удобоваримый вид и оформить ввиде прототипа, получается следующее:

MovieClip.prototype._onDoubleClick = function(func1:Function, arg1:Object, func2:Function,arg2:Object) {
var intervalDC:Number=0;

this.onPress = function() {
firstClick = getTimer();
var intervalAct = function() {
//------Действие 1
func1(arg1);
//------Конец Действие 1
clearInterval(intervalDC);
intervalDC=0;
}
if(intervalDC==0){
intervalDC = setInterval(intervalAct, 200);
}
if ((firstClick-secondClick)<200) {
//------Действие 2
func2(arg2);
//------Конец Действие 2
clearInterval(intervalDC);
intervalDC=0;
}
secondClick = getTimer();
}

};
function oneClk(arg) {
trace("oneClk");
_y+=arg;
};
function dblClk(arg) {
trace("dblClk");
_y+=arg;
};

mc._onDoubleClick(oneClk, -15,dblClk, 15);

Одна беда чаще вего функции относящиеся к объекту хранятся в самом объекте
в этом примере на 15 пикселей прыгает _root, как заставить прототип исполнять функции внутри объекта.
Конкретная задача надо чтобы mc прыгал а не _root, при этом функции должны лежать внутри mc.

silin 08.09.2005 17:58

не очень понял в чем проблема..
глянь такой вариант
onClick() вызывается с задержкой, потому как надо удостовериться, что это не двойной клик
Код:

MovieClip.prototype.dblclick=function(dt){
        var mc=this,md;
        this.onMouseDown=function(){
                if(!this.hitTest(_root._xmouse,_root._ymouse,true))return;
                if(getTimer()-md<dt ){
                        clearInterval(mc.id)
                        mc.onDoubleClick();
                }else {
                        md=getTimer();
                        mc.id=setInterval(function(){mc.onClick();clearInterval(mc.id)},dt)
                }
        }
}
test_mc.dblclick(300);
test_mc.onDoubleClick=function(){trace(this+' DblClick')};
test_mc.onClick=function(){trace(this+' Click')};


Leezard 09.09.2005 13:27

Проблема в том что если в руте написать:
mc.oneClk= function(arg){
trace("oneClk");
_y+=arg;
};
mc.dblClk=function(arg) {
trace("dblClk");
_y+=arg;
};

mc._onDoubleClick(mc.oneClk, -15,mc.dblClk, 15);
То двигаться будет не mc а _root.

Если вместо этого повесить на сам mc :
onClipEvent (load) {
this._onDoubleClick(oneClk, -15,dblClk, 15);
function oneClk(arg){
trace("oneClk");
_y+=arg;
};
function dblClk(arg) {
trace("dblClk");
_y+=arg;
};
}
Все работает как надо, но это не приемлимо если mc создается динамически (скриптами).

Leezard 09.09.2005 13:45

Блин прозрение:
mc.some = function(){}
и
function mc выешеное на сам mc
Отличаются!
Самое странное, что написав кучу кодов, не обращал на это внимание.
С другой стороны, раз не замечал, значит не критично :)
Всем страждущим, пользуйте прототип, очень удобно.
И еще к вопрос в контексте к Силину, а зачем там hitTest?

silin 09.09.2005 14:37

hitTest там, чтоб срабатывало тока на клике по мувику..

Leezard 09.09.2005 18:51

Зачем если там есть onRelease?


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

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