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

Flash动画制作
fmx2004 1000问(5)
Flash MX 2004 组件事件简单调试器
fmx2004 1000问(2)
Action Script 2.0新手调试
Flash 2004 MX Components
flash action 详解(9)
flash action 详解(7)
flash action 详解(1)
flash action 详解(6)
一个用纯AS写的正态曲线画法
flash action 详解(3)
浅谈AS的绘图功能及几个简单的实例
AS的基本代码解释(2)
flash action 详解(2)
flash action 详解(10)
运用for循环来对多个mc进行检测
极坐标在绘画方法中的运用
用Flash 2004编写简单的运算类
flash action 详解(4)
flash action 详解(5)

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-11-22   浏览: 407 ::
收藏到网摘: 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. }