Actionscript 3 如何为鼠标跟随者沿预定义路径创建平滑运动?

Actionscript 3 如何为鼠标跟随者沿预定义路径创建平滑运动?,actionscript-3,flash,Actionscript 3,Flash,我想做一个追踪游戏。我希望我的圆圈在用户跟踪字母时跟随路径(字母的路径)。用户无法返回已跟踪的区域 import flash.events.Event; import flash.geom.Point; var i: Number; var size: int = 80; var down: Boolean = false; var up: Boolean = true; var inside: Boolean = true; v

我想做一个追踪游戏。我希望我的圆圈在用户跟踪字母时跟随路径(字母的路径)。用户无法返回已跟踪的区域

    import flash.events.Event;
    import flash.geom.Point;

    var i: Number;
    var size: int = 80;
    var down: Boolean = false;
    var up: Boolean = true;
    var inside: Boolean = true;
    var outside: Boolean = true;
    var circle: Shape = new Shape();

    stage.addEventListener(Event.ENTER_FRAME, loop);
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseup);
    char.addEventListener(MouseEvent.MOUSE_DOWN, mousedown);

    function loop(e: Event) {
if (down == true) {
    // Checks if mouse pointer is on path i.e 'S' alphabet
    if (s.hitTestPoint(stage.mouseX, stage.mouseY, true)) {
        inside = true;
        outside = true;

        var point: Point = maskobj.globalToLocal(new Point(stage.mouseX, stage.mouseY));
        var point2: Point = new Point();

        //Checks if mouse pointer is completely outside of drawn area
        for (i = 0; i < 2 * Math.PI; i += (2 * Math.PI) / 10) {
            point2.x = stage.mouseX + (size / 3) * Math.cos(i);
            point2.y = stage.mouseY + (size / 3) * Math.sin(i);
            if ((maskobj.hitTestPoint(point2.x, point2.y, true))) {
                outside = false;
                break;
            }
        }

        //Checks if mouse pointer is completely inside drawn area
        for (i = 0; i < 2 * Math.PI; i += (2 * Math.PI) / 10) {
            point2.x = stage.mouseX + (size / 3) * Math.cos(i);
            point2.y = stage.mouseY + (size / 3) * Math.sin(i);

            if (!(maskobj.hitTestPoint(point2.x, point2.y, true))) {
                inside = false;
                break;
            }
        }

        //Character will be moved only if mouse position not to far from current position
        if (outside == false) {
            if (inside == false) {
                //Increases drawn area by drawing a circle shape in 'maskobj' MovieClip

                circle.graphics.beginFill(0x0000ff);
                circle.graphics.drawCircle(point.x, point.y, size);
                circle.graphics.endFill();
                maskobj.addChild(circle);

                //Moves character to new position
                char.x = stage.mouseX;
                char.y = stage.mouseY;
            }
        }
    }
}
    }

    function mouseup(e: MouseEvent): void {
up = true;
down = false;
    }

    function mousedown(e: MouseEvent): void {
down = true;
up = false;
    }
导入flash.events.Event;
导入flash.geom.Point;
变量i:数量;
变量大小:int=80;
var-down:布尔值=false;
var-up:Boolean=true;
内部变量:布尔值=真;
外部变量:布尔值=真;
变量圆:形状=新形状();
stage.addEventListener(Event.ENTER_FRAME,循环);
stage.addEventListener(MouseEvent.MOUSE_UP,mouseup);
char.addEventListener(MouseEvent.MOUSE_DOWN,mousedown);
函数循环(e:事件){
如果(向下==真){
//检查鼠标指针是否位于路径上,即“S”字母
if(s.hitTestPoint(stage.mouseX,stage.mouseY,true)){
内=真;
外部=真;
变量点:点=maskobj.globalToLocal(新点(stage.mouseX,stage.mouseY));
变量point2:Point=新点();
//检查鼠标指针是否完全位于绘图区域之外
对于(i=0;i<2*Math.PI;i+=(2*Math.PI)/10){
点2.x=stage.mouseX+(大小/3)*数学cos(i);
点2.y=stage.mouseY+(大小/3)*数学sin(i);
if((maskobj.hitTestPoint(point2.x,point2.y,true))){
外部=假;
打破
}
}
//检查鼠标指针是否完全位于绘图区域内
对于(i=0;i<2*Math.PI;i+=(2*Math.PI)/10){
点2.x=stage.mouseX+(大小/3)*数学cos(i);
点2.y=stage.mouseY+(大小/3)*数学sin(i);
if(!(maskobj.hitTestPoint(point2.x,point2.y,true))){
内=假;
打破
}
}
//仅当鼠标位置离当前位置不远时,才会移动角色
如果(外部==错误){
如果(内部==错误){
//通过在“maskobj”MovieClip中绘制圆形来增加绘制面积
圆形图形填充(0x0000ff);
圆。图形。绘图圆(点x,点y,尺寸);
circle.graphics.endFill();
maskobj.addChild(圆圈);
//将角色移动到新位置
char.x=stage.mouseX;
char.y=stage.mouseY;
}
}
}
}
}
函数mouseup(e:MouseEvent):void{
向上=真;
向下=假;
}
函数mousedown(e:MouseEvent):void{
向下=真;
向上=错误;
}


当我追踪路径时,运动并不平滑。请有人提出一种方法使运动平稳,或者提出另一种方法来达到同样的效果。提前感谢。

尝试将文档中的FPS增加到当前的两倍
修改>文档…>帧速率

尝试将文档中的FPS增加到当前的两倍
修改>文档…>帧速率

在此之前,我创建了一个绘图游戏,允许用户绘制路径

不知道为什么恶作剧的答案被否决了,因为你需要做的第一件事是使用最高的帧速率,你可以侥幸逃脱。帧速率越高,曲线越平滑

我看到,如果满足条件,代码会在当前位置绘制一个圆。最好是从最后一个点.x/point.y到当前点绘制一条线,而不仅仅是一个圆,这样路径上就不会有任何洞

我无法回避这条线在绘制时是锯齿状的(一系列直线),但只要用户抬起手指,我就能够沿着他们绘制的线提取点,并用平滑的贝塞尔路径(一系列简单的贝塞尔曲线)替换它们,效果很好。当你有3个点(你需要3个点来画一条曲线)时,你也可以在飞行中这样做

关于如何实现这一点,有理论和代码示例。有关贝塞尔路径,请参阅页面下方的更多内容。您需要转换为AS3,但这并不困难

另一个技巧是在ENTER_框架内尽可能少地进行计算。您可以预先计算循环使用的两个值(2*Math.PI)和((2*Math.PI)/10),因为它们是常量。您还可以在函数顶部计算一次(size/3),特别是预先计算Math.sin(i)和Math.cos(i)的10个值,并将它们存储在一个数组中(基本上是一个LUT查找表),因为这是您正在进行的最重的数学运算


我的最后一个提示是,代码不会检查正在绘制的点是否非常接近最后绘制的点。我建议您这样做,并且仅在鼠标移动最小距离(例如2像素)后绘制点。否则,您可能会让鼠标静止在一个点上,而您的代码会毫无必要地在其上绘制一个又一个圆圈。

在此之前,我创建了一个绘图游戏,允许用户绘制路径

不知道为什么恶作剧的答案被否决了,因为你需要做的第一件事是使用最高的帧速率,你可以侥幸逃脱。帧速率越高,曲线越平滑

我看到,如果满足条件,代码会在当前位置绘制一个圆。最好是从最后一个点.x/point.y到当前点绘制一条线,而不仅仅是一个圆,这样路径上就不会有任何洞

我无法回避这条线在绘制时是锯齿状的(一系列直线),但只要用户抬起手指,我就能够沿着他们绘制的线提取点,并用平滑的贝塞尔路径(一系列简单的贝塞尔曲线)替换它们,效果很好。当你有3个点(你需要3个点来画一条曲线)时,你也可以在飞行中这样做

关于如何实现这一点,用理论和代码sampl