因此,我试图创建一个包含两个canvas元素的项目,每个canvas元素都有其自己的paperscript,并且每个控件的外部都具有用于控制两者中某些功能的按钮。

在Paperscript下的文档下,它表示:


  请注意:
  当在页面中包含多个PaperScript时,每个脚本都将在其自己的范围内运行,而不会看到其他脚本中声明的对象和函数。要使PaperScript与其他PaperScript或> JavaScript代码进行通信,请参阅有关PaperScript互操作性的教程。


...这很不幸,因为该教程的内容如下:


  即将推出!


我在这个过程中很快陷入困境。我试过将函数放在全局范围内,从其画布外部调用它们,然后看到它们在错误的画布上打印。我尝试通过模块导出函数,但似乎可以运行该函数(?!?!)。最糟糕的是,“ paper.projects”对象是其中一个项目(第一个画布)的数组。

所以我很困惑。

有人知道怎么做吗?

编辑:显然有this answer,但是我看不到如何从全局范围脚本中调用PaperScript范围中的函数。

这似乎是一个调用PaperScope中的全局函数的脚本,如果我试图让外部按钮执行操作,则该脚本对我不起作用。

显然我缺少了一些东西。

第二次编辑:我在window.global中或在没有var声明的情况下独自坐着,使用过各种全局函数……但是似乎发生的是,当我尝试调用我定义的函数时,表示为:

globals.makecircle = function () {
    var o = new Path.Circle({
        radius: 50,
        center: new Point (200,200)
    })
}


在主作用域中,它将与正确的窗口一样在错误的窗口中运行。另外,在运行之前还有一个令人难以置信的延迟,我无法弄清楚。

第三编辑:为清楚起见。

我在HTML中将firstcanvas.js附加到canvas1,将secondcanvas.js附加到canvas2。两者都被称为paperscript类型,如下所示:

<script type="text/paperscript" src="scripts/firstcanvas.js" canvas="canvas1"></script>
        <script type="text/paperscript" src="scripts/secondcanvas.js" canvas="canvas2"></script>


我按照Jurg的建议创建了window.globals对象。我用一个按钮从main.js调用它,例如:

window.globals = {}
`$('document').ready($('#dfs').on('click', window.globals.makecircle))`


如上所述,我将此功能添加到firstcanvas.js中的全局变量中。

如果我最近单击canvas2,单击带有id='DFS'的按钮将导致该功能在canvas2上极度延迟地运行。

而且paper.projects不会列出两个项目,所以我不能使用activate()函数。

最佳答案

好的!解决了!!!

以下是从全局范围引用/激活PaperScript创建的范围的方法。尽管没有用户可访问的范围数组(我知道),但PaperScope.get(id)会检索它们。由于某种原因,我发现PaperScope.get(0)已经填充,并且我的两个canvas / PaperScript元素实际上引用的是ID为1和2的作用域。

因此:

pscope1 = PaperScope.get(1)
pscope2 = PaperScope.get(2)


然后,在任何我想在第一个画布上做某事的函数中:

pscope1.activate()

// cool paper.js graphics stuff

pscope1.view.update()


最后一行是因为paper.js不会自动更新用户未与之交互的视图。

感谢Jurg Lehni提示使用.activate()

PS使用PaperScope.get之前,请确保已创建paperscript对象。我为此使用了很好的'ol JQuery $('document').ready() ...

PPS Jurg Lehni本人的另一个小小的冲击:在PaperScript中,this将指向当前范围。您可以使用它并将其存储在全局对象中。

07-24 21:15