Ich mache eine Schwerkraft-Simulation, die die Flugbahn von Planeten zeigt. Jeder Planet hinterlässt beim Bewegen eine Spur von Punkten, die in einem dynamischen Array gespeichert sind. Wenn die Spur jedoch länger wird, muss das Paint-Ereignis jedes Mal mehr zeichnen, so dass die Bildrate abnimmt. Ich möchte die ersten Punkte löschen, wenn das Array größer als 1000 Punkte wird. DieseEntfernen der ersten Elemente aus einem dynamischen Array, wenn es eine bestimmte Größe erreicht
ist im Code für das Paint-Ereignis:
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
Und das ist in einem Timer-Ereignis, das 60-mal tickt eine Sekunde:
trailDots += 1
ReDim Preserve planet.trailX(trailDots)
ReDim Preserve planet.trailY(trailDots)
planet.trailX(trailDots) = planet.displayX
planet.trailY(trailDots) = planet.displayY
Ich habe versucht, das Hinzufügen dieser Code in der Timer tick:
If trailDots > 1000 Then
trailDots -= 1
ReDim Preserve planet.trailX(trailDots - 1)
ReDim Preserve planet.trailY(trailDots - 1)
End If
Aber sobald die Spur zu 1000 Punkte kam, stürzt die Simulation mit der Meldung "IndexOutOfRan geException wurde "on the line" nicht behandelt. planet.trailX (trailDots) = planet.displayX "
Wie kann ich das beheben?
Ich denke, Sie wären besser dran, einen [Ringpuffer] (https://en.wikipedia.org/wiki/Circular_buffer) zu implementieren. Es würde die Notwendigkeit eliminieren, Redimierungsanordnungen beizubehalten. –
Anstatt Arrays zu verwenden, können Sie besser eine Liste verwenden. Auf diese Weise können Sie Elemente am Ende hinzufügen und wenn Sie zu 1000 Punkten kommen, entfernen Sie Element 0. Anstatt eine separate Variable zu verwenden, um die Anzahl der Punkte zu verfolgen, können Sie die .count -Eigenschaft der Listen verwenden. Und zum Anzeigen der Punkte verwenden Sie einfach eine For Each-Schleife, die die Listen durchläuft. Einfach :) –