 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 12:45 Titel: Spritefläche löschen. Wie geht das am schnellsten |
|
|
Hallo, ich habe mit "spritegr=imagecreate(siw,sih)" ein Sprite erzeugt.
Darin drehe ich ein Bild, zuvor muss dann immer die Fläche vom Sprite mit der Farbe ff00ff gelöscht/bemalt werden.
Was ist schneller, das Spriteimage löschen und dann mit imagecreate immer neu anlegen oder die Fläche mit der farbe bemalen?
mfg |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 30.07.2009, 12:54 Titel: |
|
|
Hallo pebi, probier es doch einfach mal aus. Ich denke, die schnellste methode wäre, mit einem pointer durch das bild zu laufen und alles auf FF00FF zu setzen (ohne gfxlib-befehle - direkter speicherzugriff) _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 13:46 Titel: |
|
|
spritegr=imagecreate(128,128)
Zeig mal wie das mit einem Pointer zu löschen geht.
mfg |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 13:55 Titel: |
|
|
Noch eine Sache mit dem Screen.
Geschwindigkeitsvorteil für Hintergrund des Screens ,wenn das Sprite weiterwandert.
Ich kopiere jetzt den originalen Hintergrund auf Screen 2(nicht zusehen) wenn das Sprite immer weiterwandert und kopiere dann Screen 2 in den Vordergrundscreen.
Was gibt es hier für eine bessere Lösung?
mfg |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 30.07.2009, 14:02 Titel: |
|
|
Hallo Peter, so kann man direkt per Pointer schreiben:
http://www.freebasic-portal.de/index.php?s=reftopic&id=596
Warum benutzt du denn nicht mehr OpenGL, das magst du doch so sehr. Da macht das Löschen des Hintergrunds doch gar keine Probleme. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 14:48 Titel: |
|
|
Warum benutzt du denn nicht mehr OpenGL, das magst du doch so sehr. Da macht das Löschen des Hintergrunds doch gar keine Probleme.
Ich habe mit der Pixelgenauen-Collisonsabfrage schwierigkeiten unter Opengl-2d und auch die Darstellung/Simulation von Ultraschallabtastung geht zu langsam.
Damit kann man gute Spiele schreiben aber bei schnellen und genauen Simulationen wo es auf die Pixelgenauigkeit ankommt klemmt es.
mfg |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 14:54 Titel: |
|
|
He, das sieht gut aus :
http://www.freebasic-portal.de/index.php?s=reftopic&id=596
Wie sind denn da die RGB-Werte abgelegt.
Ich wollte nämlich auch so ein Bild abfragen ob sich in der der Fläche ein bestimmter Farbpunkt befindet(Collision mit einer anderen Fläche).
Nicht alle 3 sondern R, G oder B.
Hatte mal so etwas ausgedacht für eine andere Sprache (Profan),
b# ist ein Pointer auf eine Bildfläche. Wenn ein Farbwert grösser wie 252 ist sollte der Wert 255 ausgegeben werden in ASM.
Wie geht das mit FB und dem Pointer?
Code: |
AsmStart rgb_farbe
Parameters b#,groesse&
LOCAL r :BYTE
LOCAL g :BYTE
LOCAL b :BYTE
LOCAL n :DWORD
mov eax,para2
mov n,eax
mov ecx,0
mov ebx,para1
.while ecx<=n
mov al,[ebx+ecx]
mov r,al
mov al,[ebx+ecx+1]
mov g,al
mov al,[ebx+ecx+2]
mov b,al
mov al,b
.if al>252
mov eax,255
.break
.endif
mov al,g
.if al>252
mov eax,255
.break
.endif
mov al,r
.if al>252
mov eax,255
.break
.endif
add ecx,4
.endw
AsmEnd(z&)
endif
|
|
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 16:00 Titel: |
|
|
Habe mal im Image 2x unterschiedliche Punkte gesetzt.
Sind auch zu sehen.
Wenn die Abfrage unten kommt ,stürzt das Programm ab nach ca 10000 abfragen.
Woran liegt das?
Man müsste doch alle Punkte vom Pointer abfragen können, oder nicht?
mfg
Code: |
Dim As Integer zz,x
ScreenRes 320, 320, 32
img = ImageCreate(256,256,rgb(255,255,0))
imageinfo img,,,, pitch, pixdata
Dim As UInteger Ptr p
p = pixdata + 120 * pitch
For x As Integer = 100 To 150
p[x] = RGB(255,0,0)
Next x
p = pixdata + 140 * pitch
For x As Integer = 150 To 170
p[x] = RGB(0,0,255)
Next x
Put (10, 10), img
For zz=1 To 34000
If p[zz]=RGB(0,0,255) Then
Print "gefunden"
End If
Next zz
ImageDestroy img
Sleep
|
|
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 30.07.2009, 16:31 Titel: |
|
|
qbasicfan hat Folgendes geschrieben: | Woran liegt das?
Man müsste doch alle Punkte vom Pointer abfragen können, oder nicht? | ja, aber man darf die Grenzen (Ende) der Imagebereichs nicht überschreiten.
Code: | Dim As Integer x, pitch
Dim As UInteger Ptr p
Dim As Any Ptr pixdata
ScreenRes 320, 320, 32
Dim As Any Ptr img = ImageCreate(256,256,RGB(255,255,0))
ImageInfo img,,,, pitch, pixdata
p = pixdata + 120 * pitch
For x = 100 To 150
p[x] = RGB(255,0,0)
Next
p = pixdata + 140 * pitch
For x = 150 To 170
p[x] = RGB(0,0,255)
Next
Put (10, 10), img
For x=1 To 34000
If p[x]=RGB(0,0,255) Then
Print "gefunden"
Exit For 'nicht den Imagebereich überschreiten!
End If
Next
ImageDestroy img
Sleep |
_________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 17:37 Titel: |
|
|
Wenn ich wie unten wieder die geschachtelte Schleife mache, werden alle gesuchten Punkte ausgemacht.
Danke auch für dein Hinweis.
mfg
Code: |
Dim img As Any Ptr, pixdata As Any Ptr, pitch As Integer
Dim As UInteger Ptr p
Dim As Integer zz,x
ScreenRes 320, 320, 32
img = ImageCreate(256,256,rgb(255,255,0))
imageinfo img,,,, pitch, pixdata
p = pixdata + 120 * pitch
For x As Integer = 100 To 107
p[x] = RGB(255,0,0)
Next x
p = pixdata + 140 * pitch
For x As Integer = 150 To 170
p[x] = RGB(0,0,255)
Next x
Put (10, 10), img
For y As Integer = 0 To 255
p = pixdata + y * pitch
For x As Integer = 0 To 255
If p[x] = RGB(255,0,0) Then
Print "gefunden"
EndIf
Next x
Next y
ImageDestroy img
Sleep
|
|
|
Nach oben |
|
 |
qbasicfan gesperrt (Wird das nicht langweilig?)
Anmeldungsdatum: 29.07.2009 Beiträge: 45
|
Verfasst am: 30.07.2009, 17:55 Titel: |
|
|
verschoben...
mfg |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|