PDA

Просмотр полной версии : Скорость мышки - бросание или вращение чего либо


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

Подскажите, пожалуйста, алгоритм.

Division
10.10.2008, 22:58
в onEnterFrame получать предыдущие координаты мыши и текущие. При отпускани мыши смотрим на расстояние между текущими и предыдущими координатами. Чем оно больше - тем сильнее бросили

Kuruki
10.10.2008, 23:21
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;
}

orcpochta
11.10.2008, 01:27
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 тогда не происходит

Mur4ik
11.10.2008, 05:13
to Division:
Спасибо за идею

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

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

С бросанием разобрался, но очень хочется еще добиться эффекта
как вот здесь http://www.thibaud.be (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 = [];
}
};

Добавил немного размытия, но мне чет не очень нравится - может кто подправит.
И желательно размывать уже при старте перетягивания мышой объекта...

Ну и вопрос про центр тяжести остается пока открытым. :)

Obi
11.10.2008, 12:59
А можно и не изобретать велосипед:
http://www.google.com/search?hl=ru&rlz=1G1GGLQ_RURU266&q=actionscript+2+physics+engine&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=

iNils
11.10.2008, 14:16
Пользователь Mur4ik получает предупреждение за мультипостинг и игнорирование кнопки "изменить".

Mur4ik
11.10.2008, 18:14
Я на форумах гость не частый...извините.
Для тех кто в танке, то значит мультипостинг?
И в чем мой игнор кнопки "изменить"?

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

Да и зачем использовать целый движок, если нужен то всего один-два эффекта,
плюс интерес разобраться в самом алгоритме, а не просто найти готовое решение...

Division
11.10.2008, 18:47
С бросанием разобрался, но очень хочется еще добиться эффекта
как вот здесь http://www.thibaud.be, т.е чтоб центр тяжести объекта был в точке клика мыши и естественно моделировалось поведение приближенное к реальной физике....
По ссылке выше ничего, напонимающее поведение приближенное к реальной физике я не обнаружил (: Да и центр тяжести никак не должен зависить от точки клика. Если есть желание разобраться, рекомендую почитать тут: http://gamedev.ru/articles/?id=70124
Материал неполный, на сипипи к тому же, но разобраться можно. Написать полноценный двиг после этого не получится, но думаю с твоей задачей справится можно. Хотя я сам не пробовал и импульсную физику не использую.
PS лучше юзать физ. двиги.

iNils
11.10.2008, 19:07
Для тех кто в танке, то значит мультипостинг?Мультипостинг, это два и более сообщений подряд от одного человека.

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

Можно, берете физический опен-сорс движок на ас (2 или 3 — не важно), открываете код и разбираетесь. Центры тяжести, векторы силы\скорости, столкновения и прочие вкусности давно реализованы.

Mur4ik
11.10.2008, 20:08
to Obi:
многие вещи уже реализованы на as2 или as3, по Вашему получается тогда и форум этот вообще ни к чему... :)

Интересно Вы на форуме задавали вопросы на какую нибудь тему? Вот бы на них взглянуть... ;)

про центр тяжести я, конечно, немного поторопился.... он постоянен для одного объекта в обычных условиях :)
интересен вопрос если схватил за объект в определенной точке, то и вести он себя должен примерно как в жизни....

Obi
11.10.2008, 20:59
Блин, посмотрите физические движки опен-сорс, их можно найти по запросу в гугле
«flash physics engine». Вам нужна математика. Вместо того, чтобы самому выводить формулы, можно посмотреть как это реализовано у других.
Open-source означает, что исходный код открыт. Значит можно увидеть, как это реализовано програмно. Чего непонятного-то?

Mur4ik
11.10.2008, 21:22
Блин, смотрел, только вот ключевого слова в английском языке для интересующего эффекта я не знаю... а из всей массы классов физ. движка просмотреть каждый и найти то что нужно дело геморное.

Наверное, придётся осваивать какой-то физ. движок на as2, думаю, лишним опыт не будет...
Вопрос можно считать закрытым :)