Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Spritefläche löschen. Wie geht das am schnellsten

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 12:45    Titel: Spritefläche löschen. Wie geht das am schnellsten Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 30.07.2009, 12:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 13:46    Titel: Antworten mit Zitat

spritegr=imagecreate(128,128)

Zeig mal wie das mit einem Pointer zu löschen geht.

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 13:55    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 30.07.2009, 14:02    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 14:48    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 14:54    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 16:00    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 30.07.2009, 16:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 17:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
qbasicfan
gesperrt (Wird das nicht langweilig?)


Anmeldungsdatum: 29.07.2009
Beiträge: 45

BeitragVerfasst am: 30.07.2009, 17:55    Titel: Antworten mit Zitat

verschoben...

mfg
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz