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!
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
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
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
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.
Hallo zusammen!
Jetzt muss ich doch mal einschreiten
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“
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…
Jetzt muss ich doch mal einschreiten
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? 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.
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!