Hallo Rakeem,
du hast ein ganz anderes Problem. Darf ich fragen, woher du die WinForms-Programmierung lernst (Buch, Tutorial, Ausbildung etc...)?
In der Paint-Methode sollte nur gezeichnet werden - keine Logik, keine Änderung von anderen Controls und vor allen Dingen kein Thread.Sleep() - dieses hält den Hauptthread an!).
Ein gutes Buch (bzw. Online-Tutorial) wäre das OpenBook "Visual C#":
www.galileocomputing...nbook/visual_csharp/
Desweiteren ein Artikel zum korrekten Zeichnen in WinForms:
www.mycsharp.de/wbb2...d.php?threadid=21782
Für die Ballbewegung solltest du einen Timer (anstatt dem Thread.Sleep()) verwenden und in dessen Tick-Methode dann die Änderung vornehmen. Dort kannst du dann auch Invalidate() bzw. Refresh() aufrufen. Wenn du aber nur die 'Location' ändern willst, so brauchst du das nicht extra zu machen, dies passiert dann "von selbst".
Und zu deinem konkreten Problem:
Am besten, du definierst dir zwei Variablen 'stepX' und 'stepY', welche du am Anfang z.B. mit jeweils mit 1 belegst. Und bei der Kollision änderst du dann jeweils das Vorzeichen, d.h. -1.
Und in jedem Schritt (Timer.Tick) addierst du dann diese Schritte zu der aktuellen Position hinzu (bzw. bei negativen Schrittweiten wird halt abgezogen).
Als Source-Code dann in etwa so:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| private int ballX = 0; private int ballY = 0;
private int stepX = 1; private int stepY = 1;
void timer_Tick(object sender, EventArgs e) { ballX += stepX; ballY += stepY;
if(ballX <= 0 || ballX >= 200) stepX = -stepX;
if(ballY <= 0 || ballY >= 300) stepY = -stepY;
panel.Location = new Point(ballX, ballY); } |