PDA

Просмотр полной версии : Реагирование на столкновения


Haiat
21.12.2008, 22:35
Добрый вечер.

Вот думаю как реализовать такую тему:

На рабочем поле есть разросанные мувики. Нужно сделать их перетаскивание. Но если мувик приближается к другим то те должны рассталкиваться. Даже не задевая если мувик подтащить к другому, то тот должен отодвинуться.

Есть идеи?

VovkaMorkovka1
21.12.2008, 23:37
Нефик делать, реализуй систему в которой есть трение и сила расталкивания, которая обратно пропорциональна расстоянию между фигурами. Формулы прочти в учебнике физики за девятый класс.

Haiat
22.12.2008, 00:01
спасибо, но дело не в формулах, интересует просто сама реализация во флэше. Сделать через рекурсию чтоли от мувика к мувику или как?

gloomyBrain
22.12.2008, 00:11
я бы так сделал:
- каждый мувик обладает силой отталкивания
- сила отталкивания направлена во все стороны и обратно пропорциональна расстоянию в N-ной степени
- каждый кадр (onEnterFrame) считаем расстояния между мувиками (проходимся по массиву)
- получаем для каждого мувика суммарный вектор сил, действующих на него со стороны соседей
- получаем новые координаты, в которых и отрисовываются мувики в следующем кадре

ЗЫ
физика - это круто =)

Wolsh
22.12.2008, 00:20
onEnterFrame-то зачем? onMouseMove вроде меньше тепла выделяет, тем более только при драге.

gloomyBrain
22.12.2008, 00:24
за тем, чтобы мувики разбегались и плавно останавливались

Wolsh
22.12.2008, 01:12
Угу. Т.е. на движение мыши вычисляем координаты куда мувикам бежать и на их онЕнтерФрейм делаем им движение. И по достижении цели каждый онЕнтерФрейм сам себя удаляет. Это другое дело)) А так я сижу пялюсь в монитор, а проц наяривает пересчет координат неподвижных мувиков 30 раз в секунду. Скажем, в фаерфоксе у меня половина вкладок зависнет))))))

gloomyBrain
22.12.2008, 01:22
ну... не по достижении цели, а когда скорость будет равна нулю
Скажем, в фаерфоксе у меня половина вкладок зависнет))))))
Юзайте Хром =))

Haiat
22.12.2008, 01:45
Ребята спасибо. но это все детали,
Вот просто сижу засыпаю,не могу сообразить как сам принцип определить в какую сторону отлетать мувикам. просто элементарно опишите процесс столкновения и рекции плиз

gloomyBrain
22.12.2008, 02:14
да мне самому интересно стало=)
постараюсь закончить исходник седня-завтра

Haiat
24.12.2008, 19:38
Скинь сразу плиз сюда
если что мой мейл aidar.haiatov@gmail.com
интерестно как ты это реализовываешь.
спасибо

Wolsh
24.12.2008, 19:43
По-моему еще у Гурского подробно разбирается. Там надо было типа иголкой в шарик попасть, а шарики разбегались. Смысл абсолютно тот же.

gloomyBrain
25.12.2008, 01:15
2 ХАЯТ
Сори, пока никак не реализовываю... =)
начал, закончить времени щас просто нету - сессия =) как всегда внезапно и неожиданно

вот что нашевелил тут:
var pushForce = 0.1; // коэффициент на который умножается скорость
var easingDegree = -2;// степень ослабления силы с расстоянием
var freeAccel = 1;// замедление скорости
var coordsX = [100, 540, 540, 100, 320];
var coordsY = [100, 100, 380, 380, 240];
var balls = [];
for (i=0; i<5; i++) {
this.attachMovie("ball","ball_"+i,this.getNextHighestDepth());
balls.push(this["ball_"+i]);
balls[i]._x = coordsX[i];
balls[i]._y = coordsY[i];
balls[i].onDrag = false;
balls[i].speedX = 0;
balls[i].speedY = 0;
balls[i].onPress = function() {
this.onDrag = true;
};
balls[i].onRelease = function() {
this.onDrag = false;
};
balls[i].onReleaseOutside = function() {
this.onDrag = false;
};
}
function getForces(mc:MovieClip) {
mc.forceX = 0;
mc.forceY = 0;
for (i=0; i<balls.length; i++) {
if (balls[i] != mc) {
mc.forceX += mc._x-balls[i]._x;
mc.forceY += mc._y-balls[i]._y;
}
}
}
function getSpeeds(mc:MovieClip) {
mc.speedX = Math.pow(mc.forceX, easingDegree)*pushForce;
var absSpeedX = Math.abs(mc.speedX);
if (absSpeedX<freeAccel) {
mc.speedX = 0;
} else {
mc.speedX -= mc.speedX/absSpeedX;
}
mc.speedY = Math.pow(mc.forceY, easingDegree)*pushForce;
var absSpeedY = Math.abs(mc.speedY);
if (absSpeedY<freeAccel) {
mc.speedY = 0;
} else {
mc.speedY -= mc.speedY/absSpeedY;
}
}
this.onEnterFrame = function() {
for (i=0; i<balls.length; i++) {
getForces(balls[i]);
getSpeeds(balls[i]);
balls[i]._x += balls[i].speedX;
balls[i]._y += balls[i].speedY;
}
};

ЗЫ
по-моему тут ничо не работает...=)
начинал когда тема создавалась - а вообще посмотри, там ерунду какую-то исправить осталось
Но это - только то что касается отталкивания на растоянии. Как с магнитами, которые одинаковыми полюсами друг к другу подносят. Если нужно с пересечениями - то в принципе похожим образом тоже можно. Если что прошу не обижаться, я правда не виноват=) потом еще поковыряюсь