- Cree un búfer del mismo tamaño que la pantalla (o superficie donde están sus formas). En cada posición contiene boolean si hay sprite; luego, verifique todos los "píxeles" de la forma del usuario si en su posición está el sprite (verificando el valor de ese booleano). Alternativamente, puede crear más sprites allí almacenando su ID en lugar de boolean; pero este fue el caso de 1 sprite.
- Si la forma generada por el usuario puede ser representada por una secuencia de líneas, entonces puede verificar si cada línea cruza el sprite. Dado que el sprite tiene forma rectangular y la forma del usuario es una línea, solo busque la "intersección del rectángulo de la línea" ... (el algoritmo de separación de ejes es una forma de hacerlo)
Los enfoques dependen de las estructuras de datos que elija, ya sean mapas de bits o vectores.
El primer enfoque puede manejar formas complejas arbitrarias, es simple de implementar pero usa más memoria. En realidad, puede reducir la sobrecarga de memoria mediante la compresión y acelerarla mediante el uso de estructuras de datos jerárquicos (octrees) ...
El segundo enfoque, no es tan simple de implementar, pero utiliza más potencia de procesamiento.
En cada caso, mida si es importante. Intentaría hacer el primero porque es más sencillo de implementar. Buena suerte. :)