Hallo,
Ich programmiere momentan ein kleines spiel, bei dem ich viel zeichnen und Grafiken rotieren muss.
Leider hängt beim Movement die Grafik manchmal kurz nach.
Ich verwende das OwnerDrawing - zeichne also direkt im Handles MyBase.Paint Event mit e.graphics.draw usw.
In meinem 2D Topdown-view Spiel wird der View mit der Mausbewegung um den Spieler (in der unteren häfte des Bildschirmes) rotiert.
Weiters verwende ich einem Timer1 - bei jedem Tick wird die Bewegung des Spielers, der Enemies und der Items berechnet sowie das gesamte Feld mit MyBase.Invalidate(new Rectangle(0,0,MyBase.Width,MyBase.Height)) neu gezeichnet.
Das Muss leider sein, da nahezu im gesamten Bildschirmbereich etwas verändert wird.
Das ganze wirkte anfangs (time 16ms -> 60FPS) etwas holprig. Jetzt habe ich den Timer auf 10 ms-> 100FPS gesetzt, was doch recht hoch ist. Dies verbesserte aber die "holprigkeit" des Spielfelds. (und ja, form1 ist doubleBuffered).
An was könnte das liegen, dass es so holprig wirkt?
Vielen Dank!!!
Weiters: die rotation der Gegenstände erfolgt mit folgendem Code in jedem TImer1.tick - kann man daran auch was verbessern?
[EDIT] Habe gerade ein bisschen gegoogelt: Ich glaube das unerwünschte Artefakt ist das Screen Tearing. Form1 Double Buffered ist aber on... Weiß jemand vielleicht eine Lösung?
Danke!!
Ich programmiere momentan ein kleines spiel, bei dem ich viel zeichnen und Grafiken rotieren muss.
Leider hängt beim Movement die Grafik manchmal kurz nach.
Ich verwende das OwnerDrawing - zeichne also direkt im Handles MyBase.Paint Event mit e.graphics.draw usw.
In meinem 2D Topdown-view Spiel wird der View mit der Mausbewegung um den Spieler (in der unteren häfte des Bildschirmes) rotiert.
Weiters verwende ich einem Timer1 - bei jedem Tick wird die Bewegung des Spielers, der Enemies und der Items berechnet sowie das gesamte Feld mit MyBase.Invalidate(new Rectangle(0,0,MyBase.Width,MyBase.Height)) neu gezeichnet.
Das Muss leider sein, da nahezu im gesamten Bildschirmbereich etwas verändert wird.
Das ganze wirkte anfangs (time 16ms -> 60FPS) etwas holprig. Jetzt habe ich den Timer auf 10 ms-> 100FPS gesetzt, was doch recht hoch ist. Dies verbesserte aber die "holprigkeit" des Spielfelds. (und ja, form1 ist doubleBuffered).
An was könnte das liegen, dass es so holprig wirkt?
Vielen Dank!!!
Weiters: die rotation der Gegenstände erfolgt mit folgendem Code in jedem TImer1.tick - kann man daran auch was verbessern?
Quellcode
- Private Sub draw_img_rotate(e As PaintEventArgs, img As Image, x As Integer, y As Integer, scale_x As Double, scale_y As Double, angle As Double)
- Dim size As Integer = Convert.ToInt16(Math.Ceiling(Math.Sqrt(Math.Pow(img.Width, 2) + Math.Pow(img.Height, 2))))
- 'size ist diagonale des bildes; muss noch mit scale multipliziert werden
- Dim sx As Integer = Convert.ToInt16(size * scale_x) 'bitmap braucht int
- Dim sy As Integer = Convert.ToInt16(size * scale_y)
- Dim rotierte_bmp As Bitmap = New Bitmap(sx, sy) 'neue maße
- Dim bitmap_g As Graphics = Graphics.FromImage(rotierte_bmp)
- bitmap_g.TranslateTransform(size * scale_x / 2, size * scale_y / 2) 'neuer mittelpunkt
- bitmap_g.ScaleTransform(scale_x, scale_y)
- bitmap_g.RotateTransform(angle)
- bitmap_g.TranslateTransform(-size / 2, -size / 2)
- bitmap_g.DrawImage(img, New Point((size - img.Width) / 2, (size - img.Height) / 2))
- Dim coords As Point = New Point(x - size * scale_x / 2, y - size * scale_y / 2)
- e.Graphics.DrawImage(rotierte_bmp, coords)
- End Sub
[EDIT] Habe gerade ein bisschen gegoogelt: Ich glaube das unerwünschte Artefakt ist das Screen Tearing. Form1 Double Buffered ist aber on... Weiß jemand vielleicht eine Lösung?
Danke!!
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dr_Gre“ ()