Her sene üniversitelerin yaz tatiline girmesiyle Microsoft tarafından bir Yaz Okulu oluşturuluyor.
Bu yıl ben de Microsoft Yaz Okuluna eğitmen olarak katıldım.
İkinci seminerimi İzmir Ekonomi Üniversitesi‘nde XNA Oyun Programlama konusunda verdim.
İzmir Yaz Okulu öğrencilerine, beni sabırla dinledikleri için teşekkür ediyor, özverili katılımlarından dolayı da tebrik ediyorum.
XNA Oyun Programlama Sunum Dosyası‘nı download edebilirsiniz.
Her sene üniversitelerin yaz tatiline girmesiyle Microsoft tarafından bir Yaz Okulu oluşturuluyor.
Bu yıl ben de Microsoft Yaz Okuluna eğitmen olarak katıldım.
İlk seminerimi Ankara TOBB Ekonomi ve Teknoloji Üniversitesi‘nde XNA Oyun Programlama konusunda verdim.
Ankara Yaz Okulu öğrencilerine, beni sabırla dinledikleri için teşekkür ediyor, özverili katılımlarından dolayı da tebrik ediyorum.
XNA Oyun Programlama Sunum Dosyası‘nı download edebilirsiniz.
Ağustos ayı içerisinde planlanan seminerlerim;
01 Ağustos 2011 - Microsoft Yaz Okulu (Ankara) - XNA Oyun Programlama
07 Ağustos 2011 - BilgeAdam Eğitim Akademisi (İzmir) - XNA Oyun Programlama
08 Ağustos 2011 - Microsoft Yaz Okulu (İzmir) - XNA Oyun Programlama
15 Ağustos 2011 - Microsoft Yaz Okulu (İstanbul) - XNA Oyun Programlama
Hemen her oyun’da, saniyede çizilen ekran sayısı (FPS - Frame Per Second) bilgisi oyun penceresinde gösterilir.
FPS nedir?
FPS, oyunun bir saniye içerisinde oyun penceresine çizebildiği ekran sayısıdır. Bizim animasyon olarak gördüğümüz akışlar aslında ardı ardına hızlı bir şekilde çizilen tek kare resimlerdir.
Sinema filmleri bile aslında ekranda sırayla gösterilen tek kare resimlerden oluşmaktadır.
İnsan gözü, saniye 25 kare’den büyük hızlarda tek kare resimleri, bir akış olarak algılar.
XNA Framework, saniyede 60 kare ekran çizmeye çalışır.
Oyunlarımızda FPS nasıl hesaplarız?
Formül aslında basit, Draw() method’unda bir değişkenin değerini 1 arttıracağız. Update() method’unda her saniye geçişinde değişkeni sıfırlayacağız.
FPS bilgisini ekranda nasıl gösteririz?
Draw() method’unda değişkenin değerini ekranda gösterirsek, bir saniye içerisinde kaç defa Update() method’unun çalıştırıldığını, yani saniyedeki ekran sayısını (FPS) göstermiş oluruz.
Şimdi yazacağımız örnek projede, klavyeden boşluk (space) tuşuna basıldığında FPS bilgisini ekranda göstereceğiz, tekrar basıldığında gizleyeceğiz.
Örnek proje
Öncelikle sınıf seviyesinde değişkenlerimizi oluşturalım;
int SaniyedeKareSayisi = 0; double FPS = 0; bool DetayGoster = false; KeyboardState pks;</pre>
Update() method’unda FPS hesaplayalım;
KeyboardState ks = Keyboard.GetState(); if (pks.IsKeyDown(Keys.Space) && ks.IsKeyUp(Keys.Space)) { DetayGoster = !DetayGoster; } if (DetayGoster && gameTime.TotalGameTime.Milliseconds == 0) { FPS = SaniyedeKareSayisi; SaniyedeKareSayisi = 0; } pks = ks;
Oyun penceresinde yazı gösterebilmek için, SpriteFont sınıfından bir değişkene ihtiyacımız olacak.
SpriteFont Arial;
Content projemize Arial isminde bir SpriteFont dosyası ekleyelim.
<?xml version="1.0" encoding="utf-8"?> <XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipeline.Graphics"> <Asset Type="Graphics:FontDescription"> <FontName>Arial</FontName> <Size>24</Size> <Spacing>0</Spacing> <UseKerning>true</UseKerning> <Style>Regular</Style> <CharacterRegions> <CharacterRegion> <Start> </Start> <End>~</End> </CharacterRegion> </CharacterRegions> </Asset> </XnaContent>
LoadContent() method’unda Arial değişkenimize değer atayalım;
Arial = Content.Load("Arial");
Draw() method’unda hesaplanan FPS bilgisini ekranda gösterelim;
spriteBatch.Begin(); if (DetayGoster) { SaniyedeKareSayisi++; spriteBatch.DrawString(Arial, "FPS : " + FPS.ToString(), new Vector2(50, 50), Color.Black); } spriteBatch.End(); Artık oyun penceremizde *saniyedeki ekran sayısını* (**FPS**) gösterebiliriz. ![XNA Oyun Programlama - FPS Hesaplama Sonucu](/assets/uploads/2011/07/FPSGameScreen.png "XNA Oyun Programlama - FPS Hesaplama Sonucu") Oyunun kodlarını indirmek için tıklayınız.
Projelerimizde dosya sistemi üzerinde geçici olarak dosya oluşturma ve işimiz bittiğinde silme ihtiyacı hissedebiliriz.
Bu yazıyı okumadan önce Hem benzersiz hem de geçici dosya oluşturmanın en kolay yolu ve C# ile Geçici Dosya Oluşturmak başlıklı yazılarımı okumanızı öneririm.
Bu linkte bulduğum yöntemi çok kullanışlı buldum ve sizler (aynı zamanda kendim) için türkçeleştirdim;
public class TempFile : IDisposable { public TempFile() : this(string.Empty) { }
private readonly string _tmpfile;
public TempFile(string extension)
{
_tmpfile = Path.GetTempFileName();
if (!string.IsNullOrEmpty(extension))
{
string newTmpFile = _tmpfile + extension;
/// Yeni bir geçici dosya oluşturulur
File.Create(newTmpFile, 0);
/// Eski geçici dosya silinmediyse, silinir.
File.Delete(_tmpfile);
/// Yeni oluşturulan geçici dosya kullanıma hazır!
_tmpfile = newTmpFile;
}
}
public string FullPath
{
get { return _tmpfile; }
}
void IDisposable.Dispose()
{
if (!string.IsNullOrEmpty(_tmpfile) && File.Exists(_tmpfile))
{
File.Delete(_tmpfile);
}
} }</pre>
Kullanımına örnek;
using(TempFile tmp = new TempFile(".dat")) /// dat uzantılı bir geçici dosya oluşturuluyor { /// FullPath özelliğinden geçici dosyanın yolu ve dosya adı alınabilir; string filename = tmp.FullPath; }
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484