forked from: forked from: flash on 2010-2-24 - wonderfl build flash online

昨晚想起了很想用绘图API绘制一把剑,突然脑海又想起了风云当中剑圣使用的“万剑归宗”这些武学招式,想想之后,于是好无聊写了一下,不过不能做到万剑归宗的效果,就省去了一个字。呵呵,很想把学过的知识,把在看到的融合到图形表现上。这样做起来flash 会显得更加有个性一点,可能看起来是一种自娱自乐的东西,不过里面的开心的是把一种已经存在的东西转化为新的东西。

既然万剑归宗,当然不能缺少一把剑。看看绘制一把剑,这把剑采用一种比较笨的方法,记录点的位置转化线条表现上。

第一步:绘制一把剑

把每一个点记录起来,然后大概使用一个数组里面保存。

array:Array=[ [50,0], [50,50], [20,50], [20,60], [45,60], [45,300], [65,330], [75,300], [75,60], [105,60], [105,50], [70,50], [70,0], [50,0] ];

记录之后,我们就可以对其进行连线,从第一个点开始连接,一个接一点进行连。采用moveTo 和lineTo 常用组合就能连串成每一个点位置

private function init():void { addChild(pen); pen.graphics.lineStyle(1,0x000000); pen.graphics.moveTo(array[0][0],array[0][1]); for (var i:int=0; i<array.length; i++) { pen.graphics.lineTo(array[i][0],array[i][1]); } pen.graphics.drawCircle(60,-11,12);//绘制剑中心 pen.graphics.drawCircle(60,60,14); pen.graphics.beginFill(0xff00ff); pen.graphics.drawCircle(60,60,5); pen.graphics.endFill(); pen.graphics.moveTo(60,60); pen.graphics.lineTo(65,330); pen.scaleX=pen.scaleY=0.3; }

然后为剑添加一些圆和一些线,效果图就是上面那张图片。

第二步:交互操作

实现剑的操作,无非就是复制一系列的对象,然后对其进行分布。实现剑围绕圆分布。

stage.addEventListener(MouseEvent.CLICK,onClick);
 private function onClick(event:MouseEvent):void

{

//产生一系列的对象,对其对象进行分布处理,按圆的轨迹进行分布。

}

效果如下图

for (var i:int=0; i<num; i++) { var mysword:Sword=new Sword(); contain.addChild(mysword); mysword.x=mouseX+Math.cos(i*2*Math.PI/num)*150; mysword.y=mouseY+Math.sin(i*2*Math.PI/num)*150; list.push(mysword); var angle:Number=Math.atan2(mouseY-mysword.y,mouseX-mysword.x);//角度 mysword.angle=angle; mysword.rotation=angle*180/Math.PI-90; mysword.addEventListener(Event.ENTER_FRAME,Run);//进行运动 }

第三步:剑归宗

 将剑进行运动,向他的中心点进发。剑向一个方向线性运动。谈到运动就是需要我们常常使用的速度和位移改变。

vx=speed*Math.cosA;

vy=speed*Math.sinA;

速度是向量,它可以分解成两个不同方向的分速度。根据角度偏移了。

剑。x+=vx;

剑。y+=vy; 在每一帧的刷新下,剑会产生位移改变。

代码清单:

package { //剑归宗 import flash.display.Sprite; import flash.events.*; import flash.display.DisplayObject; public class Main extends Sprite { private var list:Array=new Array(); private var Speed:int=4;//飞行速度 private var contain:Sprite=new Sprite(); private var num:int=20; public function Main() { addChild(contain); stage.addEventListener(MouseEvent.CLICK,onClick); } //创建一把剑 private function onClick(event:MouseEvent):void { while (list.length>0) { list.pop(); } for (var i:int=0; i<num; i++) { var mysword:Sword=new Sword(); contain.addChild(mysword); mysword.x=mouseX+Math.cos(i*2*Math.PI/num)*150; mysword.y=mouseY+Math.sin(i*2*Math.PI/num)*150; list.push(mysword); var angle:Number=Math.atan2(mouseY-mysword.y,mouseX-mysword.x);//角度 mysword.angle=angle; mysword.rotation=angle*180/Math.PI-90; mysword.addEventListener(Event.ENTER_FRAME,Run);//进行运动 } } //运动 private function Run(event:Event):void { var vx:Number=Math.cos(event.currentTarget.angle)*Speed; var vy:Number=Math.sin(event.currentTarget.angle)*Speed; event.currentTarget.x+=vx; event.currentTarget.y+=vy; if (event.currentTarget.x>stage.stageWidth||event.currentTarget.x<0||event.currentTarget.y<0|| event.currentTarget.y>stage.stageHeight ) { if(event.currentTarget!=null) { event.currentTarget.removeEventListener(Event.ENTER_FRAME,Run); contain.removeChild(DisplayObject(event.currentTarget)); } } } } } import flash.display.Sprite; //描绘一把剑 internal class Sword extends Sprite { private var pen:Sprite=new Sprite(); public var angle:Number=0; private var array:Array=[ [50,0], [50,50], [20,50], [20,60], [45,60], [45,300], [65,330], [75,300], [75,60], [105,60], [105,50], [70,50], [70,0], [50,0] ]; public function Sword() { init(); } private function init():void { addChild(pen); pen.graphics.lineStyle(1,0x000000); pen.graphics.moveTo(array[0][0],array[0][1]); for (var i:int=0; i<array.length; i++) { pen.graphics.lineTo(array[i][0],array[i][1]); } pen.graphics.drawCircle(60,-11,12);//绘制剑中心 pen.graphics.drawCircle(60,60,14); pen.graphics.beginFill(0xff00ff); pen.graphics.drawCircle(60,60,5); pen.graphics.endFill(); pen.graphics.moveTo(60,60); pen.graphics.lineTo(65,330); pen.scaleX=pen.scaleY=0.3; } }

下面乱剑一堆哈哈。这一个和之前一篇关于粒子爆效果原理是一样的,采用Math.atan2的方法处理运动方面很多角度问题。应用很广泛

第四步:对剑的分布进行改造

有时候可以改变对图形的分布位置也能够创造出不一样的东西。采用圆 采用二维矩阵,都可以实现到。

下面是另外一个版本,采用的复制的手法不一样,有时候采用循环能够一次性看到全貌,但是有时候采用时间错开,会看到不一样的过程。Timer 类能够实现到时间错开的过程。我们可以对其进行改造看看效果如何

timer=new Timer(100);

timer.addEventListener(TimerEvent.TIMER,onTimer);

private function onTimer(event:TimerEvent):void

{

按时间间隔创建对象,能够看到创建的过程。

}

下面为代码清单。

package { //剑归宗 import flash.display.Sprite; import flash.events.*; import flash.display.DisplayObject; import flash.utils.Timer; import flash.geom.Point; public class Main extends Sprite { private var list:Array=new Array(); private var Speed:int=10;//飞行速度 private var contain:Sprite=new Sprite(); private var num:int=20; private var timer:Timer; private var count:int=-1; private var key:Boolean=true; private var key2:Boolean=true; private var point:Point;//记录鼠标一个点 public function Main() { addChild(contain); stage.addEventListener(MouseEvent.CLICK,onClick); timer=new Timer(100); timer.addEventListener(TimerEvent.TIMER,onTimer); } private function onTimer(event:TimerEvent):void { count++; var mysword:Sword=new Sword(); contain.addChild(mysword); //mysword.x=point.x+Math.cos(count*2*Math.PI/num)*150; //mysword.y=point.y+Math.sin(count*2*Math.PI/num)*150; mysword.x=50+Math.random()*60; mysword.y=(count+1)*20; list.push(mysword); var angle:Number=Math.atan2(point.y-mysword.y,point.x-mysword.x);//角度 mysword.angle=angle; //mysword.rotation=angle*180/Math.PI-90; mysword.rotation=-90; if (count==num) { timer.stop(); key=true; count=-1; point=null; for (var i:int=0; i<=num; i++) { list[i].addEventListener(Event.ENTER_FRAME,Run);//进行运动 } } } //创建一把剑 private function onClick(event:MouseEvent):void { if (key) { while (list.length>0) { list.pop(); } timer.start(); key=false; point=new Point(event.localX ,event.localY);//记录坐标点的位置 } //for (var i:int=0; i<num; i++) //{ //var mysword:Sword=new Sword(); //contain.addChild(mysword); //mysword.x=mouseX+Math.cos(i*2*Math.PI/num)*150; //mysword.y=mouseY+Math.sin(i*2*Math.PI/num)*150; //list.push(mysword); //var angle:Number=Math.atan2(mouseY-mysword.y,mouseX-mysword.x);//角度 //mysword.angle=angle; //mysword.rotation=angle*180/Math.PI-90; //mysword.addEventListener(Event.ENTER_FRAME,Run);//进行运动 //} } //运动 private function Run(event:Event):void { var vx:Number=Math.cos(event.currentTarget.angle)*Speed; var vy:Number=Math.sin(event.currentTarget.angle)*Speed; event.currentTarget.x+=vx; event.currentTarget.y+=vy; if (event.currentTarget.x>stage.stageWidth||event.currentTarget.x<0||event.currentTarget.y<0|| event.currentTarget.y>stage.stageHeight ) { if (event.currentTarget!=null) { event.currentTarget.removeEventListener(Event.ENTER_FRAME,Run); contain.removeChild(DisplayObject(event.currentTarget)); } } } } } import flash.display.Sprite; //描绘一把剑 internal class Sword extends Sprite { private var pen:Sprite=new Sprite(); public var angle:Number=0; private var array:Array=[ [50,0], [50,50], [20,50], [20,60], [45,60], [45,300], [65,330], [75,300], [75,60], [105,60], [105,50], [70,50], [70,0], [50,0] ]; public function Sword() { init(); } private function init():void { addChild(pen); pen.graphics.lineStyle(1,0xffffff); pen.graphics.moveTo(array[0][0],array[0][1]); for (var i:int=0; i<array.length; i++) { pen.graphics.lineTo(array[i][0],array[i][1]); } pen.graphics.drawCircle(60,-11,12);//绘制剑中心 pen.graphics.drawCircle(60,60,14); pen.graphics.beginFill(0xff00ff); pen.graphics.drawCircle(60,60,5); pen.graphics.endFill(); pen.graphics.moveTo(60,60); pen.graphics.lineTo(65,330); pen.scaleX=pen.scaleY=0.3; } }

转载于:https://www.cnblogs.com/guoyiqi/archive/2010/02/23/2069208.html

flash 绘图API:剑归宗相关推荐

  1. flash绘图API :周易八卦

    周易可谓是一本国宝的书,里面研究的关系很让人佩服.最近看了一个这样的图片,于是利用flash 绘图api 创作一个这样的图案,这样的图案里面当中还有一些细节没处理的到,省略了一点设置.当中很多字都不会 ...

  2. flash 绘图API:绘制基础的图形

    flash 的绘图API 函数是很强大的绘图工具,能够创建出很多神奇的效果.最近偶然发现了一些不错的程序,测试了一下感觉很有趣.这部分不算很难,主要懂借用他的命令,加上自己一点创意就能发挥出意想不到的 ...

  3. flash绘图API :flash player11新增的绘图API方法--cubicCurveTo

    今天除了更新的3D的api之前,另外在flash Graphics方法当中新增了一个cubicCurveTo的方法,能够使用其进行绘制贝塞尔曲线,奇怪是文档里面对应的flash 版本是12,不知道是不 ...

  4. flash绘图API:恋上你的CD

    早上,我无意间碰撞到一个女孩,那时候,她匆匆忙地走了.从她的口袋里面掉下了一本陈旧的书,在哪里我看到她藏在书中的那封陈旧的信和cd.我好奇打开它,一边听着她那张cd,一边看她的写的信,忽然间有一种恋上 ...

  5. flash绘图API:绘制植物

    另外附加一张迷宫图案() 前几天看了一些关于L 系统的介绍,觉得他们生成的图形很漂亮,所应用的知识很新颖,不禁打动了我.于是大概了解很皮毛的一些,对分形几何产生很浓厚的兴趣,但是目前所了解的并不是很多 ...

  6. flash 绘图API:绘制弧线

    把之前没有记录的笔记都记录一下,顺便方便日后查询.绘制弧线,对于一些制作课件的人来讲会有一些用处的.绘制弧线采用的基本思路是采用描点的方法实现.从一个开始角度,到另一个角度结束,在这个角度区间里面进行 ...

  7. flash 绘图API:炽热的太阳燃烧吧

    坐在凳子上 ,太阳依旧高高挂在天上,室内温度很高.于是无意中写了一个这样的程序,无意发现黄色线和滤镜组合变化出不错的效果. 看着这样热的太阳,你是否会感觉一阵热浪.热热热! 代码很短.效果很容易出来. ...

  8. FlexChart: 针对AJAX的Flash绘图应用

    FlexChart: 针对AJAX的Flash绘图应用 作者 Jon Rose   译者 崔康 FlexChart是一款开源的Flash应用,用在AJAX程序中.该绘图应用是通过XML动态驱动的.Ba ...

  9. Two.js – 为现代浏览器而生的 2D 绘图 API

    Two.js 是面向现代 Web 浏览器的一个二维绘图 API.Two.js 可以用于多个场合:SVG,Canvas 和 WebGL,旨在使平面形状和动画的创建更方便,更简洁. Two.js 有一个内 ...

最新文章

  1. Linux动态库和静态库比较
  2. BZOJ2301:[HAOI2011]Problem b(莫比乌斯反演,容斥)
  3. Spring Boot(09)——使用SpringMVC
  4. Java并发编程(08):Executor线程池框架
  5. 存储引擎:engine
  6. SQL Server 2014 新建数据库
  7. python中datetime函数怎么获得当年年份_Python 日期和时间函数使用指南
  8. Linux Kernel代码艺术——数组初始化
  9. python数据结构5 - 排序与搜索
  10. 38.JavaScript中异步与回调的基本概念,以及回调地狱现象
  11. dos下c语言读取扇区的函数,C语言编程读取主导扇区.doc
  12. 实用:最经济的美容偏方大汇集
  13. 吐血整理:手拿几个大厂offer的秘密武器!(免费领取)
  14. Mac安装vim插件
  15. Python的import
  16. Star miscellaneous
  17. scala 函数(柯理化)
  18. 阿尔卡特朗讯(青岛)2015校园招聘笔试题
  19. Nginx源码分析之 HTTP2
  20. 阿里云对象存储OSS作图床工具+ Typora配置

热门文章

  1. 本地存储和音视频的属性和方法
  2. 南方周末:转基因水稻—13亿人安全与利益的博弈——反对中国的那帮伪科学家
  3. 数控线切割机床可保证加工产品品质的稳定性及一致性
  4. php用户第三方登录失败,php 实现网站端qq第三方登录接口及一些注意事项【原创】...
  5. java 传参需要定义吗_java的传参究竟是按值传递的还是按引用传递的
  6. 猿辅导纪录片《奔流》温情献映开学季,讲述不同岗位的教育坚守
  7. 真的醉了!java游戏安装包下载
  8. 移动端Web开发 基础知识
  9. Java断点续传实现原理很简单
  10. 【图片新闻】据称俄罗斯核动力巡航导弹研制疑似遭遇挫折