17 Haziran 2020 Çarşamba

XNA 4.0 ile TextureUsage Hatası [20-03-2014]




XNA 4.0 ile birlikte TextureUsage Hatası

              Visual Studio 2008 ile geliştirdiğiniz XNA projesini VS 2010 Express for Windows Phone veya Visual Studio 2012 ve üstü sürümleri üzerinde çalıştırmayı denediğinizde karşılaşabileceğiniz bir hataya göz atacağız.(XNA sürümlerinden dolayı)
Ben oyunumda oyun içi sprite ların herhangi bir hasar aldıklarında yüzeylerinin beyaz olduğu bir sistem kullanıyorum.Bunun için kullandığım metot aşağıda ki gibi

                 public Texture2D MakeDamageTexture(Texture2D texture)
        {
            int pixelCount = texture.Width * texture.Height;
            Color[] pixels = new Color[pixelCount];
            texture.GetData<Color>(pixels);
            for (int i = 0; i < pixels.Length; i++)
            {
                byte offset = 200;
                byte r = (byte)Math.Min(pixels[i].R + offset, 255);
                byte g = (byte)Math.Min(pixels[i].R + offset, 255);
                byte b = (byte)Math.Min(pixels[i].R + offset, 255);
                pixels[i] = new Color(r, g, b, pixels[i].A);
            }

            Texture2D outTexture = new Texture2D(Globals.Graphics.GraphicsDevice, texture.Width, texture.Height, 1, TextureUsage.None, SurfaceFormat.Color);
            outTexture.SetData<Color>(pixels);
            return outTexture;
        }

             Burada yeni bir Texture2D nesnesi oluştururken XNA 3.1 ile yazdığımız kodda
Texture2D yapıcı fonksiyonu Texture2D(GraphicsDevice graphicsDevice,Int32 width,Int32 height,Int32 numberLevels,TextureUsage usage,SurfaceFormat format) şeklindedir.XNA 4.0 ile birlikte projemizi derlediğimizde VS  TextureUsage diye bir sınıfın olmadığını acaba bir şeyleri unutup unutmadığımızı sormaktadır.Çözüm olarak Texture2D sınıfının yeni yapıcı fonksiyonunu kullanarak hatadan sıyrılmayı başarıyoruz.

XNA 3.1 ile
Texture2D(GraphicsDevice graphicsDevice,Int32 width,Int32 height,Int32 numberLevels,TextureUsage usage,SurfaceFormat format)
XNA 4.0 ile
Texture2D(GraphicsDevice graphicsDevice,Int32 width,Int32 height,bool bipmap,SurfaceFormat format)
Eski Kod
Texture2D outTexture = new Texture2D(Globals.Graphics.GraphicsDevice, texture.Width, texture.Height, 1, TextureUsage.None, SurfaceFormat.Color);
Yeni kod

Texture2D outTexture = new Texture2D(Globals.Graphics.GraphicsDevice, texture.Width, texture.Height,false,SurfaceFormat.Color);


           Yalnız bu şekilde hatadan kurtuluyoruz fakat oyunum istediğim gibi çalışmıyor diyebilirim.Oyun içinde ki sprite lar hasar aldıklarında aşağıda ki gibi büyük beyaz kare şeklinde hasar dokusu çizdirilmekteydi.

 
Çözüm :
Eski Kod:
SpriteBatch.Begin( );
DrawFunction( );
SpriteBatch.End( );
Yeni Kod:
            SpriteBatch.Begin( SpriteSortMode.Deferred,BlendState.NonPremultiplied);
            DrawFunction( );
            SpriteBatch.End( );



Hiç yorum yok:

Yorum Gönder