Dudas funcionamiento librería CPCRSLIB

Programando el Amstrad en BASIC, C, etc.
corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Dom 26 Oct , 2014 11:09 am

Hola.

He empezado un desarrollo utilizando la librería CPCRSLIB (adiós BASIC). Tengo algunas dudas acerca de la configuración y uso de la librería CPCRSLIB. Para mi desarrollo, he tomado como base el ejemplo en modo 0 "003 - Small Sprite Demo (Tile Map)". Las dudas son las siguientes:



1. Definición del tamaño de TILEMAP. En la documentación encuentro lo siguiente:

[...]
Tile are of 2x8 bytes (width x height). The maximum definable are is 40x20 tile, depending on the screen mode this will be 320x160 pixels ( mode 1) or 160x160 pixels (mode 0).
[...]

He modificado el fichero TileMap.h y compilado la librería varias veces modificando el tamaño del fondo para intentar que el fondo sea lo más grande posible. La máxima configuración que he conseguido hacer funcionar es la siguiente:

;------------------------------------------------------------------------------------
; TILE MAP DIMENSIONS
;------------------------------------------------------------------------------------

T_WIDTH = 36 ;max=40 ;dimensiones de la pantalla en tiles
T_HEIGHT = 20 ;max=20


;Invisible tile margins:
T_WH = 2
T_HH = 2
;------------------------------------------------------------------------------------

No he conseguido hacer funcionar el ejemplo indicado con un ancho mayor de 36 tiles (errores gráficos, reseteos, etc).

¿Tenéis algún ejemplo funcionando en el que el fondo esté configurado al máximo permitido (40x20 tiles)?
Aparte, según intuyo, aún configurando el fondo al tamaño máximo, la zona jugable se seguiría mostrando en una ventanita con un marco muy grande. ¿Hay alguna posibilidad usando CPCRSLIB de crear un fondo que ocupe toda la pantalla del Amstrad CPC?



2. Según la documentación, en este ejemplo, la pantalla estaría formada por 160x160 pixels. Ahora bien, si cambio las coordenadas de un personaje del siguiente modo: cx = cx + 1, el personaje NO se pinta en una posición un pixel más a la derecha, sino que pega un salto de dos pixeles. En cambio, si el personaje lo muevo abajo o arriba haciendo: cy = cy + 1, SI que se pinta un pixel más arriba o más abajo y por lo tanto parece que funciona bien. ¿Qué estoy haciendo mal al trabajar con las coordenadas Cx? (De hecho, según la documentación, podría colocar un personaje en la posición Cx = 140 por ejemplo pero esa posición no muestra al personaje correctamente)



Muchas gracias por adelantado.
Última edición por corpiano el Dom 26 Oct , 2014 9:57 pm, editado 1 vez en total.

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Dom 26 Oct , 2014 9:07 pm

Estas usando SDCC? Es que al portar la libreria de Z88DK a SDCC Artaburu se encontro con algunos problemas al cambiar bastante la sintaxis del ensamblador.

El tema es que en Z88DK defines los valores del tilemap, y las matrices de tiles , y de tiles sucios, etc, se redefinen al recompilar la lib.

En SDCC por ahora va a huevo, esto es, las matrices las defines a pelo y has de hacerlas coincidir con los valores que has ajustado.

El tema es que por ahora la libreria no es 100% independiente de tu desarrollo, has de reconfigurarla, no solo en parametros, sino tambien las matrices y demas dependencias de esos parametros de las dimensiones del tilemap.

Yo tambien empece a retocar el ejemplo 003 para mi Marron en la Euskal, y todo eso me toco modificar ;)

Es normal que te haga extraños ya que la matriz que tienes definida y la que estas trabajando a nivel logico no coinciden. Por eso pintar con unas coordenadas de un tipo (sprite) en un framebuffer de otras dimensiones te hace esas cosas :(
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Dom 26 Oct , 2014 10:23 pm

Correcto, estoy usando el compilador SDCC. De todas formas, no me cuadra esa respuesta.

Reformularé la segunda pregunta, a ver si podemos ver la luz a este problema:

Partimos del ejemplo "003 - Small Sprite Demo (Tile Map, Relative coords update)" (he mirado el código fuente tanto de la versión para el compilador z88dk como para el compilador SDCC). No he recompilado nada, solamente he ejecutado los binarios existentes en el fichero .dsk. En ambas versiones tanto el sprite manejado por el jugador como el sprite que se mueve de izquierda a derecha de forma automática van moviéndose de 2 en 2 pixeles. El código fuente es del siguiente tipo:

cpc_SpUpdX(sprite01,-1);
cpc_SpUpdX(sprite01,1);

(en la versión z88dk)

sprite01.cx--;
sprite01.cx++;

(en la versión SDCC)



Analizando el código, entiendo que queremos que el personaje se mueva un pixel a la izquierda o un pixel a la derecha. Sin embargo, tras ejecutar dichas sentencias, el personaje se mueve 2 pixeles a la izquierda o 2 pixeles a la derecha (lo que junto al hecho de que el ejemplo está en modo 0 y los pixeles son el doble de anchos provoca mucha brusquedad en el movimiento).

En cambio, los movimientos hacia arriba o abajo son movimientos de un solo pixel a pixel y por lo tanto se muestra el movimiento super fluido.

¿Alguna idea de lo que está pasando? ¿cómo hacer para que el movimiento de izquierda a derecha sea de un solo pixel?

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Mar 28 Oct , 2014 11:28 am

Correcto, estoy usando el compilador SDCC. De todas formas, no me cuadra esa respuesta.

Reformularé la segunda pregunta, a ver si podemos ver la luz a este problema:

Partimos del ejemplo "003 - Small Sprite Demo (Tile Map, Relative coords update)" (he mirado el código fuente tanto de la versión para el compilador z88dk como para el compilador SDCC). No he recompilado nada, solamente he ejecutado los binarios existentes en el fichero .dsk. En ambas versiones tanto el sprite manejado por el jugador como el sprite que se mueve de izquierda a derecha de forma automática van moviéndose de 2 en 2 pixeles. El código fuente es del siguiente tipo:

cpc_SpUpdX(sprite01,-1);
cpc_SpUpdX(sprite01,1);

(en la versión z88dk)

sprite01.cx--;
sprite01.cx++;

(en la versión SDCC)



Analizando el código, entiendo que queremos que el personaje se mueva un pixel a la izquierda o un pixel a la derecha. Sin embargo, tras ejecutar dichas sentencias, el personaje se mueve 2 pixeles a la izquierda o 2 pixeles a la derecha (lo que junto al hecho de que el ejemplo está en modo 0 y los pixeles son el doble de anchos provoca mucha brusquedad en el movimiento).

En cambio, los movimientos hacia arriba o abajo son movimientos de un solo pixel a pixel y por lo tanto se muestra el movimiento super fluido.

¿Alguna idea de lo que está pasando? ¿cómo hacer para que el movimiento de izquierda a derecha sea de un solo pixel?
Para que el sprite se mueva un pixel en cada dirección en modo 0, tienes que hacer operaciones para rotar los bytes del sprite. Tienes algún ejemplo en modo 2, creo.
En modo 0, cada byte son 2 pixels y el movimiento es byte a byte. En vertical también pero ahí el salto es de un pixel por cada byte.
Salu2,
Arta

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Mar 28 Oct , 2014 11:55 pm

Ouch rotar los sprites... me acabas de matar.

Ante todo, mi mas sincera felicitación por el trabajo realizado con la librería. Realmente es todo un honor recibir respuesta directa del creador de la librería que ha acercado la programación de CPC a decenas de aficionados.

En cuanto a la respuesta recibida... digamos que creía que la solución a mi duda sería algo más sencilla. Esto de la rotación de sprites es algo nuevo para mi. Lo único es que me extraña que haya tantos desarrollos usando tu librería y muchos no se hayan sorprendido/preguntado/percatado de que los sprites se muevan en horizontal en saltos de 2 en 2 píxeles en modo 0 (no quiero pensar en modo 1). Voy a analizar detenidamente el código del ejemplo "004 - Sprites Tile Map Mode 1 (Sprite Rotation)" a ver si saco algo en claro.

Mil gracias por tu ayuda.

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Vie 31 Oct , 2014 8:35 am

Hola.

A ver, por partes.

1. En relación a la primera pregunta, el tema de la configuración del tamaño del fondo, lo tengo aparcado por ahora. La respuesta de Kaos me ha hecho revisar los códigos de "SAVE THE HUMOR" y "FOX BURGLAR" y ya tengo una idea de lo que está pasando.

2. En relación a la segunda pregunta (rotación de sprites): Independientemente de hacer una rutina para "ROTAR" los sprites de forma dinámica con los operadores << y >>, he realizado la siguiente prueba con sprites estáticos:

En Sprot, creo un SPRITE 2x2 con máscara del tipo:

|0|#|
|0|#|

(siendo # el color transparente)

El código sería similar al siguiente:

defb $55,$00
defb $55,$00



A continuación, creo otro SPRITE 2x2 con máscara del tipo:

|#|0|
|#|0|

(siendo # el color transparente)

El código sería similar al siguiente:

defb $AA,$00
defb $AA,$00


Suponemos, que para hacer un movimiento suave en modo 0, tengo que poner el primer sprite en el campo .sp0 y cuando pulso en el cursor derecho tengo que poner el segundo sprite en el campo .sp0 en lugar de incrementar .cx

Bien, una vez ejecutado, el resultado que obtengo es el siguiente:

Al arrancar se pinta lo siguiente:

|0|#|
|0|#|


Al pulsar en el cursor derecha, se pinta lo siguiente:

|0|0|
|0|0|


Parece que el tratamiento de la transparencia no funciona en este caso¿?¿?. Si a continuación hago un cy++ ya sí que se muestra correctamente pero evidentemente desplazado en el eje vertical una posición (lo cual no me interesa). ¿¿¿Alguna idea de lo que está pasando y/o posible solución???

3. y una nueva pregunta (y ya van 3): ¿Cómo puedo hacer para que la velocidad del juego permanezca constante? Si tengo 10 enemigos en pantalla y mato a 9, el juego se acelera una cosa mala (me gustaría que el juego fuese a la misma velocidad tanto con 10 enemigos como cuando solamente queda uno).


Nota: Soy consciente de que mis preguntas son muy cansinas pero si lo pregunto es porque después de muchas pruebas sigo atascado y creo que su resolución puede ser de utilidad a otros. Agradezco infinitamente cualquier ayuda.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Vie 31 Oct , 2014 12:49 pm

La solución que has dado para no tener una rutina para rotar sprites es buena, yo la usé en Phantomas Saga: Infinity, en el sprite de salto alto ya que ahí se mueve pixel a pixel.

No llego a entender que no te funcione porque a cpcrslib le da igual qué sprite dibujar en un posición x,y determinada así que realmente no endiendo qué puede pasar porque según describes, los pasos que das son correctos.
Prueba a poner el sprite en .sp1 también.


La velocidad del juego la puedes controlar con interrupciones, por ejemplo, hasta que no hayan pasado x interrupciones no redibujas la pantalla. Esta sería la forma fácil aunque seguro que hay alguna más elaborada que te puedan indicar (yo no he llegado nunca a más que esto que te cuento).
Salu2,
Arta

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Vie 31 Oct , 2014 12:53 pm

¿Tenéis algún ejemplo funcionando en el que el fondo esté configurado al máximo permitido (40x20 tiles)?
Aparte, según intuyo, aún configurando el fondo al tamaño máximo, la zona jugable se seguiría mostrando en una ventanita con un marco muy grande. ¿Hay alguna posibilidad usando CPCRSLIB de crear un fondo que ocupe toda la pantalla del Amstrad CPC?
Para definir 40x20 visibles habría que quitar las zonas invisibles ya que aunque no se vean, están ahí :-ss
Ten en cuenta que los márgenes son en las 4 posiciones. Usando márgenes ocultos, el máximo lo conseguirías con esta configuración.

Para no tener márgenes es posible que te de errores porque el código creo que los busca... pero prueba a ver.

Código: Seleccionar todo

;------------------------------------------------------------------------------------
; TILE MAP DIMENSIONS
;------------------------------------------------------------------------------------

T_WIDTH = 38 ;max=40 ;dimensiones de la pantalla en tiles
T_HEIGHT = 18 ;max=20


;Invisible tile margins:
T_WH = 1
T_HH = 1
;-------
Salu2,
Arta

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Vie 31 Oct , 2014 11:46 pm

Edito el mensaje: He actualizado el fichero adjunto.

Hola.

En cuanto a la pregunta 2, ya he encontrado la causa del error.

Sin rodeos, la librería CPCRSLIB para SDCC tiene algún error/carencia en una de sus funciones.

Para mis pruebas he partido del ejemplo "003..." y he utilizado por un lado el compilador z88dk y la librería CPCRSLIB para z88dk y por otro lado el compilador SDCC y la librería CPCRSLIB para SDCC

Adjunto un ejemplo con rotación de sprites en modo 0 usando la librería CPCRSLIB para z88dk.

Cursor derecha: el sprite se mueve a la derecha pixel a pixel (se ha implementado rotación de píxeles)
Cursor izquierda: el sprite se mueve a la izquierda pixel a pixel (se ha implementado rotación de píxeles)
Cursor abajo/arriba: incrementa/decrementa cy

El mismo ejemplo pero compilado con SDCC y la versión de la librería para SDCC NO funciona correctamente. Muestra el comportamiento erróneo que he descrito anteriormente al trabajar con transparencias.

Como pista, en el ejemplo "003.." para z88dk se utiliza la función cpc_ShowTouchedTiles mientras que en el mismo ejemplo para SDCC se utiliza la función cpc_ShowTileMap2 (de hecho, la función cpc_ShowTouchedTiles no existe en dicha librería).

Mis conocimientos acaban aquí, si alguien se anima a encontrar y corregir el error/carencia...
Adjuntos
unonuevo.dsk
(190.21 KiB) Descargado 48 veces

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Sab 01 Nov , 2014 7:00 pm

Por cierto, el movimiento pixel a pixel requiere gran coste computacional.

El algoritmo que he implementado para la rotación de sprites es el siguiente:

void rotatespriteleftM0(unsigned char sprite[])
{
unsigned char i, j;
unsigned char tam;
unsigned char pixel1mascarabackup, pixel1datobackup;
unsigned char limite;

// ancho = sprite[0];
// alto = sprite[1];

tam = (sprite[0] * sprite[1] * 2) + 2;
for (i = 2; i < tam; i = i + (sprite[0] * 2))
{
limite = (i + sprite[0] * 2) - 2;

// máscara y datos
pixel1mascarabackup = (sprite) & 170;
pixel1datobackup = (sprite[i + 1]) & 170;
for(j = i; j < limite; j++)
{
sprite[j] = (((sprite[j]) & 85) << 1) | (((sprite[j + 2]) & 170) >> 1);
j++;
sprite[j] = (((sprite[j]) & 85) << 1) | ((sprite[j + 2] & 170) >> 1);
}
sprite[j] = (((sprite[j]) & 85) << 1) | (pixel1mascarabackup >> 1);
sprite[j + 1] = (((sprite[j + 1]) & 85) << 1) | (pixel1datobackup >> 1);
}
}

Supongo que el mismo algoritmo implementado directamente en lenguaje ensamblador será mucho más óptimo, pero mis conocimientos acaban aquí. Si alguien se anima...

Avatar de Usuario
garvidal
Lechoncillo
Lechoncillo
Mensajes: 22
Registrado: Vie 03 Oct , 2014 10:14 am
Ubicación: Nambroca - Toledo
Contactar:

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor garvidal » Dom 02 Nov , 2014 10:06 am

Buenas.

Para imprimir un sprite (sin transparencia, eso os lo dejo a vosotros) en mode 0 en cualquier coordenada de la pantalla (considerando en mode 0 las coordenadas x de 0 a 160 e y 0 a 199), yo me hice esta rutina de impresión:

Código: Seleccionar todo

;----------------------------------------------------------------------------------------------------------------------
;| Nueva rutina de impresión |
;| Recibe en de las coordenadas d-coordenada y e-coordenada x |
;| Recibe en IX la dirección de la imagen, en la que los dos primeros bytes son el ancho y el alto, también en bc |
;| Si en lugar de llmar a impresion llamamos a impr_neta la rutina no calcula la dirección de pantalla respecto de |
;| las coordenadas, si no que supone que recibimos dicha dirección en hl. Esto será de utilidad cuando la rutina desde|
;| la que estamos llamando sea una rutina de impresión masiva, como la impresión de pantalla y no nos sea de utilidad |
;| el calcular la dirección de pantalla por cada imagen. |
;----------------------------------------------------------------------------------------------------------------------

impresion: call calc_adr
impr_neta: ld a,e ;voy a llamar a esta dirección cuando ya haya generado yo la dirección
push ix
pop de
inc de
inc de
bit 0,a ;si estoy desplazado
jr nz,despla
ld a,b ;alto del sprite
bucle: ld b,0
ld c,(ix+00) ;ancho del sprite
ex de,hl ;en de el destino
push de;guardo la direccion
ldir ;el contenido de hl en de mientras bc>0
pop de ;recupero la direccion
ex de,hl ;en hl direccion pantalla en de origen
dec a ;quito uno de alto
ret z;si es cero, fin de impresion
call nexline
jr bucle
despla: ld a,(hl) ;en hl direccion destino, en ix direccion origen, en bc alto/ancho
and %10101010
push hl
siguedes: push bc
ex de,hl
ld c,(hl)
ex de,hl
ld b,a
ld a,c
rra
and %01010101
or b
ld (hl),a
ld a,c
rla
and %10101010
inc hl
inc de
pop bc
dec c
jr nz,siguedes
ld c,a
ld a,(hl)
and %01010101
or c
ld (hl),a
ld c,(ix+0) ;ancho
pop hl
dec b
ret z
call nexline
jr despla
nexline: push bc
ld bc,2048 ;la siguiente linea deberia ser esta...
push hl ;la guardo por si carry
add hl,bc ;la calculo
jr c,sigline ;si no hay acarreo sigo
pop bc
jr sig_carac
sigline pop hl ;recupero la anterior
ld bc,14255 ;siguiente linea
sbc hl,bc ;calculada
sig_carac: pop bc ;borro lo guardado en pila
ret
Estoy seguro que se puede mejorar, pero la verdad a mi me va bien. Es para mode 0.
---------------------------------------
http://www.garvidal.com

gg
I am The Forum
I am The Forum
Mensajes: 2289
Registrado: Mié 13 Dic , 2006 10:48 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor gg » Dom 02 Nov , 2014 11:43 am

Buenas.

Yo también estuve haciendo pruebas para la rotación de sprites, pero no suelo usarla en los juegos. Me resulta más cómodo incluir el desplazamiento en los distintos sprites que se usen para la animación del elemento. Así solo hay que tener cuidado en los cambios de sentido.
Saludos,
gg.

Avatar de Usuario
Artaburu
Trasteador
Trasteador
Mensajes: 8419
Registrado: Vie 07 Oct , 2005 6:18 pm
Ubicación: En tu pantalla

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor Artaburu » Lun 03 Nov , 2014 1:06 pm

Edito el mensaje: He actualizado el fichero adjunto.

Hola.

En cuanto a la pregunta 2, ya he encontrado la causa del error.

Sin rodeos, la librería CPCRSLIB para SDCC tiene algún error/carencia en una de sus funciones.

Para mis pruebas he partido del ejemplo "003..." y he utilizado por un lado el compilador z88dk y la librería CPCRSLIB para z88dk y por otro lado el compilador SDCC y la librería CPCRSLIB para SDCC

Adjunto un ejemplo con rotación de sprites en modo 0 usando la librería CPCRSLIB para z88dk.

Cursor derecha: el sprite se mueve a la derecha pixel a pixel (se ha implementado rotación de píxeles)
Cursor izquierda: el sprite se mueve a la izquierda pixel a pixel (se ha implementado rotación de píxeles)
Cursor abajo/arriba: incrementa/decrementa cy

El mismo ejemplo pero compilado con SDCC y la versión de la librería para SDCC NO funciona correctamente. Muestra el comportamiento erróneo que he descrito anteriormente al trabajar con transparencias.

Como pista, en el ejemplo "003.." para z88dk se utiliza la función cpc_ShowTouchedTiles mientras que en el mismo ejemplo para SDCC se utiliza la función cpc_ShowTileMap2 (de hecho, la función cpc_ShowTouchedTiles no existe en dicha librería).

Mis conocimientos acaban aquí, si alguien se anima a encontrar y corregir el error/carencia...
¿Puedes poner el código del programa para ver qué es lo que puede estar fallando?
No me queda claro si estás haciendo rotación o si estás dibujando sprites desplazados un pixel.
Creo que rutinas de rotación de sprites solo había hecho una para modo 1, no creo que en la librerá haya para modo 0 ni modo 2. Cada rutina es diferente por cómo se usan los bits del byte :mrgreen:

De todas formas, yo soy muy consciente de que cpcrslib tiene carencias y errores y me encanta que me ayudeis a encontrarlos para arreglarlo así que adelante!
Salu2,
Arta

KaosOverride
Keeper of The Forum
Keeper of The Forum
Mensajes: 712
Registrado: Vie 27 Feb , 2009 12:21 pm

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor KaosOverride » Lun 03 Nov , 2014 5:20 pm

Muy buenas!

No se si es que leyendo desde el movil no te entendi la 2º pregunta, juraria que lei 8 pixeles de desplazamiento, no dos... :-k y lo asocie a lo de las dichosas matrices que hay que cambiar a mano.

Sobre esa primera pregunta, si no has modificado las matrices, y has hecho la zona de tiles mas pequeña, no pasa nada, desperdicias parte de la matriz, pero si la haces mas grande en parametrica, al ir a valores que la matriz definida se queda corta, pisaras otras partes de la memoria, de ahi te podran venir los reseteos... :(

Sobre pintar fuera de la zona de tiles, pensando que se trate de un marcador, marco, etc, si es muy elaborado lo mejor es currarselo o bien en el Art Studio (O tu programa de CPC favorito) y guardarlo en .SCR sin compresion (Al loro con la paleta de colores, que sea igual que la del juego). Despues quitarle la cabecera AMSDOS al extraerlo del .DSK y tener un binario de 16kb clavados del pantallazo del marco. O bien generar ese .SCR con cualquier programa de dibujo en PC/MAC/LINUX y pasarlo por el ConvImgCPC (Al loro de nuevo con la paleta!)

Una vez tengas el .BIN, usa el Exomizer para comprimirlo, lo que te dara un fichero .EXO. Tratandolo como binario, usa un BIN2H o BIN2ASM para pasarlo a un bloque de datos para tu codigo fuente y con la funcion Cpc_Unexo(Puntero_pantallazo_exo,&C000) y zas, lo descomprime directo a video. Aunque sea una decima de segundo igual se puede apreciar el pintado entrelazado a 8 lineas clasico del CPC, nada que la vieja treta de poner tintas a cero, y luego reponer tu paleta no arregle :)

Y lo de los 2 pixeles en horizontal parece que lo mas liviano para la CPU va a ser tener duplicados de los sprites con un pixel desplazado, que puedes aprobechar para hacer animaciones con mas fotogramas por segundo, manteniendo en la posicion X con el primer sprite de la animacion, el siguiente con el sprite 2 que desplaza un pixel y ya implica un cambio postural, X+1 y el sprite 3, otra vez el X+1 y el sprite 4 :? En lugar de X, sprite 1, X+1 Sprite 2

Lo de que vayas "desactivando" otros sprites (matar malos) yo iba recorriendo la lista de malos con un FOR, y despues actuaba con un IF malo[n].vivo hacer_cosas_del_malo ELSE bucle_bastardo_para_simular_que_hace_lo_suyo. Y si, calculado a ojimetro.....

En mi "Marron en la Euskal" no matas, pero unas pantallas tienen 4 malos, otras 3.... Tienes el codigo fuente?? (Espero que mi cutrehosting me deje enlazar). Ale, otro mas para curiosear :D
--------
Carpeta publica [url=https://mega.nz/#F!W5IyhbLa!51JpgZqvyx6j__v12Pr9QA]MEGA Amstrad[/url]
Carpeta proyecto [url=https://github.com/KaosOverride]GitHub[/url]

corpiano
Me voy lanzando
Me voy lanzando
Mensajes: 88
Registrado: Dom 26 Oct , 2014 10:38 am

Re: Dudas funcionamiento librería CPCRSLIB

Mensajepor corpiano » Sab 15 Nov , 2014 11:58 am

Edito el mensaje: He actualizado el fichero adjunto.

Hola.

En cuanto a la pregunta 2, ya he encontrado la causa del error.

Sin rodeos, la librería CPCRSLIB para SDCC tiene algún error/carencia en una de sus funciones.

Para mis pruebas he partido del ejemplo "003..." y he utilizado por un lado el compilador z88dk y la librería CPCRSLIB para z88dk y por otro lado el compilador SDCC y la librería CPCRSLIB para SDCC

Adjunto un ejemplo con rotación de sprites en modo 0 usando la librería CPCRSLIB para z88dk.

Cursor derecha: el sprite se mueve a la derecha pixel a pixel (se ha implementado rotación de píxeles)
Cursor izquierda: el sprite se mueve a la izquierda pixel a pixel (se ha implementado rotación de píxeles)
Cursor abajo/arriba: incrementa/decrementa cy

El mismo ejemplo pero compilado con SDCC y la versión de la librería para SDCC NO funciona correctamente. Muestra el comportamiento erróneo que he descrito anteriormente al trabajar con transparencias.

Como pista, en el ejemplo "003.." para z88dk se utiliza la función cpc_ShowTouchedTiles mientras que en el mismo ejemplo para SDCC se utiliza la función cpc_ShowTileMap2 (de hecho, la función cpc_ShowTouchedTiles no existe en dicha librería).

Mis conocimientos acaban aquí, si alguien se anima a encontrar y corregir el error/carencia...
¿Puedes poner el código del programa para ver qué es lo que puede estar fallando?
No me queda claro si estás haciendo rotación o si estás dibujando sprites desplazados un pixel.
Creo que rutinas de rotación de sprites solo había hecho una para modo 1, no creo que en la librerá haya para modo 0 ni modo 2. Cada rutina es diferente por cómo se usan los bits del byte :mrgreen:

De todas formas, yo soy muy consciente de que cpcrslib tiene carencias y errores y me encanta que me ayudeis a encontrarlos para arreglarlo así que adelante!

Perfecto.

Voy a crear un ejemplo en el que se demuestra que en las funciones de pintado de la librería CPCRSLIB para SDCC hay algún tipo de carencia. El ejemplo es con rotación dinámica de sprites (en un ejemplo de dibujar sprites desplazados un pixel aparece el mismo error).

Punto 1: Partimos de la demo "003...".

Punto 2: Sustituimos el siguiente código fuente

En la versión z88dk:
//for example., if key 0 is pressed, and the sprite is inside tilemap, then
//the sprite is moved one byte to the right:
if (cpc_TestKey(0)==1 && sprite00.cx<60) cpc_SpUpdX(sprite00,1);
if (cpc_TestKey(1)==1 && sprite00.cx>0) rotatespriteleftM0((*sprite00).sp0);
if (cpc_TestKey(2)==1 && sprite00.cy>0) cpc_SpUpdY(sprite00,-1);
if (cpc_TestKey(3)==1 && sprite00.cy<112) cpc_SpUpdY(sprite00,1);

En la versión SDCC:
//for example., if key 0 is pressed, and the sprite is inside tilemap, then
//the sprite is moved one byte to the right:
if (cpc_TestKey(0)==1 && sprite00.cx<60) sprite00.cx++;
if (cpc_TestKey(1)==1 && sprite00.cx>0) rotatespriteleftM0((sprite00).sp0);;
if (cpc_TestKey(2)==1 && sprite00.cy>0) sprite00.cy-=2;
if (cpc_TestKey(3)==1 && sprite00.cy<112) sprite00.cy+=2;

Punto 3: Prueba y reproducción del error. Las teclas de control son las mismas que las del ejemplo original, con la excepción de que al pulsar el cursor izquierdo el protagonista realizará una rotación de sprite en lugar de moverse a la izquierda. El ejemplo para z88dk funciona correctamente. El ejemplo para SDCC NO funciona correctamente (puede comprobarse que al pulsar arriba o abajo, el error se corrige).

Espero que este ejemplo te ayude para que puedas solucionar el problema detectado en la librería.

Un saludo.
Adjuntos
ejemplo_z88dk_OK.dsk
(190.21 KiB) Descargado 68 veces
ejemplo_sdcc_KO.dsk
(190.21 KiB) Descargado 58 veces


¿Quién está conectado?

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


La Comunidad Española
ESP Soft, juegos para tu CPC Foro de Amstrad CPC Todos los juegos para CPC en un CD Web dedicada al Amstrad CPC (utilidades) Información útil para el CPC (talleres) Selección de juegos de Amstrad CPC Mundo CPC Pree Play then any Key CPC Basic