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

PacoBlog64

  • Commodore Master
  • *****
  • Mensajes: 320
  • INC $D020
    • Ver Perfil
    • PacoBlog64
Re:Mini proyecto escuela
« Respuesta #45 en: Abril 04, 2022, 16:26:31 »
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?

No, en el SF2 como mucho se podía romper alguna caja o algún letrero al caer tras un golpe y poco más, pero yo no lo he implementado. Si tuviese elementos en el fondo tampoco podría tirar de colisiones sprite-char por hardware porque el fondo está hecho en modo bitmap, tendría que comprobarlo con una solución similar a la tuya. Es lo que dices, en juegos de otro tipo (plataformas, shooters) es lo habitual.
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 #46 en: Abril 04, 2022, 16:54:11 »
-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);


Yo uso otro "truquillo"....no me hace falta ver si hay algún CHAR bajo la totalidad del collider, sólo lo que entra por cada cara del collider en la dirección del avance.
Es decir, si el collider es rectangular, sólo necesito saber lo que entra por el lado derecho cuando voy a la derecha, el de abajo cuando voy hacia abajo, etc....
Como esto no es una operación demasiado pesada, me guardo sólo las coordenadas de la esquina superior izquierda del collider y aplicando la anchura y la altura, no es complicado hacer la conversión para dos vértices.
Además de los dos vértices a calcular, sólo necesito tres datos (ya que al ser el collider rectangular comparten una coordenada).Calculando la fila/columna común y restando la fila/columna distinta, ya tengo unas coordenadas de INICIO de la VRAM a rastrear y luego voy en un loop en saltos de 8 (tantos saltos como el resultado de la resta de fila/columna distinta)...
...jajajajaa!!! Esto es más difícil de explicar que de ver
"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 #47 en: Abril 04, 2022, 17:00:33 »
Estas son las rutinas de conversión que utilizo:
1-De (x,y) a (columna,fila) en la VRAM->
         Fila         = 3 LSR(Y-$32)
         Columna = 3 LSR(X-$18)
2-De (columna,fila) a dirección de memoria en VRAM
         DIR MEM = VRAM BASE + 3ASL (Fila) + 5 ASL (Fila) + Columna

Si pasara directamente de (x,y) a DIR MEM VRAM, la operación es muy sencilla ya que hay que hacer (y-$32) y quitarle los bits 0,1,2 y sumarlo a eso rotado dos veces a la izquierda y luego sumarle la columna ( 3 LSR(x-$18))....la verdad es que las matemáticas binarias me molan un montón!
« última modificación: Abril 04, 2022, 17:05:58 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! ;)

Dozznar

  • Commodorista
  • ***
  • Mensajes: 52
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #48 en: Abril 04, 2022, 17:05:49 »
Yo uso otro "truquillo"....no me hace falta ver si hay algún CHAR bajo la totalidad del collider, sólo lo que entra por cada cara del collider en la dirección del avance.
Es decir, si el collider es rectangular, sólo necesito saber lo que entra por el lado derecho cuando voy a la derecha, el de abajo cuando voy hacia abajo, etc....
Como esto no es una operación demasiado pesada, me guardo sólo las coordenadas de la esquina superior izquierda del collider y aplicando la anchura y la altura, no es complicado hacer la conversión para dos vértices.
Además de los dos vértices a calcular, sólo necesito tres datos (ya que al ser el collider rectangular comparten una coordenada).Calculando la fila/columna común y restando la fila/columna distinta, ya tengo unas coordenadas de INICIO de la VRAM a rastrear y luego voy en un loop en saltos de 8 (tantos saltos como el resultado de la resta de fila/columna distinta)...
...jajajajaa!!! Esto es más difícil de explicar que de ver

mmmm. Muy interesante. Me lo apunto para probar. Parece más óptimo que lo que yo hago. Ya te contaré  ;)

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #49 en: Abril 04, 2022, 17:07:36 »
mmmm. Muy interesante. Me lo apunto para probar. Parece más óptimo que lo que yo hago. Ya te contaré  ;)
Sólo hay que tener en cuanta una cosa.....que los sprites no sean muy rápidos, ya que podrías atravesar alguna pared)....en mi caso de miniproyecto todos los avances son pixel a pixel, por lo que está el control asegurado
"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

  • Commodorista
  • ***
  • Mensajes: 52
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #50 en: Abril 04, 2022, 17:08:11 »
Estas son las rutinas de conversión que utilizo:
1-De (x,y) a (columna,fila) en la VRAM->
         Fila         = 3 LSR(Y-$32)
         Columna = 3 LSR(X-$18)
2-De (columna,fila) a dirección de memoria en VRAM
         DIR MEM = VRAM BASE + 3ASL (Fila) + 5 ASL (Fila) + Columna

Si pasara directamente de (x,y) a DIR MEM VRAM, la operación es muy sencilla ya que hay que hacer (y-$32) y quitarle los bits 0,1,2 y sumarlo a eso rotado dos veces a la izquierda y luego sumarle la columna ( 3 LSR(x-$18))....la verdad es que las matemáticas binarias me molan un montón!

Y ésto también tiene buena pinta. Lo estudio.

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #51 en: Abril 04, 2022, 17:12:25 »
Cuando revise bien mis rutinas y las simplifique un poco y las ordene, a ver si cuelgo los SEQ files.....por ahora me da un poco de verguenza enseñar el caos organizado que tengo montado  ;D ;D ;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! ;)

darro99

  • Desarrolladores
  • Commodorista
  • ******
  • Mensajes: 56
  • PRESS PLAY ON TAPE
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #52 en: Abril 04, 2022, 18:36:50 »
Hola a todos.

Citar
Gracias josepzin! Le preguntaré a @darro99

Escribo lo que yo hago para obtener los caracteres que tengo a derecha e izquierda del personaje y así saber en que plataforma/suelo/lugar de la pantallas te encuentras.

- Primeramente tengo dos direcciones en la pagina cero que contienen las coordenadas x e y del personaje. Estas 'variables' con fáciles de calcular al principio de la generación del nivel pues sabes de antemano donde vas a colocar al personaje.
Esta nomenclatura es de Kickass, es como una estructura de datos que puedes encontrar en cualquier lenguaje como C por ejemplo:
Código: [Seleccionar]
namespace vars_player{
.label pant_y = $46 //Coordenada y del juagador en la pantalla de caracteres
.label pant_x = $47 //Coordenada y del juagador en la pantalla de caracteres
}
Aquí solo se declara estos nombres asignados a las paginas cero $46 y $47.

- También debemos declarar un puntero a la pantalla para una vez obtenida la dirección de la misma poder recoger su valor.
Código: [Seleccionar]
namespace paint{
.label dir_pant = $48 //Esta dirección realmente son dos, $48 y $49 pues es un puntero, y necesitamos dos bytes.
}

- Por último también definimos un lista con las direcciones altas y bajas de cada una de la lineas de la pantalla.
Código: [Seleccionar]
tabla_screen_lo:
  .byte [ SCREEN_CHAR +   0 ] & $00ff
  .byte [ SCREEN_CHAR +  40 ] & $00ff
  .byte [ SCREEN_CHAR +  80 ] & $00ff
  .byte [ SCREEN_CHAR + 120 ] & $00ff
  .byte [ SCREEN_CHAR + 160 ] & $00ff
  .byte [ SCREEN_CHAR + 200 ] & $00ff
  .byte [ SCREEN_CHAR + 240 ] & $00ff
  .byte [ SCREEN_CHAR + 280 ] & $00ff
  .byte [ SCREEN_CHAR + 320 ] & $00ff
  .byte [ SCREEN_CHAR + 360 ] & $00ff
  .byte [ SCREEN_CHAR + 400 ] & $00ff
  .byte [ SCREEN_CHAR + 440 ] & $00ff
  .byte [ SCREEN_CHAR + 480 ] & $00ff
  .byte [ SCREEN_CHAR + 520 ] & $00ff
  .byte [ SCREEN_CHAR + 560 ] & $00ff
  .byte [ SCREEN_CHAR + 600 ] & $00ff
  .byte [ SCREEN_CHAR + 640 ] & $00ff
  .byte [ SCREEN_CHAR + 680 ] & $00ff
  .byte [ SCREEN_CHAR + 720 ] & $00ff
  .byte [ SCREEN_CHAR + 760 ] & $00ff
  .byte [ SCREEN_CHAR + 800 ] & $00ff
  .byte [ SCREEN_CHAR + 840 ] & $00ff
  .byte [ SCREEN_CHAR + 880 ] & $00ff
  .byte [ SCREEN_CHAR + 920 ] & $00ff
  .byte [ SCREEN_CHAR + 960 ] & $00ff
tabla_screen_hi: 
  .byte [ [ SCREEN_CHAR +   0 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR +  40 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR +  80 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 120 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 160 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 200 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 240 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 280 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 320 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 360 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 400 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 440 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 480 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 520 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 560 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 600 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 640 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 680 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 720 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 760 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 800 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 840 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 880 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 920 ] & $ff00 ] >> 8
  .byte [ [ SCREEN_CHAR + 960 ] & $ff00 ] >> 8
Donde SCREEN_CHAR es una constate que contiene el inicio de la pantalla. En mi caso es la dirección $4400

Función que recoge el carácter a la derecha del jugador:
Código: [Seleccionar]
getCaracterDer:
ldy vars_player.pant_y
lda tabla_screen_lo,y
sta paint.dir_pant
lda tabla_screen_hi,y
sta paint.dir_pant + 1

ldy vars_player.pant_x
iny
lda (paint.dir_pant),y

Lo que se hace es cargar el puntero dir_pant con las coordenadas prefijadas del personajes gracias a la tabla de direcciones. Una vez cargado el puntero con la linea correspondiente que nos marca pant_y podemos recoger el desplazamiento sobre esta dirección con pant_x con el direccionamiento indirecto.
Al final de la función obtenemos en el acumulador el carácter que marcaban las coordenadas pant_y/pant_x.

Espero que esto sirva de algo.
Salu2!

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #53 en: Abril 04, 2022, 20:03:06 »
Espero que esto sirva de algo.
Salu2!

Gracias @darro99!

Toda ayuda es poca
"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 #54 en: Abril 04, 2022, 20:06:33 »
Estas son las rutinas de conversión que utilizo:
1-De (x,y) a (columna,fila) en la VRAM->
         Fila         = 3 LSR(Y-$32)
         Columna = 3 LSR(X-$18)
2-De (columna,fila) a dirección de memoria en VRAM
         DIR MEM = VRAM BASE + 3ASL (Fila) + 5 ASL (Fila) + Columna
Ahora viene lo bueno!

DIR MEM = VRAM BASE  + 3ASL(3LSR(Y-$32)) + 5ASL(3LSR(Y-$32)) + 3 LSR(X-$18) =
              = VRAM BASE  + [(Y-$32) AND $F8] + 2ASL[(Y-$32) AND $F8] + 3 LSR(X-$18)

La operación queda bastante simple...dos restas y tres rotaciones
 Sólo  hay que tener en cuenta las limitaciones a meter (por ejemplo, si queréis tener el Sprite siempre totalmente visible....o si queréis que atraviese los borde tipo Pacman, etc)
 Lo que está claro con esta fórmula es que
          Y>= $32
          X>= $18,
ya que una X = $17 está en el borde izquierdo de la pantalla...esto no es muy complicado comprobando BCS tras las restas
« última modificación: Abril 04, 2022, 20:18: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 #55 en: Abril 12, 2022, 00:53:12 »
https://youtu.be/UfkPOYDMRdQ

Ya he conseguido hacer que las colisiones con fondo funcionen bien!
Desistí de la técnica de leer en el fichero lógico de la pantalla y ahora todo va ok después de unos cambios!  ;D

Ahora,antes de meterme en el siguiente fregao voy a ordenar y simplificar todo un poco....creo que si guardo las coordenadas de la esquina superior izquierda e inferior derecha del collider box (y varío las coordenadas con las rutinas de movimiento) voy a ganar bastante espacio y velocidad.

« última modificación: Abril 12, 2022, 01:11:08 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 #56 en: Abril 12, 2022, 01:06:43 »
Creo que después me meteré con temas de raster, que de vez en cuando hay un parpadeo en los sprites.

« última modificación: Abril 12, 2022, 01:11:37 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 #57 en: Abril 12, 2022, 09:01:57 »
Como las Subrutinas de mover colliders y comprobar colisiones son casi idénticas en los desplazamientos verticales y horizontales, igual pruebo a cambiar las instrucciones en que se diferencian desde dentro del propio programa....a ver si con eso ahorro espacio también! ;)
Es decir,según la dirección de avance, el programa modificaría las instrucciones propias del desplazamiento en concreto (pondría etiquetas en ellas para hacer el cambio) y solo tendría una o dos Subrutinas con todo el código en común. Me ahorro dos o tres Subrutinas con cierta extensión!
« última modificación: Abril 12, 2022, 09:07:08 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! ;)

josepzin

  • Administrador
  • Commodore Master
  • *****
  • Mensajes: 13206
  • Commodoreador web
    • Ver Perfil
    • Mi blog
Re:Mini proyecto escuela
« Respuesta #58 en: Abril 13, 2022, 19:34:08 »
Lo del fondo va perfecto, al pixel!

En los lenguajes de alto nivel lo ideal siempre es tener rutinas genéricas, pero ensamblador es hijo de su padre Código Máquina y allí rigen otras reglas, igual yo creo que vas muy bien, asi visto desde afuera :P
www.retroinvaders.com | www.commodoreplus.org  | josepzin.blogspot.com

SingletonJohn

  • Commodorista
  • ***
  • Mensajes: 66
  • Poke 35136,0
    • Ver Perfil
Re:Mini proyecto escuela
« Respuesta #59 en: Abril 13, 2022, 20:07:32 »
Lo del fondo va perfecto, al pixel!

Uso otro "truco"  ;) .... Muevo primero el collider box (antes que el personaje) y si hay colisión, lo devuelvo a su posición inicial y se abandona la rutina del movimiento. No espero a tener una colisión para luego mover personaje y collider a la posición anterior....

Si se chocara contra algo mortal, haría el movimiento como si nada y el personaje moriría en el siguiente frame...esto aún lo estoy dando vueltas
« última modificación: Abril 13, 2022, 20:15:44 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! ;)