User Tag List

Página 9 de 9 PrimerPrimer ... 56789
Resultados 121 al 124 de 124

Tema: Adaptando juegos de MS-DOS a MegaDrive

  1. #121

    Fecha de ingreso
    Jun 2004
    Mensajes
    12,148
    Mencionado
    41 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    668
    Agradecer Thanks Received 
    665
    Thanked in
    Agradecido 437 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    17
    Por cierto, lo quise poner antes para Archer y al final se me fue la pinza.
    Asi mueves el scroll pixel a pixel.
    Código:
    #include <genesis.h>
    int i;
    int s32 coordY = 5;
    int s32 coordX = 5;
    int numtile = 1;
    int ciclo = 0;
    const u32 tile[8]=
    {
                    0x00111100, // Línea 1: pixels 1 a 8
                    0x01144110, // Línea 2
                    0x11244211, // Línea 3
                    0x11244211, // Línea 4
                    0x11222211, // Línea 5
                    0x11222211, // Línea 6
                    0x01122110, // Línea 7
                    0x00111100  // Línea 8: píxels 57 a 64
    };
    const u32 tile2[8]=
    {
                    0x00111100,  // Línea 8: píxels 57 a 64
                    0x01122110, // Línea 7
                    0x11222211, // Línea 6
                    0x11222211, // Línea 5
                    0x11244211, // Línea 4
                    0x11244211, // Línea 3
                    0x01144110, // Línea 2
                    0x00111100 // Línea 1: pixels 1 a 8
    };
    
    
    int main( )
    {
        VDP_setScrollingMode (HSCROLL_PLANE, VSCROLL_PLANE); // le decimos que tipo de scroll queremos, tile a tile, linea a linea...
        VDP_loadTileData( (const u32 *)tile, 1, 1, 0);
        VDP_loadTileData( (const u32 *)tile2, 2, 1, 0);
        VDP_setBackgroundColor(0);
        while(1)
            {
            VDP_setBackgroundColor(ciclo);
            VDP_setHorizontalScroll(VDP_PLAN_A,ciclo); //movemos el mapa x puntos a la derecha, voy a usar la variable ciclo mismamente
            //VDP_setVerticalScroll(VDP_PLAN_A,i%=-50); //por si quieres moverlo tambien en vertical
            i--;
            if (ciclo>63)
                ciclo=0;
    
            ciclo++;
            while (coordY<10)
                {
                while (coordX<10)
                    {
                    switch (numtile) //para pintar los dos tiles alternativamente
                        {
                        case 1:
                            VDP_setTileMapXY(VDP_PLAN_A, 1, coordX, coordY);
                            numtile = 2;
                        break;
                        case 2:
                            VDP_setTileMapXY(VDP_PLAN_A, 2, coordX, coordY);
                            numtile = 1;
                        break;
                        }
                    coordX++;
                    VDP_drawText("El texto tambien forma", 2, 1);
                    VDP_drawText("parte del mapa de tiles.", 2, 2);
                    }
                coordY++;
                coordX = 5;
                }
                coordX=5;
                coordY=5;
                VDP_waitVSync();
            }
        return (0);
    }
    -----Actualizado-----

    Evidentemente este codigo es lento porque genera el mapa de tiles para cada frame, que es una animalada, sobre todo teniendo en cuenta que en el caso de un juego, el fondo es fijo, generas el mapa de tiles una sola vez y te olvidas a no ser que necesites cambiar algo de el de manera dinamica.
    Última edición por K-teto; 29/04/2014 a las 20:22 Razón: añadidos comentarios al codigo.

  2. #122

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,580
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,678
    Agradecer Thanks Received 
    1,933
    Thanked in
    Agradecido 1,295 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por K-teto Ver mensaje
    Tambien he pensado que vale, la megadrive no pinta pixels sueltos, sino tiles, pero no seria muy complicado hacer un algoritmo para pintar pixels en un mapa de tiles a partir de un framebuffer virtual.
    O sea, tener un array de 320x224, pintar ahi como si fuera un framebuffer lineal y luego volcarlo al mapa de tiles que se ve en pantalla.
    Se supone que así hacen los juegos vectoriales en la MD, menos el VR que lo hacia con un chip pero mas o menos el chip hacia eso.

    Cita Iniciado por mills332 Ver mensaje
    No te vuelvas muy loco, el SGDK, ya incorpora un bufer de esos para pintar BMP, pero a la mitad de resolución. Yo estoy intentando hacer un rotozoom, pero no consigo pintar en si... Copié un código de rotozoom, la verdad es que lo hace, porque se ve lento, pero no "pinta" ni actualiza la pantalla.

    Para usar el modo BMP hay un monton de info en el doc, pero vamos, que yo no se hacerlo funcionar.

    Por si alguien lo intenta, este código funciona en el emulador al menos, pero no actualiza la pantalla:

    Código:
     
    
    #include "genesis.h"
    #include "BKG.h"
    
    int XX = 0;
    int x = 0;
    int y = 0;
    int u = 0;
    int v = 0;
    int W = 0;
    
    u16 color = 0x0000;
    
    int main(){
     
     BMP_init(1, 0, 1);
     VDP_drawBitmap(VDP_PLAN_A,&bkg,0,0);
     
     while (1){
     
        if (W == 1024) W = 0; //el ángulo en no se que unidades
        
        //copiar y pegar pixeles de imagen, resolución de 160x128, El modo BMP de dibujo de imágenes, usa pixeles de 2x2
        for(y=0;y<=224;y+=2){
           for(x=0;x<=320;x+=2)
           {
            u = fix16Int(x*cosFix16(W)+y*(-sinFix16(W)));
            v = fix16Int(x*sinFix16(W)+y*cosFix16(W));
            color = BMP_GETPIXEL(x,y);                              //Copia pixel
            BMP_SETPIXEL(u,v,color);                                //pega pixel
            }
        }
        
        W++;
    
    
            BMP_clear(); //no hace nada..     
        BMP_flip(1); //no hace nada...
    
            BMP_showFPS(1); Hay que hacerlo con menor resolución, yo he conseguido 3 FPS saltando pixeles de 4 en 4
    
        VDP_waitVSync();
        
     }
       
    }
    No he probado el código pero mirándolo parece que falta por volcar el BMP a la memoria de los tiles, mira en el API a ver si tiene una función que haga algo asi.
    No es lo mismo tener diez años de experiencia, que tener un año de experiencia diez veces.


    It is an undisputed truth that the Atari ST gets the best out of coders. No dedicated hardware, just the CPU and a frame buffer! Some call it Spartan, others name it Power Without The Price, and a select few say `challenge accepted'! --- by spkr from smfx

  3. #123

    Fecha de ingreso
    Oct 2012
    Mensajes
    218
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    4
    Agradecer Thanks Received 
    131
    Thanked in
    Agradecido 41 veces en [ARG:2 UNDEFINED] posts
    Me vais a ayudar más vosotros, yo soy muy novato, ya está abierto el hilo de programación. Deberíamos usarlo para ir pegando estos códigos.

    Ya he pegado el rotozoom, voy a pegar otro que hice gracias a stef, el creador de sgdk.

    Este hilo lo usaré para los juegos, Hay un error en los que hice, no funcionan en una MD real, puede que sea problema del SGDK en una función de los sprites.

  4. #124

    Fecha de ingreso
    Dec 2003
    Ubicación
    Tarragona
    Mensajes
    1,510
    Mencionado
    44 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    0
    Agradecer Thanks Received 
    33
    Thanked in
    Agradecido 12 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por K-teto Ver mensaje
    Por cierto, lo quise poner antes para Archer y al final se me fue la pinza.
    Asi mueves el scroll pixel a pixel.
    Código:
    #include <genesis.h>
    int i;
    int s32 coordY = 5;
    int s32 coordX = 5;
    int numtile = 1;
    int ciclo = 0;
    const u32 tile[8]=
    {
                    0x00111100, // Línea 1: pixels 1 a 8
                    0x01144110, // Línea 2
                    0x11244211, // Línea 3
                    0x11244211, // Línea 4
                    0x11222211, // Línea 5
                    0x11222211, // Línea 6
                    0x01122110, // Línea 7
                    0x00111100  // Línea 8: píxels 57 a 64
    };
    const u32 tile2[8]=
    {
                    0x00111100,  // Línea 8: píxels 57 a 64
                    0x01122110, // Línea 7
                    0x11222211, // Línea 6
                    0x11222211, // Línea 5
                    0x11244211, // Línea 4
                    0x11244211, // Línea 3
                    0x01144110, // Línea 2
                    0x00111100 // Línea 1: pixels 1 a 8
    };
    
    
    int main( )
    {
        VDP_setScrollingMode (HSCROLL_PLANE, VSCROLL_PLANE); // le decimos que tipo de scroll queremos, tile a tile, linea a linea...
        VDP_loadTileData( (const u32 *)tile, 1, 1, 0);
        VDP_loadTileData( (const u32 *)tile2, 2, 1, 0);
        VDP_setBackgroundColor(0);
        while(1)
            {
            VDP_setBackgroundColor(ciclo);
            VDP_setHorizontalScroll(VDP_PLAN_A,ciclo); //movemos el mapa x puntos a la derecha, voy a usar la variable ciclo mismamente
            //VDP_setVerticalScroll(VDP_PLAN_A,i%=-50); //por si quieres moverlo tambien en vertical
            i--;
            if (ciclo>63)
                ciclo=0;
    
            ciclo++;
            while (coordY<10)
                {
                while (coordX<10)
                    {
                    switch (numtile) //para pintar los dos tiles alternativamente
                        {
                        case 1:
                            VDP_setTileMapXY(VDP_PLAN_A, 1, coordX, coordY);
                            numtile = 2;
                        break;
                        case 2:
                            VDP_setTileMapXY(VDP_PLAN_A, 2, coordX, coordY);
                            numtile = 1;
                        break;
                        }
                    coordX++;
                    VDP_drawText("El texto tambien forma", 2, 1);
                    VDP_drawText("parte del mapa de tiles.", 2, 2);
                    }
                coordY++;
                coordX = 5;
                }
                coordX=5;
                coordY=5;
                VDP_waitVSync();
            }
        return (0);
    }
    -----Actualizado-----

    Evidentemente este codigo es lento porque genera el mapa de tiles para cada frame, que es una animalada, sobre todo teniendo en cuenta que en el caso de un juego, el fondo es fijo, generas el mapa de tiles una sola vez y te olvidas a no ser que necesites cambiar algo de el de manera dinamica.
    Gracias k-teto en cuanto tenga un rato pruebo el codigo y lo trasteo jeje
    Que no se vea no significa que no exista!

Página 9 de 9 PrimerPrimer ... 56789

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •