Kollisionsabfrage
-
Weiß einer, wo ich ein Tutorial herbekomme, das pixelgenaue Kollisionsabfrage zwischen zwei Bildern erklärt (also wenn eine Farbe pro Bild als Hintergrundfarbe definiert ist)? Ich hab wohl schon mitbekommen, daß man dabei erstmal beide Bilder jeweils monochrom in einen Device Context blitten muß, wobei der Hintergrund weiß ist und das Bild komplett schwarz. Und dann überprüft man den Bereich, wo sie sich überschneiden, per Bitmaskierung. Aber wie genau geht das? Ich meine, einfach sowas im Stil von:
for (int x=XAnfang; x<XEnde; x++) //XAnfang und XEnde sind der Anfangs- und Endpunkt des Rechtecks, wo sich beide Bilder überschneiden for (int y=YAnfang; y<YEnde; y++) if (dc1.GetPixel (DerEntsprechendeXWert1, DerEntsprechendeXWert1) | dc2.GetPixel (DerEntsprechendeXWert2, DerEntsprechendeXWert2)==0) KollisionIstErfolgt;
kanns ja nicht gewesen sein. Dann kann ich mir nämlich das ganze monochrome Blitten sparen, gleich die entsprechenden Punkte berechnen und so herausfinden, ob die Kollision erfolgt ist.
Also, hat irgendeiner eine Idee?
-
Nach dem Umrechnen in ein monochromes Bild sollte es nur noch 2 Zustände geben (0 = Hintergrund und 1 = Bild // oder eben andersrum)
Also kannst du die beiden Bilder per Bitmaskierung (in dem Fall UND übereinanderlegen und bekommst dort wo in beiden Bildern eine 1 steht wieder eine 1, ansonsten eine 0. Das sieht dann folgendermassen aus:char bild1 = 'f'; //deine bilddaten - natürlich binär *g* char bild2 = 'e'; endbild = bild1 & bild2; if(endbild!=0) //Kollision erfolgt.
Mir ist jetzt keine Funktion bekannt, die ein gesamtes Array mit einem anderen maskiert. Also kommst du nicht um eine Schleife herum. Aber da du nun in ein char-Array 8 Pixel packen kannst und kein 1/3 Pixel mehr, sollte das um einiges schneller gehen.
Und natürlich die Bilder erst ab ihrem Schnittpunkt überprüfen, aber das sollte klar sein ^^
-
Danke. Das scheint schonmal das zu sein, was ich suche.
Jetzt müßte ich nur noch wissen, wie ich die Bildinformationen eines vorhandenen monochromen CBitmap-Objekts in ein char-Feld bekomme. Daten von einem Feld in ein CBitmap-Objekt geht ja mit CBitmap::CreateBitmap (int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void *lpBits), aber wie funktioniert es andersherum?
-
Eigentlich musst Du es nur in ein monochromaes Bitmap umwandeln und dann mit "GetDIBits" die Daten holen und hier jedes Byte einfach mit dem anderen mit & vergleichen... geht sehr schnell...
-
O.k., muß ich mal ausprobieren.
Die GetDIBits-Funktion ist ja eigentlich ein ganz anderer Ansatz als das, was hier bisher gemacht wurde (Device independent statt dependent, API statt MFC etc.). Deshalb hätte ich nur der Vollständigkeit halber trotzdem noch gern eine Funktion genannt, die mir analog zur bisherigen Arbeitsweise (also mit MFC-CBitmap-Objekten) die Pixeldaten in ein Feld speichert. (Eben das in dem Zusammenhang direkte Gegenstück zu CBitmap::CreateBitmap (...).)
-
Sorry... dann nimm doch einfach CBitmap::GetBitmapBits
-
Das war's wohl, was ich gesucht habe. Vielen Dank.