[前言]
本鼠标跟随教程为高级教程,如果您对其中的一些概念不很清楚,请先到帝国下载简单鼠标跟随效果教程。
注:本文所提MC为 Movie Clip 的简写。
[一、鼠标跟随的基本原理]
1、要实现特殊的鼠标跟随效果,首先就要判断当前鼠标的位置:
在Flash中并没有一个函数能获取鼠标的X值和Y值,但是Flash给我们提供了一个变通之道,它提供了一个Action:
Start Drag ("mousetrack", lockcenter), 它的作用是将名为"mousetrack"的MC锁定在鼠标的位置上,鼠标移到哪里,MC就跟到哪里。通过这种方法,我们就可以通过另外一个Action:
GetProperty ("/mousetrack", _x) 随时获取MC的x值和y值------它就是鼠标当前的坐标值。
2、如何做到随时检测坐标值,并实现对其他MC的控制?
鼠标跟随最“酷”的效果就是不管何时何地,只要鼠标位置一移动,都能呈现动态的效果。显然,这就需要计算机随时都要检测鼠标的坐标值,判断所发生的变化,那么怎么在Flash中实现呢?
首先,我要帮助大家牢牢建立一个概念----关于MC的工作过程: 如果一个Symbol被定义成一个MC的话,那么工作的流程将是从这个MC的第一帧运行到最后一帧,然后又从第一帧开始周而复始,除非它遇到本MC内部的帧动作Stop。注意是MC内部的帧动作,也就是说主场景的帧的Stop不会影响到MC的播放。
那么,显然我们可以做一个MC,里面什么都不放,只包含两个帧,在这两个帧上设置Action,来检测鼠标的位置。将这个MC拖放到主场景中,计算机就周而复始的执行这个MC中的帧动作,也就时刻检测鼠标的当前位置了。通常情况下,这个MC就是我们第一步所说的跟鼠标位置锁定的"/mousetrack"(一个MC实现两个目的)。实现对其他MC的控制相信就不用我多说了,只要定义了MC的instance
name,在帧动作中都可以调用和设置不同的属性。
[二、MONO*crafts 飞行菜单的控制机理]
1、菜单大小、飞行方向的控制:
显然,MONO的中间飞行的菜单是个MC,那么是如何控制飞行菜单的大小和飞行的方向的呢?
对飞行菜单的大小,是用鼠标当前位置的Y值同屏幕中心点的Y值之间的差值,来控制飞行菜单的放大倍数。鼠标越靠近屏幕顶端,飞行菜单越大。相反,越靠近底端,飞行菜单越小。菜单飞行的方向,是用鼠标的X值同屏幕中心的X值相比较,越靠近左边,菜单向右飞行越快。所谓菜单的向右飞行,就是用Set
Property ("/mc", X Position)将MC的X坐标向右移动一定的数值。
有人肯定会问,为什么MONO的菜单会一直向一个方向飞行,给人以层出不穷的感觉呢?
事实上,这是应用了一个比较常见的小技巧:将好几个相同的MC从左到右顺序排开,控制他们一起移动。当移动的距离大于一个MC的长度时,将这个距离减去MC的长度作为实际移动的距离。因为MC大小相同,而且顺序排列,所以从视觉上讲,实际移动的效果和想要控制移动的效果是相同的。因此,实际上MC是在正负MC的长度范围内做来回运动,也就造成了层出不穷的感觉。
2、弹出菜单效果的控制:
MONO飞行菜单的MC中包含有按钮,当鼠标移动到按钮的上方时,按钮的背景就变成紫色半透明。这可以在按钮的over区设置,这里将不做进一步的介绍,大家可以分析源程序。
这里着重介绍的是当鼠标移动到按钮上方时,弹出的内容简介的菜单设计。原理也是很简单的,它是一个由小变大的MC,里面包含了一个文本框,文本框的变量就是按钮的内容简介,是通过在按钮的on
mouse over事件的action中动态设置的。至于弹出菜单的显示与否,可以通过在按钮的mouse over 和 mouse out
事件中用Begin Tell Target ("/popmenu") Go to and Play (1) End
Tell Target 来控制,这里不做进一步说明了。
3、MONO*crafts 飞行菜单的特殊控制效果:
细心的朋友可能会想到:既然菜单的放大倍数是由鼠标控制的,那么,判断菜单的移动距离是否大于一个MC的长度显然不是一个固定的值,必须根据当前菜单的放大倍数进行动态的计算。有没有一种简单的方法可以避开这些复杂的、另人生厌的计算呢?下面我来介绍一种比较特殊,但很有效的处理:
在提供的源程序中,飞行菜单的MC的instance name 是slide,它并不是直接放置在根场景中的,而是外面还嵌套了一个MC叫scale。也就是说,根场景中放置一个叫scale的MC,其中只包含一个帧,帧中放置的是一个叫slide的MC,这个MC就是我们要控制的飞行菜单。
为什么要这样处理呢?scale和slide这两个MC包含的内容是完全一致的,感觉好象有点多余。事实上,这就是本例子的精华所在。在Flash中,采用的是相对坐标体系,各个MC内部的坐标都是各自独立的,只相对于这个MC被放入场景的位置而定。
结合上面的例子,如果我们在根场景中改变了scale的位置或放大倍数,由于slide相对于scale并没有改变,所以用GetProperty
("/scale/slide", _x)获取slide的x坐标,你会发现不管scale如何改变,slide的x坐标始终是不变的!
因此,源程序中用scale专用来控制飞行菜单的放大倍数,而slide则专用来控制飞行菜单的移动,两者互不干扰,也就省却了由放大倍数带来的计算上的麻烦了:)
大家可以分析源程序来体会这一点。
[三、Action详解]
1、mousetrack:
//获取当前鼠标的x,y坐标,并显示在文本框中:
Set Variable: "/:xPos" = GetProperty ("", _x)
Set Variable: "/:yPos" = GetProperty ("", _y)
//获取/scale/slide的x,y位置,并显示在文本框中:
Set Variable: "/:xBut" = GetProperty ("/scale/slide",
_x)
Set Variable: "/:yBut" = GetProperty ("/scale/slide",
_y)
//获取/scale的放大倍数,并显示在文本框中:
Set Variable: "/:xButSca" = GetProperty ("/scale",
_xscale)
Set Variable: "/:yButSca" = GetProperty ("/scale",
_yscale)
//根据中心点x坐标和当前鼠标的x坐标的差值来计算/scale/slide应该移动的距离
Set Variable: "move" = /scale/slide:_x + ((365-_x) / 12)
//判断移动的距离是否大于一个MC的长度,并做相应处理
If (move>1352.3)
Set Variable: "move" = move-1352.3
Else If (move<-1352.3)
Set Variable: "move" = move+1352.3
End If
//根据移动距离设置/scale/slide的新x坐标
Set Property ("/scale/slide", X Position) = move
//根据中心点y坐标和当前鼠标的y坐标的差值来计算/scale应该放大的倍数
Set Variable: "growth" = /scale:_xscale+((200-_y)/4)
//设置最大放大倍数值和最小放大倍数值
If (growth >= 700)
Set Variable: "growth" = 700
Else If (growth <= 50)
Set Variable: "growth" = 50
End If
//设置/scale的放大倍数
Set Property ("/scale", X Scale) = growth
Set Property ("/scale", Y Scale) = growth
//设置弹出按钮内容菜单的起始点x,y坐标,使它同鼠标x坐标,以及飞行菜单的上沿保持一致。
Set Property ("/popmenu", X Position) = /:xPos
Set Property ("/popmenu", Y Position) = GetProperty ( "/scale",
_y )-(GetProperty ( "/scale", _height )/2)
2、按钮事件:
On (Roll Over)
//设置弹出菜单的内容
Set Variable: "/:menu" = "“抄”级闪客,杭州,此人极懒,没有主页:)"
//触发/popmenu,显示弹出菜单动画
Begin Tell Target ("/popmenu")
Go to and Play (1)
End Tell Target
End On
On (Roll Out)
//清空弹出菜单的内容
Set Variable: "/:menu" = ""
//隐藏弹出菜单
Begin Tell Target ("/popmenu")
Go to and Stop (1)
End Tell Target
End On
On (Release)
//设置按下按钮的事件
Get URL ("mailto:jimbob@21cn.com")
End On
(完)