继续上个版本修改了一些bug,然后美化了一下。
发现自己的审美观不咋的,俺觉得漂亮的人家觉得不漂亮。还是照着大家要求的画一个。
主要解决的问题是,这次行列都用宏表示,这样可以修改行列,窗口大小也动态改变。
另外长条旋转变成Z型问题也解决,主要是取模的时候绕回去了。
其中最重要的要算是解决了刷新闪烁问题,尽管HAM2008指点过,始终没做成,这次vczh说了一句话就点醒了我。根本不应该使用InvalidateRect函数,直接画,然后用缓冲DC就可以了。
VOID OnPaint()
{
HDC hdc = GetDC(hWnd);
HDC bitmap_dc = CreateCompatibleDC(hdc);
HBITMAP bitmap = CreateCompatibleBitmap(hdc,1024,768);
SelectObject(bitmap_dc,bitmap);
/**//********************************************
DrawBlock
*********************************************/
int x = tetris.GetX();
int y = tetris.GetY();
for(int i=0; i<4; ++i)
{
for(int j=0; j<4; ++j)
{
if(current_block[i][j] == 1)
{
DrawBlock(bitmap_dc,y+i+1,x+j+1,3,3,tetris.GetColor(),RGB(0,0,0));
}
}
}
/**//*****************************************
*DrawContainer
******************************************/
for(int i=0; i<ROWS; ++i)
{
for(int j=0; j<COLS; ++j)
{
if(Container[i][j] == 1)
{
DrawBlock(bitmap_dc,i+1,j+1,3,3,ColorTable[i][j],RGB(0,0,0));
}
}
}
BitBlt(hdc,0,0,1024,768,bitmap_dc,0,0,SRCCOPY);
DeleteDC(bitmap_dc);
DeleteObject(bitmap);
ReleaseDC(hWnd,hdc);
}
以上就是GDI缓冲的主要实现代码。
可执行文件下载代码还是等全部完善后上传吧。Redist请自行下载。
代码估计要有大的改动,感觉现在的代码没一点C++的味道。
有点简单,用陈坤的话说就是扩展性不好。