在flash as3中,怎样让小球沿着一条曲线运动?类似于祖玛游戏中的小球的运动.不要用引导层,要用AS代码.
来源:学生作业帮 编辑:大师作文网作业帮 分类:综合作业 时间:2024/11/10 12:19:28
在flash as3中,怎样让小球沿着一条曲线运动?类似于祖玛游戏中的小球的运动.不要用引导层,要用AS代码.
跪求大神提供思路,或者给个简单的例子.谢谢!
跪求大神提供思路,或者给个简单的例子.谢谢!
一、路径首先是已知的.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)/10yy=int(yy*10)/10degrees=int(degrees*10)/10return [xx, yy, degrees];} else {return [];}}}}生成的点:
这些点就是路径!这些点是代码的,不是引导线的!二、应用:【略,因为不在此问题中】
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)/10yy=int(yy*10)/10degrees=int(degrees*10)/10return [xx, yy, degrees];} else {return [];}}}}生成的点:
这些点就是路径!这些点是代码的,不是引导线的!二、应用:【略,因为不在此问题中】
flash中当复制出一个小球时,你要让这个小球以一定速度运动的代码是什么?
flash as3.0 物体运动的代码怎么写?
一个很简单的flash,一个小球沿一条线运动?
谁会这种做圆周运动的flash as3代码
flash怎样做小球依次按正方形轨迹运动
flash 按在引导层画出的轨迹运动,怎么让元件一直以轨迹方向为水平线方向自己翻转
Flash中AS2.0的代码能不能麻烦帮我换成AS3.0的 on (release) { gotoAndPlay("开场
(1)在做“研究平抛运动”的实验时,让小球多次沿着一轨道运动,通过描点法画小球做平抛运动的轨迹,为了能较准确的描绘运动轨
在探究平抛运动在水平方向的运动规律的实验中,如果不画小球的运动轨迹,直接让小球
大二的,需要做两个Flash,不是小球运动的,是有点复杂的,比如说小鸟振翅在天空中飞翔,小鸟在天空飞,
在用斜槽轨道做“研究平抛物体运动”的实验中,让小球多次沿同一轨道运动,通过描点法画出小球平抛运动的轨迹.
求一个 as3计算器要是类的形式 可以在flash builder中运行