当动态数组达到一定大小时,从中删除第一个项目



我正在做一个重力模拟,显示行星的轨迹。每颗行星在移动时都会留下一条点迹,这些点迹存储在一个动态阵列中。但是,当轨迹变长时,绘制事件每次都必须绘制更多,因此帧速率会降低。当数组大于1000个点时,我想删除第一个点。

这是油漆事件的代码:

For drawTrail As Integer = 0 To planet.trailX.Count - 1
    e.Graphics.DrawEllipse(trailcolour, planet.trailX(drawTrail), planet.trailY(drawTrail), 1, 1) 'Draw a pixel at the planet's current location
Next

这是在一个每秒滴答60次的计时器事件中:

trailDots += 1
ReDim Preserve planet.trailX(trailDots)
ReDim Preserve planet.trailY(trailDots)
planet.trailX(trailDots) = planet.displayX
planet.trailY(trailDots) = planet.displayY

我试着在计时器中添加这个代码:

If trailDots > 1000 Then
    trailDots -= 1
    ReDim Preserve planet.trailX(trailDots - 1)
    ReDim Preserve planet.trailY(trailDots - 1)
End If

但一旦轨迹达到1000点,模拟就会崩溃,在"planet.trailX(trailDots)=planet.displayX"行上显示消息"IndexOutOfRangeException未处理"

我该如何解决这个问题?

首先,我认为您删除的是最新的元素,而不是最旧的元素。

无论如何,它崩溃的原因是因为你首先将trailDots减少一,然后将其重新定为trailDots-1,有效地将其减少了2个元素。您可以进行以下更改来解决此问题。

If trailDots > 1000 Then
    trailDots -= 1
    ReDim Preserve planet.trailX(trailDots)
    ReDim Preserve planet.trailY(trailDots)
End If

我还建议将trailDots初始化为0,并进行以下更改。

planet.trailX(trailDots - 1) = planet.displayX
planet.trailY(trailDots - 1) = planet.displayY

但正如Andew所说,对于这个问题,您应该使用循环缓冲区。

相关内容

  • 没有找到相关文章

最新更新