Silverlightオンライン チェスシステムにチェス盤を実装しました。
これが私がやった方法です。
- チェス盤用に別のユーザー コントロールを作成しました
- コントロールに 8x8 のグリッドを追加しました
- 次に、それぞれ異なる色 (暗い正方形と明るい正方形) でシェーディングする 64 の境界線を追加しました。それぞれに名前を付けてください。各境界線は、Grid.Row および Grid.Col プロパティを使用してグリッドに配置されました。
- 各 Border 内に、チェスの駒の画像を保持する Image を追加しました。
- 現在のゲームの状態に基づいて、画像を正しいチェスの駒に設定する方法をいくつかコーディングする必要があります。
各イメージは同じイベントを受け取り (これは重要です)、64 個すべてが同じコードを呼び出します。
MouseLeftButtonDown="Image_MouseLeftButtonDown" MouseMove="Image_MouseMove" MouseLeftButtonUp="Image_MouseLeftButtonUp"
これら 3 つのイベントの背後にある考え方は、クリックの起点を取得する画像 (MouseLeftButtonDown) をクリックしたときに記録し、マウスが動いているときにイベントを呼び出すことです。これにより、ピースの動きに合わせて画面を更新できます。マウス ボタンを放したときに記録する最後のイベント (MouseLeftButtonUp) を使用すると、移動先を取得してチェス エンジンに移動を送信できます。チェス エンジンによって動きが記録されたら、チェス盤を再描画するだけです。
private void Image_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Image image = (Image)sender;
Border border = (Border)image.Parent;
image.CaptureMouse();
isMouseCapture = true;
mouseXOffset = e.GetPosition(border).X;
mouseYOffset = e.GetPosition(border).Y;
var chessPiece = (Image) sender;
var chessSquare = (Border) chessPiece.Parent;
var row = (byte) (Grid.GetRow(chessSquare));
var column = (byte) (Grid.GetColumn(chessSquare) - 1);
if (engine.HumanPlayer == ChessPieceColor.White)
{
SelectionChanged(row, column, false);
}
else
{
SelectionChanged((byte)(7 - row), (byte)(7 - column), false);
}
}
SelectionChanged は、ユーザーが選択したソース スクエアを記録する独自の方法です。isMouseCapture は、ユーザーがピースのドラッグを開始したときを記録するための独自の変数でもあります。
private void Image_MouseMove(object sender, MouseEventArgs e)
{
Image image = (Image)sender;
Border border = (Border)image.Parent;
if (!currentSource.Selected)
{
image.ReleaseMouseCapture();
isMouseCapture = false;
translateTransform = new TranslateTransform();
translateTransform.X = 0;
translateTransform.Y = 0;
mouseXOffset = 0;
mouseYOffset = 0;
}
if (isMouseCapture)
{
translateTransform = new TranslateTransform();
translateTransform.X = e.GetPosition(border).X - mouseXOffset;
translateTransform.Y = e.GetPosition(border).Y - mouseYOffset;
image.RenderTransform = translateTransform;
CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, false);
}
}
上記のCalculareSquareSelectedでは、8x8のチェス盤でピースが移動していると思われる場所に移動したピクセルを変換します。たとえば、100 ピクセル移動したとします。チェス ボードの正方形は、2 チェス ボードの正方形を移動したよりもわずか 50 ピクセルです。
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
if (translateTransform == null)
{
return;
}
Image image = (Image)sender;
image.ReleaseMouseCapture();
isMouseCapture = false;
if (translateTransform.X > 10 || translateTransform.Y > 10 || translateTransform.X < -10 || translateTransform.Y < -10)
{
CalculateSquareSelected((int)translateTransform.X, (int)translateTransform.Y, true);
}
translateTransform = new TranslateTransform();
translateTransform.X = 0;
translateTransform.Y = 0;
mouseXOffset = 0;
mouseYOffset = 0;
image.RenderTransform = translateTransform;
}
ご不明な点がございましたら、お気軽にお問い合わせください。