【问题标题】:Canvas - How to draw a growing trail画布 - 如何绘制成长轨迹
【发布时间】:2016-12-19 19:08:58
【问题描述】:

我想在一个移动的物体后面画一条成长的轨迹。我知道这看起来很简单 :) 但是有一些限制:

  • 轨迹必须具有某种均匀的透明度
  • 由于性能问题,我无法使用缓存方法

我已经测试了两种方法:

一个带有 lineTo() 和递增笔画宽度,但 alpha 透明度不是同质的......

https://jsfiddle.net/zOgs/9ntajsa1/

一个用lineTo()和圆圈填充空白,透明度还可以,但是从左到右绘制时有一个奇怪的行为,出现负空间...

https://jsfiddle.net/zOgs/psa3x9y2/

我也尝试将compositeOperation 与类似的东西一起使用,但它弄乱了我的背景......

trail.alpha = 0.5;
trail.compositeOperation = 'xor';
for(var i=nb; i>=0; i--) {
    trail.graphics.drawCircle(points[i].x,points[i].y,size/2).closePath();  
}   

我找不到这个问题的有效解决方案,我开始绝望:(

【问题讨论】:

  • 您的第一个示例似乎运行良好。您想要在屏幕上绘制的形状没有颜色不均匀的情况吗?

标签: javascript html canvas createjs


【解决方案1】:

可能有更好的方法来做到这一点,但这里有一个简单的方法:使用屏幕外画布绘制轨迹,然后将该画布显示为主舞台的位图子级。

这是基于您的第一个小提琴: https://jsfiddle.net/lannymcnie/9ntajsa1/1/

// Canvas to draw to:
var offCanvas = document.getElementById("canvas2");
var offStage = new createjs.Stage(offCanvas);

// Add the offStage to the main stage.
var bmp = new createjs.Bitmap(offCanvas);
stage.addChild(bmp);
bmp.alpha = 0.1;

// Still get events from main stage  
stage.addEventListener('stagemousemove',onMouseMove);

【讨论】:

  • 不错!如果不需要单独管理路径的各个圆圈,并且如果提问者的设计允许,他们可能会将一组半透明圆圈直接绘制到本机仅内存画布上。我正在考虑这个想法的性能考虑。
  • @Lanny 谢谢!好主意。我成功地测试了它,它很棒,但是仍然存在性能问题,因为两个或多个对象同时移动......即使以编程方式创建画布并且没有将其附加到 DOM,正如 markE 指出的那样:)
  • 这种方法实际上与使用 cache() 相同,但在管理两个阶段时引入了更多开销。使用缓存不会对性能造成太大影响,尤其是当您可以让所有实例共享一个缓存时。这是显示此方法的 Lanny 示例的更新版本:jsfiddle.net/9ntajsa1/3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 2020-08-26
相关资源
最近更新 更多