0

我正在创建一个 2P Connect 4 游戏,但我似乎无法让圆形区域均匀地放置令牌。

这是初始化每个圆的位置的代码:

POINT tilePos;

for (int i = 0; i < Board::Dims::MAXX; ++i) 
{
    tileXY.push_back (std::vector<POINT> (Board::Dims::MAXY)); //add column

    for (int j = 0; j < Board::Dims::MAXY; ++j)
    {
        tilePos.x = boardPixelDims.left + (i + 1./2) * (boardPixelDims.width / Board::Dims::MAXX);
            tilePos.y = boardPixelDims.top + (j + 1./2) * (boardPixelDims.height / Board::Dims::MAXY);

        tileXY.at (i).push_back (tilePos); //add circle in column
    }
}

我使用POINTs,的 2D 向量tileXY来存储位置。回想一下,棋盘宽 7 圈,高 6 圈。

我的逻辑是,第一个圆圈(对于 X)从以下位置开始:

left + width / #circles * 0 + width / #circles / 2

width / #circles并且每次都增加,这对于较小数量的圆圈很容易描绘。

后来,我画了这样的圆圈:

for (const std::vector<POINT> &col : _tileXY)
{
    for (const POINT pos : col)
    {
        if (g.FillEllipse (&red, (int)(pos.x - CIRCLE_RADIUS), pos.y - CIRCLE_RADIUS, CIRCLE_RADIUS, CIRCLE_RADIUS) != Gdiplus::Status::Ok)
            MessageBox (_windows.gameWindow, "FillEllipse failed.", 0, MB_SYSTEMMODAL);
    }
}

这些循环遍历向量的每个元素,并用红色绘制每个圆圈(此时突出)。int 转换是为了消除函数调用的歧义。刷后的前两个参数是左上角,CIRCLE_RADIUS是50。

问题是我的电路板看起来像这样(对不起,如果它有点伤害你的眼睛):

圆圈离得太远了。

正如你所看到的,这些圆圈太左太高了。它们也太小了,但这很容易解决。我尝试将一些整数更改为双精度数,但最终以这是我最接近真实模式的结果。位置的扩展公式(扩展 (i + 1./2))看起来也一样。

我错过了一个小细节,还是我背后的整个逻辑都没有?

编辑: 根据要求,类型:

tilePos.x: POINT (windows API一,使用的类型是LONG)
boardPixelDims.*: double
Board::Dims::MAXX/MAXY: 枚举值(整数,分别包含7和6)

4

2 回答 2

2

根据 CIRCLE_SIZE 是打算用作半径还是直径,您的两个参数在 FillEllipse 调用中似乎是错误的。如果它是一个直径,那么您应该将位置设置为pos.x - CIRCLE_SIZE/2and pos.y - CIRCLE_SIZE/2。如果是半径,则高度和宽度参数应分别为 2*CIRCLE_SIZE 而不是 CIRCLE_SIZE。

更新 - 由于您将变量名称更改为 CIRCLE_RADIUS,后一种解决方案现在显然是正确的解决方案。

于 2012-05-02T00:33:22.970 回答
0

我记得形状相关函数采用什么参数的最简单方法是始终以矩形思考。FillEllipse 只会绘制一个椭圆来填充您给它的矩形。x、y、宽度和高度。

一个简单的练习实验是,如果您将调用更改为 FillRect,让所有位置都正常,然后将它们更改为 FillEllipse。

于 2012-05-05T05:09:10.373 回答