XNA ile geliştirdiğiniz oyunlar varsayılan olarak 800 x 600 boyutlarında bir pencerede oynatılır.
Eğer siz bu pencereyi boyutlandırmak ve hatta Tam Ekran seçeneği eklemek isterseniz yapmanız gereken, oyun sınıfınızın constructor‘ına aşağıdaki kodları eklemektir;
graphics.PreferredBackBufferWidth = 1024; /// Oyun penceresinin genişliği graphics.PreferredBackBufferHeight = 768; /// Oyun penceresinin yüksekliği graphics.IsFullScreen = true; /// Oyun pencerede mi oynatılacak, yoksa tam ekran mı olacak</pre>
Bu kodları XNA - Oyun Temelleri yazımda yaptığımız oyuna uygularsak;
public GameLoop() { this.Window.Title = "XNA - Oyun Temelleri"; graphics = new GraphicsDeviceManager(this); graphics.PreferredBackBufferWidth = 1024; graphics.PreferredBackBufferHeight = 768; graphics.IsFullScreen = true; Content.RootDirectory = "Content"; }
Base class‘ta tanımlanmış bir method‘u override etmemiz gerekiyor. Fakat method virtual yazılmamışsa, override edilemez. Türetilmiş class‘ta base class‘taki virtual olmayan method’u nasıl override edebiliriz?
Türetilmiş class’ta base class’taki method’u override etmek yerine new anahtar kelimesi ile baştan yazabiliriz. Böylece** virtual** yazılmamış ve dolayısıyla override edilemeyecek method’ları “bir çeşit” override etmiş oluruz.
class Base { public virtual void VirtualGoster() { Console.WriteLine(“Base.VirtualGoster”); }
public void Goster()
{
Console.WriteLine(“Base.Goster”);
} }
class Derived : Base { public override void VirtualGoster() { Console.WriteLine(“Derived.VirtualGoster”); }
public new void Goster()
{
Console.WriteLine(“Derived.Goster”);
} }
class Program { static void Main(string[] args) { Base base = new Derived(); base.VirtualGoster(); base.Goster();
Console.WriteLine();
Derived derived = new Derived();
derived.VirtualGoster();
derived.Goster();
} }
Çıktı : Derived.VirtualGoster Base.Goster Derived.VirtualGoster Derived.Goster
XNA ile oyun geliştirmeye başlamadan önce, ekrana nasıl çizim yapabileceğimizi öğrenmemiz gerekiyor.
Not : Buradan ileriye devam etmeden önce XNA - Başlangıç yazımı okumanızı tavsiye ederim.
Öncelikle, ihtiyacımız olacak iki görseli bilgisayarınıza kopyalamanız gerekiyor;
Solution Explorer‘da Content üzerine sağ tuşla tıklayarak ari.png ve fil.png dosyalarını projeye ekleyelim.
GameLoop.cs dosyamızda class seviyesinde Texture2D tipinde iki değişken oluşturalım;
Texture2D ArkaPlan; Texture2D Ari;</pre> Daha sonra bu değişkenlere resimleri yükleyeceğiz. Aynı yere bir tane de Rectangle tipinde değişken oluşturalım.
Rectangle OyunPencere;
Bu değişkene ekranımızın boyutlarını yüklüyor olacağız.
LoadContent() method’unda bu değişkenlerin değerlerini atayalım;
OyunPencere = new Rectangle(0, 0, graphics.GraphicsDevice.Viewport.Width, graphics.GraphicsDevice.Viewport.Height); ArkaPlan = Content.Load<Texture2D>("fil"); Ari = Content.Load<Texture2D>("ari");
GameLoop class’ının constructor‘ında oyunumuzun başlığını değiştirebiliriz;
public GameLoop() { this.Window.Title = "XNA - Oyun Temelleri"; graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; }
Draw() method’unda resimlerin ekrana çizim işlerini yapacağız. Çizime işlemlerini Begin() ve End() methodları arasında yapmamız gerekiyor;
spriteBatch.Begin(SpriteBlendMode.AlphaBlend); spriteBatch.Draw(ArkaPlan, OyunPencere, Color.White); spriteBatch.Draw(Ari, Vector2D.Zero, Color.White); spriteBatch.End();
Bu durumda uygulamayı çalıştırırsak, karşımıza şöyle bir ekran gelir;
Şimdi arı resmini, klavye tuşlarını kullanarak ekranda hareket ettirelim. Öncelikle arı’nın ekrandaki konumunu tutan bir değişkene ihtiyacımız var, class seviyesindeki değişkenlere ekleyelim;
Vector2 Location = Vector2.Zero;
Draw() methodunda ari resmini çizdiğimiz satırı güncelleyelim;
spriteBatch.Draw(Ari, Location, Color.White);
Son olarak Update() method’umuzu güncelleyelim;
protected override void Update(GameTime gameTime) { KeyboardState ks = Keyboard.GetState(); if (ks.IsKeyDown(Keys.Escape)) this.Exit(); if (ks.IsKeyDown(Keys.Up)) Location.Y -= 3; if (ks.IsKeyDown(Keys.Down)) Location.Y += 3; if (ks.IsKeyDown(Keys.Left)) Location.X -= 3; if (ks.IsKeyDown(Keys.Right)) Location.X += 3; base.Update(gameTime); } Gördüğünüz gibi, klavyede o anda basılı tuşları *Keyboard.GetState()* ile *ks* değişkenine yüklüyoruz, sonra basit karşılaştırmalar ile *Location* değişkenimizin *X* ve *Y* değerlerini değiştiriyoruz. *Draw()* method'unda ari'yi çizeceğimiz yer olarak *Location* değişkenini verdiğimiz için, klavyeyi kullanarak ari'yi hareket ettirebildiğimizi görüyoruz. ![XNA Oyun Temelleri](/assets/uploads/2010/02/XNA_OyunTemelleri_2.png "XNA Oyun Temelleri") Oyunun kaynak kodlarını buradan indirebilirsiniz.
Senaryo : Uygulama çalışırken değeri değiştirilemeyecek değişken tanımlamanız gerekiyor.
Çözüm : Muhtemel iki çözüm var, const ve readonly değişken tanımlamak. Fakat aralarında önemli bir fark var;
const : Türkçe’ye Sabit olarak çevrilebilir. Class seviyesinde tanımlanır ve tanımlanma anında değeri verilmek zorundadır. Sonradan değeri değiştirilemez.
readonly : Sadece-Okunabilir anlamına gelir. Class seviyesinde tanımlanır. Tanımlandığı anda değeri verilebilir veya Class Constructor’ında değeri verilebilir. Sonradan değeri değiştirilemez.
public class Matematik { private const double PI = 3.14159; }</pre>
public class Matematik { private readonly int PI; /// PI değişkeninin değerini burada da verebilirdim. public Matematik() { PI = 22 / 7; } }
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484