Autor Tema: Mini proyecto escuela  (Leído 6451 veces)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #15 en: Marzo 30, 2022, 09:34:27 »
Ahora programando las colisiones contra el fondo con collision boxes
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

Bieno

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 3955
  • PRINT"ADORA A TU COMMODORE"
    • Ver Perfil
    • bieno64
Re:Mini proyecto escuela
« Respuesta #16 en: Marzo 30, 2022, 10:02:43 »
Que rápido aprendes !!!!!!!!!!  :D

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #17 en: Marzo 30, 2022, 11:10:48 »
Que rápido aprendes !!!!!!!!!!  :D

 ;D....esto está hecho a ratos por las noches durante un mes o asi
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #18 en: Marzo 30, 2022, 11:21:46 »
Explico cómo he planteado el movimiento
1-Creo unas tablas de X,Y para 8 personajes. Se asignará 1 a cada sprite (luego intentaré modificar esto y
   hacerlo compatible con multiplexing).
2-En la tabla creo un campo RENDER que será 0 cuando no haya que renderizar y 1 cuando haya que
   renderizar
3-La modificación de la posición se lleva a cabo en la ejecución normal. El programa mira qué sprites están
   activados en el VIC y además mira que  RENDER = 0.
4-El sprite 0 es controlado por el joystick. El resto se moverán por una rutina de seguir al sprite 0 (la
   intención es poder asignar a cada personaje una rutina que pueda ser distinta y así tener varios
   comportamientos de enemigos).
5-Tras mover las coordenadas, el campo pasa a RENDER = 1....la posición NO se podrá modificar hasta
   que la nueva posición del sprite aparezca en pantalla
6-He aprovechado la interrupción estándar del C64 (60Hz) y he modificado la rutina. Es muy simple,
   toma de la lista los sprites activos con RENDER = 1 y pone las coordenadas X,Y de la tabla en la
   Posición X,Y del sprite. Tras ello, RENDER = 0 ......listo para siguiente movimiento
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #19 en: Marzo 30, 2022, 11:31:23 »
Además de los campos X,Y y RENDER, la tabla tiene 3 campos más:
-Dirección anterior de movimiento
-Retardo de movimiento
-Retardo de animación.

Cuando un sprite recibe una orden de movimiento, lo compara con el movimiento anterior. Así sé cuándo tengo que cambiar la animación. Si el movimiento es el mismo que el movimiento anterior, se suma 1 al campo de retardo de la animación. Cuando se supere el límite de retardo, se pasa al frame siguiente y se pone el retardo a cero.
Si el movimiento varía, se ponen los retardos a cero y se asigna al Pointer del sprite el frame inicial de ese movimiento.

De manera paralela, existe un retardo para el movimiento. El sprite no modificará su posición hasta que el retardo no rebase el límite.

El retardo de la animación depende de las características del personaje. Hay una tabla (de CONSTANTES) para ello. En ella está los campos: Parado, arriba, abajo, izquierda,derecha (que contienen el valor del Sprite pointer del primer frame de cada movimiento.....por lo tanto, el final del movimiento es el inicio del movimiento siguiente) y los retardos de animación de parado, arriba, abajo, izquierda, derecha

El retardo del movimiento dependerá de cada sprite y se puede asignar en cualquier momento

« última modificación: Marzo 30, 2022, 14:38:42 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #20 en: Marzo 30, 2022, 11:33:34 »
Si estáis interesados en alguna rutina en especial, os la enseño...lo que me pidáis
Lo único que tengo todo el proyecto en archivos SEQ en una imagen de diskette....supongo que con el VICE se podrá importar. Meto tb el Turbo Macro Pro y listo.
Otra opción es pasaros los SEQ y que los podáis ver....pero es mucha info a cholón, aunque tengo todo relativamente bien documentado con comentarios
« última modificación: Marzo 30, 2022, 14:39:34 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #21 en: Marzo 30, 2022, 11:51:38 »
Lo más importante:
1-El orden de las animaciones. Son parado, izquierda, derecha, arriba, abajo (el mismo orden de los bits
  del Joystick)
2-Asigno un número a cada dirección. 0:parado, 1:izquierda, 2:derecha, 3:arriba, 4:abajo. De esta
   manera puedo usar el número como índice para las animaciones y para las rutinas de movimiento
3-Se crea una tabla de salto a las rutinas de movimiento, en la que aparecen en el mismo orden de las
   animaciones y de los bits del joystick. Para hacer el salto se usa el STACK y RTS:
       LDA MOVHI,X   (X es la dirección, MOVHI es el HIGH byte de la rutina de movimiento)
       PHA
       LDA MOVLO,X
       PHA
       RTS
   (OJO!->Si se usa esta técnica, el byte MOVLO tiene que contener el LOWByte de la rutina de
    movimiento - 1, ya que el RTS transfiere al Program counter lo que hay en el stack y le SUMA 1.
    CONSEJO->Si las subrutinas de movimiento están en la misma página de memoria, todas tienen el
    mismo HIGH byte y te ahorras meterlo en una tabla....será una CONSTANTE)
       
4-El movimiento tiene 1 byte, por lo que se pueden almacenar dos dígitos: en el LowNibble(bits 0 a 3)
   pongo el movimiento 1 y en el HighNibble (bits 4 a 7) pongo el movimiento dos. Esto me permite hacer
   diagonales. P.ej: un 2 es derecha, un 13 arriba-izquierda
5-Las animaciones sólo hacen caso al LowNibble del movimiento, ya que no he hecho animaciones para las
   diagonales ;)....por eso, el movimiento diagonal tiene como animación arriba o abajo
6-Con esta organización, los parámetros de entrada de cada subrutina pueden ser: registro X->Dirección
   de movimiento, Registro Y->nº de sprite... registro A->queda libre y puedo usarlo como parámetro tb.
« última modificación: Marzo 30, 2022, 14:45:27 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Mini proyecto escuela
« Respuesta #22 en: Marzo 30, 2022, 12:44:26 »
Esta es la estructura principal del programa,que estará hecho de manera íntegra en ensamblador:

    Variables/Arrays:[$801-?)
    Charset gráfico: [$4000-$4800)
    Video RAM: [$4800-$4CC0)
    Personajes/animaciones:[$4CC0-?)
    Programa principal/Subrutinas:[$C000-?)


Me parece una gran iniciativa, a ver si se engancha más gente a programar en ensamblador. Sobre esto, un par de consejos que he aprendido en el tiempo que llevo dándole a esto:
- Entre $0000-$0801, quitando el espacio de la pila, hay cerca de 1,5KB de RAM que puedes usar para variables.
- Si usas el VBANK $C000-$FFFF que hay bajo el Kernal ROM te quedará más memoria para código, sprites, gráficos, etc. Tendrás que cambiar un poco las interrupciones para que no vayan por ROM (muy fácil), pero quitando eso, ganarás unos 8KB de memoria.

Imagino que ya conocerás esto, es el mapa de memoria del C64, lo uso habitualmente para saber dónde están algunas cosas en memoria y qué huecos puedo usar: http://sta.c64.org/cbm64mem.html
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #23 en: Marzo 30, 2022, 13:59:01 »
- Entre $0000-$0801, quitando el espacio de la pila, hay cerca de 1,5KB de RAM que puedes usar para variables.
Reconozco que la página cero y sucesivas no las tengo muy estudiadas para este proyecto porque tengo intención de que no sea muy largo....lo justo para llegar como mucho al multiplexing. Me metí en las $0800 porque tengo claro que el basic no lo voy a usar, con lo cual acabaré deshabilitando la ROM.
Esas 1,5KB de RAM están muy fragmentadas o hay bloques decentes?

- Si usas el VBANK $C000-$FFFF que hay bajo el Kernal ROM te quedará más memoria para código, sprites, gráficos, etc. Tendrás que cambiar un poco las interrupciones para que no vayan por ROM (muy fácil), pero quitando eso, ganarás unos 8KB de memoria.
Si, lo del overlapping, rom switching, etc....lo controlo. Y no es muy complicado hacerlo. En un proyecto más largo o con multiples pantallas/enemigos, tenía intención de usarlo como "almacén gráfico" sobre todo

Imagino que ya conocerás esto, es el mapa de memoria del C64, lo uso habitualmente para saber dónde están algunas cosas en memoria y qué huecos puedo usar: http://sta.c64.org/cbm64mem.html
Si tengo varios tipos de mapas (como todos imagino ;D). Desde el más detallado (Libro "Mapping the Commodore 64") hasta el clásico por bloques (libro "Commodore 64 Programmer's Reference Guide)
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13628
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Mini proyecto escuela
« Respuesta #24 en: Marzo 30, 2022, 14:10:16 »
El resto se moverán por una rutina de seguir al sprite 0 (la
   intención es poder asignar a cada personaje una rutina que pueda ser distinta y así tener varios
   comportamientos de enemigos).

Por si te sirve, mira como hace en el Pacman para controlar los fantasmas, es ESPECTACULAR y muy inspirador lo que hicieron.

https://www.youtube.com/watch?v=0OUfyzcrCio
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #25 en: Marzo 30, 2022, 14:27:01 »
Por si te sirve, mira como hace en el Pacman para controlar los fantasmas, es ESPECTACULAR y muy inspirador lo que hicieron.

Gracias josepzin! Al meterme en harina con esto de hacer un minijuego fue en el juego que pensé sobre el comportamiento (variable y cada enemigo con un comportamiento bastante definido)....esto es una información de mucho valor!
« última modificación: Marzo 30, 2022, 14:28:34 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #26 en: Marzo 30, 2022, 14:45:13 »
...
6-Con esta organización, los parámetros de entrada de cada subrutina pueden ser: registro X->Dirección
   de movimiento, Registro Y->nº de sprite... registro A->queda libre y puedo usarlo como parámetro tb.

7-Me queda por implementar lo que pasa al pulsar el botón de disparo del joystick....no sé si ponerme
   rácano con la memoria y usar el bit de signo de la variable movimiento (bit 7, que está libre), usar un
   byte en el que cada bit sea el sprite que ha dado al disparo (esto no valdría con multiplexing) o crear
   un nuevo campo en la tabla que sea FIRE....no sé qué pensáis.Creo que la del signo es la que más me
   gusta
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 361
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Mini proyecto escuela
« Respuesta #27 en: Marzo 30, 2022, 17:24:15 »
Reconozco que la página cero y sucesivas no las tengo muy estudiadas para este proyecto porque tengo intención de que no sea muy largo....lo justo para llegar como mucho al multiplexing. Me metí en las $0800 porque tengo claro que el basic no lo voy a usar, con lo cual acabaré deshabilitando la ROM.
Esas 1,5KB de RAM están muy fragmentadas o hay bloques decentes?
Tienes un bloque bien majo de 1KB en $0400-$0800, que es la screen ram por defecto. Luego quitando la pila de $0100-$01FF, entre $0200 y $03FF hay otro bloque de 512KB que no debería darte problemas. Aparte de la Zeropage para hacer lda ($fb) y cosas de esas ;)

Si, lo del overlapping, rom switching, etc....lo controlo. Y no es muy complicado hacerlo. En un proyecto más largo o con multiples pantallas/enemigos, tenía intención de usarlo como "almacén gráfico" sobre todo
Para eso mismo uso yo el hueco bajo la ROM, como Video Bank para poner bitmaps y otros elementos gráficos. Así tienes casi todos esos 64KB de RAM disponibles para ti.

Los vídeos que has publicado pintan muy bien y vas muy rápido, qué envidia XDDDD
Commodoriano desde mis tiernos 7 añitos. ¿Quién necesita más de 1MHz, 64KB de RAM, 16 colores y 3 canales de sonido?

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #28 en: Marzo 30, 2022, 18:29:49 »
Tienes un bloque bien majo de 1KB en $0400-$0800, que es la screen ram por defecto. Luego quitando la pila de $0100-$01FF, entre $0200 y $03FF hay otro bloque de 512KB que no debería darte problemas. Aparte de la Zeropage para hacer lda ($fb) y cosas de esas ;)

Gracias por la info!

Los vídeos que has publicado pintan muy bien y vas muy rápido, qué envidia XDDDD
:D ;D ;D....no voy muy rápido.He subido el curro de 1 mes/mes y medio y esto es lo más sencillo....ahora que empieza la fiesta con las collision boxes y Multiplexing el ritmo bajará considerablemente ;D ;D ;D

La idea es aprender y sacar una rutinas guapas y flexibles para reutilizar
« última modificación: Marzo 30, 2022, 18:38:05 por SingletonJohn »
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #29 en: Marzo 31, 2022, 06:27:17 »
Por si te sirve, mira como hace en el Pacman para controlar los fantasmas, es ESPECTACULAR y muy inspirador lo que hicieron.

Increíble.....gracias por compartir el vídeo! ;)
"Ya al final de mi vida de pecador, mientras espero el momento de perderme en el abismo..." pues me lío y me pongo a hacer lo que no pude de pequeño! ;)