GDI + только рисовать экран правильно с первого раза - PullRequest
0 голосов
/ 09 мая 2019

Я кодирую игру в шашки.У меня есть класс 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);
}
...