![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
ветеран форума
|
Хотелось бы разобраться в следующем моменте:
Бросание чего-либо мышью, т.е хватаем объект и в зависимости от того чем сильнее (быстрее) замахнулись мышью тем дальше/быстрее летит/крутится объект, и плавно останавливается. Подскажите, пожалуйста, алгоритм.
__________________
trace("Остановите Землю, я сойду!!!"); |
|
|||||
|
в onEnterFrame получать предыдущие координаты мыши и текущие. При отпускани мыши смотрим на расстояние между текущими и предыдущими координатами. Чем оно больше - тем сильнее бросили
__________________
while(1) {} |
|
|||||
|
Регистрация: 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. |
|
|||||
|
Регистрация: 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 тогда не происходит
__________________
скриптограф |
|
|||||
|
ветеран форума
|
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 = [];
}
};
И желательно размывать уже при старте перетягивания мышой объекта... Ну и вопрос про центр тяжести остается пока открытым. ![]() Последний раз редактировалось iNils; 11.10.2008 в 14:15. |
|
|||||
|
Регистрация: Nov 2007
Адрес: Moscow
Сообщений: 566
|
А можно и не изобретать велосипед:
http://www.google.com/search?hl=ru&r...1%81%D0%BA&lr= |
|
|||||
|
ветеран форума
|
Я на форумах гость не частый...извините.
Для тех кто в танке, то значит мультипостинг? И в чем мой игнор кнопки "изменить"? Оbi, и что по Вашей ссылке можно что то приспособить под as2? Да и зачем использовать целый движок, если нужен то всего один-два эффекта, плюс интерес разобраться в самом алгоритме, а не просто найти готовое решение...
__________________
trace("Остановите Землю, я сойду!!!"); Последний раз редактировалось iNils; 11.10.2008 в 19:05. |
|
|||||
|
Цитата:
Материал неполный, на сипипи к тому же, но разобраться можно. Написать полноценный двиг после этого не получится, но думаю с твоей задачей справится можно. Хотя я сам не пробовал и импульсную физику не использую. PS лучше юзать физ. двиги.
__________________
while(1) {} |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:30. |
|
|
« Предыдущая тема | Следующая тема » |
|
|