Форум 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=113722)

big_shtorm 07.07.2008 12:22

здрасти всем, пытаюсь написать аэрохоккей, и ну никак не могу избавиться от бага, проблема в следущем:при отбиении мяча иногда мяч пролетает сквозь биту а иногда просто залипает к ней, не могу понять почему...буду благодарен если хоть намекнете на проблему :drinks:
исходник прикрепил и рядом с ним реализованная игра вот именно к этой игре хочу приблизить свою но...увы. код не слизан!

а вот ссылка на готовую игрулю

iNils - сори

iNils 07.07.2008 12:37

Цитата:

Сообщение от big_shtorm (Сообщение 750531)
не сочтите за флуд с первого раза не вышло файл зацепить

Для этого есть кнопка http://www.flasher.ru/forum/images/r...ttons/edit.gif

Alex_beginner 07.07.2008 17:55

Здравствуйте big_shtorm!
Попробуйте использовать hitTest. Еще одно. Мне непонятно зачем на Symbol 1 навешен код? Почему бы сразу не на _root.

big_shtorm 09.07.2008 11:36

Alex_beginner ваше замечание учел, поправил код, попробывал hitTest (в общем в исходнике 3 разных способа обнаружения сталкновения) результат не очень красивый зато вроде мячь не проскакивает насквозь, но вот проблема с залипанием на биту осталась ((( причем она выевляеться когда скорость биты равна 0, пробывал сравить условие чтоб никогда не была равна нулю...при этом она липнет и дергаясь отлетает...я думаю что всетаки я чтото напартачил с функцией реакции на столкновение function reaction(). об этой функции рассказываеться в книге "Секреты разработки игр в Macromedia Flash MX" Джоб Макар вот так она выглядит у него для двух шаров типа бильярд:
Код:

function reaction(b1, b2, x1, x2, y1, y2, time) {
        var mass1 = b1.mass;
        var mass2 = b2.mass;
        var xVel1 = b1.xmov;
        var xVel2 = b2.xmov;
        var yVel1 = b1.ymov;
        var yVel2 = b2.ymov;
        var run = (x1-x2);
        var rise = (y1-y2);
        var theta = Math.atan2(rise, run);
        var costheta = Math.cos(theta);
        var sintheta = Math.sin(theta);
        var xVel1prime = xVel1*costheta+yVel1*sintheta;
        var xVel2prime = xVel2*costheta+yVel2*sintheta;
        var yVel1prime = yVel1*costheta-xVel1*sintheta;
        var yVel2prime = yVel2*costheta-xVel2*sintheta;
        var P = (mass1*xVel1prime+mass2*xVel2prime);
        var V = (xVel1prime-xVel2prime);
        var v2f = (P+mass1*V)/(mass1+mass2);
        var v1f = v2f-xVel1prime+xVel2prime;
        var xVel1prime = v1f;
        var xVel2prime = v2f;
        var xVel1 = xVel1prime*costheta-yVel1prime*sintheta;
        var xVel2 = xVel2prime*costheta-yVel2prime*sintheta;
        var yVel1 = yVel1prime*costheta+xVel1prime*sintheta;
        var yVel2 = yVel2prime*costheta+xVel2prime*sintheta;
        var b1.tempx = b1.xpos+b1.xmov*time;
        var b1.tempy = b1.ypos+b1.ymov*time;
        var b2.tempx = b2.xpos+b2.xmov*time;
        var b2.tempy = b2.ypos+b2.ymov*time;
        var b1.xmov = xVel1;
        var b2.xmov = xVel2;
        var b1.ymov = yVel1;
        var b2.ymov = yVel2;
}

что я делаю не так? Спасибо

Dectora_Selfcit 18.07.2008 17:11

Столкнулась с такой же проблемой.

В моем случае я предполагаю, что такое безобразие происходит из-за того, что точек соприкосновения объектов получается много.

Возьмем мячик (кружок), ударяется о стену.
У кружка по радиусу получается до 360 точек соприкосновения. Скорость мяча все время разная, допустим за кадр он пробегает 5, будем так говорить, пикселей,
тогда пока он будет отскакивать получается он проскочить еще пару пискелей, от чего и получается что он дерагется.

Как решить этот вопрос?

Dectora_Selfcit 21.07.2008 17:53

Эй ребята, как так, это очень многим поможет.

robin_bobin2001 21.07.2008 18:59

в исходнике все события отслеживаются в:
Код:

_root.onEnterFrame = function (){
        _root.moveball();
        _root.detected3();
        _root.mov();
}

нужно как-то пытаться отслеживать столкновения биты с мячиком в onMouseMove. Я прицепил на основной таймлайн дополнительно:
Код:

_root.onMouseMove=function(){
        _root.detected3();
        }

вроде не так заметны залипания...

big_shtorm 22.07.2008 17:07

Ребят, попробывал все сделать по книге...собрал необходимые функции в одну кучу и получилось неплохо...только вот для шаров которые катаються "сами по себе" типа бильярд...но когда перевожу управление одним шаром на мышь получается лажа ((( может надо както по другому подойти к этому всему подскажите кто сталкивался ато скоро ап стену уже убьюсь :wacko:

big_shtorm 24.07.2008 14:16

Вложений: 2
ура...
Проблему решил добовлением дополнительной проверки по сумме радиусов...которая вызывает функцию прощета новых векторных скоростей со статичным временным параметром...т.е. работают 2 проверки первая основная прощитывает на 1 кадр вперед (котроя к стати и не всегда срабатывала почемуто) и проверка по сумме радиусов.
выкладываю исходники, может кому пригодяться иль лучше сделает...(не забыв об авторе :rolleyes:)
billard - это для бильярда и т.п. с сохранением почти всех законов физики(для добавления затухания нужно добавить переменную со значением от 0 до 1 и в каждом кадре умножать ускорение жаров на нее)
airhockey - собственно хоккей.
P.S. спосибо всем кто учавствовал.


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

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