Bälle in Liste gezeichnet aber keine Bewegung<Gelöst>
-
Guten Abend allerseits.
Ich habe heute ein programm geschrieben, dass Bälle zeichnet und diese bewegt.
Ich zeichne die Bälle so:[cs]struct Ball { public Color color; public int PosX, PosY, TempX, TempY; public int I, b; public void DrawBall(Graphics g) { g.FillEllipse(new SolidBrush(color), PosX, PosY, 20, 20); } public void MoveBall() { PosX += TempX; PosY += TempY; if (PosX >= 545) { Random r = new Random(); TempX = r.Next(1, 4); TempX *= -1; } if (PosX <= 10) { Random r = new Random(); TempX = r.Next(1, 4); TempX *= 1; } if (PosY >= 395) { Random r = new Random(); TempY = r.Next(1, 4); TempY *= -1; } if (PosY <= 10) { Random r = new Random(); TempY = r.Next(1, 4); TempY *= 1; } }[/cs]
Nun habe ich eine Liste von Bällen die sich baelle nennt.
Ich füge der Liste einen Ball zu indem ich einmal mit der Maus klicke:[cs]private void Form1_MouseClick(object sender, MouseEventArgs e) { Ball bala = new Ball(); if (bala.b == 0) { Random PositionX = new Random(); bala.PosX = PositionX.Next(20, 400); Random PositionY = new Random(); bala.PosY = PositionY.Next(20, 400); Random TempoX = new Random(); bala.TempX = TempoX.Next(1, 4); Random TY = new Random(); bala.TempY = TY.Next(1, 4); bala.b = 2; Random kolor = new Random(); int Farbe = kolor.Next(1, 10); if (Farbe == 1) bala.color = Color.Blue; if (Farbe == 2) bala.color = Color.Green; if (Farbe == 3) bala.color = Color.Magenta; if (Farbe == 4) bala.color = Color.Black; if (Farbe == 5) bala.color = Color.Cyan; if (Farbe == 6) bala.color = Color.Yellow; if (Farbe == 7) bala.color = Color.DarkGreen; if (Farbe == 8) bala.color = Color.Purple; if (Farbe == 9) bala.color = Color.Indigo; } Baelle.Add(bala); }[/cs]
Das funktioniert auch. Aber ich bewege alle Bälle mit einem Timer und zwar so:
[cs]private void timer1_Tick(object sender, EventArgs e) { foreach (Ball bala in Baelle) bala.MoveBall(); Refresh(); }[/cs]
Wenn ich es mir nun im Debugger ansehe dann verändert sich auch PosX und PosY des Balles ABER wenn ich nun folgendes aufrufe:
[cs]private void Form1_Paint(object sender, PaintEventArgs e) { ball1.DrawLine(e.Graphics); foreach (Ball bala in Baelle) bala.DrawBall(e.Graphics); }[/cs]
Dann setzt sich das PosX und das PosY wieder auf den Ursprungswert --> es kommt keine Bewegung zustande.
Wie kann ich das nun machen, dass ich alle Bälle zeichnen und bewegen kann ohne jeden ball einzeln initializieren muss?Vielen Dank im Voraus
mfg Mongole
P.S.: Falls es noch mehr Code bedarf ich kann gerne noch mehr reinstellen.
-
Afaik kriegst du in der foreach Schleife bloß Kopien der Objekte, weil structs und damit value types. MoveBall arbeitet also auf der Kopie und nicht auf dem ursprünglichen Objekt, daher nicht der gewünschte Effekt. Du könntest class benutzen oder eine normale for Schleife nehmen.
-
VIELN, vielen, vielen Dank.
Ich habe das ganze nun in eine neue Klasse geschrieben und es funktioniert einwandfrei. Dank!
Viele Grüße und ein frohes Halloween
Wandernder Mongole