- Crie um buffer do mesmo tamanho que a tela (ou a superfície onde estão suas formas). Em cada posição, contém booleano se existe sprite; depois, verifique todos os "pixels" da forma do usuário se na posição deles é o sprite (verificando o valor desse booleano). Como alternativa, você pode criar mais sprites lá, armazenando seu ID em vez de booleano; mas este foi o caso de 1 sprite.
- Se a forma gerada pelo usuário puder ser representada pela sequência de linhas, você poderá verificar se cada uma dessas linhas cruza o sprite. Como o sprite tem forma retangular e a forma do usuário é uma linha, basta procurar por "interseção de retângulo de linha" ... (algoritmo de eixos de separação e uma maneira de fazê-lo)
As abordagens dependem de quais estruturas de dados você escolhe, sejam elas bitmaps ou vetores.
A primeira abordagem pode lidar com formas complexas arbitrárias, é simples de implementar, mas usa mais memória. Na verdade, você pode reduzir a sobrecarga da memória usando a compactação e acelerá-la usando estruturas hierárquicas de dados (octrees) ...
Segunda abordagem, não é tão simples de implementar, mas usa mais poder de processamento.
Em cada caso, meça se isso for importante. Eu tentaria fazer o primeiro porque é mais simples de implementar. Boa sorte. :)