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