Flash教程:有趣的简易软力绳教程

教程

先说明,本教程仅为学习交流之用,任何人不经本人允许不得使用其进行商业用途.
大致的最终结果: 

 问题分析,主要的重点在两个方面,一个是动力学模型的建设,一个是如何绘制圆滑的曲线.首先关于曲线,先参照第1个例子,里面的代码很简单.http://www.webjx.com/upfiles/20070417/20070417213136_webjx_com_01.flahttp://www.webjx.com/upfiles/20070417/20070417213150_webjx_com_01.swf
 this.createEmptyMovieClip("circle_mc", 1); 
this.onEnterFrame = function () { 
with (circle_mc) { 
clear(); 
    lineStyle(0, 0x000000, 100); 
    moveTo(275, 150); 
    curveTo((275+_xmouse)/2,(150+_ymouse)/2+50,_xmouse,_ymouse); 

}整个代码很简单,只是用于画一条跟随鼠标的贝塞尔曲线而已.

其中最主要起作用的语句为2条:
moveTo(275, 150); //是画图起点(红点)
curveTo((275+_xmouse)/2,(150+_ymouse)/2+50,_xmouse,_ymouse);绘制一条曲线,其中终点坐标为:_xmouse,_ymouse(蓝点). 控制点坐标为: (275+_xmouse)/2,(150+_ymouse)/2+50 (黑点).

如果你认为你确实已经弄懂了这三个点的关系,可以接着往下看.下面的问题是建立动力学模型.这里建立的是一个基于经典物理学的简要模型,不牵涉微积分什么的.
好,打开第两个例子,场景中有3个点:
分别是原点,实例名:yuandian.红色
中心点,实例名:zhongxindian.蓝色
鼠标点,实例名:shubiaodian.绿色
http://www.webjx.com/upfiles/20070417/20070417212136_webjx_com_02.flahttp://www.webjx.com/upfiles/20070417/20070417212319_webjx_com_02.swf
然后在帧上写AS:
this.createEmptyMovieClip("_mc", 1);
tx=0;ty=0;
ax=0;ay=0;
i=7;
q=0.81;
lenmax=220;
r=0.2;
pianyi=0;以上全部为参数,暂时先不必理会.
this.onEnterFrame = function () {
shubiaodian._x=_xmouse;
shubiaodian._y=_ymouse;//把鼠标点元件绑在鼠标上,当然你用drag也行,效果一样.
//lenx=shubiaodian._x-yuandian._x;
//leny=shubiaodian._y-yuandian._y; 
//len=Math.sqrt(lenx*lenx+leny*leny);
//pianyi=(lenmax-len)*r;
//if (pianyi<0) pianyi=0;
//该部分计算偏移的暂时先不理会
ax=((yuandian._x+shubiaodian._x)/2-zhongxindian._x)/i;
//此语句是计算中心点在水平方向上的加速度,默认的,中心点应该在原点和鼠标点的中心.所以,用中心点的"目的坐标"减去"实际坐标"再乘上一个系数,就可以得到中心点在水平方向上的加速度.
ay=((yuandian._y+shubiaodian._y)/2-zhongxindian._y+pianyi)/i;
//在Y值上一样的道理,只不过中心点的坐标会稍微向下偏移,以形成重力的感觉.其中偏移量的计算随后解释.

tx +=ax;//计算中心点在水平方向上的速度变化,就是让速度加上加速度.
ty +=ay;//同上,纵向上的
tx *=q; //让中心点的速度逐渐衰减,以使它出现慢慢停止的效果.你可以试着把q值改为1或0试下.
ty *=q; //同上
zhongxindian._x +=tx; //让中心点移动,水平方向上移动tx点.
zhongxindian._y +=ty; //让中心点移动,垂直方向上移动ty点.

with (_mc) {
  clear();
     lineStyle(0, 0x000000, 100);
     moveTo(yuandian._x, yuandian._y);
     lineTo(zhongxindian._x, zhongxindian._y);
  lineTo(shubiaodian._x, shubiaodian._y);
  lineTo(yuandian._x, yuandian._y);
}
//以上画线(直线),很简单,不赘述.
}

这样一个简单的动力学模型就出来了.但是如果没有偏移量的计算的话,中心的坐标将始终在原点和鼠标点的正中央.所以需要计算一下Y方向上的偏移量.所谓的偏移量就是指中心点偏靠下方的距离.简单的概括下,偏移量有个特色,因为是软力绳,所以原点和鼠标点越近,这个值就应该越大,反之越小.我们简单的把这个用线形来描述.比如绳子的最大长度是:lenmax=220;
lenx=shubiaodian._x-yuandian._x;
leny=shubiaodian._y-yuandian._y;
len=Math.sqrt(lenx*lenx+leny*leny); //以上语句计算原点和鼠标点的距离len,当然你可以用point类来算更方便,但我这里保持了初中几何的写法.
pianyi=(lenmax-len)*r;
if (pianyi<0) pianyi=0; //计算偏移量,如果发现为负的话,则让其为0.

接下来画线,问题很简单,把直线换成曲线就是.
http://www.webjx.com/upfiles/20070417/20070417212501_webjx_com_03.flahttp://www.webjx.com/upfiles/20070417/20070417212603_webjx_com_03.swf前面的代码相同
with (_mc) {
  clear();
     lineStyle(0, 0x000000, 100);
     moveTo(yuandian._x, yuandian._y);
  kongzhidian1_x=(yuandian._x+zhongxindian._x)/2-tx;
  kongzhidian1_y=(yuandian._y+zhongxindian._y)/2+pianyi/2-ty;
//以上语句就是定位控制点1的坐标,先简单的用前面例1中的算法.
  curveTo(kongzhidian1_x,kongzhidian1_y,zhongxindian._x, zhongxindian._y);
  kongzhidian2_x=(zhongxindian._x+shubiaodian._x)/2-tx;
  kongzhidian2_y=(zhongxindian._y+shubiaodian._y)/2+pianyi/2-ty; 
  curveTo(kongzhidian2_x,kongzhidian2_y,shubiaodian._x, shubiaodian._y);
//以上语句就是定位控制点2的坐标,先简单的用前面例1中的算法.
}这样算出来的结果有瑕疵,很明显中心点不是一个圆角,而显现出了棱角的特点,这和软力绳的样子不符合.这时需要回到例1中去分析.这里不去分析贝塞尔曲线的公式,这里简单的把结论说一下.很显然当一条曲线画完后,接着的第二曲线的切线应该和前一个曲线相切,也就是说,第二条曲线的控制点应该与前一条曲线的控制点以及中心点在一条直线上,或者说他们斜率相同.(看图上呈一条直线的3个点)

OK,到例4中,相关的代码换了一下.http://www.webjx.com/upfiles/20070417/20070417213505_webjx_com_04.swfhttp://www.webjx.com/upfiles/20070417/20070417213432_webjx_com_04.fla
 http://space.flash8.net/bbs/attachment.php?aid=321430
http://space.flash8.net/bbs/attachment.php?aid=321431

with (_mc) {
  clear();
     lineStyle(0, 0x000000, 100);
     moveTo(yuandian._x, yuandian._y);
  kongzhidian1_x=(yuandian._x+zhongxindian._x)/2-tx*2;
  kongzhidian1_y=(yuandian._y+zhongxindian._y)/2+pianyi/2-ty;
  //kongzhidian1._x=kongzhidian1_x;
  //kongzhidian1._y=kongzhidian1_y;
  //lineTo(kongzhidian1_x,kongzhidian1_y);
  //moveTo(yuandian._x, yuandian._y);
  curveTo(kongzhidian1_x,kongzhidian1_y,zhongxindian._x, zhongxindian._y);
  len2_x=zhongxindian._x-shubiaodian._x;
  len2_y=zhongxindian._y-shubiaodian._y;
  len2=Math.sqrt(len2_x*len2_x+len2_y*len2_y);
  lent_x=kongzhidian1_x-zhongxindian._x;
  lent_y=kongzhidian1_y-zhongxindian._y;
  lent=Math.sqrt(lent_x*lent_x+lent_y*lent_y);
  kongzhidian2_x=zhongxindian._x-len2*lent_x/lent*p1;
  kongzhidian2_y=zhongxindian._y-len2*lent_y/lent*p1;; 
  //kongzhidian2._x=kongzhidian2_x;
  //kongzhidian2._y=kongzhidian2_y;
  //lineTo(kongzhidian2_x,kongzhidian2_y);
  //moveTo(zhongxindian._x, zhongxindian._y);
  curveTo(kongzhidian2_x,kongzhidian2_y,shubiaodian._x, shubiaodian._y);
}没时间解释代码了,简单的来说就是延着延长线放置第二个控制点.这样一个简单的软力绳就出来了.大概修整一下相关参数,最后的结果例5.
http://www.webjx.com/upfiles/20070417/20070417212723_webjx_com_05.swfhttp://www.webjx.com/upfiles/20070417/20070417213702_webjx_com_05.fla
这是最简单的软力绳,仅仅做到模仿,想体现更复杂的效果的话,请自行研究相关的算法,并设置更多的中心点.

时间: 2024-10-07 10:05:52

Flash教程:有趣的简易软力绳教程的相关文章

Flash制作有趣的亲嘴猪动画教程

  本教程是使用Flash制作可爱有趣的亲嘴猪动画,讲述如何用简单的绘图工具画出可爱俏皮的小猪以及制作成亲嘴动画.这个Flash实例简单易懂,这个Flash实例制作了两只可爱的小猪亲嘴的动画,用到了Flash的基本绘图工具如椭圆.矩形.直线和任意变形等,操作简单易懂,适合练习. 先看下效果吧: 制作步骤: 1.新建一个Flash文档,Ctrl+F8新建一个元件,命名为"pig".选择椭圆工具,设笔触为黑色,无填充,画出如下椭圆. 图01 2.再用矩形工具在椭圆下部画出如下矩形. 图02

Flash AS3简单制作图片变成百叶窗特效教程

  Flash AS3简单制作图片变成百叶窗特效方法,适合初学者的教程,希望大家能练习! 图片百叶窗特效: 制作过程: 任意选择一个图片,当做本例动画中的图片,我们将使该图片达到百叶窗动画特效. 然后按Ctrl+J修改文档的属性,设置任何颜色为背景都可以,大小调整到和自己选择的图的大小一样大就可以了,幁频设置为38fps 就可以. 把图层1命名为photo,把外部准备的图片导入到舞台,然后按F8转变为原件,类型是影片剪辑, 然后拖拽到舞台,打开属性面板,设置如下: 然后创建一个新图层,绘制一个文

flash教程:Dragging and Dropping Drop Targets实例教程

flash教程:Dragging and Dropping  Drop Targets实例教程 拖放使用下拉目标 拖放对象涉及....拖放对象.该物体的电影剪辑,并延伸本教程时只需拖动的影片剪辑.与拖动一个对象,你是放弃对象的位置将触发一个事件.的位置,你下降的对象是一个影片剪辑,以及,您将学习本教程如何触发的事件根据位置的对象是下降了. 为了帮助您看看我讲的,将一个彩色画笔,并将其放置在电脑上在以下动画: 当你拖彩色画笔,把它丢在电脑上,你应该已经注意到,电脑的颜色改变,以反映颜色的刷子.您将

易语言基础教程之制作简易浏览器_易语言

方法/步骤 首先打开易语言: 点击--工具--支持库配置--全选--确认 之后点击属性--拉宽 之后点击标题输入测试浏览器 拉一个编辑框和按钮最后一个超文本浏览框(自己找) 之后双击按钮输入代码: .版本 2 .支持库 HtmlView .子程序 _按钮1_被单击 超文本浏览框1.地址 = 编辑框1.内容 按F5测试,好的行了 注意事项 编辑框要输入网址,不能输入其他的OK. 以上是小编为您精心准备的的内容,在的博客.问答.公众号.人物.课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜

js教程:JavaScript For...In 方法及实例教程

js教程:JavaScript For...In 方法及实例教程 在为...在一份声明中是用来循环(重复)通过要素的一个数组,或通过性能的一个对象. 范例 对于在声明中... 如何使用的...在一份声明中循环的要素一个数组. <html> <body> <script type="text/javascript"> var x; var mycars = new Array(); mycars[0] = "Saab"; mycar

js入门教程:JavaScript Try Catch 错误捕捉实例教程

js入门教程:JavaScript Try...Catch 错误捕捉实例教程 其中的try ... catch声明允许你测试一个代码块的错误. 范例 其中的try ... catch声明 如何撰写一个try ... catch声明. <script type="text/javascript"> var txt=""; function message() { try   {   adddlert("Welcome guest!");

Photoshop文字特效教程:有趣的位移文字

导言:在这节教程中,将展示如何创建文字位移以及得到一个有趣的效果. 第一步首先,新建一个文件,大小为1000×500像素,颜色填充为#f4f4f4.(图01) 图01 第二步然后,添加一些暗色的线段以划分出地板和墙面.新建一个图层,使用椭圆选框工具创建一个如下图所示的选区.然后使用黑色到透明的渐变来填充选区,渐变的不透明度为50%.(图02) 图02 选择滤镜->模糊->高斯模糊,设置如下图所示.(图03.04) 图03   图04 [1] [2] [3] [4] [5] [6]  下一页

Flash中的电影艺术之镜头技巧教程

技巧|教程 文章内容摘自<Flash动画与卡通制作创意导航>([美]Ibis Fernanadez著 罗小燕译 清华大学出版社) ,有改动,实例作品为若无说明为qhwa原创. 对于许多动画制作者来说,通过Flash获得电影般的效果十分困难,这样他们就不得不满足于非常规的处理方法或者静态画面,而这样又影响了他们的制作.只会说话的头十分枯燥,而且有时仅仅画出角色正确的动作和姿态是远远不够的. 电影艺术融化了摄影,舞蹈动作设计和影视编辑技术,其中影视编辑技术对于成功制作卡通动画来说起主导作用.通常,

Flash制作人物会活动的关节实例教程

  Flash Cs4在界面上与其上一个版本cs3总体来说并没有特别大的区别,在工具菜单中添加了3d工具.deco工具.骨骼工具.针对mc添加了一个动画编辑器.,脚本语言没有变化,主要针对新版本中的骨骼工具做了相对的试用,下面是具体的示例. 首先制作一个简单的火柴人 每个能够活动的关节要单独作成mc如图. cs4立面的骨骼工具同3dmax一样是反向动力学,所以骨骼的绑定也要遵循这个原则.将头.四肢绑定到人的躯干上.使用骨骼工具点选头部这个mc直接连接到所对应的躯干上,所点选mc的重心是可以调节的