根据速度改变碰撞球的方向

时间:2010-01-04 18:05:40

标签: flash actionscript-3 math trigonometry

我正在制作乒乓球游戏。而且我希望能够根据对球拍的影响来控制球的方向。如果球在vy = 4时下降; vx = 4;

并且桨在vx = -5时向左移动;我希望球根据桨的移动速度稍微改变它的路线。这可能会减少碰撞时球的速度,因此当球向后移动时,球会更直(靠近Y轴)移动。但在我进行疯狂的试错之前,我想知道是否有人知道答案或者可能有任何消息来源。

我认为可能做到这一点的解决方案是测量球拍的速度。我的问题是桨由鼠标控制,没有一定的速度。我试图找出如何测量鼠标在x轴上行进的速度。

我可能会创建一个计时器,每隔几秒触发一次,以确定鼠标的位置和位置。计算差异,这将是速度

如果有人有任何答案,那就太好了。感谢

3 个答案:

答案 0 :(得分:1)

测量球拍速度的最简单方法是在前一帧中保持球拍位置的缓存,因此通过使x - xPrev得到此帧的球拍运动的增量或相对值速度。

从那个速度你可以将它作为修正器(可能缩小)添加到球的反射矢量的x速度中。

现在这听起来像一个简单的游戏,帧率应该不是问题。但是,如果您想跟踪速度,可以通过访问前一帧的总时间来进行简单的物理计算。允许在时间上保持一致的行为,与模拟的帧速率无关。

答案 1 :(得分:0)

K,我想出了解决办法。仍然需要处理我的碰撞检测。不是最伟大的。我的球有时会卡在桨中。我正在使用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;
        }

我仍然需要眨眼。但如果我继续努力我想我可以做到我想做的事。

答案 2 :(得分:0)

我能够解决这个问题。我发现在互联网上做了以下事情,物理学看起来更好。球仍不时卡在球拍内

更改了以下内容
xspeed = xspeed + (paddle.cspeed/10);

xspeed = xspeed + ( paddle.cspeed * .4 );