PDA

Просмотр полной версии : DoubleClick-extended. Не пинайте.


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

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

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?

Iv
10.09.2005, 17:49
вот еще вариантик. готовый под рукой валялся:my_mc.onPress = function() {
var handler = arguments.callee;
if (handler.double) {
delete handler.double;
this.doubleClickHandler();
} else {
this.firstClickHandler();
handler.double = true;
double_click_time = 400;
var mc = this;
var intr = setInterval(function () {
clearInterval(intr);
if (handler.double) {
mc.singleClickHandler();
}
delete handler.double;
}, double_click_time);
}
};
this.my_mc.firstClickHandler = function() {
trace("first click");
};
this.my_mc.doubleClickHandler = function() {
trace("double click");
};
this.my_mc.singleClickHandler = function() {
trace("single click");
};