2009-01-10 4 views
1

J'ai codé un jeu d'échecs d'application Windows en C# pour améliorer mes compétences, et aussi parce que c'est amusant. J'ai inclus une fonctionnalité qui permet à un joueur de sélectionner l'option pour mettre en évidence les cases sur lesquelles un morceau peut légalement se déplacer lorsqu'il est cliqué. Un CustomControl gère le rendu de l'échiquier et met également en évidence les carrés. Tout fonctionne comme prévu jusqu'à ce que le joueur commence à faire glisser la pièce vers un nouveau carré. Au moment où la souris se déplace, les points saillants disparaissent. Je soupçonne qu'un événement Paint est levé et que la carte se redessine elle-même. Et puisque les faits saillants ne font pas partie de la mise en page initiale du tableau, ils ne sont pas dessinés. Ce que je voudrais, c'est que les carrés restent en surbrillance jusqu'à ce que la pièce tombe sur son carré de destination. Est-il possible d'accomplir cela? Toute suggestion sera appréciée.Les carrés en surbrillance sur un échiquier CustomControl ne persistent pas au-delà de l'événement initial MouseDown

Code 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() 
      } 
     } 
    } 

Répondre

1

Il semble que vous mettant en valeur les carrés valides en dessinant directement, mais cela va s'effacer sur tout repeindre. Vous perdrez probablement les surbrillances si votre fenêtre est repeinte pour d'autres raisons, telles que la réduction et la restauration, ou si vous faites glisser une autre fenêtre par-dessus.

Si c'est le cas, vous devez probablement remplacer la méthode OnPaint et y mettre votre surbrillance. Lorsque vous voulez modifier ce qui est en surbrillance, définissez un état dans votre classe pour contrôler ce qui est dessiné comme mis en surbrillance dans la méthode OnPaint, puis invalidez votre fenêtre.

+0

Cela semble être une bonne approche. J'ai déjà la méthode OnPaint substituée pour rendre les carrés et les étiquettes de rang et de fichier, donc je devrais être en mesure d'ajuster le code dans la classe d'échiquier pour persister les faits saillants aussi bien. Merci Daniel. – Bryan

+0

Merci encore Daniel. J'ai eu votre idée de travailler assez facilement, mais a ensuite eu un autre problème. Au début, les points forts ne tiraient plus sur l'événement MouseDown comme avant. Ensuite, j'ai utilisé Refresh au lieu de Invalidate pour déclencher l'événement Paint, et maintenant cela fonctionne comme espéré et a l'air génial. Marquage comme réponse. – Bryan

Questions connexes