查看: 3687|回复: 4
打印 上一主题 下一主题

FLASH 3D 旋转代码

[复制链接]
.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

跳转到指定楼层
楼主
发表于 2012-10-31 17:34:58 |只看该作者 |倒序浏览
〖本教程是3D旋转的升级版,添加交互性。前一部分的制作请参看3D旋转教程,版本AS3.0〗
使图标具有交互性:
鼠标单击某个图标时使之旋转,并让图标显示在屏幕的最前面。
//定义旋转的最终角度

var endAngle:Number = 90;

//保存已经旋转的角度

var tempAngle:Number = 0;

//保存旋转的状态

var isRotating:Boolean = ***e;

//注册图标的单击事件

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 = ***e;

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(***e);

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);

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. }

⊙该文章转自[大赛人网站(技能大赛技术资源网)-DasaiRen.com]
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

2508

主题

2

听众

3万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
32806
精华
12

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2012-11-2 09:28:16 |只看该作者
回复

使用道具 举报

.    

3797

主题

11

听众

5万

积分

首席设计师

Rank: 8Rank: 8

纳金币
32328
精华
41

活跃会员 优秀版主 荣誉管理 论坛元老

板凳
发表于 2012-11-8 21:27:35 |只看该作者
这是一个好帖子,大家快来围观!!
回复

使用道具 举报

无效楼层,该帖已经被删除

0

主题

1

听众

2458

积分

中级设计师

Rank: 5Rank: 5

纳金币
0
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2014-2-22 15:23:15 |只看该作者
好东西啊,感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-15 17:31 , Processed in 0.316952 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部