@Diskover Las structs son muy útiles, y las uso profusamente, en este tutorial no las he usado por que para las 4 cosas que estamos haciendo ya nos basta con unas pocas variables globales. Eso si, ojo que en maquinas de 8 bits como la master o la nes, se nota la diferencia entre programar de forma "clara" o de forma "eficiente". Por ejemplo, es mucho más eficiente a nivel del ensamblador generado, usar variables globales que no contengan structs, y no pasarlos por parámetro. Al final yo hago como una especia de compromiso, y pongo cosas como las posiciones de scroll, las velocidades y posicion del player, etc, como variables globales, y todo lo referente al resto de entidades, suelen ser structs.
@Gammenon Es un Z80 de verdad, como el del Spectrum, el Amstrad o el MSX (de hecho, la master es un derivado del MSX arquitecturalmente). Tema divisiones y multiplicaciones lo lleva bastante mal, claro, es mucho mejor si lo hacemos con desplazamiento de bits, por ejemplo, si queremos multiplicar x*136, esto lo podemos descomponer en x*128 + x*8, que puede hacerse como x<<7 + x<<3 , que es muuucho más eficiente que la multiplicación como tal.
Para hacer lo de punto fijo, puedes hacer lo siguiente, usa una variable unsigned int, y considera que dedicas 8 bits a la parte entera, y 8 bits a la parte decimal. Luego lo puedes convertir con algo así:
#define UFIX(x) ((unsigned char)((x)>>8))
Y cuando lo quieres usar como unsigned char, haces:
x=UFIX(player_x)