![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Aug 2003
Сообщений: 25
|
Как сделать движение объекта за курсором мыши с запаздыванием используя setInterval?
Т.е. я сделал это самое запаздывание через onEnterFrame this.onEnterFrame=function()
{
xx=_root._xmouse;
yy=_root._ymouse;
if (this._x > xx) {this._x-=(this._x-xx)/4;} else {this._x+=(xx - this._x)/4;};
if (this._y > yy) {this._y-=(this._y-yy)/4;} else {this._y+=(yy - this._y)/4;};
}
Потом хотел сделать тоже самое через setInterval вот таким образом: interval = function(xx, yy) {
if ((ball._x==xx)&&(ball._y==yy))
{
clearInterval(id);
}
else
{
if (ball._x > xx) {ball._x-=(ball._x-xx)/4;} else {ball._x+=(xx - ball._x)/4;};
if (ball._y > yy) {ball._y-=(ball._y-yy)/4;} else {ball._y+=(yy - ball._y)/4;};
updateAfterEvent();
}
}
this.onMouseMove=function()
{
id = setInterval (interval, 80, _root._xmouse, _root._ymouse);
}
Вместо плавного красивого запаздывания на экране какое-то хаотичное мелькание. Подскажите, в чем ошибка? |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
1. Вы запускаете новый интервал при каждом движении мыши, а старые при этом не убиваются так как вы каждый раз переназначаете id
2. Функция interval будет работать у вас вечно, так как координаты ball не будут равны координатам курсора. 3. Ваши проверки типа this._x > xx лишние. function interval (mc, dt) {
var dx = (mc._x - _root._xmouse) / dt;
var dy = (mc._y - _root._ymouse) / dt;
if (Math.abs (dx) < 0.1 and Math.abs (dy) < 0.1) {
clearInterval (id);
id = false;
trace ("stop")
}
mc._x -= dx;
mc._y -= dy;
updateAfterEvent ();
}
this.onMouseMove = function () {
if (!id) {
id = setInterval (interval, 10, ball, 10);
}
};
Последний раз редактировалось iNils; 30.08.2006 в 12:17. |
|
|||||
|
strange mood
|
interval = function(){
xx=_xmouse;
yy=_ymouse;
if ((ball._x==xx)&&(ball._y==yy)){
clearInterval(id);
return;
}//if
ball._x+=((xx-ball._x)/10);
ball._y+=((yy-ball._y)/10);
updateAfterEvent();
}//interval
this.onMouseMove=function(){
if(!id)id = setInterval (interval, 20, _root._xmouse, _root._ymouse);
}//this.onMouseMove
Самая главная ошибка - это передача в функцию _xmouse и _ymouse при установке таймаута. То есть когда чел начал двигать мышкой, в функцию передались координаты. И всё, они не изменятся, пока мышь не остановится и не поедет снова (произойдёт переназначение интервала, передадутся новые координаты). Отсюда и расколбас. Ещё непонятно, зачем проверять if (ball._x > xx)...else, есть же универсальная формула (в моём примере). А зачем задержка такая большая? Если хочешь, чтобы медленнее ездило, поставь в уравнении делитель побольше (я поставил 10), и всё будет тип-топ! ![]()
__________________
тонкий тролль, осеянный благодатью |
|
|||||
|
Регистрация: Aug 2003
Сообщений: 25
|
iNils, Супер. спасибо!
я подозревал, что не правильно делать точное сравнение (==) и пытался тоже делать < заданного порога. Но я не допер совершенно до сброса id в ложь и последующей проверки. Очень ловко! И с отрицательным приращением (-=dx) вместо моих идиотских сравнений - тоже просто шикарно. Еще раз огромное спасибо. |
|
|||||
|
Регистрация: Aug 2003
Сообщений: 25
|
GAIKER, да, у меня похоже вообще непонятно что было написано
![]() Спасибо за совет. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
А зачем вообще было делать через setInterval? Идея фикс? Быстрее работать не будет.
|
|
|||||
|
Регистрация: Aug 2003
Сообщений: 25
|
__etc, да, совершенно верно, идея-фикс. Т.е. просто для общего развития, скажем так.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 21:56. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|