Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flash 平滑自定义AS3 Movieclip排斥功能_Flash_Actionscript 3_Function_Physics_Movieclip - Fatal编程技术网

Flash 平滑自定义AS3 Movieclip排斥功能

Flash 平滑自定义AS3 Movieclip排斥功能,flash,actionscript-3,function,physics,movieclip,Flash,Actionscript 3,Function,Physics,Movieclip,我为2个movieclips编写了这个排斥函数(如下),我从计时器调用它,而不是从输入帧侦听器(速度)调用它,但它有抖动的趋势,并且不是很平滑。我怎样才能使动作平稳?我在想可能会添加一些填充物之类的东西,但idk…任何帮助都将不胜感激 Thanx:) 功能排斥(mover2,mover){ var xdiff:Number=mover2.x-mover.x; var ydiff:Number=mover2.y-mover.y; var dist:Number=Math.sqrt(xdiff*xd

我为2个movieclips编写了这个排斥函数(如下),我从计时器调用它,而不是从输入帧侦听器(速度)调用它,但它有抖动的趋势,并且不是很平滑。我怎样才能使动作平稳?我在想可能会添加一些填充物之类的东西,但idk…任何帮助都将不胜感激

Thanx:)

功能排斥(mover2,mover){
var xdiff:Number=mover2.x-mover.x;
var ydiff:Number=mover2.y-mover.y;
var dist:Number=Math.sqrt(xdiff*xdiff+ydiff*ydiff);
如果(距离<(移动2.width/2+移动2.width/2)){
变量角度:数值=数学值atan2(ydiff,xdiff);
如果((mover.x-Math.cos(角度)*10)-(mover.width/2)>minx&&(mover.x-Math.cos(角度)*10)+(mover.width/2)miny&&(mover.y-Math.sin(角度)*10)+(mover.height/2)minx&&(mover2.x-Math.cos(角度)*10)+(mover2.width/2)miny&&(mover2.y-Math.sin(角度)*10)+(mover2.height/2)
我不确定你想要达到什么样的排斥效果,但你可以将你的代码建立在一个简单的物理原理上:两个质量之间的引力。你可以在网上了解更多。以下是公式(来自维基百科):

F是两点质量之间引力的大小,
G是重力常数(约9.81 m/s²),
m1是第一点质量的质量,
m2是第二点质量的质量,
r是两点质量之间的距离

如果不想计算质量(即两个对象的质量均为1),可以简化此过程:

这很好,但正如定义所说,F只是力的大小,也就是说,你不知道方向,只知道量。要获得方向,需要一些向量:

F_12=-G/r_12²*ru_12

其中:

F_12是物体1对物体2的作用力矢量。
G仍然是引力常数
r_12是对象1和对象2之间的距离。
ru_12是从对象1到对象2的单位向量

查看一篇关于向量的流畅介绍,从所有这些三角函数的东西中解放出来

但请注意,引力是一种引力。通过反转其方向,可以很容易地将其更改为斥力

实施 好了,关于理论已经够了。我已经实现了一个模拟这个的函数

//make sure you set your initial conditions
obj2.vx = 0;
obj2.vy = 0;

function repel(obj1:MovieClip, obj2:MovieClip) {

    var G:Number = 100; // gravitationnal constant. You can play with this to get more or less force.
    var res:Number = 0.9; //a coeffient which reduce the speed when the object hits a wall.

    //this is a vector from obj1 pointing to obj2
    var distVector:Point = new Point();
    distVector.x = obj2.x - obj1.x;
    distVector.y = obj2.y - obj1.y;

    var distance:Number = Math.sqrt(distVector.x*distVector.x + distVector.y*distVector.y);
    //a unit vector is a vector of length 1
    var unit:Point = distVector.clone();
    unit.x /= distance;
    unit.y /= distance;

    //here's the actual formula
    var force:Point = new Point();
    force.x = G / (distance*distance) * unit.x;
    force.y = G / (distance*distance) * unit.y;

    //we don't have any mass, so a = F
    var ax:Number = force.x;
    var ay:Number = force.y;

    //simple integration
    obj2.vx += ax;
    obj2.vy += ay;

    obj2.x += obj2.vx;
    obj2.y += obj2.vy;

    // bounce to stage dimension
    if(obj2.x < 0){
        obj2.x = 0;
        obj2.vx = -res*obj2.vx;
    }

    if(obj2.x > stage.stageWidth){
        obj2.x = stage.stageWidth;
        obj2.vx = -res*obj2.vx;
    }

    if(obj2.y < 0){
        obj2.y = 0;
        obj2.vy = -res*obj2.vy;
    }

    if(obj2.y > stage.stageHeight){
        obj2.y = stage.stageHeight;
        obj2.vy = -res*obj2.vy;
    }

}
//确保设置了初始条件
obj2.vx=0;
obj2.vy=0;
功能排斥(obj1:MOVICLIP,obj2:MOVICLIP){
var G:Number=100;//引力常数。你可以用它来获得更多或更少的力。
var res:Number=0.9;//当物体撞击墙壁时降低速度的系数。
//这是从obj1指向obj2的向量
var distVector:Point=新点();
distVector.x=obj2.x-obj1.x;
distVector.y=obj2.y-obj1.y;
变量距离:Number=Math.sqrt(distVector.x*distVector.x+distVector.y*distVector.y);
//单位向量是长度为1的向量
变量单位:Point=distVector.clone();
单位x/=距离;
单位y/=距离;
//这是实际公式
变量力:点=新点();
力x=G/(距离*距离)*单位x;
力y=G/(距离*距离)*单位y;
//我们没有质量,所以a=F
var ax:Number=force.x;
var ay:数值=力y;
//简单积分
obj2.vx+=ax;
obj2.vy+=ay;
obj2.x+=obj2.vx;
obj2.y+=obj2.vy;
//反弹到舞台维度
如果(obj2.x<0){
obj2.x=0;
obj2.vx=-res*obj2.vx;
}
如果(obj2.x>stage.stageWidth){
obj2.x=stage.stageWidth;
obj2.vx=-res*obj2.vx;
}
if(obj2.y<0){
obj2.y=0;
obj2.vy=-res*obj2.vy;
}
如果(obj2.y>stage.stageHeight){
obj2.y=stage.stageHeight;
obj2.vy=-res*obj2.vy;
}
}
要使用它,请定期调用repel。请注意,obj1不会受到模拟的影响。在我的原型中,obj1跟随鼠标

试试看,告诉我你的想法


另一方面,使用Timer类并不比以任何方式收听ENTER_FRAME快。请参阅及其两篇相关文章以获得更好的理解。

我不确定您想要达到何种排斥效果,但您可以将代码基于一个简单的物理原理:两个质量之间的引力。你可以在网上了解更多。以下是公式(来自维基百科):

F是两点质量之间引力的大小,
G是重力常数(约9.81 m/s²),
m1是第一点质量的质量,
m2是第二点质量的质量,
r是两点质量之间的距离

如果不想计算质量(即两个对象的质量均为1),可以简化此过程:

这很好,但正如定义所说,F只是力的大小,也就是说,你不知道方向,只知道量。要获得方向,需要一些向量:

F_12=-G/r_12²*ru_12

其中:

F_12是物体1对物体2的作用力矢量。
G仍然是引力常数
r_12是对象1和对象2之间的距离。
ru_12是从对象1到对象2的单位向量

查看一篇关于向量的流畅介绍,从所有这些三角函数的东西中解放出来

但请注意重力
F = G * (m1 * m2) / r²
F = G / r²
//make sure you set your initial conditions
obj2.vx = 0;
obj2.vy = 0;

function repel(obj1:MovieClip, obj2:MovieClip) {

    var G:Number = 100; // gravitationnal constant. You can play with this to get more or less force.
    var res:Number = 0.9; //a coeffient which reduce the speed when the object hits a wall.

    //this is a vector from obj1 pointing to obj2
    var distVector:Point = new Point();
    distVector.x = obj2.x - obj1.x;
    distVector.y = obj2.y - obj1.y;

    var distance:Number = Math.sqrt(distVector.x*distVector.x + distVector.y*distVector.y);
    //a unit vector is a vector of length 1
    var unit:Point = distVector.clone();
    unit.x /= distance;
    unit.y /= distance;

    //here's the actual formula
    var force:Point = new Point();
    force.x = G / (distance*distance) * unit.x;
    force.y = G / (distance*distance) * unit.y;

    //we don't have any mass, so a = F
    var ax:Number = force.x;
    var ay:Number = force.y;

    //simple integration
    obj2.vx += ax;
    obj2.vy += ay;

    obj2.x += obj2.vx;
    obj2.y += obj2.vy;

    // bounce to stage dimension
    if(obj2.x < 0){
        obj2.x = 0;
        obj2.vx = -res*obj2.vx;
    }

    if(obj2.x > stage.stageWidth){
        obj2.x = stage.stageWidth;
        obj2.vx = -res*obj2.vx;
    }

    if(obj2.y < 0){
        obj2.y = 0;
        obj2.vy = -res*obj2.vy;
    }

    if(obj2.y > stage.stageHeight){
        obj2.y = stage.stageHeight;
        obj2.vy = -res*obj2.vy;
    }

}