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!