我正在编写跳棋游戏。
我在屏幕上有木板图,并且在其原始位置上有碎片。我想在每次移动一块时重新绘制木板。
当我运行函数以重画电路板时,出现以下错误。当我在指向位图的指针上使用GDIplus函数.get()时,就会发生这种情况:
Exception thrown at 0x6815CD2F (GdiPlus.dll) in Step2.exe: 0xC0000005: Access violation reading location 0xCCCCCCD0.
我将图块和游戏块推回向量,如下所示:
void CBoard::getPieces()
{
while(mGamePieces.size() < 12)
{
CWhitePiece* white = new CWhitePiece();
mGamePieces.push_back(white);
}
while (mGamePieces.size() < 24)
{
CBrownPiece* brown = new CBrownPiece();
mGamePieces.push_back(brown);
}
}
要绘制游戏片段,请在每个游戏片段上调用Draw:
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);
}
第一次绘制完美。要移动一块,我更改了与其关联的图块(这将更改其绘制位置),然后尝试重新绘制该板。重新绘制时,当在类型为std :: unique_ptr的mImage上调用.get()并在创建游戏块时设置时,会发生分段错误。
我意识到,如果在尝试移动一块之前尝试多次画板,则不会出现此错误。它只会在我尝试移动一件物品后发生。
现在这是我在move()中拥有的一切:
void CBoard::move()
{
// Find piece to move
// Display possible destinations
shared_ptr<CGamePiece> gamePiece = findPieceToMove();
if (gamePiece != nullptr && gamePiece->getColor() == "Brown")
{
DrawPieces(mGraphics);
}
else if (gamePiece != nullptr && gamePiece->getColor() == "White")
{
DrawPieces(mGraphics);
}
}