Strange BitBlt behavior
Posted on 2002-04-14
I have a simple board game I'm writing in C++. I have an eight by eight grid of blocks. When the user starts a new level rather than having the blocks just "appear" I wanted them to fall, a la bejeweled.
I have written a procedure that seems to work great when I step through it in the debugger. The blocks fall just like they are supposed to. But when I run it without being in single-step mode I get nothing until the normal WM_PAINT fires and redraws the whole board.
Any ideas what might cause a BitBlt to appear in single step mode but not in normal-speed execution? Here is the code for what its worth. Note that I am going to refine this to move the blocks based on how much time has elapsed to compensate for older machines. But right now, I'm only concerned that it runs. Not how fast/slowly it runs.
int nRow, nCol;
nWidth = (BLOCK_WIDTH * m_nBlocksWide);
nHeight = (BLOCK_HEIGHT * m_nBlocksHigh);
pBMP.CreateCompatibleBitmap(this->GetDC(), nWidth, nHeight);
nSavedDC = pDC.SaveDC();
StartTime = GetTickCount();
//m_nBlocksFalling is the number of blocks that are being animated
//At the beginning of a level, this wil be 64 (8x8 grid)
//Fill my offscreen buffer with black
pDC.FillSolidRect(0, 0, nWidth, nHeight, 0);
CurrentTime = GetTickCount();
for(nRow = 0; nRow < m_nBlocksHigh; nRow++)
for(nCol = 0; nCol < m_nBlocksWide; nCol++)
//If this block isn't where it is supposed to be, and its delay
//has expired, move it
(m_Blocks[nRow][nCol].nY != m_Blocks[nRow][nCol].nDesiredY) &&
(m_Blocks[nRow][nCol].nDepartureOffset + StartTime <= CurrentTime) )
//Calculate the new position...
m_Blocks[nRow][nCol].nY += m_Blocks[nRow][nCol].nVelocity;
//Did it move past the desired location?
if(m_Blocks[nRow][nCol].nY > m_Blocks[nRow][nCol].nDesiredY)
m_Blocks[nRow][nCol].nY = m_Blocks[nRow][nCol].nDesiredY;
m_nBlocksFalling--; //This block has reached its destination
//increase velocity to simulate a gravitational effect
m_Blocks[nRow][nCol].nVelocity = (int)(m_Blocks[nRow][nCol].nVelocity* 1.5);
//Draw the block in its current location
DrawBlock(nRow, nCol, &pDC, 0, 0);
//Once the entire grid has been redraw, blt the offscreen buffer to the window
pDestDC = this->GetDC();
pDestDC->BitBlt(m_nLeftMargin, m_nTopMargin, nWidth, nHeight, &pDC, 0, 0, SRCCOPY);
ReleaseDC(pDestDC); //DO I NEED THIS?
//This delay was added to slow things down so I can see what it happening.
while(GetTickCount() - StartTime < 5000);