本人用VS2017编写Windows桌面程序的俄罗斯方块,大概的原理就是根据地图来绘制图形,每移动一下都会把地图区域画成白板再根据新地图重新绘图,但是程序出现了一个BUG,那就是当格子数变多之后,程序的界面就跟卡住了一样,回到初始的界面,但是程序依然在运行,画图函数也依然在运行,地图也没发生改变,但画出来的就是白板,或者说画不出东西出来了。
这是画图的函数
void GMap::DrawGameMap(HDC &memDc)
{
COLORREF color = RGB(0, 171, 255);
for (int i = 0; i < MAPHEIGHT; i++)
{
for (int j = 0; j < MAPWIDTH; j++)
{
if (MapData[i][j])
{
int x = (OBJECTLENTH * 7) + j * OBJECTLENTH+WALLLENTH;
int y = WALLLENTH + i * OBJECTLENTH;
RECT rect;
rect.left = x;
rect.right = x + OBJECTLENTH;
rect.top = y;
rect.bottom = y + OBJECTLENTH;
FillRect(memDc, &rect, CreateSolidBrush(color));
}
}
}
}
这是画白板的函数
void GMap::DrawBlank(HDC &memDc)
{
COLORREF color = RGB(255, 255, 255);
RECT rect;
rect.left = OBJECTLENTH * 7 + WALLLENTH;
rect.right =17 * OBJECTLENTH + WALLLENTH;
rect.top = WALLLENTH;
rect.bottom = WALLLENTH + 20 * OBJECTLENTH;
FillRect(memDc, &rect, CreateSolidBrush(color));
}
这是主循环的画图部分
if (GetTickCount() - t > 400 )
{
HDC hdc = GetDC(hWnd);
temp->Down(Map);
Map.DrawBlank(hdc);
Map.DrawGameMap(hdc);
ReleaseDC(hWnd, hdc);
t = GetTickCount();
}
这是CALLBACK WndProc函数的画图部分
case WM_KEYDOWN:
if (wParam==VK_SPACE)
{
HDC hdc = GetDC(hWnd);
temp->Translate(Map);
Map.DrawBlank(hdc);
Map.DrawGameMap(hdc);
ReleaseDC(hWnd, hdc);
}
else if (wParam == VK_RIGHT)
{
HDC hdc = GetDC(hWnd);
temp->MoveRight(Map);
Map.DrawBlank(hdc);
Map.DrawGameMap(hdc);
ReleaseDC(hWnd, hdc);
}
else if (wParam == VK_LEFT)
{
HDC hdc = GetDC(hWnd);
temp->MoveLeft(Map);
Map.DrawBlank(hdc);
Map.DrawGameMap(hdc);
ReleaseDC(hWnd, hdc);
}
else if (wParam == VK_DOWN)
{
HDC hdc = GetDC(hWnd);
temp->Down(Map);
Map.DrawBlank(hdc);
Map.DrawGameMap(hdc);
ReleaseDC(hWnd, hdc);
}
break;
程序运行时候的图片
程序画不出图像之后的图片
之前做贪吃蛇的时候就没出现过这个问题,为什么这个刷新刷新着就画不出图了。。。急QAQ
你可以尝试每次只重绘更新的部分,或者调整一下刷新率。
只重画更新部分?