配合消除动画元素操作的完成,改进拖放动画操作。
private void 玩无限消乐_DragDrop(object sender, DragEventArgs e)
{
Point 平面二维 = 玩无限消乐.PointToClient(new Point(e.X, e.Y));
int 拖到行 = 玩无限消乐.HitTest(平面二维.X, 平面二维.Y).RowIndex, 拖到列 = 玩无限消乐.HitTest(平面二维.X, 平面二维.Y).ColumnIndex;
DataGridViewCell 拖到单元 = 玩无限消乐.Rows[拖到行].Cells[拖到列];
DataGridViewCell 选定单元 = 玩无限消乐.Rows[选定坐标[1]].Cells[选定坐标[2]];
/*限制条件是有特殊标记的不被交换,交换元素可以选中盘的任何位置元素,而不做只能相邻才能交换的限制,这一点与其他消除规则有些不同,之下注释掉的语句就是一种限制条件。*/
//if (Math.Abs(选定坐标[1] - 玩无限消除.HitTest(平面二维.X, 平面二维.Y).RowIndex) <= 1) if (Math.Abs(选定坐标[2] - 玩无限消除.HitTest(平面二维.X, 平面二维.Y).ColumnIndex) <= 1)
if ((int)拖到单元.Tag != 0 && (int)选定单元.Tag != 0)
{
选定单元.Value = 拖到单元.Value;
选定单元.Tag = 拖到单元.Tag;
拖到单元.Value = 选定坐标[0] == 0 ? new Bitmap("动画素材/e136.gif") : new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
拖到单元.Tag = 选定坐标[0];
bool 消除行 = (消除动画(拖到行, 拖到列, (int)拖到单元.Tag)),
消除列 = (消除动画(拖到行, 拖到列, (int)拖到单元.Tag, true)), 复原 = true;
if (消除行 || 消除列)/*目标处动画消除。*/
{
拖到单元.Value = new Bitmap("动画素材/e136.gif");
拖到单元.Tag = 0;
复原 = false;
填充检测(选定坐标[4], 选定坐标[5]);
}
消除行 = (消除动画(选定坐标[1], 选定坐标[2], (int)选定单元.Tag));
消除列 = (消除动画(选定坐标[1], 选定坐标[2], (int)选定单元.Tag, true));
if (消除行 || 消除列)/*拖动处动画消除。*/
{
选定单元.Value = new Bitmap("动画素材/e136.gif");
选定单元.Tag = 0;
复原 = false;
填充检测(选定坐标[4], 选定坐标[5]);
}
if (复原)/*如果拖动的动画元素没被消除则恢复原先位置。*/
{
拖到单元.Value = 选定单元.Value;
拖到单元.Tag = 选定单元.Tag;
选定单元.Value = 选定坐标[0] == 0 ? new Bitmap("动画素材/e136.gif") : new Bitmap("动画素材/e" + 选定坐标[0].ToString() + ".gif");
选定单元.Tag = 选定坐标[0];
检查可消();
}
}
}
至此,这个游戏的基础部分就设计完成了,也就是说可以玩了。