【问题标题】:Moving rectangles in opposite directions in canvas在画布中沿相反方向移动矩形
【发布时间】:2015-03-27 12:11:05
【问题描述】:

原谅菜鸟问题,对 JS 来说是全新的。

我已经成功地在画布中来回移动了一个矩形,我想添加第二个相反的方向(甚至上下)

唯一的问题是第二个矩形是静态的,我不能让它移动。

我可以在我的第一个正方形的同一个函数中放置一个新的 ctx.fillRect(x,y,w,h) 吗?

atm 看起来是这样的:

function drawSquare(ctx) {

    clearCanvas(ctx); 
    ctx.fillStyle = "black";
    ctx.fillRect(xpos, 140, 20, 20);
    if(direction==="goright"){
        if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
    } if(direction==="left"){
        if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
    }
    // This is the second square i am having trouble with??
    ctx.strokeStyle = "black";
    ctx.strokeRect(780, 200, 20, 20)

    if(direction==="goright"){
        if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
    } if(direction==="left"){
        if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
    }

如果需要,我有我的变量和其他编码。 但是我需要为第二个正方形设置第二个方向变量吗? 还是我需要为它设置一个完全不同的函数和新的 setInterval?

【问题讨论】:

    标签: javascript canvas


    【解决方案1】:

    您需要在更新xpos 变量之后 绘制第二个矩形,并使用xpos 变量。

    function drawSquare(ctx) {
        clearCanvas(ctx); 
        if(direction==="goright"){
            if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
        } if(direction==="left"){
            if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
        }
        ctx.fillStyle = "black";
        ctx.fillRect(xpos, 140, 20, 20);
    
        if(direction==="goright"){
            if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
        } if(direction==="left"){
            if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
        }
        // This is the second square i am having trouble with??
        ctx.strokeStyle = "black";
        ctx.strokeRect(xpos, 200, 20, 20)
    }
    

    这是一个有效的 sn-p

    var
        ctx = document.getElementById('c').getContext('2d'),
        xpos = 0, t,
        canvasWidth = 256,
        direction = "goright"
    ; 
    
    function drawSquare(ctx) {
            ctx.clearRect(0,0,256,256); 
            if(direction==="goright"){
                if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
            } if(direction==="left"){
                if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
            }
            ctx.fillStyle = "black";
            ctx.fillRect(xpos, 140, 20, 20);
            
            if(direction==="goright"){
                if(xpos<canvasWidth - 20){xpos = xpos + 5;}else{direction = "left";}
            } if(direction==="left"){
                if(xpos>0){xpos = xpos - 5;}else{direction = "goright";}   
            }
            // This is the second square i am having trouble with??
            ctx.strokeStyle = "black";
            t = window.performance.now();
            ctx.strokeRect(xpos + Math.cos(t * 0.001) * 32, Math.sin(t * 0.001) * 118 + 128, 20, 20)
        }
    
    window.requestAnimationFrame(function draw() {
    drawSquare(ctx);
      window.requestAnimationFrame(draw);
    });
    &lt;canvas width="256" height="256" id="c"&gt;&lt;/canvas&gt;

    【讨论】:

    • 嘿 LJ,谢谢,我将它复制到我的文本编辑器中,我收到无法读取 null 的“getContext”属性的错误我显然更改了我的 html 文件以适应写入 ID 等。是window.requestAnimationFrame 和 set.Interval(function.. 或者类似的东西一样是吗?还没用过。
    • 它的类似 是的,它在浏览器准备就绪时执行,但每秒不超过 60 次。 setInterval“总是”执行,即使浏览器可能尚未准备好或尚未完成最后一次调用。这可能会导致重型应用程序的性能问题。 Read more here。上面的可见代码应该是“答案”,其中折叠的代码更吸引眼球;)
    • Sweet,我会考虑使用它,还有什么我应该改变的吗?
    • 好吧,我猜一些适当的缩进不会伤害。此外,您可能希望使用对象来表示您的框并使用循环遍历它们的列表。
    • 会做,需要代表更高一点,但 np。 ty
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多