Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Простой физический движок (http://www.flasher.ru/forum/showthread.php?t=119813)

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

ОК, выкладываю.
Код точки:
Код AS1/AS2:

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

Доработал+упростил :)

Код AS1/AS2:

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

Вот так:
Код AS1/AS2:

        _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

Вложений: 2
Хм, заменил
Но он, собака, все-равно ускоряется :)

Вот что непонятно, если стартовая скорость по оси Y равна 0, то шарик НЕ ускоряется, а если НЕ равна 0, то ускоряется.
Вкладываю Аутпуты с разным значением углов, чтобы понятнее объяснить в чем дело. Тут указано значение переменной vy

Black_Hawk 02.01.2009 16:22

Ух, кажется решил проблему :)
Дело было в возврате значения _y
Код AS1/AS2:

if (_y>=740) {
                vy *=-1;
                _y = 740
        }

За счет этого, с каждым ударом об пол шарик двигался все выше и выше :)

Теперь все в порядке, спасибо!


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

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