我正在创建一个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。
问题是我的电路板看起来像这样(抱歉,如果它有点伤害你的眼睛):
如你所见,圆圈太远而且离开了。它们也太小了,但很容易修复。我尝试将一些整数改为双打,但最终结果是这是我对真实模式的最接近。扩展公式(扩展(i + 1./2))的位置看起来也一样。
我是否错过了一个小细节,或者我背后的整个逻辑是什么?
修改 根据要求,类型:
tilePos.x
:POINT(Windows API一,使用的类型是LONG)
boardPixelDims.*
:双倍
Board::Dims::MAXX/MAXY
:枚举值(整数,分别包含7和6)
答案 0 :(得分:2)
根据CIRCLE_SIZE是用作半径还是直径,FillEllipse调用中的两个参数似乎是错误的。如果它是直径,那么您应该将位置设置为pos.x - CIRCLE_SIZE/2
和pos.y - CIRCLE_SIZE/2
。如果它是一个半径,则高度和宽度参数应分别为2 * CIRCLE_SIZE而不是CIRCLE_SIZE。
更新 - 由于您将变量名称更改为CIRCLE_RADIUS,后一种解决方案现在显然是正确的。
答案 1 :(得分:0)
我记得形状相关函数所采用的最简单的方法是始终用矩形来思考。 FillEllipse将只绘制一个椭圆来填充您给它的矩形。 x,y,宽度和高度。
练习的简单实验是,如果您更改对FillRect的调用,请将所有内容定位好,然后将其更改为FillEllipse。