当前位置: 首页 > 图文教程 > Flash动画 > Flash动画制作 > Flash实例教程:用AS3代码制作交互式3D旋转动画效果

Flash动画制作
Flash5任意两点间随机画线(二)
Flash5的DATE对象(一)
Flash5任意两点间随机画线(四)
Flash 神奇遮罩之图片篇(2)
Flash 神奇遮罩之应用篇(3)
Flash MX的自由变形工具(4)
利用Flash MX模板制作XML动态菜单(3)
Freehand和Flash的结合应用(9)
Flash5 位移操作(一)
Flash5任意两点间随机画线(五)
Flash 神奇遮罩之应用篇(2)
Flash 神奇遮罩教程之以假乱真篇
Flash 神奇遮罩之透明度篇(3)
实例学用Flash MX增强的AS功能(3)
利用Flash MX模板制作XML动态菜单(5)
Flash5任意两点间随机画线(一)
Flash层的运用(二)
Flash 神奇遮罩之应用篇(4)
Flash 神奇遮罩之综合篇(2)
Flash 神奇遮罩之综合篇(1)

Flash动画制作 中的 Flash实例教程:用AS3代码制作交互式3D旋转动画效果


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-22   浏览: 391 ::
收藏到网摘: n/a

当鼠标单击某个图标时使之旋转,并让图标显示在屏幕的最前面。

//定义旋转的最终角度
var endAngle:Number = 90;
//保存已经旋转的角度
var tempAngle:Number = 0;
//保存旋转的状态
var isRotating:Boolean = true;
//注册图标的单击事件
mc.addEventListener(MouseEvent.MOUSE_DOWN,startRotation);
//定义侦听器函数
function startRotation(e:MouseEvent):void
{
//得到图标
var currentIcon::MovieClip = e.target;
//得到图标的角度
enaAngle = atan2D(currentIcon.y,cosD(currentIcon.angle) * disy);
//计算旋转的度数
endAngle = (endAngle > -180&&endAngle < -90) ? - 270 - endAngle:90 - endAngle;
//单击后旋转,需要注册enterFrame事件侦听器
menu.addEventListener(Event.ENTER_FRAME,moveMenu);
}

每次旋转前要重新初始化旋转角度
function initAngle(b:Boolean)
{
//如果处于旋转状态保存角度
if (isRotating)
//保存图标角度
tempAngle += speed;
//旋转速度重新设置为0
speed = 0;
//设置旋转状态
isRotating = b;
}

修改函数moveMenu():

function moveMenu(e:Event):void
{
var iconCount:int = menu,numChildren;
var depthArrat:Array = new Array();
var angle:Number = 360 / iconCount;
for (var z:int; z < iconCount; z++)
{
var mc:MovieClip = menu.getChildAt(z);
mc.gotoAndStop(z + 1);
//把图标角度保存在mc的动态属性中
mc.angle = tempAngle + speed + angle * z;
mc.x = cosD(mc.angle) * disy;
mc.y = sinD(mc.angle) * disy;
depthArray[z] = mc;
setProp(mc, "alpha");
setProp(mc, "scaleX", .2, .7);
setProp(mc, "scaleY", .2, .7);
}
arrange(depthArray);
//利用缓冲公式把图标旋转到endAngle角度
speed += (endAngle - speed) * .2;
if (Math.abs(speed - endAngle) < 1)
{
//移除事件侦听器
menu.removeEventListener(Event.ENTER_FRAME,moveMenu);
initAngle(false);
}
}

下面给出完整代码

1. include "Math2.as"
2. stage.frameRate = 30;
3.

4. var disx:Number = 200;
5. var disy:Number = 10;
6. var speed:Number = 0;
7.

8. var endAngle:Number = 90;
9. var tempAngle:Number = 0;
10. var isRotating:Boolean = true;
11.

12. var menu:Sprite = new Sprite();
13. menu.x = 300;
14. menu.y = 200;
15. menu.addEventListener(Event.ENTER_FRAME,moveMenu);
16. this.addChild(menu);
17.

18. initMenu(5);
19. function initMenu(n:int) {
20. for (var i:int; i<n; i++) {
21. var mc:MovieClip = new IconMenu();
22. mc.scaleX = mc.scaleY = .5;
23. mc.addEventListener(MouseEvent.MOUSE_DOWN,startRotation);
24. menu.addChild(mc);
25. }
26. }
27. function initAngle(b:Boolean) {
28. if (isRotating) {
29. tempAngle += speed;
30. }
31. speed = 0;
32. isRotating = b;
33. }
34. function startRotation(e:MouseEvent):void {
35. var currentIcon:MovieClip = e.target;
36. endAngle = atan2D(currentIcon.y,cosD(currentIcon.angle)*disy);
37. endAngle = (endAngle> -180&&endAngle < -90)? -270 - endAngle:90 - endAngle;
38. initAngle(true);
39. menu.addEventListener(Event.ENTER_FRAME,moveMenu);
40. }
41. function moveMenu(e:Event):void {
42. var iconCount:int = menu.numChildren;
43. var depthArray:Array = new Array();
44. var angle:Number = 360 / iconCount;
45. for (var z:int; z<iconCount; z++) {
46. var mc:MovieClip = menu.getChildAt(z);
47. mc.gotoAndStop(z + 1);
48. mc.angle = tempAngle + speed+angle * z;
49. mc.x = cosD(mc.angle) * disx;
50. mc.y = sinD(mc.angle) * disy;
51. depthArray[z] = mc;
52. setProp(mc,"alpha");
53. setProp(mc,"scaleX",.2,.7);
54. setProp(mc,"scaleY",.2,.7);
55. }
56. arrange(depthArray);
57. speed += (endAngle-speed) * .2;
58. if (Math.abs(speed - endAngle) < 1) {
59. menu.removeEventListener(Event.ENTER_FRAME,moveMenu);
60. initAngle(false);
61. }
62. }
63. function arrange(depthArray:Array):void {
64. depthArray.sortOn("y", Array.NUMERIC);
65. var i:int = depthArray.length;
66. while (i--) {
67. menu.setChildIndex(depthArray[i], i);
68. }
69. }
70.

71. function setProp(mc:MovieClip,prop:String,n1:Number = .5, n2:Number = 1):void {
72. mc[prop] = ((mc.y + 2 * disy) / disy - 1) / 2 * (n2 - n1) + n1;
73. }