La verdad es que 16 pixeles de altura me desmonta un poco el tema... 20 pixeles por 10 tiles = 200 pixeles (el alto total de la pantalla)... con 16 pixeles, la cosa descuadra un poco... pero si no queda mas remedio, adaptaré "mi pensamiento".Para hacer las cosas más rápidas, te aconsejo un tile de 8 o de 16 pixels de alto de modo que todos se puedan dibujar en inicio de caracter y así ganar velocidad haciendo una rutina específica. El ancho ya da un poco más igual puesto que el cálculo del incremento es trivial.
Rutina para dibujar un Sprite en pantalla.
Reglas del Foro
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.
De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
Debido a que hay varios temas pidiendo ayuda para programar en ensamblador máquinas distintas al Amstrad CPC, con micro distinto al Z80 y que incluso dependen del sistema operativo, nos vemos en la necesidad de poner por escrito que estos posts son bienvenidos pero que no es el lugar adecuado ya que por estos lares nos dedicamos más al ensamblador del Z80, un microprocesador de 8 bits que tuvo su gran auge en ordenadores y consolas de los años 80.
De todas formas, esto no quita que alguien que sepa del asunto pueda postear alguna respuesta pero es más fácil encontrar foros dedicados a programar en ensamblador en Windows o MS-DOS que ayudarán más que nosotros:
http://www.lawebdelprogramador.com/news ... nsamblador
La idea es que no se pueda pasar sobre los tiles... seran plataformas... yo no me veo capaz de restaurar fondos ni leches xDHombre, pueden ser de 20 de alto pero la rutina será un poco más lenta porque comprobará todo el rato si hay salto de caracter o de línea pero irá bastante rápido también. ¿El fondo se guarda o se reconstruye el tile tocado? ¿hay buffer para dibujar los sprites?
Osea, se dibuja el "mapeado" con los tiles de las plataformas y hasta la siguiente pantalla no se redibuja la pantalla completa...
Habia pensado en meter disparos... que si pasarian sobre los tiles de las plataformas... pero claro... repito, soy un cutre y no me veo capaz de gestionar eso, ni se como hacerlo.
Salu2
Yo creo que hay un problema en la parte final de la rutina, en
Esas medidas de ancho hay que cambiarlas por variables para hacer la rutina 'universal'. Por otro lado, el &37b0 no se de donde salesalto_caracter
ld bc,&37b0+10 ;37b0+ ancho
sbc hl,bc
jp loop_alto_2x
salto_linea
ld bc,&0800-10 ;0800-ancho
add hl,bc
jp loop_alto_2x
Okis, si el juego es divertido no tiene porqué ser un alarde de la técnica. Como no redibujas tiles sigue con los de 10x20 tranquilamente
Para los disparos, si los dibujar con XOR y cuando pasen los redibujas en la posición anterior con XOR, se restaura el fondo... simpre que no se haya tocado nada. Bueno, como los disparos serán pequeños spritillos diminutos y simpáticos, también puedes capturar el fondo para ellos.
Para los disparos, si los dibujar con XOR y cuando pasen los redibujas en la posición anterior con XOR, se restaura el fondo... simpre que no se haya tocado nada. Bueno, como los disparos serán pequeños spritillos diminutos y simpáticos, también puedes capturar el fondo para ellos.
Salu2,
Arta
Arta
Ah, pequeño saltamontes... la rutina sólo vale para número par de bytes, eh? y ese número tan raro es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050Yo creo que hay un problema en la parte final de la rutina, en
Esas medidas de ancho hay que cambiarlas por variables para hacer la rutina 'universal'. Por otro lado, el &37b0 no se de donde salesalto_caracter
ld bc,&37b0+10 ;37b0+ ancho
sbc hl,bc
jp loop_alto_2x
salto_linea
ld bc,&0800-10 ;0800-ancho
add hl,bc
jp loop_alto_2x
Salu2,
Arta
Arta
Ahá !!! ¿Y que hay de lo sumar C850 y despreciar el acarreo ? xDD Que sepas que me ha gustado , pero deberías estandarizar esa rutina, auqne solo sea para números pares.es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050
Pero es que para sprites pequeños creo que es más lenta. De todas formas no costará mucho estandarizarla. A ver si esta tarde-noche puedo.Ahá !!! ¿Y que hay de lo sumar C850 y despreciar el acarreo ? xDD Que sepas que me ha gustado , pero deberías estandarizar esa rutina, auqne solo sea para números pares.es el número que hay que restar para pasar a la siguiente línea cuando se salta de caracter. Es la diferencia entre el valor de la última posición de un caracter menos la siguiente (o al revés). Por ejemplo, entre &F800 y &C050
Salu2,
Arta
Arta
Os dejo una rutina que colgó Prodatron en algún foro alemán y que encontró DaDMaN. Mejora muy mucho a las rutinas que hay hasta ahora en este hilo. Sirve para dibujar sprites sólidos (sin transparencias)
La rutina original está aquí:
http://www.cpc-forum.de/phpbb/viewtopic.php?t=209
Ojo que si la cogéis debéis meter un par de ex de,hl porque si no me equivoco, se le olvidó meter un cambio de hl a de para poder hacer el salto de línea.
La rutina que cuelgo aquí está modificada para ejecutarla desde BASIC con call &writesprite,destino,dimensiones,origen
Dimensiones =&alto.ancho
Es muy sencilla de entender y de modificar para pasar los parámetros desde ASM, pero en caso de duda... preguntad.
La rutina original está aquí:
http://www.cpc-forum.de/phpbb/viewtopic.php?t=209
Ojo que si la cogéis debéis meter un par de ex de,hl porque si no me equivoco, se le olvidó meter un cambio de hl a de para poder hacer el salto de línea.
La rutina que cuelgo aquí está modificada para ejecutarla desde BASIC con call &writesprite,destino,dimensiones,origen
Dimensiones =&alto.ancho
Es muy sencilla de entender y de modificar para pasar los parámetros desde ASM, pero en caso de duda... preguntad.
Código: Seleccionar todo
writesprite:
ld b,(ix+2) ;ancho
ld l,(ix+4)
LD h,(ix+5)
ld a,64
sub b
add a
ld (width1+1),a
xor a
sub b ;-ancho
ld (width2+1),a
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
width1: jr width1 ;cada LDI es un byte
;se hace el salto al byte correspondiente (64-ancho)
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi
dec a
ret z
width2:
ld bc,#700
ex de,hl
add hl,bc
jp nc,width0
ld bc,#c050
add hl,bc
jp width0
Salu2,
Arta
Arta
Re: Rutina para dibujar un Sprite en pantalla.
con meter un jr width1 entre las siguientes lineas funciona:
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
o un ex de,hl que es más rápido...
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
o un ex de,hl que es más rápido...
--
Salu2 (-:) JAVIER
Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?
Visita www.4mhz.es
Salu2 (-:) JAVIER
Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?
Visita www.4mhz.es
- Mode 2
- I am The Forum
- Mensajes: 2068
- Registrado: Lun 10 Oct , 2005 8:01 pm
- Ubicación: Sevilla, años 80.
- Contactar:
Re:
Este enlace parece roto ¿sabeis de algun otro sitio donde se encuentre esta información?Con la información que aparece en:
http://andercheran.aiind.upv.es/~amstra ... trtim.html
Se pueden calcular mejor los tiempos relativos de ejecución de las rutinas.
Gracias.
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.
Re: Rutina para dibujar un Sprite en pantalla.
Sí
http://www.cpctech.org.uk/docs/instrtim.html
o http://www.cepece.info/amstrad/docs/instrtim.html
Tengo que ver si puedo actualizar el mirror de cepece.info, que ya no lo está...
http://www.cpctech.org.uk/docs/instrtim.html
o http://www.cepece.info/amstrad/docs/instrtim.html
Tengo que ver si puedo actualizar el mirror de cepece.info, que ya no lo está...
Re: Rutina para dibujar un Sprite en pantalla.
ó puedes usar la versión de mi google code
Re: Rutina para dibujar un Sprite en pantalla.
Me gusta
ó puedes usar la versión de mi google code
--
Salu2 (-:) JAVIER
Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?
Visita www.4mhz.es
Salu2 (-:) JAVIER
Who'd need windows in a world without gates?
¿Quien necesita ventanas en un mundo sin puertas?
Visita www.4mhz.es
- Mode 2
- I am The Forum
- Mensajes: 2068
- Registrado: Lun 10 Oct , 2005 8:01 pm
- Ubicación: Sevilla, años 80.
- Contactar:
Re:
Sí, es muy instructiva y puedes saber que instrucciones 'penan' más en tiempo pero algo pesado calcularlas a mano. Imagino que con el time de Basic o un análogo en Ensamblador te dará una idea de cómo de rápida o no es una rutina ¿no?Con la información que aparece en:
http://andercheran.aiind.upv.es/~amstra ... trtim.html
Se pueden calcular mejor los tiempos relativos de ejecución de las rutinas.
¡¡¡Que guay!!, y en español.ó puedes usar la versión de mi google code
Tengo una pequeña duda, la he probado y va perfectamente pero ahora a pasarla a Ensamblador, sin la llamada a BASIC veo que la dirección del sprite no aparece asignandose a DE por ningun lado aunque al poner un 'breakpoint' nada más comenzar la rutina ya tiene DE asignada dicha dirección (en mi ejemplo he puesto en &4000 el comienzo del código y el sprite en &4400). Seguramente será una tontería, pero no la veo.Os dejo una rutina que colgó Prodatron....
La rutina que cuelgo aquí está modificada para ejecutarla desde BASIC con
call &writesprite,destino,dimensiones,origen donde Dimensiones =&alto.ancho
Es muy sencilla de entender y de modificar para pasar los parámetros desde ASM, pero en caso de duda... preguntad.
writesprite:
ld b,(ix+2) ;ancho
ld l,(ix+4)
LD h,(ix+5)
ld a,64
sub b
add a
ld (width1+1),a
xor a
sub b ;-ancho
ld (width2+1),a
ld a,(ix+3) ;A lleva el alto del sprite
width0: ex de,hl
width1: jr width1 ;cada LDI es un byte
;se hace el salto al byte correspondiente (64-ancho)
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi:ldi
ldi:ldi:ldi:ldi
dec a
ret z
width2:
ld bc,#700
ex de,hl
add hl,bc
jp nc,width0
ld bc,#c050
add hl,bc
jp width0
Por cierto, a día de hoy ¿es ésta la rutina más rápida para pintar un sprite sin respetar el fondo que conocéis?
Gracias.
BUSCO: VideoPac+, Jaguar Saturn, Micromanía 1, Amstrad Semanal, MicroHobby, juegos especialmente CPC y Vectrex, Aquarius, Sam Copé, 520 ST, manual +3, manual CPC664.
¿Quién está conectado?
Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro
La Comunidad Española |