コード例 #1
0
ファイル: MapRenderer.cs プロジェクト: xerohour/scsharp
        public Surface RenderToSurface()
        {
            byte[] bitmap = RenderToBitmap(mpq, chk);

            return(GuiUtil.CreateSurfaceFromRGBAData(bitmap, (ushort)pixel_width, (ushort)pixel_height, 32, (ushort)(pixel_width * 4)));
        }
コード例 #2
0
ファイル: MapRenderer.cs プロジェクト: xerohour/scsharp
        Surface GetTile(int mapTile)
        {
            if (tileCache == null)
            {
                tileCache = new Dictionary <int, Surface>();
            }

            //					bool odd = (mapTile & 0x10) == 0x10;

            int tile_group  = mapTile >> 4;            /* the tile's group in the cv5 file */
            int tile_number = mapTile & 0x0F;          /* the megatile within the tile group */

            int megatile_id = Util.ReadWord(cv5, (tile_group * 26 + 10 + tile_number) * 2);

            if (tileCache.ContainsKey(megatile_id))
            {
                return(tileCache[megatile_id]);
            }

            if (image == null)
            {
                image = new byte[32 * 32 * 4];
            }

            int minitile_x, minitile_y;

            bool   show_flag = true;
            ushort flag      = 0x0001;        /* walkable flag */

            for (minitile_y = 0; minitile_y < 4; minitile_y++)
            {
                for (minitile_x = 0; minitile_x < 4; minitile_x++)
                {
                    ushort minitile_id    = Util.ReadWord(vx4, megatile_id * 32 + minitile_y * 8 + minitile_x * 2);
                    ushort minitile_flags = Util.ReadWord(vf4, megatile_id * 32 + minitile_y * 8 + minitile_x * 2);
                    bool   flipped        = (minitile_id & 0x01) == 0x01;
                    minitile_id >>= 1;

                    int pixel_x, pixel_y;
                    if (flipped)
                    {
                        for (pixel_y = 0; pixel_y < 8; pixel_y++)
                        {
                            for (pixel_x = 0; pixel_x < 8; pixel_x++)
                            {
                                int x = (minitile_x + 1) * 8 - pixel_x - 1;
                                int y = (minitile_y * 8) * 32 + pixel_y * 32;

                                if (show_flag && (minitile_flags & flag) == flag && (pixel_x == pixel_y))
                                {
                                    image[0 + 4 * (x + y)] = 255;
                                    image[1 + 4 * (x + y)] = 255;
                                    image[2 + 4 * (x + y)] = 0;
                                    image[3 + 4 * (x + y)] = 0;
                                }
                                else
                                {
                                    byte palette_entry = vr4[minitile_id * 64 + pixel_y * 8 + pixel_x];

                                    image[0 + 4 * (x + y)] = (byte)(255 - wpe[palette_entry * 4 + 3]);
                                    image[1 + 4 * (x + y)] = wpe[palette_entry * 4 + 2];
                                    image[2 + 4 * (x + y)] = wpe[palette_entry * 4 + 1];
                                    image[3 + 4 * (x + y)] = wpe[palette_entry * 4 + 0];
                                }
                            }
                        }
                    }
                    else
                    {
                        for (pixel_y = 0; pixel_y < 8; pixel_y++)
                        {
                            for (pixel_x = 0; pixel_x < 8; pixel_x++)
                            {
                                int x = minitile_x * 8 + pixel_x;
                                int y = (minitile_y * 8) * 32 + pixel_y * 32;

                                if (show_flag && (minitile_flags & flag) == flag && (pixel_x == pixel_y))
                                {
                                    image[0 + 4 * (x + y)] = 255;
                                    image[1 + 4 * (x + y)] = 255;
                                    image[2 + 4 * (x + y)] = 0;
                                    image[3 + 4 * (x + y)] = 0;
                                }
                                else
                                {
                                    byte palette_entry = vr4[minitile_id * 64 + pixel_y * 8 + pixel_x];

                                    image[0 + 4 * (x + y)] = (byte)(255 - wpe[palette_entry * 4 + 3]);
                                    image[1 + 4 * (x + y)] = wpe[palette_entry * 4 + 2];
                                    image[2 + 4 * (x + y)] = wpe[palette_entry * 4 + 1];
                                    image[3 + 4 * (x + y)] = wpe[palette_entry * 4 + 0];
                                }
                            }
                        }
                    }
                }
            }

            Surface surf = GuiUtil.CreateSurfaceFromRGBAData(image, 32, 32, 32, 32 * 4);

            tileCache [megatile_id] = surf;

            return(surf);
        }