Просмотр полной версии : Простой физический движок
Black_Hawk
01.01.2009, 12:56
Вот уже второй день не могу сделать простой
физический движок во flash :)
Памагите!
Есть точка 1х1, имеющая какую-то начальную скорость и какой-то угол поворота (эти скорость и угол можно задавать). Точка находится внутри прямоугольника 300х1000 (вид сбоку).Нужно, чтобы эта точка имела ускорение свободного падения и отражалась от стенок.
Никаких параметров больше нет, т.е. если точка падает вниз, то отразясь от пола она подлетит на такую же высоту.
Буду очень благодарен за помощь!
З.Ы. С Новым Годом всех :)
gloomyBrain
02.01.2009, 01:29
Вы хотя бы выложите Ваши попытки (КОД)... а там посмотрим=)
DarkLight
02.01.2009, 01:49
Если есть угол и скорость, раскладываем по X и Y. Сдвиг осуществляется на регулярной основе (каждый кадр или по таймеру) прибавлением к координатам точки текущей скорости по X и Y соответственно, а также прибавлением к скорости по Y некоторой постоянной величины(ускорение свободного падения). При сдвиге проверяем, не выходит ли точка за границы зоны. Если выходит, то отрисовываем на границе. Если врезалась в вертикальную стену - умножаем скорость по X на -1, если в горизонтальную - скорость по Y на -1.
Black_Hawk
02.01.2009, 10:32
ОК, выкладываю.
Код точки:
onClipEvent (load) {
v = 14;
g = 0.98;
a = 90;
getx = _x;
gety = _y;
cx = 1;
cy = 1;
fcounter = 0;
curg = 0;
}
onClipEvent (enterFrame) {
if ((_x>=340) || (_x<=40 && _y>=340)) {
cx = cx*-1;
}
if (_y>=740) {
cy = cy*-1;
curg = curg+g*fcounter;
fcounter = 0;
}
_x = _x+v*Math.cos(a/180*Math.PI)*cx;
_y = _y-(v*Math.sin(a/180*Math.PI)-curg)*cy+g*fcounter;
fcounter = fcounter+1;
}
DarkLight, вроде сделал все как вы написали, но результат не очень. Думается мне ошибка здесь какая-то глупая, а вот найти не могу :)
DarkLight
02.01.2009, 12:52
При сдвиге проверяем, не выходит ли точка за границы зоны. Если выходит, то отрисовываем на границе.
Поставьте if-ы после сдвига, а в проверках кроме умножения скорости на -1 добавьте установку координат на крайние значения - т е если _x>=340 то надо поставить точке координату 340.
P. S. onClipEvent - зло, не рекомендуется к использованию начиная с Flash MX 2004. Пишите хотя бы в кадрах - меньше будет проблем будущем
Black_Hawk
02.01.2009, 13:32
Доработал+упростил :)
onClipEvent (load) {
v = 14;
g = 0.98;
a = 20;
getx = _x;
gety = _y;
vx = v*Math.cos(a/180*Math.PI);
vy = -v*Math.sin(a/180*Math.PI);
}
onClipEvent (enterFrame) {
_x = _x+vx;
_y = _y+vy;
vy = vy+g;
if (_x<=40 && _y>=340) {
vx = vx*-1;
_x=40;
}
if (_x>=340) {
vx = vx*-1;
_x = 340;
}
if (_y>=740) {
vy = vy*-1;
_y = 740;
}
}
Уже выглядит гораздо лучше, вот только проблема возникла - шарик отлетает от пола на более высокую высоту, чем он начинал движение вниз. И с каждым отскоком от пола взлетает все выше и выше :)
Как исправить?
DarkLight
02.01.2009, 14:04
Вот так:
_x +=vx;
_y +=vy;
if (_x<=40 && _y>=340) {
vx *=-1;
_x=40
}else if (_x>=340) {
vx *=-1;
_x = 340
}else if (_y>=740) {
vy *=-1;
_y = 740
}else{
vy +=g;
}
Иначе получалось что при первом сдвиге вверх ускорение его разгоняло а не тормозило:)
Black_Hawk
02.01.2009, 14:22
Хм, заменил
Но он, собака, все-равно ускоряется :)
Вот что непонятно, если стартовая скорость по оси Y равна 0, то шарик НЕ ускоряется, а если НЕ равна 0, то ускоряется.
Вкладываю Аутпуты с разным значением углов, чтобы понятнее объяснить в чем дело. Тут указано значение переменной vy
Black_Hawk
02.01.2009, 16:22
Ух, кажется решил проблему :)
Дело было в возврате значения _y
if (_y>=740) {
vy *=-1;
_y = 740
}
За счет этого, с каждым ударом об пол шарик двигался все выше и выше :)
Теперь все в порядке, спасибо!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.