VisualBasic Hintergrundfarbe der Form

Brixaz

Cadet 4th Year
Registriert
Dez. 2008
Beiträge
114
Äh hi ^^ ich versuche gerade mit vb ein jump&run hinzubekommen, ich hab da aber leider ein problem das extremst stört.

Und zwar bewegen sich jeweils 2 pictureboxen bei gedrücktem right key auf der tastatur durch einen aktivierten timer in einem gewissen intervall um jeweils 5 pixel nach rechts.
parallel läuft whärenddessen ein anderer timer der die jeweiligen pb´s andauernd vertauscht und mir so eine schöne animation whärend des Laufens ermöglicht. Beide Images in den Boxen sind .png, da ich sonst kein Format gefunden hab das in vb transparenz unterstützt.

so und jetzt zu meinem Problem. pb´s können nur transparent zur form sein, und zu keinem anderen pb. Deswegen hat meine Form die World als Hintergrundbild. Die Hintergrundfarbe der Form kann nicht transparent sein. Whärend sich meine pb durch den timer nach vorne bewegen flackert hinter ihnen immer ein streifen in der farbe der Form nach. kann man da was machen?

PS: Bitte nicht zu viel über Rechtschreibfehler aufregen, hatte es echt eilig :D

MFG: Brix
 
Mit folgenden Sub's könntest du evtl. dein Refreshproblem lösen:

Code:
Public Class Form1

' Verwendung von: Me.Refresh()
' oder
  Private Sub RefreshRectangle(ByVal rc As Drawing.Rectangle)
    Me.Invalidate(rc)
    Me.Update()
  End Sub

End Class

Wenn du in deiner Form-Klasse nach dem Neupositionieren der Objekte die "Me.Refresh()" Methode verwendest, dann wird das gesamte Fenster von Windows neu gezeichnet. "Me" ist so ein Alias für das Form Objekt in dem du dich befindest. Jede Form (besser gesagt jedes Control) hat eine Refresh() - Methode mit der alles unmittelbar im Windows neu gezeichnet wird.

Alternativ kennst du ja bereits die Position und Größe der geänderten Bildabschnitte, evtl. hast du diese Daten als ein Rectangle vorliegen. Dann wäre es sicher besser, wenn du die "RefreshRectangle" Methode (s.o.) verwendest, da hier nur der geänderte Teil deines Fensters neu gezeichnet wird. Das ist dann etwas performanter als die brachial "Zeichne-Alles-Neu" Vorgehensweise. Aber nicht vergessen, das du beide Bereiche (Start und Zielbereich bei der Bewegung) neu zeichnest. Da ja beide Abschnitte sich geändert haben.

Viel Erfolg
Rossibaer
 
jo danke für eure antworten, hilft es alleine schon was wenn ich es in die Public class schreibe oder muss ich das me.refresh() direkt nach der beweegung setzen? in diesem fall funktioniert es leider nicht, der streifen wird zwar etwas kleiner aber das programm rucklt dann start und das fenster flimmert durch das refreshen, da mein fortbewegnungstimer nur 1ms intervall hat
 
Wie ich schon schrieb, ist Refresh() eine Methode der Form. Methodenaufrufe kannst du fürs erste nur im Code einer Methoden schreiben, d.h. du hast immer eine Methode wo du zeichnest, jedoch ist das Zeichnen deiner Veränderungen stark von Windows abhängig. Windows entscheidet sich irgendwann einmal "ok, jetzt muss ich neu zeichnen". Dann gibt es diesen Wunsch an die Form weiter, die Ihrerseits sich neu zeichnet. Diesen Prozess kannst du gezielt erzwingen und eben immer nach einer Änderung sagen, "hey zeichne dich neu.". Das erreichst du mit einem Aufruf der Methode Refresh(), z.B. direkt nach dem du die Position der Objekte verschoben hast. Bei komplexen Animationen wirst du schnell an die Leistungsgrenze kommen und ein starkes Flackern/Flimmern der Form wahrnehmen.

Mit der 2. Variante wird nur der Teil der Form neu gezeichnet, den du tatsächlich geändert hast. Einfach nur die Koordinaten des Ausschnitts als Rectangle angeben. Wie gesagt wäre das schneller als die Form komplett neu zu zeichnen. Das würde auch das Flackern/Flimmern reduzieren oder gar ganz entfernen. Aber denke daran beide Bereiche um die Startposition und um die Position nach der Bewegung neu zu zeichnen, da ja beide Bereiche sich geändert haben und somit neu gezeichnet werden müssen. Wenn du das nicht beachtest, wirst du genau die von dir beschriebenen Grafikfehler sehen. Es entstehen Artifakte, die erst nach einer Zeit wieder verschwinden.

Der Timer hat für das Zeichen erstmal relativ wenig Auswirkung, wenn die Animation so berechnet ist das es keine bzw. minimale Sprünge in der Bewegung gibt. D.h. wenn du die Figur nur um wenige Pixel verschiebst, wirds wahrscheinlich nicht wirklich auffallen. Ab 25 Bilder pro Sekunde sieht das Auge eine Bewegung und nicht mehr die Einzelbilder. Bei einem Timer mit 1ms Intervall wären dann ca. 1000 Bilder pro Sekunde gezeichnet, wenn das Zeichnen schnell geht und nicht allzu viel Code die Berechnung des neuen Bildes/Szene verlangsamt. Da das Zeichnen viel vom Computer abverlangt, könntest du auch mal deinen Timer aus Spaß an der Freude auf 10 oder 40ms Intervall stellen. Schau mal was dann dabei rauskommt.

Für später könntest du in Erwägung ziehen, die Berechnung des Spielverlaufs, wie z.B. die neuen Positionen der Figuren, in einen gesonderten Thread zu legen und über den Timer nur den aktuellen Stand der Figuren abfragen und neu zeichnen. Damit reduzierst du den Code der das Zeichnen stark beeinflußt aufs Minimum, während das Spiel unabhängig vom Timer den Rest neu berechnet. Aber wie gesagt, nur in Zukunft eine kleine Idee wie du was ändern/optimieren könntest! Schau erstmal, dass du nicht alles, sondern nur die geänderten Bereiche neu zeichnest. Das sollte schonmal viel an Leistung bringen. Und kümmer dich dann mehr um die restlichen Sachen wie Gameplay, KI, Ablauf, Handlung etc.. Richtig optimieren würde ich ganz zum Schluß. Sonst beist man sich fest, ist gefrustet, wenn es nicht vorwärts geht. Man schießt das Programm dann in den Bithimmel , geht raus ans Tageslicht und genießt diesen herrlichen Sommer!

Viel Erfolg.
Rossibaer
 
Zuletzt bearbeitet:
Zurück
Oben