
今天我们来讲这个互动的3d菜单。不过我们这里所讲述的方法是完全没有经过z轴计算的,也就是说是一个伪3d的效果。
在解释结构之前,对整个作品的运动把握是很重要的。首先我们看例子,在这里有5个立方体柱子以画面最右方的某点为消失点向外沿伸。这个立方体的前侧会根据其与鼠标的距离而变换大小和左右移动。另外,立方体对鼠标的纵方向(y)移动也有反应,可以随其上下移动。
如我们刚才说的,这个作品是没有z轴运算的,场景中的实例会根据x和y的坐标来模拟z轴的空间感觉。在基本的立方体产生的过程中将运用as的填充和画线命令。首先先做一个正方形的按钮,你可以自己为它定制大小,例子中的是一个75*75大小的正方形,将它的填充作成透明(alpha=0)。接着制作五个mc,我们把它们命名为mm-a1_typo~mm-a5_typo,将刚才作的透明按钮放进去,注意按钮对于中心点都要有一个递增的偏移植。比如mm-a5_typo在x=-150的位置,而mm-a4_typo则在x=-250,依次类推,到mm-a1_typo,x=550。这样一来当把所有这五个mc实例的中心点对齐后,它们便会均匀地分布在x轴上了,对它们进行放大或者缩小都会以相同“消失点”为中心,这样便会产生出透视效果。
在场景中给这五个mc的实例起实例名为“typo”,因为他们处在不同的父级中,所以起相同的名字就可以了,然后在这五个实例上加入as——
onclipevent (enterframe) {
ppp = getbounds(this);
pointdatamin = {x:ppp.xmin, y:ppp.ymin};
pointdatamax = {x:ppp.xmax, y:ppp.ymax};
this.localtoglobal(pointdatamin);
this.localtoglobal(pointdatamax);
xmindata = pointdatamin.x;
ymindata = pointdatamin.y;
xmaxdata = pointdatamax.x;
ymaxdata = pointdatamax.y;
}
这里我们所用的函数getbounds会取得实例坐标的四个级值点(即x轴上的最大最小值和y轴上的最大最小值,也就是矩形的四个顶点),分别存在xmin,ymin,xmax,ymax中。另外localtoglobal可以将mc中的空间坐标转为全局,也就是根目录中的坐标植。所以经过这一计算后,xmindata、 ymindata、xmaxdata 、 ymaxdata 这四个变量中会存储正方形的顶点信息并将之转为根目录下的坐标值。现在再将这五个ty
po都转化为mc(在场景中按f8即可),我们给它们起名为mm-a1~mm-a5,并将随之产生的实例命名为a1~a5。给它们都分别加入as——
onclipevent (load) {
objnum = _name.slice(1, 2);
_parent.init3d(objnum);
}
onclipevent (enterframe) {
tb = this.getbounds(this);
valuea = math.pow(_parent._xmouse - tb.xmin, 2);
valueb = math.pow(_parent._ymouse - tb.ymax, 2);
distance = math.sqrt(valuea + valueb) * 0.5;
if (distance <= 200) {
this._xscale = this._xscale + (((200 - distance) - this._xscale) * 0.1);
this._yscale = this._yscale + (((200 - distance) - this._yscale) * 0.1);
} else {
this._xscale = this._xscale + ((50 - this._xscale) * 0.1);
this._yscale = this._yscale + ((50 - this._yscale) * 0.1);
}
this.typo._x = _parent._ymouse * 0.1;
this.typo._y = this.typo._y + (((_parent._ymouse - this.typo._y) * 0.1) * objnum);
_parent.move3d(objnum);
}
这段as一开始会把实例名的一部分切下来,也就是a1,a2,a3…的序号1,2,3……。并将之传递给父级目录下的init3d这个函数。接着,在每一帧都计算鼠标与正方形左下角顶点的距离,将对mc进行动态的放缩。
现在对这五个加入了as的影片实例a1~a5进行排序,分别将他们放在不同的层中,靠右边的层要高一点,因为它要压在其左边层的上方。排好层后再新建一层,加入如下as——
function init3d(objnum) {

























