El método que presentas es el más adecuado.
Primero descartas las colisiones con la intersección de los rectangulos que envuelven al sprite.
Si el resultado de la interseccion existe, utilizas este para calcular el area de colision de los rectangulos, y los consecuentes pixeles de cada superficie que se intersectan. Solo tendrias que comprobar que no exista en la misma posición relativa dos pixeles (uno de cada superficie) con color diferente al ColorKey.
Si solo tienes cuatro sprites no necesitas ordenar el array de sprites ni nada, pero en caso de que fuera un plataformas con muchos enemigos, quizás si te interesaria para crearte una especie de "partición espacial" y ahorrarte comparaciones.
El problema lo veo en tener que comprobar los pixeles de la superficie (o sea bloquearla acceder, etc, además de que estaria en vram), asi que te aconsejo que al cargar la superficie, te crees una especie de cache en la ram (un array de int, por ejemplo) que y pongas ahi la información de colisión (0 colorkey, 1 otro color, por ejemplo), lo que te ahorria tiempo de acceso a la hora de comprobar los pixeles.
Hay muchos trucos, por ejemplo utilizar valores 2^n (2,4,8,16,32,...) y en vez de crearte una array, utilizas los bits de uno o varios int para almacenar la información de colision (1 si, 0 no) luego puedes hacer un:
if ((datosA & datosB) != 0) {
// Existe colisión
} else {
// No existe colisión
}
Si sabes utilizar bien las operaciones booleanas y los desplazamientos, puedes ahorrate muchas operaciones y comparaciones (ya que en una operación de estas puedes llegar hasta a comprobar 64pixeles de la zona de intersección, uno por cada bit).
Bueno, espero que te sirva de ayuda.
Un saluo.