我正在做一个简单的二维铁路模拟器而且我坚持建造一条直轨。 我有一个由小型PictureBox(控件)组成的地图,用作建筑物的块。我想实现:我点击一个块并移动鼠标,例如向左和向右,当我从起点和后面移动到我的起点时,我的轨道会出现并消失。
我用这段代码实现了它:
public static void HandleMouseEnterWhileBuilding(Block sender) //only while building straights
{
if (sender.x - startingPoint.x >= sender.y - startingPoint.y && currentRotation == "horizontal") //then keep it horizontal
{
for (int i = 0; i < currentlyPrebuilt.Count; i++)
{
currentlyPrebuilt[i].Image = null;
}
currentlyPrebuilt.Clear();
for (int i = 1; i <= sender.x - startingPoint.x; i++) //prefills all wanted blocks with rails
{
currentlyPrebuilt.Add(MainForm.map[startingPoint.x + i, startingPoint.y]);
MainForm.map[startingPoint.x + i, startingPoint.y].ImageLocation = @"Images\horizontalRail.png";
}
}
}
它只是一个用于在startingPoint右侧构建rails的分支,而仅当我将鼠标移动得非常慢时才能工作。如果我快速向右移动鼠标,它会构建所有想要的轨道块,但是当我将它移动到起始点时,它会“忘记”移除一些,或者有时候所有的轨道,这是很奇怪的,导致代码,来自currentlyPrebuilt
列表&lt;&gt;的每个图像在被清除之前被删除,似乎清除操作超过它并且一些rails永远不会被删除,因为它们不再在列表中。
所以它会发生,当有新事件时,前一个处理程序的执行会跳过吗?
我的假设是有很多事件处理程序调用,它们启动了在相同结构上工作的新线程,但我得知UI调用不会启动新线程。
当我删除行currentlyPrebuilt.Clear();
时,它工作得很好,虽然它总是留下一些块,但是在几个mouseEnters(我的事件)上它最终删除了用户想要的一切。但是,无限地用指针填充List会感觉很糟糕。