Flash 基于速度更改碰撞时球的方向

Flash 基于速度更改碰撞时球的方向,flash,actionscript-3,math,trigonometry,Flash,Actionscript 3,Math,Trigonometry,我正在制作一个乒乓球游戏。我想创造一种能力,根据对球拍的影响来控制球的方向。如果球在vy=4时落下;vx=4 桨在vx=-5处向左移动;我想让球稍微改变它的路线,这取决于球拍移动的速度。这可能会降低碰撞时球的vx速度,从而使球在向上移动时移动得更直(靠近Y轴)。但在我开始疯狂的试错之旅之前,我想知道是否有人知道答案或者可能有任何来源 我想这样做的解决方案可能是测量桨的速度。我的问题是桨是由鼠标控制的,没有一定的速度。我想知道如何测量鼠标在x轴上移动的速度 我可能会创建一个计时器,每隔几秒钟启动一

我正在制作一个乒乓球游戏。我想创造一种能力,根据对球拍的影响来控制球的方向。如果球在vy=4时落下;vx=4

桨在vx=-5处向左移动;我想让球稍微改变它的路线,这取决于球拍移动的速度。这可能会降低碰撞时球的vx速度,从而使球在向上移动时移动得更直(靠近Y轴)。但在我开始疯狂的试错之旅之前,我想知道是否有人知道答案或者可能有任何来源

我想这样做的解决方案可能是测量桨的速度。我的问题是桨是由鼠标控制的,没有一定的速度。我想知道如何测量鼠标在x轴上移动的速度

我可能会创建一个计时器,每隔几秒钟启动一次,以确定鼠标的位置和所在位置。算出差别,这就是速度


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

测量桨叶速度的最简单方法是在前一帧中保留桨叶位置的缓存,因此通过使用x-xPrev,您可以获得此帧桨叶移动的增量或相对速度

根据该速度,您可以将其作为修改器(可能缩小)添加到球反射向量的x速度中


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

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;
        }
私有函数checkWalls():void
{
如果(y>sRef.stageHeight | | y<0)
{
yDir=yDir*-1;
}
否则如果(x>sRef.stageWidth | | x<0)
{
xDir=xDir*-1;
}
//微量元素(dist);
/*变量dx:Number=paile.x-x;
变量dy:数字=桨。y-y;
var dist:Number=Math.sqrt(dx*dx+dy*dy)*/
if(hitTestObject(拨片))
{
xspeed=(桨速/100)+xspeed;
yDir=yDir*-1;
}
//跟踪(桨式cspeed);
}
私有函数moveBall():void
{
x+=xspeed*xDir;
y+=y速度*yDir;
}

我还需要好好休息一下。但如果我努力的话。我想我可以让它做我想做的事。

我能够解决一些问题。我发现在网上做了下面的物理和一些看起来更好的东西。球仍不时卡在桨内

将以下内容从

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


如果这恰巧太过紧张,你可以记录下前几帧的x值,并对它们进行平均/过滤,以获得更平滑的效果。我将不得不对此进行研究。是的,我想我会设置一个计时器,它会触发一个如此多x毫秒的事件来记录距离。我很好奇,想知道有没有什么吸引人的公式。如果不是的话,我可能会以我的鼠标的速度,减去一点球的vx。为了扩展Cookieoff的说法,数字滤波器可能是使球平滑的最简单的方法。这里有一个简单的低通滤波器:v=f*input+(1-f)*v。f在0和1之间。f的值越大,过滤就越少。一个简单的解决方案是,当检测到击球时,在更改所需的属性(速度、方向等)后,恢复到先前的位置(当它还没有击球时),然后移动球。我多少明白你的意思。你能把它放在psuedo里吗??
xspeed = xspeed + ( paddle.cspeed * .4 );