C# ile en basit dizi tanımlama yöntemi, değişken tipinin sonuna [] karakterlerini eklemektir.
Örnek :
int[] TekSayilar = { 3, 1, 9, 5, 7 };
string[] Ogrenciler = { “Engin”, “Ahmet”, “Mehmet”, “Ali”, “Veli” };</pre>
Dizileri sıralamak için, Array sınıfının static Sort() methodunu kullanabiliriz;
Array.Sort(TekSayilar); Array.Sort(Ogrenciler);
Şimdi TekSayilar ve Ogrenciler dizilerindeki elemanları ekrana yazdırırsak;
foreach (int Sayi in TekSayilar) Console.WriteLine(Sayi); foreach (string Ogrenci in Ogrenciler) Console.WriteLine(Ogrenci); Dizilerdeki elemanların **sıralanmış** olduklarını görürüz.
XNA ile Pong oyunu yazalım - 1 yazıma bu yazı ile devam ediyorum.
XNA ile ekrana yazı yazdırmak için öncelikle Content projesi içerisinde bir spritefont dosyası oluşturmalıyız.
Pong projesi için ben Arial.spritefont ismini verdiğim dosyayı oluşturdum, “yorum satırları kaldırılmış halini” aşağıdaki gibi düzenledim;
<?xml version=”1.0” encoding=”utf-8”?> <XnaContent xmlns:Graphics=”Microsoft.Xna.Framework.Content.Pipeline.Graphics”> <Asset Type=”Graphics:FontDescription”> <FontName>Arial</FontName> <Size>16</Size> <Spacing>0</Spacing> <UseKerning>true</UseKerning> <Style>Regular</Style> <CharacterRegions> <CharacterRegion> <Start> </Start> <End>~</End> </CharacterRegion> </CharacterRegions> </Asset> </XnaContent></pre>
Gördüğünüz gibi, font dosyası aslında font’un özelliklerini yazdığımız bir Xml dosyası.
GameLoop sınıfının değişkenlerine Arial font dosyamızı yükleyeceğimiz değişkeni de ekleyelim;
SpriteFont Arial;
LoadContent() method’unda Arial.spritefont dosyasını Arial değişkenine yükleyelim;
Arial = Content.Load<SpriteFont>("Arial");
Şimdi Draw() method‘una aşağıdaki kodları ekleyerek, oyuncuların skorlarını ekrana yazdıralım;
spriteBatch.DrawString(Arial, "Oyuncu 1 : " + Oyuncu1Skor, new Vector2((float)(PENCERE_GENISLIK * 0.05), 30), Color.Yellow); spriteBatch.DrawString(Arial, "Oyuncu 2 : " + Oyuncu2Skor, new Vector2((float)(PENCERE_GENISLIK * 0.80), 30), Color.Yellow);
Bu kod parçası ile, spriteBatch değişkeninde yeralan DrawString() method’unu kullandık. DrawString() method’unun parametrelerine bakacak olursak;
Gelelim, oyunda ses çıkartmaya;
Öncelikle wav formatında iki ses dosyasını Content içerisine sürükleyip bırakalım.
Class seviyesindeki değişkenlere iki tane daha ekleyelim;
SoundEffectInstance ArkaplanSes; SoundEffectInstance SkorSes;
LoadContent() method’unda bu değişkenlerin değerlerini atayalım;
ArkaplanSes = Content.Load<SoundEffect>("Pong").CreateInstance(); SkorSes = Content.Load<SoundEffect>("recycle").CreateInstance();
Gördüğünüz gibi, SoundEffectInstance tipinde iki değişken tanımladık. Bu değişkenlere Content içindeki ses dosyalarını yüklerken, SoundEffect tipinin CreateInstance() method‘unu kullandık.
Böylece ses değişkenlerimiz kullanıma hazır hale geldi.
LoadContent() method’una aşağıdaki kodları da ekleyerek, arkaplanda çalacak ses değişkeninin sesini %20 oranına düşürelim ve loop olmasını sağlayalım (Böylece ses dosyasının sonuna geldiğinde başa dönüp çalmaya devam edecek).
Son olarak Play() methodu ile, ses dosyasını çalmaya başlayalım;
ArkaplanSes.Volume = 0.2f; ArkaplanSes.IsLooped = true; ArkaplanSes.Play();
Update() method’unda oyuncuların skor kazandığı kodlara aşağıdaki satırı da ekleyelim;
SkorSes.Play(); Böylece oyuncular skor yaptıkça, SkorSes değişkeninde yüklü olan ses dosyası çalınacak. İşte Pong oyunundan ekran görüntüsü. Oyunun kaynak kodlarını buradan indirebilirsiniz. ![XNA Pong oyunun bitmiş hali](/assets/uploads/2010/03/XNA_Pong.png "XNA_Pong")
C# ile yazdığınız uygulamanın her açılışta bir önceki kapatıldığı yerde açılmasını isteyebilirsiniz.
Aslında gayet basit olan bu işi yaparken düşünmemiz gereken bazı detaylar var. Mesela;
Ya uygulama kapatıldıktan sonra kullanıcı windows’un çözünürlüğünü değiştirdiyse?
Kullanıcı birden fazla monitör kullanıyorsa, ve uygulama kapatıldıktan sonra monitörlerin ayarlarını değiştirdiyse?
Hem bu noktaları gözönünde bulunduracak, hem de kolay şekilde programlanacak bir çözümü aşağıda kodladım;
Öncelikle formumuz kapatılırken, tam olarak bulunduğu noktayı bir yere kaydetsin. Bunu uygulamanın Settings penceresine iki tane özellik ekleyerek yapalım;
FormLocation ve FormSize
Formumuzun base class‘ı olan Form class‘ından gelen OnClosing virtual method’unu override edelim;
protected override void OnClosing(CancelEventArgs e) { Properties.Settings.Default.FormLocation = this.Location; Properties.Settings.Default.FormSize = this.Size; Properties.Settings.Default.Save();
base.OnClosing(e); }</pre>
Uygulamamızın Settings penceresinden eklediğimiz property‘lere
Properties.Settings.Default
ile ulaşabiliriz.
Şimdi, form’umuzun base’den gelen OnLoad virtual method‘unu override edelim ve açıldığında eski yerine konumlanmasını sağlayalım;
protected override void OnLoad(EventArgs e) { base.OnLoad(e); Point konum = Properties.Settings.Default.FormLocation; Size boyut = Properties.Settings.Default.FormSize; bool isOnScreen = false; /// Formun gözükür olup-olmadığını kontrol edelim foreach (Screen screen in Screen.AllScreens) if (screen.WorkingArea.Contains(konum)) isOnScreen = true; if (!isOnScreen) ///Eğer formumuz görünür değilse, görünür yapalım this.SetDesktopLocation(Screen.PrimaryScreen.WorkingArea.Left, Screen.PrimaryScreen.WorkingArea.Top); if (boyut.Width < 10 || boyut.Height < 10) /// Formun boyutları çok küçükse, normal hale geri getirelim this.Size = new Size(300, 300); } Yukarıdaki kod parçalarını sizler de **kendi uygulamalarınızda** kullanabilirsiniz.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484