help me to make 8BP better

If you like 8BP, your help is welcome. Help me supporting this initiative (from 1€, whatever you want). Donations will be used for materials and 8BP disemination:

SPEDIT


Spedit (Simple Sprite Editor) es una herramienta que te va a permitir crear tus imágenes de personajes y enemigos y usarlos en tus programas BASIC. Al final de esta página he incluido un videotutorial para aprender paso a paso de un modo mas visual. 

Spedit está hecha en BASIC, y es muy sencilla, de modo que puedes modificarla para que haga cosas que no están contempladas y te interesen. Se ejecuta en el amstrad CPC, aunque esta pensada para que la utilices desde el emulador winape.

Lo primero que debes hacer es configurar winape para que la salida de la impresora la saque a un fichero. En este ejemplo he puesto la salida de la impresora al fichero printer5.txt


SPEDIT te permite “espejar” tu imagen para hacer el mismo muñeco caminando hacia la izquierda sin esfuerzo, basta con pulsar H (flip horizontal) y lo mismo se puede hacer en vertical.

Es fácil adaptar esta herramienta para que te permita editar en mode 1 si lo deseas. De hecho es tan sencillo como eliminar la línea de BASIC que establece el modo de pantalla. Como ves la herramienta no es del todo completa pero te permite hacer absolutamente todo lo que necesitas.


pantalla de edicion de SPEDIT v11

Una vez que has definido tu muñeco, para extraer el código ensamblador deberás pulsar la “b”. Esto mandará a la impresora (al fichero que hayamos definido como salida) un texto como el siguiente, al que puedes añadir un nombre, yo le he llamado “SOLDADO_R1”

Una vez que has hecho el primer fotograma de tu soldado puedes dejar el trabajo y continuar otro día. Para partir del soldado que has dibujado y continuar retocándolo o bien modificarlo para construir otro fotograma, puedes ensamblar el soldado en la dirección 20000, quitando el ancho y el alto  . Una vez ensamblado desde winape, le dices a SPEDIT que vas a editar un sprite del mismo tamaño y una vez estés en la pantalla de edición pulsas “r”. El sprite se cargará desde la dirección 20000, que es donde lo has “ensamblado”

Gran parte del atractivo de un juego son sus sprites. No escatimes tiempo en esto, hazlo despacio y con gusto y tu juego parecerá mucho mejor.

Para saber en que dirección de memoria se ha ensamblado cada imagen, utiliza desde el menu de winape:
Assemble->symbols
Con ello veras una relacion de las etiquetas que has definido, como “SOLDADO_R1” y la dirección de memoria a partir de la cual se ha ensamblado.

Una vez que hayas hecho las diferentes fases de animación de tu soldado, puedes agruparlas en una “secuencia” de animación. Las secuencias de animación son listas de imágenes y no se definen con SPEDIT. Con SPEDIT simplemente editas los “fotogramas”. En un apartado posterior te explicaré como decirle a la librería 8BP que un conjunto de imágenes constituyen una secuencia de animación.

Las imágenes que vayas haciendo para tu juego ve guardándolas todas en un único fichero, que se titule “images_mijuego.asm”, por ejemplo. Dicho fichero comienza con una lista de imágenes que puedes referenciar en los comandos 8BP en BASIC con un índice, con independencia de la dirección en la que se ensamblen, por ejemplo:

IMAGE_LIST
; la primera imagen siempre se asignara al índice 16, la siguiente al 17 y asi sucesivamente
;----------------------------------------------------------------------------------------------
dw SOLDADO_R0; 16
dw SOLDADO_R1;17
dw SOLDADO_R2;18

Una vez que estén todas las imágenes hechas podrás ensamblar ese fichero en la dirección 33500 y lo salvarás en un fichero binario desde el Amstrad con el comando SAVE. Por ejemplo si has hecho 2500 bytes de imágenes, tras ensamblarlas en 33500 ejecuta desde el BASIC del CPC en el emulador:

    SAVE “sprites.bin”, b, 33500,2500

Con esto habrás salvado en disco tu fichero de imágenes, así como las descripciones de secuencias de animación de las que hablaremos más adelante. En este ejemplo he puesto una longitud de 2500 pero si has dibujado muchos sprites puede que tengas que poner hasta 8540. No te olvides de la letra “b”, que sirve para especificar que se trata de un fichero binario. Si no estás seguro de cuanto ocupan tus imágenes, pon lo máximo, que es 8540 bytes

MUY IMPORTANTE: asegúrate de no exceder los 8540 bytes de gráficos. Para ello comprueba donde se ha ensamblado la etiqueta “_FINGRAPH”, la cual debe ser inferior a 42040 (ya que 42040 – 33500 = 8540 bytes). Si se ensambla en una dirección superior entonces estás “machacando” direcciones que necesita el interprete BASIC y el ordenador podrá bloquearse. En caso de necesitar más memoria para gráficos deberás ensamblar los gráficos “extra“ en una zona de memoria no ocupada, por ejemplo en la 25000, y usar en tu programa un MEMORY 24999, reduciendo la memoria disponible para el BASIC

Si quieres salvar las imágenes y las secuencias de animación juntas (las secuencias se encuentran en la 33500) simplemente ejecuta

    SAVE “sprites.bin”, b, 33500,8540

Para cargar tus sprites en memoria RAM, simplemente ejecuta:

    LOAD “sprites.bin”


He creado este sencillo videotutorial para introducir en el uso de SPEDIT para crear sprites y usarlos en vuestros programas BASIC hechos con la librería 8BP
El audio en ocasiones es algo malo pero en general creo que puede ser aceptable, ya que una imagen vale mas que mil palabras. 
Nota importante: la versión actual de SPEDIT es v11 mientras que el video está grabado con una versión anterior, algunas diferencias con la versión actual son que por ejemplo para recargar un sprite hay que ensamblar en la 20000 mientras que en el video se hace en la &4000. Quizás edite un nuevo video sobre este tema



En el vídeo se explica como estructurar el juego en carpetas, como usar el emulador "winape" para sacar la salida del SPEDIT a un fichero, ensamblar la librería y los sprites y programar en BASIC vuestro juego, creando unas secuencias de animación con las direcciones en las que se han ensamblado las imágenes

Lo que es inevitable aprender para programar (siempre lo digo) es el significado de la palabra "ensamblar". Que a nadie le de fiebre, saber lo que es ensamblar no significa tener que saber programar en ensamblador.

Al final del vídeo se ensambla todo y se generan los ficheros del juego, de los sprites, la musica, todo




18 comentarios:

  1. Hola Jose Javier,

    Te quería comentar una cosa. Tengo los sprites guardados en el asm de imágenes y creadas dos secuencias con el numero 1 y 2 para desplazamiento a izquierda y derecha en el asm de secuencia, pero cómo puedo mostrar las secuencias en pantalla?. En el manual hay un mini código para manejar el sprite pero no consigo hacerlo funcionar. No sé que tengo que ensamblar (si el images.asm, el secuence.asm o el 8BP) o cambiar en el código para que cargue. Me podrías echar una mano. Gracias de antemano

    saludos

    ResponderEliminar
  2. hola amigo,

    voy a suponer que tienes descargada la 8bp v27, que es la que actualmente se encuentra en github.
    Segun indicas has creado dos secuencias con identificadores 1 y 2. Ahora quieres mostrarlas en pantalla.

    Para ello primero debes asociar una de esas secuencias a un sprite. Por ejemplo voy a usar el sprite 31
    |SETUPSP,31,7,1 asocia al sprite 31 la secuencia de animacion numero 1
    a continuación debes configurar el byte de status del sprite para que sea animado (bit 2). Tambien activamos el flag de impresion (bit 0), es decir status= &x00000101 = 5. lo haremos con |SETUPSP,31,0,5
    Colocamos el sprite en algun sitio : |LOCATESP,31,50,50
    A continuacion invocamos en bucle el comando |PRINTSPALL,0,1,0 . los p3 arametros le indican que no ordene los sprites, que los anime y que no sincronice con el barrido

    en resumen
    10 memory 25999
    20 call &6b78
    30 |SETUPSP,31,7,1
    40 |SETUPSP,31,0,5
    50 |LOCATESP,31,50,50
    60 |PRINTSPALL,0,1,0
    70 GOTO 60

    este ejemplo va a funcionar muy deprisa porque no hay instrucciones entre una impresión y la siguiente , de modo que es mejor que lo pruebes con |PRINTSPALL,0,1,1 para que espere a cada barrido a imprimir, es decir que te imprimirá un fotograma cada 20ms. En tu videojuego en ejecución tendrás muchas instrucciones y sincronizar con el barrido introducirá una demora, por lo que en general es mejor que no sincronices

    un saludo!!

    ResponderEliminar
  3. Hola Jose Javier

    gracias por responder tan rápido. Lo estoy probando y no consigo que cargue nada o me salen unas rayas muy raras jejeje. Entiendo que tengo que ensamblar la librería v27 antes de pone el basic para que pueda leerme los comandos no? He probado también con el SETUPSQ, previo ensamblado del fichero images y mirnado en symbols las posiciones de memoría. Pero tampoco oye...

    ResponderEliminar
    Respuestas
    1. antes de poder usar los comandos de 8BP debes ensamblar la libreria con make_all. De todos modos escribeme un mail a jjaranda13@gmail.com con los detalles de tu programa (incluso zipeamelo todo) y te ayudare mucho mejor, te ayudare a encontrar el problema. Verás que fácil es solucionarlo

      Eliminar
  4. Buenas, estoy creando mi propio juego básico en Amstrad y éste tutorial es desde luego muy interesante. En el vídeo dónde explicas cómo utilizar SPEDIT, en el minuto 11:00 para ser exactos, muestras el fichero "test_juegosencillo" pero no lo encuentro por ninguna parte en el ZIP. ¿Puedes guiarme por favor? Luego, despues de hacer save"sprites.bin",b,33500,8540 cuando lo cargo todo con load, el amstrad contesta MEMORY FULL. ¿A qué se debe? De antemano, Gracias.

    ResponderEliminar
    Respuestas
    1. hola amigo

      tienes razon, estas cosas me pasan porque hice el video con una version de 8BP y ahora estamos en la version 39, y he cambiado un poco los jemeplos. Ahora el ejemplo que viene con la libreria se llama "tu_primer_juego.bas" y esta en 8BP/8BP_V39/BASIC
      Tambien hay dos ejemplos similares en el directorio 8BP/Demos/BASIC, concretamente ahi tienes
      > test_juegosencillo.bas
      > test_juegosencillo_salta_conruta_disparo2.bas

      ambos te pueden servir como ejemplos.
      En cuanto a lo que me comentas de lo que te ocurre con el memory full, es porque antes de empezar a cargar ningun fichero debes hacer un MEMORY 23999. De lo contrario, el amstrad se niega a cargar nada que esté por encima del memory, que inicialmente esta en 42619. En definitiva, tu cargador debe ser:
      10 MEMORY 23999
      20 load "8bp.bin"
      30 load "sprites.bin"

      de todos modos te recomiendo que grabes la libreria, graficos y musica todo junto, asi:
      SAVE "juego.bin", b, 24000, 18620

      y el cargador asi:
      10 MEMORY 23999
      20 load "juego.bin"
      30 run "juego.bas"

      espero haber aclarado tus dudas. Un abrazo

      Eliminar
    2. Gracias por contestar. Aún así sigo con problemas: he editado el archivo "tu_primer_juego.bas" para añadir las lineas :
      61 |SETUPSQ,1,&8571,&8663,&8755,&8663,0,0,0,0: REM LUKE RIGHT
      62 |SETUPSQ,2,&8569,&856B,&856D,&856B,0,0,0,0: REM LUKE LEFT
      (tal como aparece en el vídeo dedicado al spedit y utilizando los "symbols" de mi personaje.)

      Sin embargo, el BASIC dice que no entiende el comando de la linea 61.
      Aquí tienes una captura de pantalla del "tu_primer_juego.bas" tuneado junto a la lista de "symbols" por si pudieras echarle un vistazo. Gracias de nuevo.

      Enlace imagen:
      https://1.bp.blogspot.com/-jDf3MQL6WAM/Xo4PwnuswqI/AAAAAAAADH8/E21H28SfSCwst5LanyPgUtGMLm8mONYGQCLcBGAsYHQ/s1600/61.jpg

      Eliminar
    3. como te comenté , el video lo grabé hace mucho. La version actual de 8BP es la 39 y ese video es de las primeras versiones. A partir de la v33, el comando SETUPSQ lo eliminé y la forma de crear secuencias de animacion desde entonces es a través del fichero "sequences_mygame.asm". En la documentacion pdf (8BP/Documentacion/Manual/8bp_v039_r02_ES.pdf) encontraras explicaciones y numerosos ejemplos. La seccion 8.9 sobre secuencias de animación incluso explica la desaparición de este antiguo comando. En el capitulo 9 encontrarás el ejemplo sencillo. El manual tiene mucha calidad, es riguroso y didáctico. Y para los que quieren ir muy deprisa, contiene un capitulo (el 18) que es un "manual de referencia" con todos los comandos y el modo de usarlos

      Eliminar
  5. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  6. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  7. Vale, gracias a tu ayuda, he conseguido crear los sprites y moverlos en el entorno de test_juegosencillo_salta_conruta_disparo2.bas. Gracoas por todo.
    Para que se borre a sí mismo durante los saltos he añadido líneas de 0 arriba y abajo para cada sprites. El problema es que en test_juegosencillo_salta_conruta_disparo2.bas, la línea de suelo amarillo se va borrando conforme va andando mi sprite. ¿Cómo puedo dejarla "encima" o en primer plano con respecto al sprite? Gracias.

    ResponderEliminar
    Respuestas
    1. hola
      Ese ejemplo que mencionas con los graficos originales del ejemplo no borra el suelo pero como has puesto una linea de 0s debajo del personaje pues logicamente invade mas espacio y borra la linea del suelo. Para evitarlo puedes hacer 3 cosas: 1)no poner esa linea de 0s, o bien 2) dibujar la linea de suelo mas abajo o bien 3) usar sobreescritura. 8BP tiene capacidad de sobreescritura de sprites. Para usarla tienes una descripcion detallada en el manual (cpitulo 8). La libreria 8BP es muy facil y potente pero te recomiendo que leas el manual despacio, capitulo a capitulo. Si vas directo a un capitulo sin leer los anteriores puede resultarte más dificil entenderlo. En el ejemplo que mencionas es que realmente no existe ese problema, simplemente has añadido una linea de 0s y logicamente tiene ese efecto, pero si quieres mantener esos 0s puedes bajar el suelo o usar sobreescritura

      Eliminar
    2. Hola Jose Javier, realmente añadí varias líneas de 0 porque cuando el sprite salta, deja una cascada de colores detrás, es decir, no se borra a sí mismo del todo. Quiero leer el capítulo 8 desde luego pero voy todavía por el 4. Poco a poco. También supongo que en algún momento podré remplazar esa línea por unos "bricks" que simulen suelo o cesped, ¿no?.
      En fin, que estoy muy enganchado y encima tengo tiempo!... Gracias por contestar.

      Eliminar
    3. hola!
      si! por supuesto que podrás poner suelo hecho con bricks. De hecho tienes el mecanismo de layout para juegos de laberintos , entre otras posibilidades que puedes usar. Mucho animo y muchas gracias por tu interes. La libreria esta hecha para gente como tú.

      Eliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Hola Jose Javier:
    Te escribo éste post porque tras vencer los misterios de la paleta 3 y de la sobrescritura, me encuentro atascado con el uso de los layouts. Puedo diseñarlos e imprimirlos en pantalla (como puedes ver en el siguiente pantallazo: https://1.bp.blogspot.com/-8PKRzmd3bGE/XphWLwtxD_I/AAAAAAAADI0/3d7DBTx4JjkC76zvWoJry2Ryc1xwZhckgCLcBGAsYHQ/s1600/luke.jpg) pero no consigo que mi sprite se "suba" (con un salto) a los layouts de diferentes alturas. (A la manera de los típicos juegos de plataformas como RICK DANGEROUS por ejemplo.) ¿Es el comando COLAY el que tengo que usar? Debo reconocer que el manual se me hace algo complicado a éste nivel. ¿Tienes previsto algún tutorial al respeto?

    ResponderEliminar
    Respuestas
    1. Hola, en efecto debes usar el comando COLAY. Puedes basarte en una de las demos que precisamente pinta un layout y controla la colision con COLAY. Hay otra forma de hacer estos juegos y es mediante un mapa de mundo, En ese caso puedes controlar la colision con COLSPALL. Hay un capitulo en el manual donde explico un poco como hacer ese tipo de juegos. Es el capitulo 12 "juegos de plataformas". tambien tienes el juego "fresh fruits and vegetables" que hace justamente eso. En ese capitulo explico como cobrobar la colision con el suelo si optas por un mapa de mundo

      Eliminar