0

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

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

我认为可能这样做的解决方案是测量桨的速度。我的问题是桨是由鼠标控制的,没有一定的速度。我试图弄清楚如何测量鼠标在 x 轴上的移动速度。

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

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

4

3 回答 3

1

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

从该速度,您可以将其作为修改器(可能按比例缩小)添加到球反射矢量的 x 速度中。

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

于 2010-01-04T18:09:49.870 回答
0

我能够解决这个问题。我在互联网上发现可以执行以下操作,并且物理看起来更好一些。球仍然不时卡在桨内

更改了以下内容

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

xspeed = xspeed + ( paddle.cspeed * .4 );
于 2010-01-04T21:12:41.953 回答
0

K,我想出了解决方案。不过,仍然需要进行我的碰撞检测。不是最伟大的。我的球有时会卡在桨中。我正在使用闪光灯对象命中测试。但无论如何。这是我用来让它有点我想要它做的代码。似乎它有时支持它应该去的方向,有时它不支持。

它有效,但问题是我将我的速度降低到负数,所以有时方向是错误的。因为球移动的方向由-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;
        }

我仍然需要经常眨眼。但如果我努力的话。我想我可以让它做我想做的事。

于 2010-01-04T18:57:17.857 回答