3

我目前正在编写一个简单的蛇游戏。
http://jsfiddle.net/jhGq4/3/
我开始为背景绘制网格

function fill_grid() {
    ctx.beginPath();
    var row_no = w/cw;
    var col_no = h/cw;
    for (var i=0;i<row_no;i++)
    {
        for (var j=0;j<col_no;j++)
        {
            ctx.rect(i*cw, j*cw, (i+1)*cw, (j+1)*cw);
            ctx.fillStyle = 'black';
            ctx.fill();
            ctx.lineWidth = 1;
            ctx.strokeStyle = '#135d80';
            ctx.stroke();
        }
    }

}

它效果很好,但是当我画蛇时,位置出错了,长度加倍了。我试图控制台记录我的蛇的 x 位置,但它们是正确的。

function paint_cell(x, y)
{
    console.log(x*cw);
    console.log((x+1)*cw);
    ctx.fillStyle = '#fff799';
    ctx.fillRect(x*cw, y*cw, (x+1)*cw, (y+1)*cw);
    ctx.lineWidth = 1;
    ctx.strokeStyle = '#135d80';
    ctx.strokeRect(x*cw, y*cw, (x+1)*cw, (y+1)*cw);
}

***因为有人想学习如何制作蛇游戏,这是我对这个游戏的最终解决方案。 http://jsfiddle.net/wd9z9/
也可以访问我的网站玩:

使用WSAD玩。 http://www.catoyeung.com/snake2/single.php :D

4

1 回答 1

1

我测试了这个替代初始化函数:

function init()
{
        fill_grid();
        // create_snake1();
        // paint_snake1();
        paint_cell(5, 5)
}

它从坐标 (5,5) 开始绘制一个正方形,但大小为 6x6。

我相信您在滥用 fillRect() 方法。利用

        ctx.fillRect(x*cw, y*cw, cw, cw);

代替

        ctx.fillRect(x*cw, y*cw, (x+1)*cw, (y+1)*cw);

这可能同样适用于 strokeRect。

顺便说一句,我正在查看您的网格填充功能。您填充 i*j 相邻的正方形,这是可行的,但您实际上只需要 i 垂直线和 j 水平线 - 这需要更少的处理。以更少的计算运行更快的循环:

function fill_grid() {
        ctx.beginPath();
        ctx.fillStyle = 'black';
        ctx.fillRect(0,0,w,h);
        for (var i=0;i<=h;i+=cw)
        {
            ctx.moveTo(0,i);
            ctx.lineTo(w,i);
            ctx.moveTo(i,0);
            ctx.lineTo(i,h);
        }
        ctx.stroke();
    }

当您初始化画布时,我也只会定义一次线宽和笔触颜色。当然,您可能不需要担心这一点。但是,如果您经常刷新网格来为您的蛇设置动画,那么这种护理会产生影响。

于 2013-05-11T14:26:29.643 回答