Control de usuario
Patrocinadores
Estadísticas
Miembros:
334.664
Online:
571
Hilos:
1.380.682
Mensajes:
24.885.334
Stats

Índice de foros Otras Consolas Consolas clásicas

Tutorial programacion NES - Basico

Para recordar esos momentos tan buenos que nos han hecho pasar...

Moderador: sd-snatcher

Diskover
Avatar de usuario
Y que viva la NES, coño
 
Mensajes: 7195
Registrado: 25 Jul 2003
Ubicación: Planeta Tierra

Mensajepor Diskover 22 Nov 2011 22:22

Me tome la libertad mientras me escribías y se me ocurrió hacerlo de esta manera. Ademas, como juego con hasta tres metaSprites a la vez y uno de ellos con 8 pixels por debajo del principal, he tenido que inventarme dos clases para cada coordenada, x1, x2, y1 e y2. Todo lo demás es copiar y pegar.

Funciona bien, pero cuando va ha hacer la animación de Link, se queda como cortada. Antes, sin hacer esto, la animación se realizaba correctamente.

¿por que puede ser debido?

Te pego el código:

Código: Seleccionar todo
vid_waitFadeToNormal_a()
-------------------------- de aquí para arriba, todo igual.

   //Coordenadas iniciales. Las damos un valor.
   lda #150
   sta linkDir_x1

   lda #130
   sta linkDir_y1

   lda #150
   sta linkDir_x2

   lda #138
   sta linkDir_y2   

   //Bucle principal, se ejecutara siempre
   forever {
      //Metasprite de Link
      putMetaSprite(linkDir_x1, linkDir_y1, #2, #1, #SPR_ATTR.PALETTE_0, #0) //0
      putMetaSprite(linkDir_x2, linkDir_y2, #2, #2, #SPR_ATTR.PALETTE_0, #2) //1
      putMetaSprite(linkDir_x1, linkDir_y1, #2, #2, #SPR_ATTR.PALETTE_1, #10) //2
      doFrame()
   }
}

inline doFrame() {
   //Leemos el joypad 1
   inp_update(#PORT_1)
   
   ldand( pads[CONTROLLER.PLAYER1].mantained, #BUTTON.DOWN)
   if(true) {

      lda frames
      cmp #12

      if(greater) {
         lda metaSprites[1].firstTile
         switch(reg.a) {
            case #2 {
               lda #$6
            }
            case #$6 {
               lda #$9         
               lda #2
            }
         
         }
         sta metaSprites[1].firstTile
   
         lda #0
         sta frames
      }

      inc metaSprites[0].y //Incrementamos el valor de metaSprite 0 en y
      lda metaSprites[0].y //Cargamos ese valor en a
      sta linkDir_y1   //Introducimos el valor de a en la coordenada y1
      
      inc metaSprites[1].y //Incrementamos el valor de metaSprite 1 en y
      lda metaSprites[1].y //Cargamos ese valor en a
      sta linkDir_y2

      inc metaSprites[2].y //Incrementamos el valor de metaSprite 2 en y
      lda metaSprites[2].y //Cargamos ese valor en a
      sta linkDir_y1 //Introducimos el valor de a en la coordenada y1
   }
   
   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.UP)
   if(true) {

      lda frames
      cmp #12

      if(greater) {
         lda metaSprites[1].firstTile
         switch(reg.a) {
            case #2 {
               lda #$6
            }
            case #$6 {
               lda #$9         
               lda #2
            }
         
         }
         sta metaSprites[1].firstTile
   
         lda #0
         sta frames
      }

      
      dec metaSprites[0].y //Decrecentamos el valor de metaSprite 0 en y
      lda metaSprites[0].y //Cargamos ese valor en a
      sta linkDir_y1   //Introducimos el valor de a en la coordenada y1
      
      dec metaSprites[1].y //Decrecentamos el valor de metaSprite 1 en y
      lda metaSprites[1].y //Cargamos ese valor en a
      sta linkDir_y2

      dec metaSprites[2].y //Decrecentamos el valor de metaSprite 2 en y
      lda metaSprites[2].y //Cargamos ese valor en a
      sta linkDir_y1 //Introducimos el valor de a en la coordenada y1
   }
   
   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.LEFT)
   if(true) {

      lda frames
      cmp #12
      if(greater) {
         lda metaSprites[1].firstTile
         switch(reg.a) {
            case #2 {
               lda #$6
            }
            case #$6 {
               lda #$9         
               lda #2
            }
         
         }
         sta metaSprites[1].firstTile
   
         lda #0
         sta frames
      }
      
      dec metaSprites[0].x //Decrecentamos el valor de metaSprite 0 en x
      lda metaSprites[0].x //Cargamos ese valor en a
      sta linkDir_x1   //Introducimos el valor de a en la coordenada x1
      
      dec metaSprites[1].x //Decrecentamos el valor de metaSprite 1 en x
      lda metaSprites[1].x //Cargamos ese valor en a
      sta linkDir_x2

      dec metaSprites[2].x //Decrecentamos el valor de metaSprite 2 en x
      lda metaSprites[2].x //Cargamos ese valor en a
      sta linkDir_x1 //Introducimos el valor de a en la coordenada x1
   }   
   
   ldand(pads[CONTROLLER.PLAYER1].mantained, #BUTTON.RIGHT)
   if(true) {

      lda frames
      cmp #12
      if(greater) {
         lda metaSprites[1].firstTile
         switch(reg.a) {
            case #2 {
               lda #$6
            }
            case #$6 {
               lda #$9         
               lda #2
            }
         
         }
         sta metaSprites[1].firstTile
   
         lda #0
         sta frames
      }

      inc metaSprites[0].x //Incrementamos el valor de metaSprite 0 en x
      lda metaSprites[0].x //Cargamos ese valor en a
      sta linkDir_x1   //Introducimos el valor de a en la coordenada x1
      
      inc metaSprites[1].x //Incrementamos el valor de metaSprite 1 en x
      lda metaSprites[1].x //Cargamos ese valor en a
      sta linkDir_x2

      inc metaSprites[2].x //Incrementamos el valor de metaSprite 2 en x
      lda metaSprites[2].x //Cargamos ese valor en a
      sta linkDir_x1 //Introducimos el valor de a en la coordenada x1
   }   
   ----------------------- a partir de aquí para abajo, todo igual
   inc frames   
Imagen

Imagen

wave
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 516
Registrado: 18 Abr 2004

Mensajepor wave 22 Nov 2011 23:18

Al llamar a la funcion putMetaSprite estas indicandole de nuevo el tile, machacando el que has cambiado mas abajo.

Diskover
Avatar de usuario
Y que viva la NES, coño
 
Mensajes: 7195
Registrado: 25 Jul 2003
Ubicación: Planeta Tierra

Mensajepor Diskover 23 Nov 2011 13:01

Ok, ya he conseguido hacer que cuando Link vaya a la derecha o a la izquierda, cambie el metasprite, etc...

Resulta que he ahora estoy animando el andar a la derecha e izquierda y llega un momento que sin venir a cuento, el compilador casca en cuanto meto el ultimo case de una de las animaciones. Error de fuera de rango o algo así. Si meto un case mas, casca.

Código: Seleccionar todo
d:\Users\Diskover\Desktop\nesframework\projects\zeldaSprites>..\..\bin\neshla ".
\src\project.as" -o ".\out" -listvars -listfuncs -listbanks -listsrc

Nintendo NES High Level Assembler
Version 1.0.0, April 12th, 2005
By Brian Provinciano :: http://www.bripro.com

Compiling file: .\src\project.as ...
[Error]: Within "doFrame": (118),
        main.as (106: 3): Branch out of range!The time was: 0.093000


[Fatal Error]: Compile: FAILED!

d:\Users\Diskover\Desktop\nesframework\projects\zeldaSprites>pause
Presione una tecla para continuar . . .


¿Puede ser que me haya pasado del límite de calculo o algo así? Por que la verdad que es bastante complejo, son 3 frames diferentes, y cada uno esta compuesto de 2 metasprites para el tema de los colores :-)

P.D.: Tengo la cabeza que me echa humo entre lo de ayer y hoy, jajaja [+risas]
Imagen

Imagen

wave
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 516
Registrado: 18 Abr 2004

Mensajepor wave 23 Nov 2011 13:07

Diskover escribió:Ok, ya he conseguido hacer que cuando Link vaya a la derecha o a la izquierda, cambie el metasprite, etc...

Resulta que he ahora estoy animando el andar a la derecha e izquierda y llega un momento que sin venir a cuento, el compilador casca en cuanto meto el ultimo case de una de las animaciones. Error de fuera de rango o algo así. Si meto un case mas, casca.

¿Puede ser que me haya pasado del límite de calculo o algo así? Por que la verdad que es bastante complejo, son 3 frames diferentes, y cada uno esta compuesto de 2 metasprites para el tema de los colores :-)

P.D.: Tengo la cabeza que me echa humo entre lo de ayer y hoy, jajaja [+risas]

Dentro de un switch o de un if no puede haber mas de 128 posiciones, cada instruccion ocupa unas 3-4.
Pero yo que tu me iria mirando de hacer otras pruebas o iria preparando los graficos que quieras poner porque todo esto sera "automatico" con el sistema de objetos, no habra que colocar los metasprites a mano ni nada.

Diskover
Avatar de usuario
Y que viva la NES, coño
 
Mensajes: 7195
Registrado: 25 Jul 2003
Ubicación: Planeta Tierra

Mensajepor Diskover 23 Nov 2011 22:33

Bueno, debido al poco éxito que vemos cosechar en este tutorial continuaremos el hilo en RetroNES.

Nos vemos a los interesados.
Imagen

Imagen

puch666
Avatar de usuario
idle
 
Mensajes: 1723
Registrado: 10 Nov 2005

Mensajepor puch666 23 Nov 2011 23:31

¡Nooooooooooooo!

A mi si me interesa. Pero ahora mismo no ando con tiempo como para meterme en algo así.
De todas maneras leo el hilo a diario y me parece muy interesante todo. No escribí ésto antes para no ensuciar el hilo.

Bueno, tampoco es gran cosa si llevan el hilo en otra parte, sólo que no lo leeré a diario.

Diskover
Avatar de usuario
Y que viva la NES, coño
 
Mensajes: 7195
Registrado: 25 Jul 2003
Ubicación: Planeta Tierra

Mensajepor Diskover 23 Nov 2011 23:45

Mmm, si tal, ya sabes en donde encontrarnos.

Acabo de crear el hilo nuevo [360º]
Imagen

Imagen

pocket_lucho
Avatar de usuario
MegaAdicto!!!
 
Mensajes: 1203
Registrado: 04 Ene 2004

Mensajepor pocket_lucho 05 Feb 2012 22:45

¿por que no probar con c y luego meterse con el ensamblador?

http://shiru.untergrund.net/articles/pr ... s_in_c.htm
Imagen

Previo

Volver a Consolas clásicas

¿Quién está conectado?

Usuarios navegando por este foro: No hay usuarios registrados visitando el foro y 1 invitado