Saya tidak terbiasa dengan Android jadi saya tidak tahu alat apa yang Anda miliki, tetapi saya dapat memberi tahu Anda cara untuk menerapkannya secara umum. Betapa mudahnya itu tergantung pada apa yang disediakan Android untuk Anda. Anda akan membutuhkan matriks atau setidaknya mereka akan menyederhanakan banyak perhitungan.
Sebagai permulaan, lakukan tabrakan kotak pembatas dan segera kembali jika mereka tidak bertabrakan untuk menghindari perhitungan lebih lanjut. Itu logis karena jika kotak pembatas tidak bertabrakan, dijamin tidak ada piksel yang akan bertabrakan juga.
Setelah itu, jika diperlukan pemeriksaan tabrakan piksel sempurna, maka poin terpenting adalah Anda harus melakukan pemeriksaan itu di ruang yang sama . Ini dapat dilakukan dengan mengambil setiap piksel dari sprite A, menerapkan serangkaian transformasi untuk membawanya ke ruang lokal sprite B, dan kemudian memeriksa apakah itu bertabrakan dengan piksel apa pun pada posisi tersebut pada sprite B. Tumbukan terjadi ketika kedua piksel diperiksa buram.
Jadi, hal pertama yang Anda butuhkan adalah membuat matriks dunia untuk masing-masing sprite. Mungkin ada tutorial online yang mengajarkan Anda cara membuatnya, tetapi pada dasarnya harus merupakan gabungan dari beberapa matriks sederhana dengan urutan sebagai berikut:
Translation(-Origin) * Scale * Rotation * Translation(Position)
Kegunaan dari matriks ini adalah dengan mengalikan titik di ruang lokal - dan misalnya jika Anda mendapatkan piksel menggunakan metode seperti bitmap.getPixelAt(10,20)
10,20 didefinisikan dalam ruang lokal - dengan matriks dunia yang sesuai akan memindahkannya ke ruang dunia:
LocalA * WorldMatrixA -> World
LocalB * WorldMatrixB -> World
Dan jika Anda membalikkan matriks Anda juga dapat pergi ke arah yang berlawanan yaitu mengubah titik dari ruang dunia ke masing-masing ruang lokal sprite tergantung pada matriks yang Anda gunakan:
World * InverseWorldMatrixA -> LocalA
World * InverseWorldMatrixB -> LocalB
Jadi untuk memindahkan titik dari ruang lokal sprite A ke ruang lokal sprite B , Anda pertama-tama mengubahnya dengan menggunakan matriks dunia sprite A, untuk membawanya ke ruang dunia, dan kemudian menggunakan matriks dunia terbalik sprite B , untuk memasukkannya ke dalam ruang lokal sprite B:
LocalA * WorldMatrixA -> World * InverseWorldMatrixB -> LocalB
Setelah transformasi, Anda memeriksa apakah titik baru berada dalam batas sprite B, dan jika ya, Anda memeriksa piksel di lokasi tersebut seperti yang Anda lakukan untuk sprite A. Jadi seluruh proses menjadi seperti ini (dalam kodesemu dan tidak teruji) :
bool PixelCollision(Sprite a, Sprite B)
{
// Go over each pixel in A
for(i=0; i<a.Width; ++i)
{
for(j=0; j<a.Height; ++j)
{
// Check if pixel is solid in sprite A
bool solidA = a.getPixelAt(i,j).Alpha > 0;
// Calculate where that pixel lies within sprite B's bounds
Vector3 positionB = new Vector3(i,j,0) * a.WorldMatrix * b.InverseWorldMatrix;
// If it's outside bounds skip to the next pixel
if(positionB.X<0 || positionB.Y<0 ||
positionB.X>=b.Width || positionB.Y>=b.Height) continue;
// Check if pixel is solid in sprite B
bool solidB = b.getPixelAt(positionB.X, positionB.Y).Alpha > 0;
// If both are solid then report collision
if(solidA && solidB) return true;
}
}
return false;
}