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

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13628
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Mini proyecto escuela
« Respuesta #30 en: Marzo 31, 2022, 13:51:59 »
Es increible todo lo que hay detras de la lógica de esos fantasmitas, que parece una tontería pero no por nada el juego es lo que es.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #31 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!
« última modificación: Abril 03, 2022, 14:38:18 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 #32 en: Abril 03, 2022, 20:51:06 »
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.
...

Pues no te sé decir, la verdad, ya que hasta ahora siempre he usado la detección de colisión por hardware entre sprites (para sprites-chars aún no lo he necesitado). Cuando hablas de CHKIN, PLOT, CHRIN y OPEN ¿te refieres a funciones del kernal ROM?
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 #33 en: Abril 03, 2022, 21:22:23 »
Pues no te sé decir, la verdad, ya que hasta ahora siempre he usado la detección de colisión por hardware entre sprites (para sprites-chars aún no lo he necesitado). Cuando hablas de CHKIN, PLOT, CHRIN y OPEN ¿te refieres a funciones del kernal ROM?

Si, son las funciones del Kernal.

No te hace falta ver colisiones contra fondo? Y como haces paredes,suelos,platformas,etc?
"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 #34 en: Abril 03, 2022, 22:59:09 »
Si, son las funciones del Kernal.

No te hace falta ver colisiones contra fondo? Y como haces paredes,suelos,platformas,etc?

Para lo que estoy haciendo ahora (https://www.pacoblog64.com/2020/05/desarrollo-de-street-fighter-2-champion.html) no lo necesito, los luchadores no interactúan con el escenario, sólo entre ellos. Actualmente leo el valor de $d01e y de ahí saco las colisiones entre los 4 sprites de un luchador y los 4 del otro.
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 #35 en: Abril 04, 2022, 00:25:15 »
Yeah! Vaya pintaza!Nada menos que el Street Fighter. 2....

Yo por ahora no aspiro a tanto.

Ya....entiendo que no necesitas interacción con fondo porque es de visión lateral y solo hay un suelo....te haría falta interacción con fondo si hubiera plataformas a las que subir y si no recuerdo mal el SF2 no las tenía.
Pero si las hubiera,entiendo que no te quedaría otra que comprobar el fondo....o hay otra manera y me estoy complicando la vida?

Saludos
"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 #36 en: Abril 04, 2022, 01:18:12 »
@darro99 seguro que puede responder.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #37 en: Abril 04, 2022, 02:33:47 »
https://youtu.be/UbsD0pWY6L8

Implementados los colliders y funcionan....a medias
Despues de volverme loco todo el día intentando leer los caracteres de la pantalla tratada como un fichero lógico me di cuenta de que si hago esto,tengo que poner la dirección de memoria $288 (high byte de la VRAM) en $48, ya que aunque cambies la ubicación en el VIC,esto no cambia y al abrir el fichero de la pantalla lo que estaba haciendo era leerme l pantalla en $0400

Por lo demás va bien,salvo que el muro de la derecha lo atraviesas....creo que es porque en vez de detectar el char de la pared,CHRIN me está devolviendo un retorno de carro ;D....algo así debe estar pasando porque miro la memoria en $4800 y está l pared con el CHAR correcto.No le veo otra explicación,aunque soy todavía un novato en esto y lo más seguro es que se me esté pasando algo más ...
Me refuerzo en esta teoría por otro detalle....si pongo al macaco en la esquina inferior derecha,la pantalla hace un scroll extraño.Creo que al tratar la pantalla como un fichero lógico,sigue avanzando aunque no hay nada más.
En fin,que parece que ni Dios me libra de hacer la rutina de conversión de filas/columnas  a direcciones de memoria de la VRAM
« última modificación: Abril 04, 2022, 12:50:59 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 #38 en: Abril 04, 2022, 02:35:24 »
@darro99 seguro que puede responder.
Gracias josepzin! Le preguntaré a @darro99
« última modificación: Abril 04, 2022, 02:54: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 #39 en: Abril 04, 2022, 12:53:12 »
Cita de: SingletonJohn
En fin,que parece que ni Dios me libra de hacer la rutina de conversión de filas/columnas  a direcciones de memoria de la VRAM

Bueno....puede ser despiste de la modificación tras copiar-pegar....a ver si tengo tiempo y lo reviso!

Diossss!Que vicio le estoy pillando al ensamblador! ;D ;)
"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 #40 en: Abril 04, 2022, 14:28:59 »
https://youtu.be/UbsD0pWY6L8

Va mejorando esto eh!

El otro que toca estos temas es @Dozznar pero ahora está subido al carro de la fama asi que no creo que responda.
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #41 en: Abril 04, 2022, 15:16:41 »
Va mejorando esto eh!

El otro que toca estos temas es @Dozznar pero ahora está subido al carro de la fama asi que no creo que responda.

 ;D ;D ;D Gracias de nuevo @josepzin!
"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! ;)

Dozznar

  • Commodoremaníaco
  • ****
  • Mensajes: 143
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #42 en: Abril 04, 2022, 15:22:12 »
...Teniendo en cuenta que aquí se está hablando de ensamblador igual el que tengo que aprender  algo soy yo  :P

Para el sprite sprite por Software encontré algo aquí que me sirvió

https://codebase64.org/doku.php?id=base:simple_software_sprite_to_sprite_collision

Es sencilla pero efectiva siempre que los dos sprites sean de tamaño igual o similar.

Aquí tengo mi traducción a "C"
S0X,S0Y son las coordenadas del prota.
S1X,S1Y Las del sinver.

Asignando valores a CX1,CX2,CY1,CY2.  Como se ve en el ejemplo, ajustamos el tamaño del cuadrado imaginario dentro del sprite donde queramos que haya "HIT"
La sencilla comparación de la última línea hace el trabajo

void __fastcall__ CheckSprColl(void){

   CX1=S0X-8;
   CX2=S0X+8;
   CY1=S0Y-8;
   CY2=S0Y+8;
   if (S1X>CX1&&S1X<CX2&&S1Y>CY1&&S1Y<CY2) HIT();
}
« última modificación: Abril 04, 2022, 15:42:54 por Dozznar »

Dozznar

  • Commodoremaníaco
  • ****
  • Mensajes: 143
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #43 en: Abril 04, 2022, 15:31:14 »
Para el tema Sprite con el fondo, la cosilla la tengo más elaborada....

-Hay que hacer como se comenta por aquí una traducción entre las coordenadas de sprite y las de Caracteres.
-Como era una operación relativamente compleja y multiplicada por cuatro (cuatro puntos de colisión) por cada ciclo de gameloop tengo un par de truquillos.
   
      1-Precalculo y almaceno los valores de la conversión en dos vectores. Uno para X y otro para Y de manera que luego se pueda hacer una simple suma para la conversión
                       Sprite.CharPos=(P0Y[E0.Y])+P0X[E0.X];
     2.-Y en vez de hacer 4 cálculos con 8 tablas (4 para x y 4 para Y) Avanzo o retrocedo uno o dos caracteres (Dependiendo del tamaño del sprite) en la memoria de pantalla para calcular los 4 puntos de colisión
  Sprite.P0=*((unsigned char*)ADDR_MATERIAL_RAM+Sprite.CharPos);
  Sprite.P1=*((unsigned char*)ADDR_MATERIAL_RAM+Sprite.CharPos+1);
  Sprite.P2=*((unsigned char*)ADDR_MATERIAL_RAM+Sprite.CharPos-40);
  Sprite.P3=*((unsigned char*)ADDR_MATERIAL_RAM+Sprite.CharPos-39);

Esto tiene una pequeña pega y es que el diseño del sprite no puede ser de cualquier manera. Cuanto mas se ajuste el tamaño a múltiplos de 8, más precisa será la colisión.

Ufff. vaya mierda de explicación... Cualquier cosa me decís e intento aclararlo con más ejemplos

Tened en cuenta que tengo que recurrir a estos trucos por la lentitud de "C". Quizás en ensamblador no hace falta tanto lío.

     



« última modificación: Abril 04, 2022, 15:48:16 por Dozznar »

Dozznar

  • Commodoremaníaco
  • ****
  • Mensajes: 143
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #44 en: Abril 04, 2022, 15:45:44 »
A ver si tengo calma para leerme el hilo completo y ver tranquilo los videos (He visto el último un poco a la carrera pero pinta muy bien)
Encantado de ayudar y aprender. A ver si puedo dar el gran salto algún día (a assembler claro)

Salu2