Форум 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=84373)

an_artist 30.08.2006 11:23

Движение объекта за курсором с запаздыванием.
 
Как сделать движение объекта за курсором мыши с запаздыванием используя 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);
}

Но приведенный код работает неправильно.
Вместо плавного красивого запаздывания на экране какое-то хаотичное мелькание.
Подскажите, в чем ошибка?

iNils 30.08.2006 11:59

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);
        }
};


Gaen 30.08.2006 12:08

Код:

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), и всё будет тип-топ! :)

Gaen 30.08.2006 12:09

хы, долго ж я писАл :)

an_artist 30.08.2006 12:23

iNils, Супер. спасибо!
я подозревал, что не правильно делать точное сравнение (==) и пытался тоже делать < заданного порога. Но я не допер совершенно до сброса id в ложь и последующей проверки. Очень ловко! И с отрицательным приращением (-=dx) вместо моих идиотских сравнений - тоже просто шикарно. Еще раз огромное спасибо.

an_artist 30.08.2006 12:28

GAIKER, да, у меня похоже вообще непонятно что было написано :)
Спасибо за совет.

etc 30.08.2006 13:27

А зачем вообще было делать через setInterval? Идея фикс? Быстрее работать не будет.

an_artist 30.08.2006 13:57

__etc, да, совершенно верно, идея-фикс. Т.е. просто для общего развития, скажем так.


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

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