Flash AS3 - Ball Physics (быстрое движение и маленькие объекты на пути) - PullRequest
1 голос
/ 01 апреля 2012

После того, как вы много прочли о физике шаров, посмотрите несколько примеров и несколько дней попыток сделать пинбол с растровыми изображениями, мне нужна помощь. Я использую простой (простой в работе) и высокопроизводительный движок Physics AS3 для растровых изображений http://coreyoneil.com/portfolio/index.php?project=5, но все еще не могу решить следующую проблему: если шар движется слишком быстро и объект на пути слишком мал, обнаружение столкновений не будет (код отлично работает только с большими объектами или если мяч движется медленнее). Я не очень хорош в физике и математике. Вот код функции, который делает физику для шара на каждой частоте кадров (но, возможно, лучше изменить его на setTimeout):

    function showFrame(e:Event) // onEnterFrame
    {
        var collisions:Array = collisionlist.checkCollisions();
        if(collisions.length) // if collision
        {
            var collision:Object = collisions[0]; // get collision information
            var angle:Number = collision.angle; // get collision angle
            var overlap:int = collision.overlapping.length; // get collision overlap
            var sin:Number = Math.sin(angle);
            var cos:Number = Math.cos(angle);
            var vx0:Number = vx * cos + vy * sin;
            var vy0:Number = vy * cos - vx * sin;
            vx0 = ((mass - immovable) * vx0) / (mass + immovable); // var immovable:Number=10000; var mass:Number=immovable*2;
            vx = vx0 * cos - vy0 * sin;
            vy = vy0 * cos + vx0 * sin;
            vx -= cos * overlap / radius; // radius=Math.round(ball.width/2);
            vy -= sin * overlap / radius;
            vx += speed; // var speed:Number=0;
        }           
        vy += gravity; // var gravity:Number=0.75;
        vy *= friction; // var friction:Number=0.981;
        vx *= friction;
        ball.x += vx;
        ball.y += vy;
        //setTimeout(showFrame, 20);
    }

Ответы [ 2 ]

0 голосов
/ 01 апреля 2012

Вы могли бы использовать подэтапы.

Это просто, но хорошо работает, в основном вы делите свои скорости на желаемое количество шагов, а затем получаете цикл for, который проверяет столкновения на этих приращениях.1004 * Вот хороший пример / учебник: http://www.samclifton.com/tutorials.php?tut=2

0 голосов
/ 01 апреля 2012

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

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