Mundo Maker
¡Bienvenid@ a Mundo Maker!

¿Quieres aprender todo sobre el RPG Maker?



Regístrate y forma parte de Mundo Maker.

(Busco Script VX o ACE de Tilemap) - Arreglado -

Ver el tema anterior Ver el tema siguiente Ir abajo

(Busco Script VX o ACE de Tilemap) - Arreglado -

Mensaje por newold el 2018-09-16, 12:32

Bueno al final el script si estaba completo, fue error mío que puse un 2 donde debía poner un 3 xd. ya puedo continuar


Hola a todos. Estoy intentando hacer una herramienta en C# para añadir doodads  los 3 rpg makers (xp, vx, y ace). por ahora estoy diseñando el mapa interactivo pero tengo problemas con el Tilemap que uso para VX/ACE, y es que me parece que está incompleto porque algunas cosas no las dibuja, como muestro en este vídeo:



Este es el TileMap que uso en C# para dibujar el mapa de VX y ACE

Código:
private Bitmap get_tileVX(int id, int frame, Bitmap[] tilesets)
        {
            int[,] autotile_parts = new int[48, 4]
            {
                {18,17,14,13}, { 2,14,17,18}, {13, 3,17,18}, { 2, 3,17,18},
                {13,14,17, 7}, { 2,14,17, 7}, {13, 3,17, 7}, { 2, 3,17, 7},
                {13,14, 6,18}, { 2,14, 6,18}, {13, 3, 6,18}, { 2, 3, 6,18},
                {13,14, 6, 7}, { 2,14, 6, 7}, {13, 3, 6, 7}, { 2, 3, 6, 7},
                {16,17,12,13}, {16, 3,12,13}, {16,17,12, 7}, {12, 3,16, 7},
                {10, 9,14,13}, {10, 9,14, 7}, {10, 9, 6,13}, {10, 9, 6, 7},
                {18,19,14,15}, {18,19, 6,15}, { 2,19,14,15}, { 2,19, 6,15},
                {18,17,22,21}, { 2,17,22,21}, {18, 3,22,21}, { 2, 3,21,22},
                {16,19,12,15}, {10, 9,22,21}, { 8, 9,12,13}, { 8, 9,12, 7},
                {10,11,14,15}, {10,11, 6,15}, {18,19,22,23}, { 2,19,22,23},
                {16,17,20,21}, {16, 3,20,21}, { 8,11,12,15}, { 8, 9,20,21},
                {16,19,20,23}, {10,11,22,23}, { 8,11,20,23}, { 0, 1, 4, 5}
            };

            int[,] waterfall_pieces = new int[3, 4]
            {
                {2, 1, 5, 6}, {0, 1, 4, 5}, {2, 3, 6, 7}
            };

            int[,] wall_pieces = new int[16, 4]
            {
                {10, 9, 6, 5}, { 8, 9, 4, 5}, { 2, 1, 6, 5}, { 0, 1, 4, 5},
                {10,11, 6, 7}, { 8,11, 4, 7}, { 2, 3, 6, 7}, { 0, 3, 4, 7},
                {10, 9,14,13}, { 8, 9,12,13}, { 2, 1,14,13}, { 0, 1,12,13},
                {10,11,14,15}, {10,11, 6, 7}, { 2, 3,14,15}, { 0, 3,12,15}
            };

            Bitmap bmp = new Bitmap(32, 32);
            Graphics g = Graphics.FromImage(bmp);

            Rectangle srcRect, destRect;
            Bitmap tilemap;
            int sx, sy, autotile, auto_id, sub_id;
            int[] rects = null;
            bool need_draw = false;

            destRect = new Rectangle(0, 0, 32, 32);

            sx = sy = 0;

            if (id < 1024) // B-E
            {
                sub_id = id % 256;
                switch (id / 256)
                {
                    case 0: // B
                        tilemap = tilesets[5];
                        break;
                    case 1: // C
                        tilemap = tilesets[6];
                        break;
                    case 2: // D
                        tilemap = tilesets[7];
                        break;
                    default:   // E
                        tilemap = tilesets[8];
                        break;
                }
                if (sub_id < 128)
                {
                    srcRect = new Rectangle((int)(sub_id % 8.0) * 32, (int)(sub_id / 8.0) * 32, 32, 32);
                    g.DrawImage(tilemap, destRect, srcRect, GraphicsUnit.Pixel);
                }
                else
                {
                    sub_id -= 128;
                    srcRect = new Rectangle((int)(sub_id % 8.0) * 32 + 256, (int)(sub_id / 8.0) * 32, 32, 32);
                    g.DrawImage(tilemap, destRect, srcRect, GraphicsUnit.Pixel);
                }

            }
            else if (id < 1664) // A5
            {
                tilemap = tilesets[4];
                sub_id = id - 1536;
                srcRect = new Rectangle((int)(sub_id % 8.0) * 32, (int)(sub_id / 8.0) * 32, 32, 32);
                g.DrawImage(tilemap, destRect, srcRect, GraphicsUnit.Pixel);
            }
            else if (id < 2816) // A1
            {
                sub_id = id - 2048;
                autotile = sub_id / 48;
                auto_id = sub_id % 48;
                tilemap = tilesets[0];
                switch (autotile)
                {
                    case 0: // sea water
                        switch (frame)
                        {
                            case 0: sx = 0; sy = 0; break;
                            case 1: sx = 64; sy = 0; break;
                            default: sx = 128; sy = 0; break;
                        }
                        break;
                    case 1: // sea deep water
                        switch (frame)
                        {
                            case 0: sx = 0; sy = 96; break;
                            case 1: sx = 64; sy = 96; break;
                            default: sx = 128; sy = 96; break;
                        }
                        break;
                    case 2: // sea rocks
                        sx = 192; sy = 0; break;
                    case 3: // ice rocks
                        sx = 192; sy = 96; break;
                    case 4: // shallow water
                        switch (frame)
                        {
                            case 0: sx = 256; sy = 0; break;
                            case 1: sx = 320; sy = 0; break;
                            default: sx = 384; sy = 0; break;
                        }
                        break;
                    case 5: // shallow waterfall
                        switch (frame)
                        {
                            case 0: sx = 448; sy = 0; break;
                            case 1: sx = 448; sy = 32; break;
                            default: sx = 448; sy = 64; break;
                        }
                        break;
                    case 6: // town water
                        switch (frame)
                        {
                            case 0: sx = 256; sy = 96; break;
                            case 1: sx = 320; sy = 96; break;
                            default: sx = 384; sy = 96; break;
                        }
                        break;
                    case 7: // town waterfall
                        switch (frame)
                        {
                            case 0: sx = 448; sy = 96; break;
                            case 1: sx = 448; sy = 128; break;
                            default: sx = 448; sy = 160; break;
                        }
                        break;
                    case 8: // cave water
                        switch (frame)
                        {
                            case 0: sx = 0; sy = 192; break;
                            case 1: sx = 64; sy = 192; break;
                            default: sx = 128; sy = 192; break;
                        }
                        break;
                    case 9: // cave waterfall
                        switch (frame)
                        {
                            case 0: sx = 192; sy = 192; break;
                            case 1: sx = 192; sy = 224; break;
                            default: sx = 192; sy = 256; break;
                        }
                        break;
                    case 10: // temple water
                        switch (frame)
                        {
                            case 0: sx = 0; sy = 288; break;
                            case 1: sx = 64; sy = 288; break;
                            default: sx = 128; sy = 288; break;
                        }
                        break;
                    case 11: // temple waterfall
                        switch (frame)
                        {
                            case 0: sx = 192; sy = 288; break;
                            case 1: sx = 192; sy = 320; break;
                            default: sx = 192; sy = 352; break;
                        }
                        break;
                    case 12: // deep water
                        switch (frame)
                        {
                            case 0: sx = 256; sy = 192; break;
                            case 1: sx = 320; sy = 192; break;
                            default: sx = 384; sy = 192; break;
                        }
                        break;
                    case 13: // deep waterfall
                        switch (frame)
                        {
                            case 0: sx = 448; sy = 192; break;
                            case 1: sx = 448; sy = 224; break;
                            default: sx = 448; sy = 256; break;
                        }
                        break;
                    case 14: // magma water
                        switch (frame)
                        {
                            case 0: sx = 256; sy = 288; break;
                            case 1: sx = 320; sy = 288; break;
                            default: sx = 384; sy = 288; break;
                        }
                        break;
                    default: // magma waterfall
                        switch (frame)
                        {
                            case 0: sx = 448; sy = 288; break;
                            case 1: sx = 448; sy = 320; break;
                            default: sx = 448; sy = 352; break;
                        }
                        break;
                }

                if (is_wall(id))
                    rects = new int[4]
                    {
                        waterfall_pieces[auto_id, 0], waterfall_pieces[auto_id, 1],
                        waterfall_pieces[auto_id, 2], waterfall_pieces[auto_id, 3]
                    };
                else
                    rects = new int[4]
                    {
                        autotile_parts[auto_id, 0], autotile_parts[auto_id, 1],
                        autotile_parts[auto_id, 2], autotile_parts[auto_id, 3]
                    };

                need_draw = true;
            }
            else if(id < 4352) // A2
            {
                sub_id = id - 2816;
                autotile = sub_id / 48;
                auto_id = sub_id % 48;
                tilemap = tilesets[1];
                sx = (autotile % 8) * 64;
                sy = (autotile / 8) * 96;
                rects = new int[4]
                {
                    autotile_parts[auto_id, 0], autotile_parts[auto_id, 1],
                    autotile_parts[auto_id, 2], autotile_parts[auto_id, 3]
                };

                need_draw = true;
            }
            else if (id < 5888) // A3
            {
                sub_id = id - 4352;
                autotile = sub_id / 48;
                auto_id = sub_id % 48;
                tilemap = tilesets[2];
                sx = (autotile % 8) * 64;
                sy = (autotile / 8) * 64;
                rects = new int[4]
                {
                    wall_pieces[auto_id, 0], wall_pieces[auto_id, 1],
                    wall_pieces[auto_id, 2], wall_pieces[auto_id, 3]
                };

                need_draw = true;
            }
            else // A4
            {
                sub_id = id - 5888;
                autotile = sub_id / 48;
                auto_id = sub_id % 48;
                tilemap = tilesets[2];
                sx = (autotile % 8) * 64;

                switch (autotile / 8)
                {
                    case 0: sy = 0; break;
                    case 1: sy = 96; break;
                    case 2: sy = 160; break;
                    case 3: sy = 256; break;
                    case 4: sy = 320; break;
                    default: sy = 416; break;
                }

                if (is_wall(id))
                    rects = new int[4]
                    {
                        wall_pieces[auto_id, 0], wall_pieces[auto_id, 1],
                        wall_pieces[auto_id, 2], wall_pieces[auto_id, 3]
                    };
                else
                    rects = new int[4]
                    {
                        autotile_parts[auto_id, 0], autotile_parts[auto_id, 1],
                        autotile_parts[auto_id, 2], autotile_parts[auto_id, 3]
                    };

                need_draw = true;
            }

            if (need_draw)
            {
                for (int i = 0; i < 4; i++)
                {
                    srcRect = new Rectangle((int)(rects[i] % 4.0) * 16 + sx, (int)(rects[i] / 4.0) * 16 + sy, 16, 16);
                    destRect = new Rectangle((int)(i % 2.0) * 16, (int)(i / 2.0) * 16, 16, 16);
                    g.DrawImage(tilemap, destRect, srcRect, GraphicsUnit.Pixel);
                }
            }

            return bmp;
        }

Por eso pido si sabéis de algún script de tilemap para VX o ACE o completar las condiciones que faltan en mi script para mostrar las piezas del mapa que faltan
avatar
newold
Principiante
Principiante

0/3

Créditos 1253

Gracias : 129

Volver arriba Ir abajo

Re: (Busco Script VX o ACE de Tilemap) - Arreglado -

Mensaje por orochii el 2018-09-16, 17:50

Qué ganas de hacer un Player en C# :'V.

¿Estás usando un binding de Ruby para leer el binario del mapa? ¿O estás usando otro acercamiento? Es algo en que nunca he pensado mucho cómo hacer aparte de meter todo Ruby sólo para leer el archivo xD.

Y está interesante el proyecto.
avatar
orochii
Reportero

0/3

Créditos 7760

Gracias : 456

Volver arriba Ir abajo

Re: (Busco Script VX o ACE de Tilemap) - Arreglado -

Mensaje por newold el 2018-09-16, 18:31

Los datos se pasan tal que así (se pasarán porque ahora mismo lo estoy haciendo manualmente, creando un archivo con rpg maker y copiando su contenido a mi escript c# :))

Por ejemplo en el Maker VX:

Código:
map_id = 36
map = load_data(sprintf("Data/Map%03d.rvdata", map_id))


tileset_names = [ "TileA1",  "TileA2", "TileA3", "TileA4", "TileA5",
                  "TileB",  "TileC",  "TileD",  "TileE"]

events = {}
events[0] = {
    :tile_id => 0,
    :character_name => "",
    :character_index => 0, # 0.7
    :direction => 0,
    :pattern => 0 # 0..2
}

map.events.each_value{|event|
  id = event.x + map.width * event.y
  events[id] = {
    :tile_id => event.pages[0].graphic.tile_id,
    :character_name => event.pages[0].graphic.character_name,
    :character_index => event.pages[0].graphic.character_index, # 0.7
    :direction => event.pages[0].graphic.direction / 2 - 1,
    :pattern => event.pages[0].graphic.pattern # 0..2
  }
}

data = {
  :map_id    => map_id,
  :map_width => map.width,
  :map_height => map.height,
  :tileset_names => tileset_names,
  :parallax_name => map.parallax_name,
  :map_data => map.data,
  :events => events
}

json = JSON.encode(data)

# Pasar la cadena de texto json a la dll que abrirá el editor de doodads y descodificará la cadena de texto. El editor crea archivos json para cada mapa conteniendo los doodas de ese mapa. Cuando el maker carga un mapa, verá si existe el archivo doodads para ese mapa que estará en json y lo descodificará y añadirá los doodas al mapa (estos pueden ser animados y tienen pasabilidad desde las 4 direcciones)

avatar
newold
Principiante
Principiante

0/3

Créditos 1253

Gracias : 129

Volver arriba Ir abajo

Re: (Busco Script VX o ACE de Tilemap) - Arreglado -

Mensaje por Contenido patrocinado


Contenido patrocinado


Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


Permisos de este foro:
No puedes responder a temas en este foro.