如何从 EaselJS / CreateJS 中的缓存对象以外的来源绘制到 cacheCanvas?

How to draw to a cacheCanvas from a source other than the cached object in EaselJS / CreateJS?

我有一个缓存的形状和一个由形状的 cacheCanvas 制作的位图。我现在想将另一个位图绘制到 cacheCanvas,或者更具体地说,将另一个位图的 cacheCanvas 绘制到形状的 cacheCanvas。我试过 bitmap2.draw(shape.cacheCanvas) 但它没有用 - 尽管 draw() 说它收到一个 ctx,我认为形状的 cacheCanvas 是一个 ctx。它给我一个 drawImage is not a function 错误。

我这样做的原因是绘图工具的撤消功能。我绘制形状并使用 sourceover 将位图绘制到位图以供显示,并绘制到缩略图位图,因为有多个图层。在 pressup 上,我从形状的 cacheCanvas 中存储一个新的 Bitmap 并将其缓存以记住撤消状态。这些给我每次俯卧撑时的图纸。要撤消,我想清除绘图并在没有 sourceover 的情况下缓存它,然后将撤消位图绘制到形状的缓存中 canvas。这保持了原始形状、原始位图和缩略图位图之间的关系。绘制到形状的 cacheCanvas 就是问题所在。有办法吗?谢谢!!

已添加 - 我想我找到了解决方法。我可以从一个带有形状的容器开始。然后将容器blit到Bitmap。然后,当我想返回到某个存储的位图时,我可以清除形状图形并将位图添加到容器中 - blit 并删除存储的位图。知道是否有一种方法可以使用缓存对象以外的内容写入 cacheCanvas 仍然很有趣。

绘制到缓存 canvas 是不够的,您必须确保更新绘制它的阶段。

另一种为您提供更多控制的方法是将您的 cacheCanvas 包装在另一个舞台中。这使您可以使用与 EaselJS 舞台相同的控件向其中添加内容。请注意,它会在您更新时清除缓存的原始内容,因此这不是一个完美的解决方案。 https://jsfiddle.net/lannymcnie/8yczqt05/

var stage2 = new createjs.Stage(s.cacheCanvas);
stage2.autoClear = false; // Keep the current cache. Just for this demo
var s2 = new createjs.Shape();
s2.graphics.f("blue").dc(50,50,50);
stage2.addChild(s2);
stage2.update();

如果您正在制作一个 undo/redo 系统,您可能会考虑更强大的解决方案,而不是依赖 Shape 的缓存。听起来您已经在为缓存探索容器,希望您能成功。

干杯!