graphics.command的用法及AS3和Createjs矢量的区别

  • 内容
  • 评论
  • 相关

今天又是一篇高级教程,不过api使用起来并不难,难的是理解里面的原理。好了,先来讲graphics.command的用法吧。

在flash年代,矢量(graphics)如果需要修改颜色或样式都是需要重绘的(clear)的,但是用createjs却不需要,只需要使用command保存绘图指令就可以。createjs的官网有改颜色的例子,我这里就放出画线的例子。先来看看如果不使用command的做法:

var point1 = new createjs.Point(50,50);
var point2 = new createjs.Point(200,200);
var shape = new createjs.Shape();
stage.addChild(shape)
createjs.Ticker.addEventListener("tick",function (event){
	
	shape.graphics.clear()
	shape.graphics.beginStroke("#ff0000").moveTo(point1.x,point1.y).lineTo(point2.x,point2.y).endStroke();
	point2.x--;
	if(point2.x < 0) point2.x = 200;
})

下面是使用command的做法:

var point1 = new createjs.Point(50,50);
var point2 = new createjs.Point(200,200);
var shape = new createjs.Shape();
stage.addChild(shape)
shape.graphics.beginStroke("#ff0000");
var moveCommand = shape.graphics.moveTo(0,0).command;
var lineCommand = shape.graphics.lineTo(0,0).command;
createjs.Ticker.addEventListener("tick",function (event){
	
	moveCommand.x = point1.x;
	moveCommand.y = point1.y;
	lineCommand.x = point2.x;
	lineCommand.y = point2.y;
	point2.x--;
	if(point2.x < 0) point2.x = 200;
})

先来看看效果: http://www.ajexoop.com/demo/command/graphics_command.html

fla下载地址: http://www.ajexoop.com/demo/command/graphics_command.fla

(代码我写在fla里面,不会animate的可以复制上面代码放到自己的文件里)

可以看到代码区别其实还是蛮大的,第一个的做法是每次都清除指令后再赋予绘制指令,第二个的做法是直接把绘制指令给改了,其实道理是差不多的。大家可以使用console.log(shape.graphics.instructions)代码来看绘制指令,都是一模一样的。

接下来,我再来讲一下AS3和Createjs矢量的区别,这个也是一个比较重要的知识点,牵扯到矢量的性能问题,听的云里雾里的人可以直接去看最下面的结论,并牢记。

那么开始,细心的童鞋可能会发现,我上面说了很多的绘制指令,这其实就是createjs的一个特点了,他存储矢量的方式并不是数据,而是指令,大家从api上也可以看出区别:

QQ图片20190401173557.png

AS3由于用的是数据,所以几乎所有的api都不提供返回值,直接就把数据画到舞台上了,想要改变就只能clear。

QQ图片20190401173904.png

但是createjs由于是指令,所以都有返回值,而且就因为是指令,所以他可以中途修改(AS3可以看做是已经画在纸上不能修改,只能撕掉,createjs可以看做是活版印刷,把印换了就好了),使用上面说的console.log(shape.graphics.instructions)可以看到指令集。

那么由于createjs的矢量图是根据存储的指令画出来的。那么这就会出现几个问题:

1:如果图片复杂,绘制指令会非常多,性能也会很差。这个问题adobe考虑到了,一般来说你用代码不会去画复杂矢量图形,毕竟谁也没那么空一句句打代码不是,但是用动画软件就不一定了,随便画几笔就是十几个绘图指令了,所以从animateCC诞生的时候他的矢量不管有多少,都是用一些编码来表示的(记住不是base64),然后用decodePath解码出来。这样无论多复杂的图形,至少绘制指令只有一句。

QQ图片20190401174805.png

QQ图片20190401174931.png

2:指令和指令之间是不可能有补间的(AS3因为是数据,他有内置的算法,所以可以自己演算补间),也就是说createjs的矢量和矢量时间是无法做形状补间的,那有人会问了,animateCC可以做形状补间啊,它是怎么做到的的呢?很简单,他直接发布成了逐帧动画。我来做一个例子,大家会animateCC的也可以随便做个例子。

我做了一个很简单的图形变大动画,使用形状补间做的,然后看图片:

QQ图片20190401172329.png

QQ图片20190401172452.png

大家可以看到每一帧都变成了代码,代码非常多。

那么如果做成动画补间呢?,下面再来看图片:

QQ图片20190401172804.png

image.png

大家可以看到,代码非常的少,所以animateCC用形状补间非常坑,试想一下你如果要做一个400帧的慢速变大动画,那代码量真的就是日了狗了。

最后总结一下,大家平时做动画如果用代码做的,用command或者直接clear重绘都可以,由于最终操作的都是指令,所以性能几乎没有多少差别。如果你是用animateCC来做动画,尽量少用形状补间,使用形状补间不仅会造成代码冗余,还会造成由于对象过多而卡顿

dashang.jpg    

玻璃钢生产厂家商场网红美陈装饰玻璃钢孔子雕塑现货河南玻璃钢香蕉雕塑肇庆玻璃钢抽象雕塑玻璃钢龙雕塑图片乌鲁木齐现代人物玻璃钢雕塑河南超市商场美陈供应天水彩色玻璃钢雕塑厂家四川超市商场美陈供应通用玻璃钢雕塑摆件怎么样人物玻璃钢雕塑哪里买余杭区玻璃钢雕塑介绍黄冈玻璃钢雕塑是什么做的惠东玻璃钢抽象雕塑商场美陈服务公司四川玻璃钢仿铜雕塑厂家主题玻璃钢雕塑批发盘锦玻璃钢雕塑生产厂家泰州frp玻璃钢雕塑玻璃钢雕塑安装过程浙江玻璃钢雕塑定制厂家玻璃钢动画装饰雕塑张杰玻璃钢卡通雕塑兴城玻璃钢卡通座椅雕塑宁波玻璃钢农耕人物雕塑洛阳景观园林玻璃钢景观雕塑玻璃钢卡通雕塑订做玻璃钢雕塑生产过程云南玻璃钢雕塑定制商场门头美陈网香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化