FastLine von blitzbase.de funktioniert nicht richtig...
Übersicht

![]() |
entresBetreff: FastLine von blitzbase.de funktioniert nicht richtig... |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo. Auf Blitzbase.de ist im Codearchiv eine Function um besonders schnell eine Linie zu zeichnen. Hier geht es zum Original: http://www.blitzbase.de/quellcode/bresenham.bb
Nun habe ich das Beispiel bei mir übertragen und wollte es einfach mal austesten. der Code sieht so aus: Code: [AUSKLAPPEN] Graphics 800, 600 SetBuffer BackBuffer() Repeat Cls FastLine 0,0,MouseX(),MouseY(), 255,255,255 Flip Until KeyDown(1) End Function FastLine(x1, y1, x2, y2, r, g, b) ;DebugLog x1 +" "+ y1 +" "+ x2 +" "+ y2 +" "+ r +" "+ g +" "+ b farbe = r*$10000 + g*$100 + b dx = x2 - x1 dy = y2 - y1 If dx > 0 Then inc_x = 1 Else inc_x = -1 EndIf If dy > 0 Then inc_y = 1 Else inc_y = -1 EndIf If Abs(dy) < Abs(dx) Then error = -Abs(dx) delta = 2 * Abs(dy) schwelle = 2 * error While x1 <> x2 WritePixelFast x1, y1, farbe x1 = x1 + inc_x error = error + delta If error > 0 Then y1 = y1 + inc_y: error = error + schwelle Wend Else error = -Abs(dy) delta = 2 * Abs(dx) schwelle = 2 * error While y1 <> y2 ;DebugLog x1 +" "+ y1 +" "+ farbe WritePixelFast x1, y1, farbe y1 = y1 + inc_y error = error + delta If error > 0 x1 = x1 + inc_x: error = error + schwelle Wend EndIf WritePixelFast x2, y2, farbe End Function Wenn ich dieses Program nun in der Form ausführen möchte stürzt es mit einem Speicher Zugriffsfehler ab. Ich hab ein wenig rumgespielt und hab nun vor dem Fastline ein normales line hingesetzt: Code: [AUSKLAPPEN] Graphics 800, 600 SetBuffer BackBuffer() Repeat Cls Line 0, 0, 0, 0 FastLine 0,0,MouseX(),MouseY(), 255,255,255 Flip Until KeyDown(1) End Function FastLine(x1, y1, x2, y2, r, g, b) ;DebugLog x1 +" "+ y1 +" "+ x2 +" "+ y2 +" "+ r +" "+ g +" "+ b farbe = r*$10000 + g*$100 + b dx = x2 - x1 dy = y2 - y1 If dx > 0 Then inc_x = 1 Else inc_x = -1 EndIf If dy > 0 Then inc_y = 1 Else inc_y = -1 EndIf If Abs(dy) < Abs(dx) Then error = -Abs(dx) delta = 2 * Abs(dy) schwelle = 2 * error While x1 <> x2 WritePixelFast x1, y1, farbe x1 = x1 + inc_x error = error + delta If error > 0 Then y1 = y1 + inc_y: error = error + schwelle Wend Else error = -Abs(dy) delta = 2 * Abs(dx) schwelle = 2 * error While y1 <> y2 ;DebugLog x1 +" "+ y1 +" "+ farbe WritePixelFast x1, y1, farbe y1 = y1 + inc_y error = error + delta If error > 0 x1 = x1 + inc_x: error = error + schwelle Wend EndIf WritePixelFast x2, y2, farbe End Function Und siehe da, auf einmal geht es wie am Schnürchen ^^ Irgendwie ist das ein sehr komischer Fehler. Ich kann das fastline erst verwenden wenn ich line vorher verwende... woran könnte das liegen ![]() |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das liegt daran dass die Koordinaten wohl noch undefiniert sind.
Dein Problem liegt aber per se daran dass Du writepixelfast benutztr ohne den Buffer zu locken. Mach am Beginn der Funktion ein lockbuffer backbuffer() und am ende ein unlockbuffer backbuffer() und alles funzt. EDIT: um die Funktion universal nutzbar zu machen, speicher den Handle des Buffers in eine Variable und übergeb den an die Funktion: Code: [AUSKLAPPEN] a = Backbuffer()
fastline x,y,zx,zy,r,g,b,a function fastline(......,buff) lockbuffer buff ... unlockbuffer buff end function Du kannst dann auch imagebuffer etc. an die Funktion geben (a= imagebugffer(xyz)) und somit auf jeden beliebigen Buffer schnellzeichnen... EDIT2: vergiss das, nimm einfach lockbuffer ohne parameter, dann wird automatisch der aktuelle genommen. ich werd alt. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
![]() |
entres |
![]() Antworten mit Zitat ![]() |
---|---|---|
BladeRunner hat Folgendes geschrieben: Das liegt daran dass die Koordinaten wohl noch undefiniert sind.
Dein Problem liegt aber per se daran dass Du writepixelfast benutztr ohne den Buffer zu locken. Mach am Beginn der Funktion ein lockbuffer backbuffer() und am ende ein unlockbuffer backbuffer() und alles funzt. EDIT: um die Funktion universal nutzbar zu machen, speicher den Handle des Buffers in eine Variable und übergeb den an die Funktion: Code: [AUSKLAPPEN] a = Backbuffer()
fastline x,y,zx,zy,r,g,b,a function fastline(......,buff) lockbuffer buff ... unlockbuffer buff end function Du kannst dann auch imagebuffer etc. an die Funktion geben (a= imagebugffer(xyz)) und somit auf jeden beliebigen Buffer schnellzeichnen... EDIT2: vergiss das, nimm einfach lockbuffer ohne parameter, dann wird automatisch der aktuelle genommen. ich werd alt. Danke für die Hilfe! Mit der lockbuffer Methode klappt es wunderbar. Allerdings ist das Risiko den computer abstürzen zu lassen durch writepixelfast fast recht hoch und der Performancevorteil beträgt auch nur um die 40%.... Ist recht nett, aber ich bleibe glaube ich lieber beim alten line. Ist einfach sicherer. |
||
![]() |
BladeRunnerModerator |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wenn Du den Buffer lockst ist dein Risiko gleich null, denn genau dafür ist der Befehl da.
Alternative kannst Du selbst prüfen ob Start- und Endpunkt der Linie im sichtbaren Bildschirm liegen und nur dann zeichnen lassen, auch das ist absolut sicher und geht sehr schnell. |
||
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3 Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64 B3D BMax MaxGUI Stolzer Gewinner des BAC#48, #52 & #92 |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group