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

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

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

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
По умолчанию Скорость мышки - бросание или вращение чего либо

Хотелось бы разобраться в следующем моменте:
Бросание чего-либо мышью, т.е хватаем объект и в зависимости от того чем сильнее (быстрее) замахнулись мышью тем дальше/быстрее летит/крутится объект, и плавно останавливается.

Подскажите, пожалуйста, алгоритм.
__________________
trace("Остановите Землю, я сойду!!!");

Старый 10.10.2008, 22:58
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 2  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
в onEnterFrame получать предыдущие координаты мыши и текущие. При отпускани мыши смотрим на расстояние между текущими и предыдущими координатами. Чем оно больше - тем сильнее бросили
__________________
while(1) {}

Старый 10.10.2008, 23:21
Kuruki вне форума Посмотреть профиль Отправить личное сообщение для Kuruki Найти все сообщения от Kuruki
  № 3  
Ответить с цитированием
Kuruki

Регистрация: Jan 2008
Сообщений: 669
Код:
var prevMouseX:Number;
var curMouseX:Number = _root._xmouse;
var prevMouseY:Number;
var curMouseY:Number = _root._ymouse;

var xSpeed:Number;
var ySpeed:Number;
var k:Number = 2; // Коэффециент какой-нибудь там...
var acceleration:Number = -1; 

something_mc.onMouseDown = dragStart;
something_mc.onMouseUp = beginFly;

function dragStart():Void {
	_root.onMouseMove = countSpeed;
	startDrag(this);
}
function countSpeed():Void {
	prevMouseX = curMouseX;
	prevMouseY = curMouseY;
	curMouseY = _root._ymouse;
	curMouseX = _root._xmouse;
	xSpeed = (curMouseX - prevMouseX) / k;
	ySpeed = (curMouseY - prevMouseY) / k;
}
function beginFly():Void {
	delete _root.onMouseMove;
	stopDrag(this);
	this.onEnterFrame = fly;
}
function fly():Void {
	this._x += xSpeed;
	this._y += ySpeed;
	this._rotation++;
	xSpeed += acceleration;
	ySpeed += acceleration;
	
	if (xSpeed <= 0) xSpeed = 0;
	if (ySpeed <= 0) ySpeed = 0;
	if (xSpeed == ySpeed && ySpeed == 0) delete this.onEnterFrame;
}


Последний раз редактировалось Kuruki; 10.10.2008 в 23:23.
Старый 11.10.2008, 01:27
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 4  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Код:
class ForceVector {
	private var _aArr:Array = new Array(); //массив, куда пишутся координаты мыши
	private var _nInterval:Number = null; //идентификатор интервальной функции
	private var _timeTrigger:Number = 50; //значение по умолчанию отрезка времени в милисекундах в интервале которого должен вычисляться вектор силы	
	function ForceVector(nTimeTrigger:Number) {	//конструктор, принимающий если надо значение временного интервала
			timeTrigger = nTimeTrigger;
			_aArr[0] =_aArr[1] = [_xmouse, _ymouse]; //запись начальных координат мыши при инициализации
			_nInterval = setInterval(this, "recordXY", _timeTrigger); //запуск интервальной функции, соответственно переданному значению временного отрезка
	}	
	private function recordXY():Void { //собственно запись  координат в массив из двух элементов по кругу
		_aArr[0] = _aArr[1];
		_aArr[1] = [_xmouse, _ymouse];		
	}
	public function getForceXY():Array { //возвращает разность актуальных координаты, записанные в массив
		clearInterval(_nInterval); //убивает интервал
		return [_aArr[1][0] - _aArr[0][0], _aArr[1][1] - _aArr[0][1]]; //дельта X и дельта Y - по сути это и есть вектор силы		
	}
	
	public function get timeTrigger():Number { //геттер
		return _timeTrigger;
	}
	public function set timeTrigger(nTimeTrigger:Number):Void { //сеттер
		if((nTimeTrigger) && nTimeTrigger >= 10) { //проверка, что интервал передан в конструктор и, что он больше 10 мс - иначе вектор будет слишком маленьким
			_timeTrigger = nTimeTrigger;
		}
	}
}
пример использования:
Код:
mcClip.onPress = function():Void { //какой-то клип, который надо кинуть, пнуть или еще что-то
    this.startDrag(); //начинаем перетаскивание
    this.force = new ForceVector(); //запускаем обсчет вектора силы
};
mcClip.onRelease = function():Void {
    stopDrag();
    this.aXY = this.force.getForceXY(); //создаем свойство у клипа, в которое передается дельта X и дельта Y вектора силы
    delete this.force; //удаляем вектор силы
    this.kick(); //какая-то функция, обрабатывающая вектор силы и совершающая необходимые действия
//доступ к дельтам через mcClip.aXY[0] и mcClip.aXY[1] - дельта X и дельта Y соответственно
};
mcClip.onReleaseOutside = mcClip.onRelease; //бывает, что при резком рывке мыши она "слетает" с мувиклипа и событие onRelease тогда не происходит
__________________
скриптограф

Старый 11.10.2008, 05:13
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 5  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
to Division:
Спасибо за идею

to Kuruki:
Ваш код не рабочий (даже если поправить ошибку все равно клип бросается только вправо), но все равно спасибо.

to orcpochta:
пока я стряпал свой код, Вы уже дали судя по всему готовое решение, ща буду пробовать, СПАСИБО.

С бросанием разобрался, но очень хочется еще добиться эффекта
как вот здесь http://www.thibaud.be, т.е чтоб центр тяжести объекта был в точке клика мыши и естественно моделировалось поведение приближенное к реальной физике....
Может есть у кого-нибудь идеи? Подскажите алгоритм

Во вложении моя версия на данный момент:

orcpochta хитрец
он не показал самого важного как же все таки использовать его класс,
если кто не въехал вот пример:

Код:
import flash.filters.BlurFilter;

// mcClip - какой-то клип, который надо кинуть,
// пнуть или еще что-то
mcClip.onPress = function():Void
{
    this.startDrag();
    this.force = new ForceVector();
};
mcClip.onRelease = function():Void
{
    stopDrag();
    this.aXY = this.force.getForceXY();
    delete this.force;
    this.onEnterFrame = this.kick;
};

mcClip.onReleaseOutside = mcClip.onRelease;

mcClip.kick = function():Void
{
	var nBlurX:Number = Math.abs(this.aXY[0]) > 255 ? 255 : Math.abs(this.aXY[0]);
	var nBlurY:Number = Math.abs(this.aXY[1]) > 255 ? 255 : Math.abs(this.aXY[1]);
	var nQuality:Number = 3;

	var filterBlur:BlurFilter = new BlurFilter(nBlurX, nBlurY, nQuality);
	
	this.filters = [filterBlur];

	this._x += this.aXY[0];
	this._y += this.aXY[1];
	
	this.aXY[0] *= .7;
	this.aXY[1] *= .7;
	
	if (Math.round(this.aXY[0]) == 0 && Math.round(this.aXY[1]) == 0)
	{
		delete this.onEnterFrame;
		this.filters = [];
	}
};
Добавил немного размытия, но мне чет не очень нравится - может кто подправит.
И желательно размывать уже при старте перетягивания мышой объекта...

Ну и вопрос про центр тяжести остается пока открытым.
Вложения
Тип файла: rar ThrowEffect.rar (5.6 Кб, 66 просмотров)


Последний раз редактировалось iNils; 11.10.2008 в 14:15.
Старый 11.10.2008, 12:59
Obi вне форума Посмотреть профиль Отправить личное сообщение для Obi Найти все сообщения от Obi
  № 6  
Ответить с цитированием
Obi
 
Аватар для Obi

Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
А можно и не изобретать велосипед:
http://www.google.com/search?hl=ru&r...1%81%D0%BA&lr=

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Пользователь Mur4ik получает предупреждение за мультипостинг и игнорирование кнопки "изменить".
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 11.10.2008, 18:14
Mur4ik вне форума Посмотреть профиль Отправить личное сообщение для Mur4ik Найти все сообщения от Mur4ik
  № 8  
Ответить с цитированием
Mur4ik
ветеран форума

Регистрация: Sep 2008
Сообщений: 717
Записей в блоге: 4
Отправить сообщение для Mur4ik с помощью ICQ
Я на форумах гость не частый...извините.
Для тех кто в танке, то значит мультипостинг?
И в чем мой игнор кнопки "изменить"?

Оbi, и что по Вашей ссылке можно что то приспособить под as2?

Да и зачем использовать целый движок, если нужен то всего один-два эффекта,
плюс интерес разобраться в самом алгоритме, а не просто найти готовое решение...
__________________
trace("Остановите Землю, я сойду!!!");


Последний раз редактировалось iNils; 11.10.2008 в 19:05.
Старый 11.10.2008, 18:47
Division вне форума Посмотреть профиль Отправить личное сообщение для Division Найти все сообщения от Division
  № 9  
Ответить с цитированием
Division
 
Аватар для Division

Регистрация: Jul 2008
Адрес: Украина, Херсон
Сообщений: 635
Отправить сообщение для Division с помощью ICQ
Цитата:
С бросанием разобрался, но очень хочется еще добиться эффекта
как вот здесь http://www.thibaud.be, т.е чтоб центр тяжести объекта был в точке клика мыши и естественно моделировалось поведение приближенное к реальной физике....
По ссылке выше ничего, напонимающее поведение приближенное к реальной физике я не обнаружил (: Да и центр тяжести никак не должен зависить от точки клика. Если есть желание разобраться, рекомендую почитать тут: http://gamedev.ru/articles/?id=70124
Материал неполный, на сипипи к тому же, но разобраться можно. Написать полноценный двиг после этого не получится, но думаю с твоей задачей справится можно. Хотя я сам не пробовал и импульсную физику не использую.
PS лучше юзать физ. двиги.
__________________
while(1) {}

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

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Цитата:
Сообщение от Mur4ik Посмотреть сообщение
Для тех кто в танке, то значит мультипостинг?
Мультипостинг, это два и более сообщений подряд от одного человека.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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