html - 如何构建 AngularJS 和 PaperJS 项目

标签 html angularjs canvas angularjs-routing paperjs

想法是在简单的 Canvas 游戏开发中使用 Angular。从理论上讲,该项目应该受益于更加系统化、可管理和可扩展。这不是 sprite/tile/collision 游戏,PaperJS 用于进行大多数 Canvas 绘制和交互。

  1. 将 Paper.js(或其他 Canvas 绘图库)集成到多个 NG View 以使每个 View 代表一个游戏阶段的最佳方法是什么?
  2. 是否可以设置 Paper 一次并在多个 View 中使用 paper?
  3. 该游戏允许用户重新访问之前的阶段/ View 。每次加载 View / Canvas 时我都必须重新设置 Paper 吗? (如下例所示,如果只设置一次,第二次访问 View 时将出现空白 Canvas )
  4. 如何在 View 之间传输 Paper js 信息?例如在 View 1 中捕获用户绘图,并在 View 3 中显示绘图。

背景:

论文JS

我正在开发一个项目,创建一个简单的 canvas 游戏,有 4 个阶段。我决定使用 PaperJS,因为它在绘制和动画形状方面具有优势。每个阶段的内容和用户界面都保存在同一论文项目中的单独层中。

Angular JS

随着游戏的发展,游戏变得越来越复杂。经过一些研究,我决定使用 Angular 来组织整个游戏,尽管我是 Angular 的新手。计划:

  • 4 个游戏阶段分为四个 View ,每个 View 都有自己的 Canvas
  • 自定义指令用于在每个 Canvas 上设置纸张
  • 使用服务在 Canvas 之间进行通信。例如允许用户在第一阶段绘图,第二阶段显示绘图

我在 plunker 中制作了一个模型,展示了 Paper.js 的基本设置和动画。每个 Canvas 都位于一个单独的 View 中,并启用了路由。

Plunker 演示:http://plnkr.co/edit/Um1jTp8xTmAzVEdzk2Oq?p=preview

为了测试,我做了

paper.project.layers[0].children

随时可见。设置纸张后,触发“添加形状”按钮会按预期将 child 引入事件层。

问题 1(演示中的 Draw1)

在 DRAW1 中,纸张只会在 View 首次加载时在 Canvas 上设置一次:

drawControllers.directive('drawingBoard',['drawService',function(drawService){

function link(scope, element, attrs){

    // setup Paper

    var canvas = element[0];

    if ( scope.objectValue.count < 1){

        paper = new paper.PaperScope();
        paper.setup(canvas);
        scope.setCount( scope.objectValue.count + 1 );

        with (paper) {

            var shape = new Shape.Circle(new Point(200, 200), 200);
                shape.strokeColor = 'black';
                shape.fillColor = 'yellow';

            // Display data in canvas
            var text = new PointText(new Point(20, 20));
                text.justification = 'left';
                text.fillColor = 'black';

            var text2 = new PointText(new Point(200, 200));
                text2.justification = 'center';
                text2.fillColor = 'black';
                text2.content = 'click to change size';

            shape.onClick = function(event) {
                this.fillColor = 'orange';
                scope.$apply(function () {
                  scope.setWidth(Math.round((Math.random()*100)+100));
                });
            }

            view.onFrame = function(event) {

                if ( text.position.x > 440 ){
                  text.position.x = -40;
                } else {
                  text.position.x = text.position.x + 3;
                }

                text.content = 'Shape width: ' + scope.objectValue.width;

                shape.radius = scope.objectValue.width;

                scope.$apply(function () {
                    scope.setMessage();          
                });

            }

            paper.view.draw();

        }

    } else {

        scope.setMessage();

    }

}

return {
    link: link
}

}]);

但是,如果从 DRAW1 导航到 HOME 并返回到 DRAW1, Canvas 将显示为空白。但是此时触发“添加形状”仍会为图层创建新的子项。

问题 2(演示中的 DRAW2)

通过删除这一行

if ( scope.objectValue.count < 1){
    // ... paper setup ...
}

纸张每次加载时都会在 DRAW2 中设置。

但这每次都会引入一个新的论文项目。

谢谢

感谢您的任何意见和建议。

最佳答案

您正在 link 函数中创建新的论文项目,每次使用您的指令都会运行该函数,特别是每次生成新 View 时。

如果你想让它只运行一次,你可以把它放在指令的compile函数中,或者放在专用的Angular service中,或者不要关闭/重新-打开 View 。

后者可以简单地使用 ng-show/ng-hide 将 View 保留在 DOM 中而不是更改路由来完成:https://stackoverflow.com/a/26820013/1614973 .

关于html - 如何构建 AngularJS 和 PaperJS 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25276709/

相关文章:

javascript - 使用 Javascript 将两个数字相加并在文本框中显示结果

javascript - Ionic 中的 Angularjs $http 发布错误

android - 矩形 Canvas 中的效果阴影

javascript - 如何围绕 fabric.js 中的一个指定点旋转?

html - 在 HTML 5 2d Canvas 上下文中查找曲线上的点

html - 奇怪的 CSS 过渡问题

html - Wordpress 不断添加 <a> 标签

javascript - Slickgrid - 调整列大小触发 onHeaderClick 事件

html - 一个html5文档可以有两个id吗?

javascript - Handsontable,自定义文本编辑器,复制/粘贴问题