Página 7 de 10

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Vie, 23 May 2014, 22:16
por elborra
¿ has probado a hacerle el cast con (int) (_sprite1) ?

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Sab, 24 May 2014, 08:25
por Hark0
$this->bbcode_second_pass_quote('na_th_an', 'T')e 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:

$this->bbcode_second_pass_code('', '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. ;)

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Sab, 24 May 2014, 08:27
por Hark0
$this->bbcode_second_pass_quote('elborra', 'Â')¿ 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!

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Dom, 25 May 2014, 00:02
por radastan
$this->bbcode_second_pass_quote('Harko', 'A')l 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.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Dom, 25 May 2014, 06:59
por Hark0
Ok... ;)

Se me ha ocurrido hacer lo mismo, pero para los mapas... :P

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Dom, 25 May 2014, 11:15
por na_th_an
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.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Dom, 25 May 2014, 23:12
por radastan
$this->bbcode_second_pass_quote('na_th_an', 'S')i 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.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 26 May 2014, 07:48
por na_th_an
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í :)

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 26 Oct 2015, 03:11
por Lord Raptor
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.

Re: Z88DK (curso Radastan) - Dudas Varias

Publicado: Lun, 26 Oct 2015, 08:07
por na_th_an
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.

$this->bbcode_second_pass_code('', 'zcc +zx -vn hola.c -o hola.bin-lsplib2 -create-app -zorg=24000')