VB 2008 2D Animation einer Kugel in einem Looping

Hallo Zusammen!

Ich habe folgendes Problem bei der Programmierung in Visual Basic 2008.

Ich hab mir auf ganz einfach weise eine art looping zeichnen lassen.

Private Sub PictureBox1_Paint(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles PictureBox1.Paint

Dim g As Graphics = e.Graphics
g.Clear(Color.White)
g.ScaleTransform(1, -1)
g.TranslateTransform(250, 200)
g.DrawEllipse(New Pen(Color.Black, 4), -90, -650, 350, 350)
g.DrawLine(New Pen(Color.Black, 4), -250, -650, 600, -650)

End Sub

Nun möchte ich per knopfdruck eine zweite picturebox mit einer kugel als bild von links nach rechts durch diesen looping fahren lassen.

Ich habe mich schon genauer mit den verknüpfungen mit timern, mit den befehlen location, new point oder picturebox.left/top auseinander gesetzt,bekomme aber nur geradlinige oder schräge bewegungen hin, keine kreis/looping bewegung.

ich habe schon zahlreiche foreneinträge durchsucht, aber nichts gefunden was ich für mich nutzten konnte, leider sind das auch erst meine ersten schritte mit vb.

Ich hoffe mir kann jemand weiter helfen oder einen Lösungsansatz aufzeigen. Schon einmal vielen dank im voraus!

mfg Rob

Also ich habe jetzt folgenden Lösungsansatz gewählt, halte ihn aber für sehr aufwändig und unausgereift.

ich habe mir 20 timer genommen, und die kugel pro timer eine bestimmte position anfahren lassen. ich bin mir aber sicher dass es da eine sehr viel bessere und einfachere lösung geben muss, vorschläge sind also immer noch SEHR willkommen!

Hier einmal der auszug aus dem programm:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click

'Start der Animation

Timer1.Enabled = True

End Sub

'Festlegung der Anfahrtspunkte der Animation mit Hilfe von Timern

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

PictureBox2.Location = New Point(250, 443)
Timer2.Enabled = True

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick

Timer1.Enabled = False
PictureBox2.Location = New Point(300, 443)
Timer3.Enabled = True

End Sub

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
Timer2.Enabled = False
PictureBox2.Location = New Point(350, 440)
Timer4.Enabled = True
End Sub

Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
Timer3.Enabled = False
PictureBox2.Location = New Point(400, 418)
Timer5.Enabled = True
End Sub

usw. usw…

Hallo,

ein Timer reicht doch, statt Zahlen kannst Du doch auch Variablen einsetzen. Eine Möglichkeit wäre eine Wertetabelle in einem Array, wenn der Weg eine Bahn beschreiben soll, die sich nicht berechnen lässt. Wenn es aber z.B. eine Gerade sein soll, ist berechnen einfacher.

Ein Beispiel tippen ist für mich in VB6 einfacher, das Prinzip wird dabei aber auch klar:

Private Sub Form\_Load()
 Timer1.Interval = 100
 Timer1.Enabled = True
End Sub

Private Sub Timer1\_Timer()
 Static cx As Integer, cy As Integer
 cx = cx + 300
 cy = cy + 10
 Picture1.Top = cy
 Picture1.Left = cx
 If cx \> Me.Width Then cx = 0
 If cy \> Me.Height Then cy = 0
End Sub

Gruß Rainer

Nachtrag
Hallo,

ich hab’s mal doch noch mit VB.NET gebaut …

Public Class Form1

 Private Sub Button1\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 Timer1.Interval = 100
 Timer1.Enabled = True
 End Sub

 Private Sub Timer1\_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 Static cx As Int32
 Static cy As Int32

 cx = cx + 5
 cy = cy + 2

 PictureBox1.Location = New Point(cx, cy)

 If cx \> Me.Width Then
 cx = 0
 End If
 If cy \> Me.Height Then
 cy = 0
 End If
 End Sub
End Class

… und noch die Variante mit dem Array …

Public Class Form1

 Dim cx(19) As Int32
 Dim cy(19) As Int32

 Private Sub Button1\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
 cx(0) = 100 : cy(0) = 50
 cx(1) = 110 : cy(1) = 60
 cx(2) = 120 : cy(2) = 90
 cx(3) = 150 : cy(3) = 80
 cx(4) = 155 : cy(4) = 20
 cx(5) = 170 : cy(5) = 30
 cx(6) = 160 : cy(6) = 50
 cx(7) = 120 : cy(7) = 90
 cx(8) = 110 : cy(8) = 100
 cx(9) = 100 : cy(19) = 90
 cx(10) = 150 : cy(10) = 80
 cx(11) = 160 : cy(11) = 70
 cx(12) = 170 : cy(12) = 60
 cx(13) = 190 : cy(13) = 50
 cx(14) = 170 : cy(14) = 40
 cx(15) = 150 : cy(15) = 30
 cx(16) = 120 : cy(16) = 20
 cx(17) = 110 : cy(17) = 30
 cx(18) = 160 : cy(18) = 40
 cx(19) = 190 : cy(19) = 50
 Timer1.Interval = 100
 Timer1.Enabled = True
 End Sub

 Private Sub Timer1\_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 Static i As Int32
 PictureBox1.Location = New Point(cx(i), cy(i))
 i = i + 1
 If i \> 19 Then
 Timer1.Enabled = False
 i = 0
 End If
 End Sub
End Class

Es gibt noch ein paar Möglichkeiten mehr, aber dafür mehrere Timer zu verwenden ist überflüssig.

Gruß Rainer

Hallo zusammen!
Jetzt muss ich doch mal einschreiten :smile:
Das geschilderte Problem ist alles andere als „nicht berechenbar“, sondern funktioniert mit ein bisschen elementarer Trigonometrie.

Eine Ellipse oder einen Kreis kannst Du sehr einfach zeichnen, indem Du einen Winkel von 0 bis 360°/2*π durchlaufen lässt und die X-Koordinate mit dem Sinus des Winkels und die Y-Koordinate mit dem Cosinus berechnest.
Eine entsprechende Skalierung mit dem Radius reinmultipliziert - fertig.
Du kommst dann auch problemlos mit einem Timer aus.
In Codeform (C# geht mir leichter von der Hand - die Übersetzung bekommst Du bestimmt selbst hin):

private Point center = new Point(100, 100); // oder wo immer die Mitte des Kreises sein soll
private double angle = 0;
private double steps = 30; // damit bekommst Du 30 Schritte pro Umrundung
private double radiusX = 80;
private double radiusY = 80;
 
private Timer1\_Tick(object sender, EventArgs e)
{
 angle += 2\*Math.Pi/steps;
 if (angle \> 2\*Math.Pi)
 angle -= 2\*Math.Pi;
 
 double cx = center.X + Math.Sin(angle) \* radiusX;
 double cy = center.Y + Math.Cos(angle) \* radiusY;
 
 PictureBox1.Location = new Point((int)cx, (int)cy);
}

Ist doch viel schöner als mit irgendwelchen vorberechneten Arrays rumzuhantieren. Das Teil heisst schließlich „Rechner“ und nicht „Merker“ :wink:

Allerdings fürchte ich, dass Du mit der Picturebox nicht so richtig glücklich werden wirst - sie ist immer rechteckig und echte Transparenz gibt es bei ihr nicht. Wenn Du wirklich etwas wie unregelmäßig geformte „Sprites“ haben willst, musst Du Dir was anderes überlegen…

Gruß,
Martin

Hallo Martin,

Jetzt muss ich doch mal einschreiten :smile:
Das geschilderte Problem ist alles andere als „nicht
berechenbar“, sondern funktioniert mit ein bisschen
elementarer Trigonometrie.

*gg* habe ich etwas von nicht berechenbar ezählt? :smile: Ich habe nur den Weg gezeigt, wie man mit einem Timer die Picturebox bewegt. Welchen Weg die beschreiben soll, habe ich nicht gelesen. Einen eliptischen Weg berechnen kann ich.

Die Wertetabelle war für den Fall, daß der Weg der Flugbahn einer Fliege ähneln soll, eigentlich nur um das Array in das Programm zu bringen. Wenn das wirklich gebraucht würde, würde ich ohnehin keine Tabelle schreiben sondern ein Programm schreiben um eine Mausbewegung aufzuzeichnen, die Werte in einer Datei sichern und die dann abspielen. Das ist viel weniger Code.

Allerdings fürchte ich, dass Du mit der Picturebox nicht so
richtig glücklich werden wirst - sie ist immer rechteckig und
echte Transparenz gibt es bei ihr nicht. Wenn Du wirklich
etwas wie unregelmäßig geformte „Sprites“ haben willst, musst
Du Dir was anderes überlegen…

Mit .Net kenne ich mich noch nicht gut genug aus, um Dir zu widersprechen. Für VB6.0 wäre das falsch. Da gibt es auf http://www.activevb.de einen Beispielcode, der ein .ocx schreibt mit dem man dann ein Steuerelement erhält, das Eine Picturebox mit genau diesen Eigenschaften zur Verfügung stellt und ein paar mehr, man kann sie ohne weiteren Code zur Laufzeit mit der Maus auf der Form verschieben. Weil der Quellcode offen liegt und VB.Net recht mächtig ist denke ich, daß das auch mit .Net nachzubauen ist.

Gruß Rainer

Schon mal vielen dank für tipps, ich werde sie ausprobieren und bestimmt lässt sich damit was eleganteres basteln als das was ich zustande gebracht habe. aber es freut mich so viel hilfe zu bekommen wenn man sich noch nicht auskennt, vielen dank nochmal!