Beispiel #1
0
        private static bool isNew(int startAdress, ArrayList PatternTable, NES_PPU_Color color, int ID)
        {
            bool isnew = isNewPattern(startAdress, PatternTable, ID);

            isnew |= color.isNewPalette;
            return(isnew);
        }
Beispiel #2
0
        private static BitmapWithInfo CreateNewTile(int startAdress, NES_PPU_Color color, ArrayList PatternTable)
        {
            byte[,] pattern = new byte[8, 8];
            Picture     bitmap = new Picture(8, 8);
            List <byte> cID    = new List <byte>();

            Parallel.For(0, 8, j =>
            {
                Parallel.For(0, 8, i =>
                {
                    var a             = (((Address)PatternTable[startAdress + i]).Value >> j) & (0x01);
                    var b             = ((((Address)PatternTable[startAdress + i + 8]).Value >> j) & (0x01)) << 1;
                    pattern[7 - j, i] = (byte)(a | b);


                    lock (cID)
                    {
                        if (!cID.Contains(pattern[7 - j, i]))
                        {
                            cID.Add(pattern[7 - j, i]);
                        }
                    }

                    lock (bitmap)
                    {
                        bitmap.SetPixel(7 - j, i, color.color[pattern[7 - j, i]]);
                    }
                });
            });
            ((Address)PatternTable[startAdress]).setAsOld();
            return(new BitmapWithInfo(bitmap, pattern, cID.ToArray()));
        }
Beispiel #3
0
        private static BitmapWithInfo UpdateTile(int ID, NES_PPU_Color color)
        {
            lock (patternArray)
            {
                bool isNew = false;
                foreach (int cID in patternArray[ID].cID)
                {
                    isNew |= color.isNewColor[cID];
                }

                if (isNew)
                {
                    byte[,] pattern = patternArray[ID].Pattern;
                    Picture bitmap = new Picture(8, 8);

                    for (int j = 0; j < 8; j++)
                    {
                        for (int i = 0; i < 8; i++)
                        {
                            bitmap.SetPixel(7 - j, i, color.color[pattern[7 - j, i]]);
                        }
                    }
                    return(new BitmapWithInfo(bitmap, pattern, patternArray[ID].cID, true));
                }
                patternArray[ID].isNew = false;
                return(patternArray[ID]);
            }
        }
Beispiel #4
0
        /// <summary>
        /// converts Tiles from Memory to Bitmap. With ID, BankID and  Backgrount Tile Select.
        /// </summary>
        /// <param name="spriteID">ID of Sprite  </param>
        /// <returns></returns>
        public static Picture Tile(ushort spriteID, int pallete, int bankID)
        {
            int           startAdress  = spriteID * 16;
            NES_PPU_Color color        = NES_PPU_Palette.getSpriteColorPalette(pallete);
            var           PatternTable = NES_PPU_Memory.PatternTableN[bankID];
            int           ID           = GetTileID(startAdress, pallete, PatternTable);

            return(CreateTileBitmap(startAdress, color, PatternTable, ID));
        }
Beispiel #5
0
        /// <summary>
        /// converts Tiles from Memory to Bitmap.
        /// </summary>
        /// <param name="startAdress"></param>
        /// <returns></returns>
        public static Picture Tile_StartAdress(int startAdress, int pallete)
        {
            byte[,] pattern = new byte[8, 8];
            NES_PPU_Color color        = NES_PPU_Palette.getPalette(pallete);
            var           PatternTable = NES_PPU_Memory.Memory;
            int           ID           = GetTileID(startAdress, pallete, PatternTable);

            return(CreateTileBitmap(startAdress, color, PatternTable, ID));
        }
Beispiel #6
0
        /// <summary>
        /// Creates an Bitmap from data saved in PPU Adresses.
        /// </summary>
        /// <param name="startAdress"></param>
        /// <param name="bitmap"></param>
        /// <param name="pattern"></param>
        /// <param name="color"></param>
        /// <param name="PatternTable"></param>
        private static Picture CreateTileBitmap(int startAdress, NES_PPU_Color color, ArrayList PatternTable, int ID)
        {
            Stopwatch t = new Stopwatch();

            t.Start();
            System.TimeSpan t1 = new System.TimeSpan(0);
            System.TimeSpan t2 = new System.TimeSpan(0);

            try
            {
                if (isNew(startAdress, PatternTable, color, ID))
                {
                    BitmapWithInfo bitmap;

                    if (isNewPattern(startAdress, PatternTable, ID))
                    {
                        bitmap = CreateNewTile(startAdress, color, PatternTable);
                        t1     = t.Elapsed;
                        AddTileToPatternArray(ID, bitmap);
                        t2 = t.Elapsed;
                        t.Stop();
                        t2 -= t1;
                        return(DrawRefreshFrame(bitmap.Image, Color.Red));
                    }
                    else
                    {
                        bitmap = UpdateTile(ID, color);
                        t1     = t.Elapsed;
                        AddTileToPatternArray(ID, bitmap);
                        t2 = t.Elapsed;
                        t.Stop();
                        t2 -= t1;
                        lock (bitmap)
                        {
                            return(DrawRefreshFrame(bitmap.Image, Color.Blue, bitmap.isNew));
                        }
                    }
                }
                else
                {
                    lock (patternArray)
                    {
                        return(patternArray[ID].Image);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
Beispiel #7
0
        /// <summary>
        /// converts Tiles from Memory to Bitmap. With ID and  Backgrount Tile Select.
        /// </summary>
        /// <param name="spriteID">ID of Sprite  </param>
        /// <returns></returns>
        public static Picture Tile(ushort spriteID, int pallete)
        {
            System.TimeSpan t1 = new System.TimeSpan(0);
            System.TimeSpan t2 = new System.TimeSpan(0);
            Stopwatch       t  = new Stopwatch();

            t.Start();
            int startAdress = spriteID * 16;

            byte[,] pattern = new byte[8, 8];
            NES_PPU_Color color        = NES_PPU_Palette.getPalette(pallete);
            var           PatternTable = NES_PPU_Memory.PatternTableN[NES_PPU_Register.PPUCTRL.B ? 1 : 0];
            int           ID           = GetTileID(startAdress, pallete, PatternTable);

            t1 = t.Elapsed;
            var temp = CreateTileBitmap(startAdress, color, PatternTable, ID);

            t2 = t.Elapsed;
            t.Stop();
            t2 -= t1;
            return(temp);
        }