Gracias por el aporte.
Sí, ya caí en ello, por eso realizo el cálculo del carácter bajo el Sprite teniendo en cuenta que los caracteres son de 8x8.
Tras calcular las relativas al carácter bajo el sprite, las paso (de nuevo) a coordenadas de pantalla, les vuelvo a sumar el Offset y calculo la diferencia entre ese resultado y las del Sprite, sabiendo que me tiene que dar un resultado entre 7 y 0, con lo que reposiciono el Sprite hasta que este resultado sea 0.
Es decir, algo así para la coordenada Y de un sprite:
Supongamos un sprite en (x,79).
Supongamos un OFFSET en Y de 29.
1.- Restamos el offset a la coordenada del sprite para obtener su posición en la parte de texto (el fondo) de la pantalla.
79-29 = 50
2.- Ahora calculamos la coordenada de un carácter ahí situado, para ello lo dividimos entre 8 y obteniendo el entero (no necesito realizar cálculos de decimales, así que con tres desplazamientos de bits a la derecha me sirve. Esto me dará el carácter en el que se encuentra la parte inferior de sprite, pero yo necesito el que hay bajo él, así que le sumo 1
50/8 = 6 + 1 = 7 <-- Esta será la fila del carácter
3.- Como hemos despreciado los decimales, hago la conversión inversa para obtener la diferencia real entre el carácter y el sprite.
7*8 = 56 + 29 (offset) = 85 <-- Esta es la coordenada equivalente del carácter bajo el sprite
Teniendo esto, sé que la diferencia entre las coordenadas del sprite y del carácter es:
85-79 = 6 <-- Esto es lo que queda entre el "suelo" y el sprite, que siempre ha de ser inferior a 8, así que ajusto el sprite para que sea 0 (exactamente encima de él).
Estoy haciendo pruebas calculando también el carácter en el que se encuentra el sprite e igualando a 7 (justo por encima del siguiente).
De esta forma me está funcionando. Además, sabiendo la posición del carácter, lo recojo para saber qué carácter es y, de esa forma, saber el tipo al que corresponde y si hay que ignorarlo en el cálculo (por ser atravesable) o no.
Esto me está funcionando perfectamente. La única forma en la que veo que puede fallar es en la que tú comentas, pero solo por movimientos superiores a 8 píxeles, en los que el desplazamiento sea superior a 1 carácter y, por lo tanto, se quedarían caracteres intermedios sin calcular y alguno podría ser un muro o suelo y nuestro sprite lo saltaría. La solución fácil, el personaje no utilizará armas con balas, sino un potente láser que lo atraviesa todo
Por eso no sé si me estoy liando un poco y si hay formas más sencillas de hacerlo, ya que este método son muchos cálculos y muchos ciclos en cada redibujado, que ahora está bien pero cuando haya más cosas que calcular no sé, no sé.
Es hora de seguir practicando y poner en práctica todo lo que aprenda con los enlaces que me habéis pasado.