Makale Özeti

XNA ile uzay'da uzay gemisi yönetmek için yapmak istediklerimiz; 800 x 600 pencere içerisinde arkaplanda Uzay.jpg görselini göstermek Pencerenin ortasına UzayGemisi.png dosyasını konumlandırmak Klavyenin tuşlarına görevler atayarak, UzayGemisi‘ni Uzay içerisinde yönetmek

Makale

Öncelikle ihtiyacınız olacak iki görseli buradan indirebilirsiniz;



Yapmak istediğimiz;

  • 800 x 600 pencere içerisinde arkaplanda /Makaleler/Resimler/1000002822_Uzay.jpg görselini göstermek
  • Pencerenin ortasına /Makaleler/Resimler/1000002822_UzayGemisi.png dosyasını konumlandırmak
  • Klavyenin tuşlarına görevler atayarak, UzayGemisi‘ni Uzay içerisinde yönetmek
Hemen başlayalım, ilk olarak yeni bir XNA projesi oluşturalım. Game1.cs dosyasının adını GameLoop.cs olarak değiştirelim.

/Makaleler/Resimler/1000002822_Uzay.jpg ve /Makaleler/Resimler/1000002822_UzayGemisi.png dosyalarını Content içerisine sürükleyip bırakalım. GameLoop.cs dosyasını açarak kod yazmaya başlayalım;

Sabitlerimizi class seviyesinde const ve readonly field’larda tanımlayalım;
private const int PENCERE_GENISLIK = 800;
private const int PENCERE_YUKSEKLIK = 600;
private const string PENCERE_BASLIK = "XNA - Uzay'da UzayGemisi Yönetelim";
private const bool TAM_EKRAN = false;
private readonly Color ARKAPLAN_RENK = Color.Black;
GameLoop class‘ının constructor‘ında bu sabitleri kullanalım;
graphics.PreferredBackBufferWidth = PENCERE_GENISLIK;
graphics.PreferredBackBufferHeight = PENCERE_YUKSEKLIK;
graphics.IsFullScreen = TAM_EKRAN;
this.Window.Title = PENCERE_BASLIK;
Uzay görselimizi 800 x 600 boyutlarındaki oyun penceremize sığdırmak için class seviyesinde Rectangle tipinde bir değişken tanımlayalım, Uzay ve UzayGemisi görsellerimiz için de birer tane Texture2D tipinde değişken tanımlayalım;
Rectangle Pencere;
Texture2D Uzay;
Texture2D UzayGemisi;
LoadContent() method’unda bu değişkenlerin değerlerini atayalım;
Pencere = new Rectangle(0, 0, PENCERE_GENISLIK, PENCERE_YUKSEKLIK);
Uzay = Content.Load("Uzay");
UzayGemisi = Content.Load("UzayGemisi");
Artık Uzayımızı ve UzayGemimizi oyun penceresine çizebiliriz. Ama madem uzay gemisini klavye tuşları ile yönetmek istiyoruz, o zaman uzay gemisinin kendi çevresinde dönebilmesini de sağlamamız gerekir.

Eğer bunu yapmazsak, Yukarı tuşu ile yukarı giden uzay gemisi, Aşağı tuşu ile aşağı gelirken yönünü düzeltmez, geri geri geliyormuş gibi gözükür. Hatta yanlara ve çağrazlara giderken iyice anlamsız görünmeye başlar.

Öncelikle uzay gemisinin o anda oyun penceresinin neresinde olduğunu tutacağımız Vector2 sınıfında bir değişkene class seviyesinde ihtiyacımız var, ayrıca uzay gemisinin gideceği yöne göre yönelmesi için, iki değişkene daha ihtiyacımız olacak;
Vector2 Konum = Vector2.Zero;
Vector2 Merkez;
float Yonelme = 0;
Uzay gemisinin doğru bir yönelme yapabilmesi için, ağırlık merkezini doğru vermemiz gerekiyor, LoadContent() methoduna aşağıdaki kodu ekleyelim;
Merkez = new Vector2(UzayGemisi.Width / 2, UzayGemisi.Height / 2);
Önce Draw() methodumuzu yazalım;
GraphicsDevice.Clear(ARKAPLAN_RENK);
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);

spriteBatch.Draw(Uzay, Pencere, Color.White);
spriteBatch.Draw(UzayGemisi, Konum, null, Color.White, Yonelme, Merkez, 1, SpriteEffects.None, 0);

spriteBatch.End();
base.Draw(gameTime);
Son olarak Update() methodumuzu yazalım;

Öncelikle klavyenin o andaki durumunu tutacağımız değişkenimizi tanımlıyoruz;
KeyboardState ks = Keyboard.GetState();
Eğer Escape tuşuna basılıyorsa, oyunda çıkıyoruz;
if (ks.IsKeyDown(Keys.Escape))
    this.Exit();
Eğer hem Yukarı, hem de Sağa tuşlarına basılıyorsa, uzay gemisinin X ve Y koordinatlarında güncellemeler yapıp, yönelmesini 45 derecenin radian karşılığına eşitliyoruz;
if (ks.IsKeyDown(Keys.Up) && ks.IsKeyDown(Keys.Right))
{
    Konum.Y -= 3;
    Konum.X += 3;
    Yonelme = MathHelper.ToRadians(45);
}
MathHelper.ToRadians() parametre olarak derece cinsinden değer alır ve geriye float cinsinden radian döner.

Update() methodunun geri kalanında yön tuşlarına göre uzay gemisinin koordinatlarını ve yönelmesini güncelliyoruz;
if (ks.IsKeyDown(Keys.Up) && ks.IsKeyDown(Keys.Right))
{
    Konum.Y -= 3;
    Konum.X += 3;
    Yonelme = MathHelper.ToRadians(45);
}
else if (ks.IsKeyDown(Keys.Up) && ks.IsKeyDown(Keys.Left))
{
    Konum.Y -= 3;
    Konum.X -= 3;
    Yonelme = MathHelper.ToRadians(315);
}
else if (ks.IsKeyDown(Keys.Down) && ks.IsKeyDown(Keys.Right))
{
    Konum.Y += 3;
    Konum.X += 3;
    Yonelme = MathHelper.ToRadians(135);
}
else if (ks.IsKeyDown(Keys.Down) && ks.IsKeyDown(Keys.Left))
{
    Konum.Y += 3;
    Konum.X -= 3;
    Yonelme = MathHelper.ToRadians(225);
}
else if (ks.IsKeyDown(Keys.Up))
{
    Konum.Y -= 3;
    Yonelme = MathHelper.ToRadians(0);
}
else if (ks.IsKeyDown(Keys.Down))
{
    Konum.Y += 3;
    Yonelme = MathHelper.ToRadians(180);
}
else if (ks.IsKeyDown(Keys.Left))
{
    Konum.X -= 3;
    Yonelme = MathHelper.ToRadians(270);
}
else if (ks.IsKeyDown(Keys.Right))
{
    Konum.X += 3;
    Yonelme = MathHelper.ToRadians(90);
}
Son olarak Update() methodunda uzay gemisinin pencereden dışarı çıkmasını engelleyecek kontrol kodlarını da yazıyoruz;
if (Konum.X < 0)
    Konum.X = 0;
if (Konum.X > PENCERE_GENISLIK - UzayGemisi.Width)
    Konum.X = PENCERE_GENISLIK - UzayGemisi.Width;
if (Konum.Y < 0)
    Konum.Y = 0;
if (Konum.Y > PENCERE_YUKSEKLIK - UzayGemisi.Height)
    Konum.Y = PENCERE_YUKSEKLIK - UzayGemisi.Height;
"Oyun" projemizin kodlarını buradan bilgisayarınıza indirebilirsiniz.

Projeyi çalıştırdığınızda aşağıdaki gibi bir sonuç almanız lazım;

Engin Polat'ın C#, XNA, SQL, ASP.NET, MVC içerikli programcılık sitesi