2016-05-02 6 views
1

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?

+1

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. –

+0

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 :) –

Antwort

1

Zuerst denke ich, dass Sie das neueste Element entfernen und nicht das älteste.

Wie auch immer, der Grund, warum es abstürzt, ist, dass Sie zuerst trackDots um eins reduzieren und dann redim es zu trailDots - 1, effektiv schrumpft es um 2 Elemente. Sie können die folgenden Änderungen vornehmen, um das Problem zu beheben.

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

Ich würde auch empfehlen, trailDots auf 0 zu initialisieren und die folgenden Änderungen vorzunehmen.

Aber wie Andew sagte, sollten Sie für dieses Problem lieber Ringpuffer verwenden.