Ist es möglich, eine pixelgenaue Kollision in einer Ansichtsanwendung zu erzielen? Ich habe nach Beispielcodes gesucht, aber ohne Glück ... Können Sie auch farbige Bitmaps verwenden, um Kollisionen für eine bestimmte Farbe darzustellen?Pixel perfekte Kollision?
Antwort
Sie können. Es sieht am einfachsten aus, wenn Sie eine CGImage verwenden.
Sie könnten ein boolesches 2D-Array erstellen, um die Pixelwerte zu lesen, um ein Treffergitter zu erstellen (im Grunde eine 2x2-Matrix), und dieses dann mit Ihrer Spielobjektklasse speichern.
Sie müßten direkten Zugriff auf die Pixeldaten für die CGImage (the code is here) dann in eine Schleife Zur Anwendung werden die Pixeldaten in die Array Boolesche Werte zu lesen:
BOOL pixelGrid[xPixels][yPixels];
for (int i = 0; i < xPixels; i++) {
for (int j = 0; j < yPixels; j++) {
pixelGrid[i][j] = pixelIsOpaque(i, j);
}
}
Verfahren pixelIsOpaque() oben offensichtlich doesn‘ t existieren, ersetzen Sie einfach mit was auch immer der Beispielcode Ihnen gibt, um den Pixelwert zu extrahieren. Sie speichern, ob ein Pixel existiert (überprüfen Sie grundsätzlich, ob das Pixel eine Opazität> 0 hat)
Sobald Sie dieses Gitter haben (erzeugen Sie es am Anfang Ihres Programms einmal und speichern Sie das resultierende 2D-Array innerhalb des Spielobjekts) dann Sie brauche ein Kollisionserkennungsverfahren.
BOOL detectCollision(BOOL *pixelGrid1, BOOL *pixelGrid2) {
BOOL result = NO;
for (int i = 0; i < xPixels; i++) {
for (int j = 0; j < yPixels; j++) {
if (pixelGrid1[i][j].opacity != 0 && pixelGrid2[i][j].opacity != 0]) {
result = YES; break;
}
}
}
return result;
}
Ich schrieb diesen Code on the fly, so dass ich nicht zu 100% übersetzbar sein kann, aber ich hoffe, dass es Ihnen die Idee gibt. Sie können dies leicht ändern, aber anstatt mit der Opazität zu vergleichen, vergleichen Sie einfach erneut den Wert der Pixelfarbe, see here, um die Rohdaten zu erhalten.
+1 für ausgezeichnete Informationen. Ich war selbst sehr an pixelperfekten Kollisionen interessiert. Ich werde versuchen zu sehen, ob das an diesem Wochenende funktioniert. Ich bin nur besorgt über die Leistung, aber das ist ein ganz anderes Thema, das zu einem späteren Zeitpunkt angegangen werden kann. – Tovi7