书上这段代码已经研究许久了,终于有点头绪了,
其中关键代码是
speed ++;
temp.x = Math.sin(speed*Math.PI/180)*radius+100;
temp.y =- Math.sin(speed*Math.PI/180)*radius+100;
细心的你也许会发现,化简完竟然是x=r*sina,天哪,简谐运动。
互动百科:
简谐运动 - 简谐运动方程
一个做匀速圆周运动的物体在一条直径上的投影所做的运动即为简谐运动:R是匀速圆周运动的半径,也是简谐运动的振幅;ω是匀速圆周运动的角速度,也叫做简谐运动的圆频率,ω=√(k/m);φ是t=0时匀速圆周运动的物体偏离该直径的角度(逆时针为正方向),叫做简谐运动的初相位。在t时刻,简谐运动的位移x=Rcos(ωt+φ),简谐运动的速度v=-ωRsin(ωt+φ),简谐运动的加速度a=-(ω^2)Rcos(ωt+φ),这三个式子叫做简谐运动的方程。
然后,代码就全部明白了。使小球做简谐运动的同时,满足两个原则:
1.近大远小
2.远处alpha减小。
然后可以写一个粗糙的程序看看效果:
s1.addEventListener(Event.ENTER_FRAME,D_move);
var temp;
var radius:uint = 120; //立体旋转半径
var speed:Number = 1;
function D_move(evt:Event) {
temp=evt.target;
speed += 3;
temp.x = Math.sin(speed*Math.PI/180)*radius;
temp.y =300;
temp.scaleX = temp.scaleY=(Math.cos(speed*Math.PI/180)*100+70)/100;//scaleX scaleY --拉伸
temp.alpha = (Math.cos(speed*Math.PI/180)*100+100)/100;//alpha ---改变透明度
trace(temp.x,temp.y );
}
基本效果已经有了,如果有很多球呢,还要复杂一下:
书上的代码原封拷过来:
var $radius:uint = 120; //立体旋转半径
var $factor:uint = 90;
var $speed:Number = 0;
var $num:uint = 10;
var $temp;
for (var $i:uint=1; $i<=$num; $i++) { //10张图片。i从1到10
this["s"+$i].$range = 0; //range代表 旋转角度
this["s"+$i].$sin = 0; //正弦函数值
this["s"+$i].$cos = 0;
this["s"+$i].$s = $i;
this["s"+$i].$dx = Math.random()*200-100;
this["s"+$i].$dy = Math.random()*200-100;
this["s"+$i].$da = 360/$num*$i;
this["s"+$i].buttonMode=true;
this["s" + $i].addEventListener(Event.ENTER_FRAME,$3D_move);
}
function $3D_move($evt:Event) {
$temp=$evt.target;
$speed += -(stage.mouseX-stage.stageWidth/2)/400; //stage.mouseX--鼠标x坐标 stage.stageWidth--舞台宽度
$temp.$range = ($speed+$temp.$da)*Math.PI/180;
$temp.$sin = Math.sin($temp.$range);
$temp.$cos = Math.cos($temp.$range);
$temp.x =$temp.$sin*$radius+stage.stageWidth/2+$temp.$dx;
if ($temp.$s%2 == 1) {
$temp.y = -$temp.$sin*$radius+stage.stageWidth/2+$temp.$dy;
} else {
$temp.y = $temp.$sin*$radius+stage.stageHeight/2+$temp.$dy; //stage.stageHeight--舞台高度
}
$temp.scaleX = $temp.scaleY=($temp.$cos*$factor+70)/100;//scaleX scaleY --拉伸
$evt.target.alpha = ($temp.$cos*$factor+100)/100;//alpha ---改变透明度
$temp.$stack = Math.round(($temp.$cos+1)*5);
this.setChildIndex($temp,$temp.$stack);
}
里面还是有一些小问题的,不过总体来说,已经可以达到效果。
总结:编程除了算法,还要多了解些物理的,暑假在家写了个碰撞的代码,深深被物理的伟大折服。
参考文献:
【1】叶翊霳《FLASH actionscript 程序设计经典商业范例集》清华大学出版社 134-137