在循环中的特定坐标处绘制

时间:2013-05-07 16:40:20

标签: c++ canvas drawing

我正在尝试编写一个简单读取多维数组的程序(使用'for'循环),如果遇到某个字母(如'A'),它会绘制一个矩形形状(即时使用画布库和绘制形状的函数。)

我正在尝试使用画布绘制一个类似迷宫的地图。但由于一些奇怪的原因,它并不是正确的。我认为这是读取数组的问题,我不知道为什么。

来自文本文件的多维数组读取输入,如下所示(示例): 这是我尝试使用画布创建的迷宫地图的布局。

AAAAAAAAAAAAAAAAAAAAA
A.........A.........A
A.........A.........A
A...............AAAAA
AAAAA...............A
AAAAAAAAAAAAAAAAAAAAA

当然'A'将替换为填充矩形以表示墙

''。'代表道路。

这是我的代码:

void MazeGame::DrawMap(Canvas &canvas, char (&map)[20][26]) 
{ 
    double drawx = 200; 
    double drawy = 200;

    for(int i = 0; i < 20; i++)
    {
        for(int j = 0; j < 26; j++)
        {
            if(map[i][j] == 'A') 
            {
                canvas.DrawFillRect(drawx+10, drawy, 10, 10);
            } 

            if(map[i][j] == '.')
            {
                map[i][j] = ' ';  
            }
        }
    }
}
我在课堂上写了这个函数。

我将两个'double'变量drawx和drawy初始化为200.这被认为是将绘制形状的x和y原点坐标。 当然,正在读取字符数组时,x&amp; y坐标必须相应地移动到迷宫布局在文本文件中的显示方式,否则,在绘制形状时,它将简单地绘制或覆盖先前绘制的形状。我不想那个

我觉得这很简单,但输出让我很困惑。 有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你没有递增 drawx drawy ,所以程序总是在(210,200)处绘制。

canvas.DrawFillRect(10*i + drawx, j*10 + drawy, 10, 10);

另外,您可能需要查看:http://en.wikipedia.org/wiki/Single_responsibility_principle

并将点替换模块移动到另一个函数中。

答案 1 :(得分:1)

这样的事情怎么样:

if(map[i][j] == 'A')
{
    canvas.DrawFillRect(i * 10 + drawx, j * 10 + drawy, 10, 10);
} 

这样您就可以翻译每个矩形的x和y坐标。

以这种方式思考:

where: 
    i = 0, x = 0 * 10 + 200 = 200
    i = 1, x = 1 * 10 + 200 = 210
    i = 2, x = 2 * 10 + 200 = 220
    i = 3, x = 3 * 10 + 200 = 230
    ect...

答案 2 :(得分:0)

你永远不会在(210,200)之外的任何其他位置画任何东西。

绘图时,您应该执行以下操作:

canvas.DrawFillRect(drawx + 10 * j, drawy + 10 * i, 10, 10)

假设数组以标准[height] [width]形式表示。