Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 30.08.2006, 11:23
an_artist вне форума Посмотреть профиль Отправить личное сообщение для an_artist Найти все сообщения от an_artist
  № 1  
Ответить с цитированием
an_artist

Регистрация: 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);
}
Но приведенный код работает неправильно.
Вместо плавного красивого запаздывания на экране какое-то хаотичное мелькание.
Подскажите, в чем ошибка?

Старый 30.08.2006, 11:59
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 2  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: 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);
	}
};
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 30.08.2006 в 12:17.
Старый 30.08.2006, 12:08
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 3  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Код:
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), и всё будет тип-топ!
__________________
тонкий тролль, осеянный благодатью

Старый 30.08.2006, 12:09
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 4  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
хы, долго ж я писАл
__________________
тонкий тролль, осеянный благодатью

Старый 30.08.2006, 12:23
an_artist вне форума Посмотреть профиль Отправить личное сообщение для an_artist Найти все сообщения от an_artist
  № 5  
Ответить с цитированием
an_artist

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

Старый 30.08.2006, 12:28
an_artist вне форума Посмотреть профиль Отправить личное сообщение для an_artist Найти все сообщения от an_artist
  № 6  
Ответить с цитированием
an_artist

Регистрация: Aug 2003
Сообщений: 25
GAIKER, да, у меня похоже вообще непонятно что было написано
Спасибо за совет.

Старый 30.08.2006, 13:27
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
А зачем вообще было делать через setInterval? Идея фикс? Быстрее работать не будет.

Старый 30.08.2006, 13:57
an_artist вне форума Посмотреть профиль Отправить личное сообщение для an_artist Найти все сообщения от an_artist
  № 8  
Ответить с цитированием
an_artist

Регистрация: Aug 2003
Сообщений: 25
__etc, да, совершенно верно, идея-фикс. Т.е. просто для общего развития, скажем так.

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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