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