【问题标题】:Game Development Using IIFEs - Code Seperation使用 IIFE 进行游戏开发 - 代码分离
【发布时间】:2016-03-17 11:09:20
【问题描述】:

所以,我目前正在学习如何使用 Javascript 进行 Canvas 游戏开发。在查看了几个示例中使用的方法并阅读了其中的好处之后,我开始将我的代码转移到 IIFE 中。

但是,目前,我的所有代码都在一个 IIFE 中。我想要做的是开始将我的代码分成单独的文件。

然而,我坚持的部分是如何让每个 IIFE 函数看到另一个函数中的数据。我真的不明白这是如何工作的。

我的完整代码在这个小提琴中,https://jsfiddle.net/473z1g2t/1/,而我的代码示例在下面;

(function(){
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    function Ball(x, y, radius, color){
        /* .. */
    }

    function Paddle(x, y){
        /* .. */
    }

    var ball = new Ball((canvas.width / 2), canvas.height - 60, 10, 'black');
    var paddle = new Paddle((canvas.width / 2) - 20, 550);

    function initCanvas(){
        canvas.addEventListener('click', function(){
            if(!ball.active)
                ball.active = true;
            else
                ball.active = false;
        });

        canvas.addEventListener('mousemove', function(e){

        });
    }

    initCanvas();

    function Update(){
        Draw();
        requestAnimationFrame(Update);

        if(ball.active){
            /* .. */
        }
    }
    function Draw(){
        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ball.draw();
        paddle.draw();
    }

    requestAnimationFrame(Update);
})();

TLDR

我想将我的 Paddle 和 Ball 逻辑与应用程序的其余部分(可能还有 canvasInit 函数)分开。解决此问题的首选方法是什么?我知道我可以将参数传递给这些函数,但是我在它们之间传递什么?

提前致谢。

【问题讨论】:

    标签: javascript html canvas logic


    【解决方案1】:

    据我从您的代码中了解到,您实际上并没有在垫子和球之间进行通信。

    因此,您可以将类移动到另一个文件中,并拥有一个主文件(画布文件)来编排屏幕上的元素。

    ```

    (function(canvas, ctx) {
        function Ball(x, y, radius, color){
            this.x = x;
            this.y = y;
            this.r = radius;
            this.c = color;
            this.vx = -3;
            this.vy = -3;
            this.active = false;
    
            this.draw = function(){
                ctx.beginPath();
                ctx.arc(this.x, this.y, this.r, 0, Math.PI*2);
                ctx.fill();
                ctx.closePath();
            }
        }
    })(canvas, ctx);
    

    ```

    您可以这样做并共享全​​局 canvas 和 ctx,也可以将 canvas 和 ctx 作为 Ball/Paddle 构造函数中的参数发送

    如果你想在它们之间共享数据,你可以在编排调用方法中使用特定的参数来完成。

    【讨论】:

    • 谢谢,这确实有帮助! - 尽管我仍然不确定我是否完全理解 canvas、构造函数中的 ctx 和 return 发生了什么。肯定需要更多阅读!
    • 忽略这个。由于您将它们定义到另一个 IIFE 中,它们不是全局的,因此最好作为参数发送。您可以尝试使用一些参数构建器模式,例如 new Ball().withContext(ctx) 以提高可读性 像这样: Ball.prototype.withContext = function(c) { this.ctx = c;返回这个; }
    • 我刚刚尝试过这个,并收到 ctx 和 canvas 的未定义错误。我错过了什么吗?我也尝试在 main.js 文件中返回它们。
    • 你能提供更多代码吗?你把draw方法从ctx.beginPath();改成this.ctx.beginPath();了吗?
    • 我已经构建了一个最小的演示来开始重构我的代码。你可以在这里找到它 - jsfiddle.net/h7b3wbfe - 我现在要做的就是让画布从另一个文件中绘制
    猜你喜欢
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    相关资源
    最近更新 更多