先锋动漫电子杂志
注册请使用正确的邮箱地址,注册需要邮箱激活
最新主题
» 宝马 跑车 --我来抢个位 呵呵
周六 八月 21, 2010 6:58 pm 由 帕瓦

» 《火影忍者》与《美食猎人》特别篇动画DVD
周四 一月 07, 2010 11:49 am 由 天贪之狼

» [海贼王]第10弹剧场版召开试看会
周三 一月 06, 2010 10:51 am 由 天贪之狼

» 再读《文学少女》第一卷《文学少女と死にたがりの道化》
周日 十二月 27, 2009 9:27 am 由 不灭蛇魂

» 惠临神明的文学少女
周日 十二月 27, 2009 9:16 am 由 不灭蛇魂

» 【COS】『K-START』社团〓〓Versailles〓〓预告
周日 十二月 13, 2009 10:41 pm 由 咻咻—撒麻

» 动画片《孔子》将播 打造经典国学动漫产品
周六 十二月 12, 2009 8:24 pm 由 Kinyo23

» fusion基本功能,或者说是后期软件基本功能总结。
周五 十二月 11, 2009 9:24 pm 由 shcsaa

» 一个动画小瘪三--“渣干”的故事
周三 十二月 09, 2009 11:34 am 由 xinyl

搜索
 
 

结果按:
 


Rechercher 高级搜索


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

向下

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

帖子  木头 于 周二 十二月 01, 2009 3:35 pm

本例为Flash AS3代码实例教程,教程讲解了通过用AS3制作交互式3D旋转动画效果,希望通过本教程的学习,能给朋友们带来帮助~~

效果演示:


〖本教程是3D旋转的升级版,添加交互性。前一部分的制作请参看3D旋转教程,版本AS3.0〗

使图标具有交互性:

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

//定义旋转的最终角度
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; i21. 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; z46. 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. }

木头

帖子数 : 13
注册日期 : 09-12-01

返回页首 向下

返回页首


 
您在这个论坛的权限:
不能在这个论坛回复主题