Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - SingletonJohn

Páginas: 1 2 [3] 4 5
31
Desarrollo / Re:Mini proyecto escuela
« en: Abril 03, 2022, 13:40:31 »
Ayer por fin tuve algo de tiempo e hice pruebas de colisiones
Conseguí abrir la pantalla como fichero lógico con CHKIN y OPEN,y obtener un char de pantalla usando PLOT y CHRIN.
Como obtener las líneas/columnas ocupadas por el collider es una operación "barata",creo que voy a usar este sistema y dejar al Kernal que haga el trabajo sucio.Este es el esquema del proceso de detectar colisiones.

1-Abrir el fichero lógico de la pantalla al iniciarse un escen de "acción".Habrá que cerrarlo y abrir el del teclado cuando te maten
2-Al hacer un Spawn de jugador/enemigo se asignará la posición del collider.Esto nos evitará calcularla,aunque habrá que crear una nueva tabla con las posiciones de los colliders.
3-Dentro de las rutinas de movimiento,al inicio de todas,crearemos una subrutina de colisión que responda con Carry Set si hay colisión o Carry Clear si no hay.Si hay colisión,no se realizará el movimiento.
4-La subrutina de colisión hará lo siguiente:
 4.1-Se moverá el collider en la dirección del movimiento.Se guarda la posición antes del movimiento ya que si hay colisión,el collider volverá a su posicion
 4.2-Obtener la línea y columna en la VRAM de la esquina superior izquierda del collider.
 4.3-Segun el movimiento,se calculará la línea/columna final que tenemos que comprobar.Por ejemplo, si el movimiento es hhacia arriba,tenemos que rastrear la fila de la posición del collider entre la columna del vértice superior izquierdo hasta la del vértice superior derecho.Esto se obtiene sumando a la X del collider la anchura del collider (que es una CONSTANTE que depende de cada personaje,al igual que los offsets del vértice superior izquierdo del collider)
 4.4-Mediante un PLOT que parte de la línea y columna del vértice superior izquierdo y un CHRIN,haremos un bucle incrementando la línea/columna en 1 hasta llegar la límite fijado por la anchura/altura del collider.P.ej. si nos movemos hacia arriba,haremos el bucle desde la línea/columna del vértice superior izquierdo del collider hasta la columna del vértice superior derecho,barriendo todas las columnas intermedias.
 4.5-En caso de colisión contra un CHAR pared,se sale del bucle,se hace un SEC y se sale de la rutina de colisión.NO OLVIDAR asignar al collider su posición inicial....más adelante,haré que se rastreen todas las posiciones,ya que molaría poner "obstáculos mortales" y cosas así...
 4.6-Si no hay colisión,se deja el collider en la posición y se sale de la rutina con CLC.

Este proceso se lleva a cabo dentro de la ejecución normal del programa, ya que es caro para hacerlo en la interrupción.En la interrupción,la animación direccional funcionará pero el movimiento se restringirá por las paredes (es un efecto buscado....me gusta que el personaje resbale andando hacia la pared)
Además, lo que me gusta es que el collider(que es invisible) se mueve primero para chequear si la posición está libre,por lo que no se verían rebotes del Sprite. Lo "malo" es que los chars de  las paredes van a tener que ocupar como mínimo un espacio de 8*8 para evitar colisiones contra el aire....

Que os parece? Se admiten sugerencias!

32
Desarrollo / Re:Mini proyecto escuela
« 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! ;)

33
Desarrollo / Re:Mini proyecto escuela
« 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

34
Desarrollo / Re:Mini proyecto escuela
« 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

35
Desarrollo / Re:Mini proyecto escuela
« 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!

36
Desarrollo / Re:Mini proyecto escuela
« 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)

37
Desarrollo / Re:Mini proyecto escuela
« 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.

38
Desarrollo / Re:Mini proyecto escuela
« 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

39
Desarrollo / Re:Mini proyecto escuela
« 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


40
Desarrollo / Re:Mini proyecto escuela
« 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

41
Desarrollo / Re:Mini proyecto escuela
« 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

42
Desarrollo / Re:Mini proyecto escuela
« en: Marzo 30, 2022, 09:34:27 »
Ahora programando las colisiones contra el fondo con collision boxes

43
Desarrollo / Re:Mini proyecto escuela
« en: Marzo 30, 2022, 09:33:39 »
https://youtu.be/gXZ5EYpOUc8?mute=1

Pintando una pantalla simple

44
Desarrollo / Re:Mini proyecto escuela
« en: Marzo 30, 2022, 09:32:59 »
https://youtu.be/D7C9lunQzX4?mute=1

Añadiendo un enemigo perseguidor

45
Desarrollo / Re:Mini proyecto escuela
« en: Marzo 30, 2022, 09:32:13 »
https://youtu.be/gNfL9_NS1ds?mute=1

Controlando el personaje con el joystick

Páginas: 1 2 [3] 4 5