在flash as3中,怎样让小球沿着一条曲线运动?类似于祖玛游戏中的小球的运动。不要用引导层,要用AS代码。

跪求大神提供思路,或者给个简单的例子。谢谢!... 跪求大神提供思路,或者给个简单的例子。谢谢! 展开
 我来答
xlzzc
2013-01-12 · TA获得超过7301个赞
知道大有可为答主
回答量:4205
采纳率:50%
帮助的人:1452万
展开全部

一、路径首先是已知的。

1.用描点法,定大概。

2.再将上面的点位提取出坐标,加入数组:

var MapData=[];

var MapArray:Array =  [[879,57],[832,55],[648,48],[418,49],[142,68],[66,134],

[50,225],[53,335],[76,458],[135,542],[300,559],

[546,558],[677,542],[741,491],[746,378],[734,259],

[679,155],[564,150],[336,159],[180,193],[158,262],

[154,351],[207,434],[312,484],[482,474],[591,456],

[635,384],[613,277],[473,234],[309,251],[289,356],];

用下面原方法可查看路径:

function initMap(arr:Array) {

graphics.lineStyle(2,0xFFFFFF);

graphics.moveTo(arr[0][0],arr[0][1]);

for (var i:uint = 1; i<arr.length - 2; ++i) {

var xc:Number = (arr[i][0] + arr[i+1][0])/2;

var yc:Number = (arr[i][1] + arr[i+1][1])/2;

graphics.curveTo(arr[i][0],arr[i][1],xc,yc);

}

graphics.curveTo(arr[i][0],arr[i][1],arr[i+1][0],arr[i+1][1]);

}


3.再用贝赛尔曲线类,生成一定数量的关键点。

贝赛尔曲线类:

package {

import flash.geom.Point;

public class Bezier {

//  =====================================  属性

//  对外变量

private static var p_start:Point;// 起点

private static var p_ctrl:Point;// 贝塞尔点

private static var p_over:Point;// 终点

private static var step:uint;// 分割份数

//  辅助变量

private static var ax:int;

private static var ay:int;

private static var bx:int;

private static var by:int;

private static var A:Number;

private static var B:Number;

private static var C:Number;

private static var total_length:Number;// 长度

//  速度函数

private static function s(t:Number):Number {

return Math.sqrt(A * t * t + B * t + C);

}

//  长度函数

private static function L(t:Number):Number {

var temp_ctrl:Number = Math.sqrt(C + t * (B + A * t));

var temp_over:Number = (2 * A * t * temp_ctrl + B *(temp_ctrl - Math.sqrt(C)));

var temp3:Number = Math.log(B + 2 * Math.sqrt(A) * Math.sqrt(C));

var temp4:Number = Math.log(B + 2 * A * t + 2 * Math.sqrt(A) * temp_ctrl);

var temp5:Number=2*Math.sqrt(A)*temp_over;

var temp6:Number = (B * B - 4 * A * C) * (temp3 - temp4);

return (temp5 + temp6) / (8 * Math.pow(A, 1.5));

}

//  长度函数反函数,使用牛顿切线法求解

private static function InvertL(t:Number, l:Number):Number {

var t1:Number=t;

var t2:Number;

do {

t2 = t1 - (L(t1) - l)/s(t1);

if (Math.abs(t1-t2) < 0.000001) {

break;

}

t1=t2;

} while (true);

return t2;

}

//  返回所需总步数

public static function init($p_start:Point, $p_ctrl:Point, $p_over:Point, $speed:Number):uint {

p_start=$p_start;

p_ctrl=$p_ctrl;

p_over=$p_over;

//step = 30;

ax=p_start.x-2*p_ctrl.x+p_over.x;

ay=p_start.y-2*p_ctrl.y+p_over.y;

bx=2*p_ctrl.x-2*p_start.x;

by=2*p_ctrl.y-2*p_start.y;

A = 4*(ax * ax + ay * ay);

B = 4*(ax * bx + ay * by);

C=bx*bx+by*by;

//  计算长度

total_length=L(1);

//  计算步数

step = Math.floor(total_length / $speed);

if (total_length % $speed > $speed / 2) {

step++;

}

return step;

}

// 根据指定nIndex位置获取锚点:返回坐标和角度

public static function getAnchorPoint(nIndex:Number):Array {

if (nIndex >= 0 && nIndex <= step) {

var t:Number=nIndex/step;

//  如果按照线行增长,此时对应的曲线长度

var l:Number=t*total_length;

//  根据L函数的反函数,求得l对应的t值

t=InvertL(t,l);

//  根据贝塞尔曲线函数,求得取得此时的x,y坐标

var xx:Number = (1 - t) * (1 - t) * p_start.x + 2 * (1 - t) * t * p_ctrl.x + t * t * p_over.x;

var yy:Number = (1 - t) * (1 - t) * p_start.y + 2 * (1 - t) * t * p_ctrl.y + t * t * p_over.y;

//  获取切线

var Q0:Point = new Point((1 - t) * p_start.x + t * p_ctrl.x, (1 - t) * p_start.y + t * p_ctrl.y);

var Q1:Point = new Point((1 - t) * p_ctrl.x + t * p_over.x, (1 - t) * p_ctrl.y + t * p_over.y);

//  计算角度

var dx:Number=Q1.x-Q0.x;

var dy:Number=Q1.y-Q0.y;

var radians:Number=Math.atan2(dy,dx);

var degrees:Number=radians*180/Math.PI;

xx=int(xx*10)/10

yy=int(yy*10)/10

degrees=int(degrees*10)/10

return [xx, yy, degrees];

} else {

return [];

}

}

}

}

生成的点:


这些点就是路径!!!

这些点是代码的,不是引导线的!

二、应用:

【略,因为不在此问题中】

jycily
2013-01-11
知道答主
回答量:23
采纳率:0%
帮助的人:3.5万
展开全部
写出路径算法是最好的,可以用连续的关键点来组成路径。设置小球的每次step时移动的距离speed,然后在每次step时计算当前位置与下一个关键点的距离,如果距离大于speed则向下个关键点方向移动,设置当前位置为下个关键点,下一个关键点移动剩下的距离
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
show3show
2013-01-11 · TA获得超过396个赞
知道小有建树答主
回答量:671
采纳率:0%
帮助的人:724万
展开全部
如果你能写出路径算法是最好的,如果没有的话可以用连续的关键点来组成路径。设置小球的每次step时移动的距离speed,然后在每次step时计算当前位置与下一个关键点的距离,如果距离大于speed则向下个关键点方向移动,否则设置当前位置为下个关键点,然后向再下一个关键点移动剩下的距离。当关键点越多效果越好
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
天天适合
2013-01-11 · TA获得超过529个赞
知道答主
回答量:197
采纳率:0%
帮助的人:143万
展开全部
如果只是曲线,用三角函数不就行了吗?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式