转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 电脑应用 >> 电脑技术 >> 正文
运动缓冲效果解晰         ★★★

运动缓冲效果解晰

作者:闵涛 文章来源:闵涛的学习笔记 点击数:781 更新时间:2003/11/23

原文地址:http://flash8.net/dispbbs.asp?boardID=10&ID=70443

前言

前不久又逛了一些flash做的网站,看到有的网站导航菜单的效果确实不错,即萌发了尝试写一些关于这方面的一系列教程。菜单的表现方式可以说是千姿百态,充满个性,但透过现象看本质,其技术的核心却有着相通或相似之处,比如今天所要讲的运动的缓冲效果,其在这方面的运用是非常的多,当然,一个好的导航菜单决不仅仅只是运动缓冲的效果,它还包括很多方面,比如创意。今天所写的东西其实并没有多大的技术含量,都是很基本的东西,但是如果你真正掌握了一些基本的知识,那么你才有可能发挥自己的聪明才智去设计一些更酷炫的东西,而不仅仅是简单的把别人的代码copy到自己的作品之中,或者改改别人的原文件就用,这对你的学习并没有什么好处,如果你同意我的观点,那么请接着看下去.....

正题

主场景中只有一帧、一个MC(MovieClip),如果我要的效果是点一下鼠标,MC就出现在鼠标所点击的位置,该如何实现呢。通常我们可以给MC加这样的代码:

onClipEvent(load){
  _x=300;
  _y=200;
}
  //设置MC的初始坐标,如果不需要设置以上代码可省。此代码(↑)只运行一次。
  onClipEvent(mouseDown){
    targetx=_root._xmouse;
    targety=_root._ymouse;
}
   //鼠标按下,把其坐标分别赋值给两个变量:targetx、targety
  onClipEvent(enterFrame){
    _x=targetx;
    _y=targety;
}
//把targetx、targety的值分别赋值给MC的_x _y
//〖当然你也可以这样写:
  onClipEvent(load){
    _x=300;
    _y=200;
}
  onClipEvent(enterFrame){
    if(Key.isDown(1)){//如果鼠标左键按下
    _x=_root._xmouse;
    _y=_root._ymouse;
  }
}

但为了表述方便,以下将采用第一种写法
ctrl+Enter测试一下效果,当点击鼠标左键,MC就会出现在鼠标点击的位置,但并没有出现MC的运动过程,那么,如果要出现MC的运动缓冲过程又该如何设置代码?
OK,我们先试着给MC加这样的代码:

onClipEvent(load){
  vx=1;
  vy=1;
  //你可以试着改变vx、vy的值,然后看看效果.
}
  onClipEvent(enterFrame){
    _x+=vx;//或者_x-=vx;
    _y+=vy;//或者_y-=vy;
}

Ctrl+Enter观看效果,我们将看到MC运动了,
这是因为enterFrame 以影片帧频不断地触发此动作:
_x+=vx;(等效于_x=_x+vx)
_y+=vy;
使MC的x、y坐标不断的在原来的基础上加上vx、vy,这个你得用心体会。MC虽然运动了,但速度是恒定的,因为MC的x、y坐标每次增加的量(步长)是个定值vx、vy,如果vx、vy不是定值,那很显然MC的运动就是变速的。

基于以上的思想,为了实现MC的运动缓冲过程,我们可以这样设置代码:

onClipEvent(load){
  _x=300;
  _y=200;
}
  onClipEvent(mouseDown){
    targetx=_root._xmouse;
    targety=_root._ymouse;
}
  onClipEvent(enterFrame){
    distx=targetx-_x;
    disty=targety-_y;
    //算出鼠标点击的位置到MC的距离
    movex=distx/10;
    movey=disty/10
    _x+=movex;
    _y+=movey;
}

在这里我们使用了
_x+=movex;
_y+=movey;
首先我们得注意,movex和movey并不是一个固定不变的数值,在MC的运动过程中,其x、y坐标是不断变化的,所以movex和movey也是不断变化的(movex=distx/10;movey=disty/10;而distx=targetx-_x;disty=targety-_y;)。
你可以看看下面这张图(x方向)以帮助理解。

以上代码我们可以精简为:

onClipEvent(load){
  _x=300;
  _y=200;
}
  onClipEvent(mouseDown){
    targetx=_root._xmouse;
    targety=_root._ymouse;
}
  onClipEvent(enterFrame){
    _x+=(targetx-_x)/10;
   _y+=(targety-_y)/10;
}

我想你可能注意到了,为什么(targetx-_x)、(targety-_y)还要除以10?
你可以把它去掉,变成 :

_x+=targetx-_x;
_y+=targetx-_x;

Ctrl+Enter看看效果,这时你只要一点击鼠标,MC马上就出现在点击的位置,根本就看不到MC的运动过程,这是因为MC的x、y坐标的增量过大,为鼠标点击的位置到MC的距离,正因为如此,鼠标一点击,MC就会马上出现在点击的位置。所以我们要使MC的x、y坐标的增量要比鼠标点击的位置到MC的距离小。当然“10”这个数字你也可以改成其它的数字,比如8、9、12、2等等。

我们再来简单讲讲为什么MC运动会出现缓冲效果。看上图,MC向B点运动不断靠近B点时,B点与MC的距离(targetx-_x)变得越来越小,所以MC x坐标每次增加的量(步长)会变得越来越小,因而出现缓冲效果。

以上代码我们还可以写得更规范一些,以便于修改:

onClipEvent(load){
  _x=300;
  _y=200;
  speed=10;
}
  onClipEvent(mouseDown){
    targetx=_root._xmouse;
    targety=_root._ymouse;
}
  onClipEvent(enterFrame){
    _x+=(targetx-_x)/speed;
    _y+=(targety-_y)/speed;
}

总结
今天讲的这种效果你可以应用于MC的属性:_rotation, _alpha, scale 赶快试试吧。
请记住这样的式子:property = (target - property)/speed;
常用的弹性缓冲效果还有:

x = disx-(disx-x)/a; 
y = disy-(disy-y)/a;
===============
dx=dx*.a+(_root._xmouse-_x)*.b;
dy=dy*.a+(_root._ymouse-_y)*.b;


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 电脑技术  · 操作系统
    · 磁盘工具  · 视音频技术
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台