Tutorial de programacion para NES - Básico

Foro sobre la N.E.S. Aqui esta el verdadero mejunje donde podreis conversar.

Responder
Avatar de Usuario
Diskover
##El Jefe##
Mensajes: 488
Registrado: Lun, 27 Oct 2003, 20:59
Ubicación: Planeta Tierra
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Diskover » Jue, 24 Nov 2011, 14:29

Ok, pues cuando puedas a ver si sabes decirme que es lo que le pasa ;-)
No dejes de visitar www.RetroNES.net la mejor pagina sobre la NES 8 bits de Nintendo, ¡Y en español!

Avatar de Usuario
sewave
Nintender@
Mensajes: 100
Registrado: Dom, 15 May 2005, 22:28
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por sewave » Jue, 24 Nov 2011, 16:11

Código: Seleccionar todo

clc
      sbc vel_pos

Antes del sbc hay que poner sec y no clc igual por eso te iban raro las valocidades.

Avatar de Usuario
Diskover
##El Jefe##
Mensajes: 488
Registrado: Lun, 27 Oct 2003, 20:59
Ubicación: Planeta Tierra
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Diskover » Jue, 24 Nov 2011, 19:39

Arreglado. Ahora ya va bien para todas las direcciones.

Seguimos con el tema:

- Mario ahora se agacha. Lo hace correctamente, manteniendo el botón DOWN pulsado. El tema es que si pulsas RIGHT o LEFT, debido a la orden released que tienen, durante una fracción de segundo Mario se levanta y vuelve ha agacharse ¿hay alguna forma de decirle que desactive RIGHT y LEFT cuando esta DOWN pulsado?

Código: Seleccionar todo

   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.DOWN)   
   if(true){
      lda #224
      sta metaSprites[0].firstTile
      lda #232
      sta metaSprites[1].firstTile
      lda #0
      sta vel_pos
   }

   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.RIGHT)
   if(true) {

      inc frames
   
      Mario()

      lda #SPR_ATTR.H_FLIP ^ 0xFF
      and metaSprites[0].attributes
      sta metaSprites[0].attributes
      lda metaSprites[0].x
      clc
      adc vel_pos
      sta metaSprites[0].x
      
      lda #SPR_ATTR.H_FLIP ^ 0xFF
      and metaSprites[1].attributes
      sta metaSprites[1].attributes
      lda metaSprites[1].x
      clc
      adc vel_pos
      sta metaSprites[1].x   
   }

   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.LEFT)
   if(true) {

      inc frames
   
      Mario()
      
      lda metaSprites[0].attributes
      ora #SPR_ATTR.H_FLIP
      sta metaSprites[0].attributes
      lda metaSprites[0].x
      sec
      sbc vel_pos
      sta metaSprites[0].x
      
      lda metaSprites[1].attributes
      ora #SPR_ATTR.H_FLIP
      sta metaSprites[1].attributes
      lda metaSprites[1].x
      sec
      sbc vel_pos
      sta metaSprites[1].x      
   }

   ldand(pads[CONTROLLER.PLAYER1].released, #BUTTON.DOWN)
   if(true) {
      lda #0
      sta metaSprites[0].firstTile
      lda #8
      sta metaSprites[1].firstTile
      lda #2
      sta vel_pos
   }

   ldand(pads[CONTROLLER.PLAYER1].released, #BUTTON.RIGHT)
   if(true) {
      lda #0
      sta metaSprites[0].firstTile
      lda #8
      sta metaSprites[1].firstTile
   }

   ldand(pads[CONTROLLER.PLAYER1].released, #BUTTON.LEFT)
   if(true) {
      lda #0
      sta metaSprites[0].firstTile
      lda #8
      sta metaSprites[1].firstTile
   }



- Me estoy peleando con el contador de tiempo. He declarado un metaSprite de 1x1 colocado justo debajo del gráfico de TIME y mi intención era que pasasen los segundos del 1 al 9 y vuelta a empezar. Realmente es una mamonada, y por ser una mamonada, no consigo que me salga bien. Estoy usando los case, diciéndole que cuando este en el sprite de 1, pase a 2, del 2 al 1, etc... usando los case. Igual que la animación de Mario pero intentando que lo haga el solo, y no hay tu tía. No responde. Se queda en el uno todo el rato.

Código: Seleccionar todo

//Animación tiempo
   inc frames
   lda frames
   cmp #5
   if(greater) {
      lda metaSprites[3].firstTile
      switch(reg.a) {
         case #240 {
            lda #$241
            }
         case #241 {
            lda #$240
            }
      }
   }

   sta metaSprites[3].firstTile


Te dejo la ROM para que veas el progreso: http://www.megaupload.com/?d=D7B1SMP0

EDITO: Lo de tiempo lo probé en el proyecto tuyo del sprite de Mario, sustituyendo el CHR, poniéndole a 1x1 y cambiando los case como te comento y funciona bien, pero en el mio no hay tu tía.

EDITO 2: Déjalo. Lo del tiempo ya está solucionado. Me equivoque al declarar el metaSprite.
No dejes de visitar www.RetroNES.net la mejor pagina sobre la NES 8 bits de Nintendo, ¡Y en español!

Avatar de Usuario
sewave
Nintender@
Mensajes: 100
Registrado: Dom, 15 May 2005, 22:28
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por sewave » Jue, 24 Nov 2011, 20:06

Para lo primero, create una variable que diga si mario esta agachado y si esta agachado no hagas caso de izquierda y derecha.
Para lo segundo:
sta metaSprites[3].firstTile

Deberia estar dentro del if, ademas
#$241

El $ significa que es un numero hexadecimal y estos van de $00 a $FF si quieres poner el numero en decimal (te lo recomiendo) quitale el $ porque ademas ese numero es demasiado grande para 8 bits.

Avatar de Usuario
Diskover
##El Jefe##
Mensajes: 488
Registrado: Lun, 27 Oct 2003, 20:59
Ubicación: Planeta Tierra
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Diskover » Vie, 25 Nov 2011, 16:19

Bueno, bueno, bueno. Mejoras. La función Mario ahora recoge las cuatro direcciones usando case y usando la variable nueva Mario_estado. Si está a 1, Mario se queda quieto, aunque mas adelante lo pasaré a 0 y el 1 lo usare para poner el sprite de Mario mirando hacia arriba. El 2 se mueve hacia la izquierda y el 4 a la derecha. El 3 lo he dejado para agacharse.

Tuve un problema con B, pues seguía funcionando si Mario estaba agachado, así que también me hice una variable que miraba si B estaba activado o desactivado. Por defecto está activado. Se desactivaba cuando Mario está agachado, pulsando hacia abajo, y se vuelve a activar cuando se deja de pulsar hacia abajo.

Me fue imposible implementar el código lda #SPR_ATTR.H_FLIP ^ 0xFF y ora #SPR_ATTR.H_FLIP (con los parámetros que lo hacen funcionar) en los cases correspondientes (2 y 4) por que me daba fallo de rango a tener demasiadas instrucciones a la vez (si los hacia funcionar para los dos metasprites de Mario, mal, pero si lo ponía solo con uno, por probar, iba bien) ¿?. Así que los he dejado en land de LEFT y RIGHT por que ahí si que no me daba problema. Si sabes decirme como arreglar esto, aunque si lo dejo así, no pasa nada.

Por todo lo demas, Mario se mueve y controla bien. Mmmm, lo de hacerle saltar me parecería una proeza XD XD XD

Imagen Imagen

ROM: http://www.megaupload.com/?d=UZYBW2AF

CODIGO de Mario:

Código: Seleccionar todo

function Mario() {
   lda mario_estado
   switch(reg.a) {
      case #1 {
         lda #0
         sta metaSprites[0].firstTile
         lda #8
         sta metaSprites[1].firstTile
      }

      case #2 {         
         lda metaSprites[0].x
         clc
         adc vel_pos
         sta metaSprites[0].x         
         sta metaSprites[1].x

         //Animacion andando de mario      
         lda frames
         cmp vel_anima
         if(greater) {
            lda metaSprites[0].firstTile
            switch(reg.a) {
               case #0 {
                  lda #$7
                  lda #16
               }
               case #16 {
                  lda #$23
                  lda #32
               }
               case #32 {
                  lda #$39
                  lda #0
               }         
            }
            sta metaSprites[0].firstTile      
            lda #0
            sta frames
   
            lda metaSprites[1].firstTile
            switch(reg.a) {
               case #8 {
                  lda #$15
                  lda #24
               }
               case #24 {
                  lda #$31
                  lda #40
               }
               case #40 {
                  lda #$47
                  lda #8
               }
            }
            sta metaSprites[1].firstTile      
            lda #0
            sta frames
         }         
      }

      case #3 {
         lda #224
         sta metaSprites[0].firstTile
         lda #232
         sta metaSprites[1].firstTile
         lda #0
         sta vel_pos
         lda #0
         sta B_activado
      }

      case #4 {      
         lda metaSprites[0].x
         sec
         sbc vel_pos
         sta metaSprites[0].x         
         sta metaSprites[1].x

         //Animacion andando de mario      
         lda frames
         cmp vel_anima
         if(greater) {
            lda metaSprites[0].firstTile
            switch(reg.a) {
               case #0 {
                  lda #$7
                  lda #16
               }
               case #16 {
                  lda #$23
                  lda #32
               }
               case #32 {
                  lda #$39
                  lda #0
               }         
            }
            sta metaSprites[0].firstTile      
            lda #0
            sta frames
   
            lda metaSprites[1].firstTile
            switch(reg.a) {
               case #8 {
                  lda #$15
                  lda #24
               }
               case #24 {
                  lda #$31
                  lda #40
               }
               case #40 {
                  lda #$47
                  lda #8
               }
            }
            sta metaSprites[1].firstTile      
            lda #0
            sta frames
         }         
      }
   }
}


Problemas:
Conseguí hacer funcionar el tiempo, pero de una manera muy, muy tosca. Ademas, solo funcionaba cuando no manejaba a Mario. Si manejo a Mario se para el tiempo ¿donde debería de colocar la función tiempo para que no me diese ese problema?

CODIGO del Tiempo:

Código: Seleccionar todo

function tiempo() {
      //Animacion andando de tiempo
      lda frames
      cmp #60
      if(greater) {
         lda metaSprites[2].firstTile
         switch(reg.a) {
            case #240 {
               lda #241
            }
            case #241 {
               lda #242
            }
            case #242 {
               lda #243
            }
            case #243 {
               lda #244
            }
            case #244 {
               lda #245
            }
            case #245 {
               lda #246
            }
            case #246 {
               lda #247
            }
            case #247 {
               lda #248
            }
            case #248 {
               lda #249
            }
            case #249 {
               lda #240
            }
         }
         sta metaSprites[2].firstTile
      
         lda #0
         sta frames
      }
   }
No dejes de visitar www.RetroNES.net la mejor pagina sobre la NES 8 bits de Nintendo, ¡Y en español!

Avatar de Usuario
sewave
Nintender@
Mensajes: 100
Registrado: Dom, 15 May 2005, 22:28
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por sewave » Vie, 25 Nov 2011, 16:45

Lo que necesitas es otra variable que no sea frames para controlar el estado del tiempo.
En cuanto a lo del salto, en la mayoria de juegos lo que se hace es asignar una velocidad de subida que se va decrementando cada frame hasta que se hace negativa y te acaba por llevar al suelo.

Avatar de Usuario
Diskover
##El Jefe##
Mensajes: 488
Registrado: Lun, 27 Oct 2003, 20:59
Ubicación: Planeta Tierra
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Diskover » Vie, 25 Nov 2011, 17:03

Bufff, la verdad que a veces me siento como un tonto. Pensaba que frames era algo cogido del propio NESHLA y que controlaba el tiempo :-(

He creado una variable llamada time2 (time no me dejaba) y la función tiempo esta basada en esta variable time2 y ahora funciona bien.

Gracias :-)
No dejes de visitar www.RetroNES.net la mejor pagina sobre la NES 8 bits de Nintendo, ¡Y en español!

Avatar de Usuario
Diskover
##El Jefe##
Mensajes: 488
Registrado: Lun, 27 Oct 2003, 20:59
Ubicación: Planeta Tierra
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Diskover » Vie, 25 Nov 2011, 17:05

A todo esto, estaba leyendo esto sobre lo del salto. Esta pensado para un programa en flash. Realmente el resultado queda muy bien y estaba pensando si sería posible implementarlo en esta demo de NES para utilizar con Mario

http://www.redribera.es/formacion/tutor ... 909-10.xml

¿que opinas? ¿o me estoy metiendo en un berenjenal? Al menos los conceptos a tener en cuenta no están mal ¿no?
No dejes de visitar www.RetroNES.net la mejor pagina sobre la NES 8 bits de Nintendo, ¡Y en español!

Avatar de Usuario
sewave
Nintender@
Mensajes: 100
Registrado: Dom, 15 May 2005, 22:28
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por sewave » Vie, 25 Nov 2011, 17:07

Diskover escribió:A todo esto, estaba leyendo esto sobre lo del salto. Esta pensado para un programa en flash. Realmente el resultado queda muy bien y estaba pensando si sería posible implementarlo en esta demo de NES para utilizar con Mario

http://www.redribera.es/formacion/tutor ... 909-10.xml

¿que opinas? ¿o me estoy metiendo en un berenjenal? Al menos los conceptos a tener en cuenta no están mal ¿no?

Pues esta bastante bien, por ahi anda la idea.

Avatar de Usuario
Loquo
Peach Star
Mensajes: 2717
Registrado: Mar, 23 Ago 2005, 21:11
Ubicación: Oddworld
Contactar:

Re: Tutorial de programacion para NES - Básico

Mensaje por Loquo » Vie, 25 Nov 2011, 23:53

La verdad es que no tengo ni papa de programación pero está genial y aprendiendo cosillas y viendo las demos. Seguid!
VIVA LA NES

Responder