• Estuve mirando y no funciona, el problema parece ser que no apagas los sprites al principio del programa, ni haces bump(1) ni bump(2) para borrar los registros de colision.
    Pero... probe eso y tampoco funciona  :o
    Voy a hojear alguna K64 que tenga un juego de c128 a ver como hace...
     

  • El problema puede venir de dos lados:
    D01f queda <> 0, entonces no se produce mas la interrupcion, que se produce cuando pasa de 0 a otro valor

    O no se esta limpiando el flag de interrupcion (53273 o D019)
    [edit]
    D019h - VIC Interrupt Flag Register  Bit  Name  Expl.
     7    IRQ   Set on Any Enabled VIC IRQ Condition       (0=None, 1=IRQ)
     4-6  -     Not used
     3    ILP   Lightpen Triggered IRQ Flag                (0=None, 1=IRQ)
     2    IMMC  Sprite to Sprite Collision IRQ Flag        (0=None, 1=IRQ)
     1    IMBC  Sprite to Background Collision IRQ Flag    (0=None, 1=IRQ)
     0    IRST  Raster Compare IRQ Flag                    (0=None, 1=IRQ)

    Reading returns the (latched) interrupt flags. Writing "1" into Bit(s) 0-3 acknowledges (clears) the respective interrupt flag(s).
    [/edit]
    Al parecer escribiendo 2 en 53273, limpia el IRQ de colision con el fondo.
    Quiero creer que la instruccion COLLISION hace este trabajo sola, porque de hecho activa la IRQ

    [edit]
    D01Ah - Interrupt Enable Register  Bit  Name  Expl.
     4-7  -     Not used
     3    ELP   Lightpen Triggered              (0=Disable, 1=Enable)
     2    EMMC  Sprite to Sprite Collision      (0=Disable, 1=Enable)
     1    EMBC  Sprite to Background Collision  (0=Disable, 1=Enable)
     0    ERST  Raster Compare                  (0=Disable, 1=Enable)
    [/edit]

    Pero a mi me suena que es D01F, que la lees con BUMP(2):
    [edit]
    D01E - Sprite to Sprite Collision Detect (Read Only)
    When non-transparent pixels of two (or more) sprites overlap each other, collision bits for each of these sprites will be set.  Bit  Name  Expl.
     0-7  M#M   Sprite 0-7 Collision Flag  (0=Normal, 1=Collision)

    Collisions are detected even if sprites are located offscreen.
    The IMMC IRQ Bit becomes set when this register changes from 00h to a non-zero value.
    This register is automatically cleared after reading.

    D01F - Sprite to Background Collision Detect
    When non-transparent pixels of any sprites overlap non-transparent background pixels, collision bits for any such sprites will be set.
    "For special applications, the display data from the 0-1 multicolor bit pair also does not cause a collision. This feature permits their use as background display data without interfering with true MOB collisions." ???  Bit  Name  Expl.
     0-7  M#D   Sprite 0-7 Collision Flag  (0=Normal, 1=Collision)

    Offscreen collisions may occur in 38 column mode if overlapping the two horizontally offscreen hidden columns.
    The IMBC IRQ Bit becomes set when this register changes from 00h to a non-zero value.
    This register is automatically cleared after reading.
    [/edit]
    en la documentacion figura DO1E como solo lectura, pero D01F no, pero igual dice que leyendola se limpia, que es lo que queremos, pero me suena que tambien es de solo lectura.

    Yo modificaria el programa para que apague los sprites, y recien ahi, haga un, ponele, A=BUMP(2) y despues el COLLISION
    En mi epoca de hacer jueguitos, evitaba usar esto de la colision porque no lo entendia, justamente la forma de borrar la colision, no sabia que se borraba leyendola, que no era instantanea. Una vez, pensando que era un error de la Commodore, que debia andar mal, la deje de usar como por una semana ver si se arreglaba sola, muy cientifico  :)

          Saludos
         MARCOS
     

  • Antes que nada, gracias por coparse y darme una mano con esto !!!

    Probe todo esto pero no pasa naranja, apago los sprites y nada, borre pantalla con GRAPHIC CLR, tire los pokes pero como me anticipaste no pasa nada. Es intrigante, ahora me voy a ir a dormir, pero mañana voy a ver si pruebo otra cosa, por que es desconcertante esto.

    La teoria del flag de interrupcion seria piola, el tema es que yo le doy 50 posibilidades de colision antes de reiniciar el juego, o sea que hasta que no salgo de eso no falla, capaz que si armo el programa de otra manera puede llegar a zafar.
     

  • Estuve mirando el codigo más detenidamente, y estas terminando mal el juego; COLLISION salta tipo GOSUB, y vos le estas mandando un GOTO5 en lugar de un RETURN. Tenes que agregar una variable que te indique si el juego terminó, y si es así, hacer el GOTO5 desde el bucle principal del juego.
     

  • Bueno, sigo para el traste con esto, me está desesperanzando. Tire gotos por todos lados, volvi al medio de la rutina para probar, no entiendo cual es el drama, realmente no lo entiendo.
     

  • Bueno, sigo para el traste con esto, me está desesperanzando. Tire gotos por todos lados, volvi al medio de la rutina para probar, no entiendo cual es el drama, realmente no lo entiendo.

    Yo lo mire muy por encima el listado (es dificil listar con el comando list y el break, perdi la costumbre), por eso tengo algunas dudas:

    1ro: El error se produce solo si el juego termino con colision, o si terminaste en cualquier punto sin colision tambien al principio vuelve a fallar?
    2do: Proba, cuando haya una colision, imprimir ? BUMP(2) 2 veces seguidas, si las dos veces es 0, es que el basic ya limpio el VIC, si la primera es distitnas de 0 y la segunda es 0, quiere decir que la limpiaste vos con el primer BUMP, y que tenes que hacerlo siempre, si las dos son distintas de 0, es que la condicion de colision sigue existiendo, apaga los sprites, sino va a seguir, y si la primera es 0, y la segunda no, tira la C128 que anda para la #%^@$@#$

    3ro:En el prorgrama, antes de hacer COLLISION(2), imprimi BUMP(2), si es 0 esta OK, si no, no te va a andar la interrupcion.

    Tal vez el problema no tenga nada que ver con el VIC, pero si no probamos....

          Saludos
         MARCOS
     

  • El problema es el GOTO5 en lugar de RETURN, el manual dice que solo salta a la linea de COLLISION de a una colisión por vez, no hay concurrencia ni recursión, por eso al hacer GOTO en vez de RETURN, el BASIC todavia piensa que esta dentro de la primera colisión que detecto y no le da bola a las siguientes.
     

  • El problema es el GOTO5 en lugar de RETURN, el manual dice que solo salta a la linea de COLLISION de a una colisión por vez, no hay concurrencia ni recursión, por eso al hacer GOTO en vez de RETURN, el BASIC todavia piensa que esta dentro de la primera colisión que detecto y no le da bola a las siguientes.

    Yo pruebo lo que me decis, pero no pasa nada, ademas al principio del programa pongo la colision en 0, haciendo COLLISION 1 y COLLISION 2. Ese no me parece que sea el problema, ya que la colision funciona, cada vez que colisiono cuenta, no puede ser (creo) que el BASIC piense que esta dentro de la primera, si ya pasaron 50 colisiones, no se si me explico ? El juego termina cuando chocas 50 veces o cuando te la pegas contra otro sprite, en este caso al final del laberinto. Ganando, o perdiendo, el problema persiste.

    Ahora voy a fijarme los tips que me paso marcos, a ver si doy en el clavo.
     

  • Si serás porfiado!  ;D

    Ya lo arregle como decia yo:


    30 C=50:GS=0
    ...
    5010 COLLISION1,35000

    10100 ON GS GOTO30000,40000
    10101 GOTO10000:REM LOOP MUEVE

    ...

    20000 IFC=0THENRETURN
    20001 SOUND1,4096,10
    ...
    20050 IFC=0THENGS=1
    20100 RETURN

    ...
    35000 GS=2:RETURN

    creo que fueron todas la lineas que modifiqué

    GS es 0 mientras estas jugando, 1 cuando perdes y 2 cuendo ganas.
     

  • jajaj! para que me fijo, que estuve haciendo unas cosas y tenes razon que por ahi viene el drama, mi nivel de programacion no da para que lo corrija rapidamente, voy a probar eso que escribiste.

    EDITO: le mande lo que pusiste pero algo falta, me pasas el d64 y me fijo, por que ahora no se mueve nada jajajajaja
     

Moderador (s): thierry, homecomputer, Selandari, pastbytes, Durandal