Z88DK (curso Radastan) - Dudas Varias

Soporte técnico sobre los lanzamientos de MojonTwins y comentarios sobre los güegos. Ofrecemos soporte técnico con Fourspriter, te ayudamos con ZX Basic o Z88DK, te damos pistas some cómo saltarse un bicho y cosas así.

Moderador: na_th_an

Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor elborra » Vie, 23 May 2014, 22:16

¿ has probado a hacerle el cast con (int) (_sprite1) ?
Avatar de Usuario
Hark0
Mensajes: 96
Registrado: Mar, 28 Ene 2014, 07:42
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor Hark0 » Sab, 24 May 2014, 08:25

na_th_an escribió:Te avisa por si acaso te has equivocado. Como no te has equivocado, puedes evitarlo. De todos modos, te sale porque estás asignando punteros a un array de enteros. En esta plataforma no importa, porque los punteros son valores de 16 bits, y los enteros también, por lo que los tipos son compatibles y el programa no te casca... Sin embargo en otras no tienen por qué ser compatibles (por ejemplo, en MSDOS, si estás en modo large el puntero puede ser de 32 bits y los enteros tienen 16...). Por eso no es buena práctica de programación en C, y un buen compilador te avisa.

Lo suyo es, por tanto, hacer las cosas bien para que el compilador no se queje.

Cada extern unsigned char [] es en realidad un puntero a unsigned char. Si, teniendo en cuenta esto, haces tu array como un array de punteros a unsigned char, y problema solucionado:

Código: Seleccionar todo

unsigned char *matriz_direccion_sprites [] = {
    sprite1, sprite2, sprite3
}


Así, cuando llamas a la función, que espera un unsigned char *, con "matriz_direccion_sprites [1]", por ejemplo, estarás pasándole precísamente un unsigned char *, ya que la matriz contiene elementos de este tipo.

En ese mismo sentido iba el consejo que te di. La función que usas espera un puntero, o sea, una dirección de memoria. Teniendo la dirección de memoria del primer elemento (sprite0 en tu ejemplo de antes) calcular la de los siguientes es cuestión de sumar y multiplicar.


Aja!... entiendo... muchas gracias por la aclaración. ;)
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica
Avatar de Usuario
Hark0
Mensajes: 96
Registrado: Mar, 28 Ene 2014, 07:42
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor Hark0 » Sab, 24 May 2014, 08:27

elborra escribió:¿ has probado a hacerle el cast con (int) (_sprite1) ?


Cambié todos los char por int... con el mismo resultado...

Finalmente voy a seguir el consejo de na_th_an... ;)

EDiTO:

Al final, ni siquiera una matriz... almaceno la posicion 0 (sprite1), y como bien has dicho, sumo y resto los bytes correspondientes a cada tile...

Con todo esto he pasado de 19,5 kb a 15,1 kb. ;)

Muchisimas gracias por la ayuda!
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor radastan » Dom, 25 May 2014, 00:02

Harko escribió:Al final, ni siquiera una matriz... almaceno la posicion 0 (sprite1), y como bien has dicho, sumo y resto los bytes correspondientes a cada tile...

Con todo esto he pasado de 19,5 kb a 15,1 kb. ;)

Muchisimas gracias por la ayuda!


Ese es el método que menos memoria consume con diferencia.

Basta llamar al primer tile tileset y que los datos del resto estén de forma consecutiva detrás sin nombre, todos definidos bajo el mismo puntero. Sólo multiplicas por 36 el número de tile, empezando por el cero, y ya te sale el puntero del tile correspondiente.

Así se explicará en el curso, pero como ya comenté... hay que enseñar primero lo simple y luego los trucos para entender el porqué de las cosas.

A ver si me pongo las pilas y termino otra tanda del curso.
Avatar de Usuario
Hark0
Mensajes: 96
Registrado: Mar, 28 Ene 2014, 07:42
Ubicación: Cornellà de Llobregat - Barcelona
Contactar:

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor Hark0 » Dom, 25 May 2014, 06:59

Ok... ;)

Se me ha ocurrido hacer lo mismo, pero para los mapas... :P
litiopixel.blogspot.com - Desarrollo videojuegos Indie · Pixel-Art · Retroinformática · Electrónica
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor na_th_an » Dom, 25 May 2014, 11:15

Si n es el número de sprite, en vez de hacer n*36 es mejor que pases de multiplicar.

Descompon en potencias de 2. Date cuenta que 36 = 32 + 4. O sea, n*36 = n*32 + n*4. Las multiplicaciones por potencias de dos se pueden hacer con desplazamientos, que son muy rápidos. Así, n*2^m = (n << m). Recuerda esto.

Por tanto, n*36 puede ponerse como (n << 5) + (n << 2) (porque 32 = 2^5 y 4 = 2^2), lo cual es muchísimo más rápido.

Hay que evitar multiplicar o dividir, a menos que estemos en un lugar donde no importe si tardamos un poco más. Por ejempo, cuando vas a pintar una pantalla, tampoco se va a notar si calcular el offset de la pantalla dentro del mapa multiplicando o desplazando. En la churrera las pantallas ocupan 75 bytes, un número bastante irregular, que se descompone en 64 + 8 + 2 + 1, y que implicaría una expresión con cuatro desplazamientos y tres sumas. Como no estamos en el bucle del juego ni en ningún sitio crítico, ponemos n_pant * 75 y a otra cosa, porque ocupa mucha menos memoria.
Como diría Rorshach: "Urm..."
Avatar de Usuario
radastan
Mensajes: 692
Registrado: Vie, 20 Ago 2010, 12:54
Contactar:

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor radastan » Dom, 25 May 2014, 23:12

na_th_an escribió:Si n es el número de sprite, en vez de hacer n*36 es mejor que pases de multiplicar.

Descompon en potencias de 2. Date cuenta que 36 = 32 + 4. O sea, n*36 = n*32 + n*4. Las multiplicaciones por potencias de dos se pueden hacer con desplazamientos, que son muy rápidos. Así, n*2^m = (n << m). Recuerda esto.

Por tanto, n*36 puede ponerse como (n << 5) + (n << 2) (porque 32 = 2^5 y 4 = 2^2), lo cual es muchísimo más rápido.

Hay que evitar multiplicar o dividir, a menos que estemos en un lugar donde no importe si tardamos un poco más. Por ejempo, cuando vas a pintar una pantalla, tampoco se va a notar si calcular el offset de la pantalla dentro del mapa multiplicando o desplazando. En la churrera las pantallas ocupan 75 bytes, un número bastante irregular, que se descompone en 64 + 8 + 2 + 1, y que implicaría una expresión con cuatro desplazamientos y tres sumas. Como no estamos en el bucle del juego ni en ningún sitio crítico, ponemos n_pant * 75 y a otra cosa, porque ocupa mucha menos memoria.


A ver si me curro una rutina en ensamblador que lo haga y una función nueva para la librería, así no hay que pensar en estas cosas.
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor na_th_an » Lun, 26 May 2014, 07:48

Hombre, yo creo que es importante que un programador controle de ese tipo de cosas. Si cada vez que hay que optimizar el cálculo de un desplazamiento se va a necesitar una función nueva de la biblioteca, la liamos :D

De todos modos, y para hacer el tema más sencillo, lo que yo haría sería guardar entre las variables de la biblioteca la dirección de inicio del tileset, ofrecer una función para modificarla, y hacer que la función que dibuja un sprite, en vez de recibir la dirección del sprite, reciba el número del sprite. Al principio de la función haces la cuenta de donde sacar los bytes tú, y listos. Luego, para contentarlos a todos, escribes otra interfaz en C que reciba la dirección del sprite, la ponga en HL, y luego haga una llamada al punto de la otra función donde la dirección ya está calculada. Así no eliminas funcionalidad.

De todos modos, ya te digo que si se pretende hacer juegos en C, creo que lo mejor es aprender C primero. Y si se pretende hacer juegos para 8 bits, no está de mal empaparse de las diferentes técnicas de optimización y saber qué ocupa más y qué ocupa menos, o dónde es preferible ahorrar espacio y dónde bytes, y cosas así :)
Como diría Rorshach: "Urm..."
Avatar de Usuario
Lord Raptor
Mensajes: 17
Registrado: Mié, 09 Oct 2013, 22:52

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor Lord Raptor » Lun, 26 Oct 2015, 03:11

Wenas... una ayudita pofavó !!

He descubierto el curso de z88dk de radas y me lo he bajau todo, me lo he instalau y toa la pesca.
Empiezo [voy compilando los ejercícios y tal], continúo y me lo acabo [lo poco ke ha sacado].... y
como estoy animado pues me pongo con la info ke hay en spanish del z88dk [en la ke se tocan las
diferentes librerías de base ke permiten hacer cosillas muy shulas...]

Y le toca el turno a la spritepack.h [creo ke es lo mísmo ke decir splib2...o no?] el caso es ke al
compilar me se vuerve hilipollas el compilador, lanzándome todo tipo de improperios y tal.
[creo haberme explicado bien] Ahora la batería de preguntas:

- La versión 'portable' del z88dk de Radas está 'toketeada' y por eso me da problemas ?
- Está creada/compilada esa librería? [o le falta algo ?]
- se supone ke debo 'invocarla' con: #include <lib\spritepack.h> [o ya la hemos cagado?]
[es como si no viera la librería]...[y me tiene parado sin poder seguir los ejercícios]

Ala, a ver kién es el valiente ke me desface el entuerto.

nota: se supone ke seguí toos los pasos al deíllo. Y todo me compilaba bien....
z88dk10 en carpeta única, y en C:\ y usando la versión ke colgó de su hilo.
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Z88DK (curso Radastan) - Dudas Varias

Mensajepor na_th_an » Lun, 26 Oct 2015, 08:07

Depende de donde tengas instalada splib2. Normalmente se pone splib2.lib en /z88dk10/lib/clibs/ y spritepack.h en /z88dk10/include/. Con esto, sólo tienes que poner #include <spritepack.h> en el código para que vea los símbolos y no olvidarte de añadir la biblioteca al compilar/linkar para que se incluya el código.

Código: Seleccionar todo

zcc +zx -vn hola.c -o hola.bin-lsplib2 -create-app -zorg=24000
Como diría Rorshach: "Urm..."

Volver a “Ayuda”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado