Connect 4 Board中的不均匀圈子

时间:2012-05-01 23:46:35

标签: c++ winapi math gdi+

我正在创建一个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
    }
}

我使用POINT s,tileXY的2D矢量来存储位置。召回董事会是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。

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

The circles are too far up and left.

如你所见,圆圈太远而且离开了。它们也太小了,但很容易修复。我尝试将一些整数改为双打,但最终结果是这是我对真实模式的最接近。扩展公式(扩展(i + 1./2))的位置看起来也一样。

我是否错过了一个小细节,或者我背后的整个逻辑是什么?

修改 根据要求,类型:

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

练习的简单实验是,如果您更改对FillRect的调用,请将所有内容定位好,然后将其更改为FillEllipse。