Я кодировал шахматную игру для Windows на C # как упражнение для оттачивания своих навыков, а также потому, что это весело. Я включил функциональность, которая позволяет игроку выбирать опцию для выделения квадратов, на которые часть может легально перемещаться, когда на нее нажимают. CustomControl обрабатывает рендеринг шахматной доски, а также подсвечивает квадраты.
Все работает как запланировано, пока игрок не начнет перетаскивать фигуру на новый квадрат. В тот момент, когда мышь двигается, блики исчезают. Я подозреваю, что событие Paint происходит, и доска перерисовывается. А поскольку основные моменты не являются частью первоначального макета доски, они не прорисовываются.
Я бы хотел, чтобы квадраты оставались выделенными до тех пор, пока фигура не упадет на квадрат назначения. Возможно ли это сделать? Любые предложения будут оценены.
Код Psuedo:
void piece_MouseDown(object sender, MouseEventArgs e)
{
Piece piece = (Piece)sender;
legalSquares = CalculateLegalSquares(piece.CurrentSquare);
if (legalSquares.Count > 0 && this.showLegalMoves)
{
chessBoard1.HighlightSquares(legalSquares);
}
// I believe a Paint event gets raised either here...
piece.DoDragDrop(piece, DragDropEffects.Move);
}
void piece_DragEnter(object sender, DragEventArgs e)
{
// ...or here, that removes the highlights.
if (e.Data.GetDataPresent("Chess.Piece"))
{
e.Effect = DragDropEffects.Move;
}
else
{
e.Effect = DragDropEffects.None;
}
}
void piece_DragDrop(object sender, DragEventArgs e)
{
Piece piece = (Piece)e.Data.GetData("Chess.Piece");
if (piece.CurrentSquare != dropSquare)
{
if (legalSquares.Contains(dropSquare))
{
// This is where I’d like the highlights to stop
// DoStuff()
}
}
}