Изменение направления мяча на базе столкновения на скорости - PullRequest
0 голосов
/ 04 января 2010

Я создаю игру в пинг-понг.И я хочу создать возможность контролировать направление мяча исходя из воздействия на весло.Если мяч падает при vy = 4;vx = 4;

и весло движется влево на vx = -5;Я хочу, чтобы мяч немного изменил свой ход в зависимости от того, насколько быстро движется весло.Это, вероятно, уменьшит vx скорость шаров при столкновении, поэтому заставит шар двигаться более прямо (близко к оси Y), когда он движется обратно вверх.Но прежде чем отправиться в сумасшедший путь проб и ошибок, я хотел узнать, знает ли кто-нибудь ответ или, возможно, у него есть какие-либо источники.

Я полагаю, что решение, вероятно, для этого будет измерять, насколько быстро веслособираетсяМоя проблема в том, что весло управляется мышью и не имеет определенной скорости.Я пытаюсь понять, как я могу измерить скорость перемещения моей мыши по оси X.

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

Если у кого-то есть ответы, это было бы здорово.спасибо

Ответы [ 3 ]

1 голос
/ 04 января 2010

Самый простой способ измерить скорость весла состоит в том, чтобы сохранить кэш позиции весла в предыдущем кадре, таким образом, имея x - xPrev, вы получите дельту движения весла для этого кадра или относительную скорость.

С этой скорости вы можете добавить ее как модификатор (вероятно, уменьшенный) в скорость x отраженного вектора шара.

Теперь это звучит как простая игра, и частота кадров не должна быть проблемой. Однако, для справки, если вы хотите отслеживать скорость, простые физические расчеты можно выполнить, имея доступ к общему времени предыдущего кадра. с учетом согласованного поведения по времени, независимо от частоты кадров моделирования.

0 голосов
/ 05 января 2010

Мне удалось кое-что решить проблему. Я нашел в интернете следующее: физика выглядит лучше. мяч все еще время от времени застревает в лопатке

Изменено следующее с

xspeed = xspeed + (paddle.cspeed/10);

до

xspeed = xspeed + ( paddle.cspeed * .4 );
0 голосов
/ 04 января 2010

К, я разобрался с решением. Все еще нужно работать над моим обнаружением столкновения, хотя. не самое большое. мой мяч иногда застревает в весле. Я использую тест на попадание объекта Flash. но все равно. это код, который я использовал, чтобы заставить его делать то, что я хочу. Кажется, что он поддерживает направление, в котором он предполагает идти, а иногда - нет.

Это работает, но проблема в том, что я сбиваю свою скорость с отрицательной стороны, поэтому иногда указания не совпадают. поскольку направление движения мяча определяется -1 или 1. если я выбиваю свою скорость в минус. это может привести к тому, что число будет противоположно тому, что предполагается.

Ниже в классе весла

public var cspeed:Number;
        private var timer:Timer;
        public var vx:Number = 0;
        public var vy:Number = 0;
        private var prevx:Number = 0;
        private var prevy:Number = 0;

        public function Paddle():void
        {
            timer = new Timer(60);
            timer.start();
            timer.addEventListener(TimerEvent.TIMER,checkSpeed);
        }


        private function checkSpeed(e:TimerEvent):void
        {
            if(prevx == 0)
            {
                prevx = x;
            }
            else
            {
                cspeed = x - prevx;
                prevx = 0;
            }
        }

Я проверяю наличие столкновений в своем классе мяча. так как это тот, кто поражает все. ниже код

следующее в моем классе мяча. в классе проверки стен он проверяет, попал ли он в стену или на весло. Я передал ссылку моего весла на урок мяча.

private function checkWalls():void
        {

            if(y > sRef.stageHeight || y < 0)
            {
                yDir = yDir * -1;
            }
            else if ( x > sRef.stageWidth || x < 0)
            {
                xDir = xDir * -1;
            }
             //trace(dist);
            /*var dx:Number = paddle.x - x;
            var dy:Number = paddle.y - y;
            var dist:Number = Math.sqrt(dx * dx + dy * dy);*/


             if(hitTestObject(paddle))
             {
                 xspeed = (paddle.cspeed/100) + xspeed;
                 yDir = yDir * -1;
             }
            //trace(paddle.cspeed);
        }

        private function moveBall():void
        {

            x += xspeed * xDir;
            y += yspeed * yDir;
        }

Мне все еще нужно подмигнуть ALOT. но если я над этим работаю. я думаю, что смогу заставить его делать то, что я хочу.

...