Bewegung in VB.NET begrenzen.

pmutz

Stammgast
Hallo zäme

Ich habe von der Schule den Auftrag erhalten, ein kleines Programm zu schreiben, bei dem ein Schmetterling über das Formular fliegt. Das mache ich mit zwei Bildern, die immer bei Ablauf des Timers abwechslungsweise in die leere Picturebox eingefügt wird. Diese Picturebox wird dann verschoben.

Doch leider fliegt der Schmetterling immer aus dem Formular raus. Wie kann ich das verhindern (Zum Beispiel fliegt er zurück wenn er an dern Rand des Formulars/Bereichs stösst.

Hier der Code:

Code:
Public Class frmSchmetterling

    Private Sub tmrSchmetterling_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrSchmetterling.Tick
        Static Offen As Boolean

        If Not Offen Then
            picFlug.Image = picFluegelOffen.Image

        Else
            picFlug.Image = picFluegelZu.Image

        End If

        picFlug.Left = picFlug.Left + 10
        picFlug.Top = picFlug.Top - 5
        Offen = Not Offen

    End Sub
End Class


Gruss BT
 

romansvillage

Stammgast
Doch leider fliegt der Schmetterling immer aus dem Formular raus. Wie kann ich das verhindern (Zum Beispiel fliegt er zurück wenn er an dern Rand des Formulars/Bereichs stösst.

Du kennst ja die Höhe und Breite des "frmSchmetterling". Die Verschiebung könntest du zum Beispiel abhängig machen von dieser Höhe und Breite. Dazu musst du dann auch noch die Höhe und Breite des Bildes des Schmetterlings einbeziehen.
 

romansvillage

Stammgast
Könntest du mir ein Beispielcode dazu liefern?
Eigentlich ist der Lerneffekt ja ziemlich gering wenn ich dir jetzt dazu einen Beispielcode liefere...

Ich kann dir ja mal einen Ansatz geben:
Code:
Public Class frmSchmetterling

    Private Sub tmrSchmetterling_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrSchmetterling.Tick
        Static Offen As Boolean

        If Not Offen Then
            picFlug.Image = picFluegelOffen.Image

        Else
            picFlug.Image = picFluegelZu.Image

        End If

        Dim rightOffset As Integer
        rightOffset = 10

        If picFlug.Right + rightOffset <= Me.Width Then
            picFlug.Left = picFlug.Left + rightOffset
        Else
            picFlug.Left = picFlug.Left - rightOffset
        End If

        Offen = Not Offen

    End Sub
End Class
Ich hab den Code nicht getestet ob er funktioniert. Ausserdem ist hier nur der rechte Rand berücksichtigt. Den Rest solltest du schon selbst machen.
 

pmutz

Stammgast
Habe das Ganze jetzt auf ein Panel gepackt.

Die Picturebox bewegt sich zwar, doch nur hinter dem Panel.

Wie kann ich diese hervorholen?

Gruss BT
 

romansvillage

Stammgast
Also wenn du im Visual Studio Designer den Panel auf das Form ziehst und dann die PictureBox auf den Panel drauf machst, müsste das eigentlich funktionieren.
 

pmutz

Stammgast
Fehler gefunden! Habe der Picturebox das Bild als Backgroundimage angefügt und nicht als Image. Und als ich das Background auf Transparent geschaltet habe, war es nicht sichtbar.


Zur anderen Sache: Habe den Code ganz begriffen. Der Schmetterling fliegt nicht mehr über den Rand.
Nun möchte ich den Schmetterling zurückfliegen lassen, oder irgendwohin, doch er wechselt immer wieder die Richtung wenn der Abstand zum Rand wieder gross genug ist (logisch).

Ich habe schon Verschiedene Dinge versucht, komme aber auch da nicht wirklich weiter. Ich denke, man sollte seine letzte Position vor dem Rand in einer Variable speichern und von dort weg dann wieder weiterfliegen. Was meint ihr?

Gruss
 

romansvillage

Stammgast
Nun möchte ich den Schmetterling zurückfliegen lassen, oder irgendwohin, doch er wechselt immer wieder die Richtung wenn der Abstand zum Rand wieder gross genug ist (logisch).
In deinem Ansatz mit dem Tick Event würde ich am ehesten die Richtung in die er aktuell fliegt in einer Variable speichern und in dahin weiterfliegen lassen, bis es nicht mehr weiter geht.

Edit:
Oder du könntest die verschiebung in einer Klassenvariable speichern und diese dann beim erreichen der rechten Seite negativ ändern, beim erreichen der linken wieder positiv.
 
Zuletzt bearbeitet:
Oben