Я кодирую игру в шашки.У меня есть класс CBoard, который имеет 2 вектора указателей на CGamePieces
и CTiles
.В первый раз, когда доска нарисована, она прекрасно рисует.Если я попытаюсь внести какие-либо изменения в векторы и снова нарисовать, исходная доска будет перерисована без отражения изменений.
Вот как я добавляю элементы к этим векторам:
void CBoard::getPieces()
{
while(mGamePieces.size() < 12)
{
shared_ptr<CWhitePiece> white(new CWhitePiece());
white->setBoard(this);
white->setTile(mTiles[tileIndex]);
mGamePieces.push_back(white);
}
}
Врисуя доску, я вызываю функцию Draw на всех CTiles
и CGamePieces
, перебирая векторы, которые выглядят так:
void CGamePiece::Draw(Gdiplus::Graphics * graphics)
{
double wid = 100;
double hit = 100;
graphics->DrawImage(mImage.get(),
float(mTile->getColumn() / 2) + 100 * mTile->getColumn(), float(mTile->getRow() / 2) + 100 * mTile->getRow(),
100.0, 100.0);
}
Используя отладчик, я вижу, что векторповторяющиеся действия отражают изменения - если я удаляю что-то, то на один элемент меньше, и если я добавляю что-то, этот элемент присутствует в векторе.Этот код вызывается непосредственно перед перерисовкой платы:
void CBoard::move()
{
shared_ptr<CBrownPiece> brown(new CBrownPiece());
brown->setBoard(this);
brown->setTile(mTiles[30]);
mGamePieces.push_back(brown);
}
Поскольку при отладке изменения вносятся в вектор, я не уверен, почему эта дополнительная часть не была нарисована наэкран, особенно когда я вижу функцию Draw, вызываемую на нем.Если доска нарисована с помощью вызова draw для каждого элемента этих векторов, разве элементы, добавляемые / удаляемые в вектор, не должны быть нарисованы / удалены с экрана?
Я перерисовываю экран, когда на элемент нажимают
/**
* When the mouse is pressed down, we will run the HitTest function.
* If HitTest does not return a nullpointer, we will run the
* move function.
*/
void CChildView::OnLButtonDown(UINT nFlags, CPoint point)
{
// Check if a piece has been clicked
mClickedPiece = mBoard.HitTest(point.x, point.y);
if (mClickedPiece != nullptr && !mClickedPiece->getClicked())
{
mClickedPiece->setClicked(true); // This will allow us to find the piece to move in the vector of CGamePieces
mBoard.move();
OnPaint();
//mClickedPiece->setClicked(false);
}
}
/** This function is called to draw in the window.
*
* This function is called in response to a drawing message
* whenever we need to redraw the window on the screen.
* It is responsible for painting the window.
*/
void CChildView::OnPaint()
{
CPaintDC paintDC(this); // device context for painting
CDoubleBufferDC dc(&paintDC); // device context for painting
Graphics graphics(dc.m_hDC);
mBoard.OnDraw(&graphics);
}