Bu yazımı okumadan önce XNA ile Oyun Programlama konulu diğer yazılarımı okumanızı tavsiye ederim.
Her oyunda bir ana karakter vardır ve biz oyuncular olarak, bu ana karakteri mouse/klavye/joystik aracılığıyla oyun evreninde kontrol ederiz.
Bu yazımda önce bir oyun evreni oluşturacak, sonra da ana oyun karakterini bu evrende hareket ettireceğiz.
Önce oyunda kullanacağımız görselleri bilgisayarımıza indirelim;
Öncelikle arkaplan ve ana karakterimiz için sınıf seviyesinde değişkenlerimizi oluşturalım;
Texture2D KarakterSprite; Texture2D ArkaplanCim;</pre>
Klavye bilgisini alabilmek için KeyboardState sınıfından bir değişken ekleyelim;
KeyboardState ks;
Vector2 sınıfından bir değişken ile, ana karakterimizin oyun penceresinde konumunu tutalım;
Vector2 KarakterKonum;
Oyun sınıfının constructor‘ında (Game1 ismini GameLoop olarak değiştirelim) KarakterKonum değişkenine başlangıç değerini verelim;
public GameLoop() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; KarakterKonum = new Vector2(50, 50); }
LoadContent() method’unda ArkaplanCim ve KarakterSprite değişkenlerine değer atayalım;
protected override void LoadContent() { spriteBatch = new SpriteBatch(GraphicsDevice); KarakterSprite = Content.Load<Texture2D>("KarakterSprite"); ArkaplanCim = Content.Load<Texture2D>("Cim"); }
KarakterSprite görselinde, karakterimizin dört yöne yapacağı hareketlerin tek tek görüntüleri yer alıyor.
Karakterimize yürüme efekti vermek için, aslında birden fazla görselden oluşan tek bir görsel kullanıyoruz. (Böylece hafızaya tek bir görsel yüklendiği için hafıza kullanımını az tutmuş oluyoruz)
Sırayla görselin herbir parçasını ekranda karakterimiz olarak çizdiğimizde, karaktere yürüme efektini vermiş oluyoruz.
Bir Sprite‘ın bir parçasını ekrana çizdirmek için, SpriteBatch sınıfının Draw() method’undan faydalanırız;
SpriteBatch.Draw(Texture2D, Vector2, Rectangle, Color);
Bu method’un parametreleri;
Sınıf seviyesine aşağıdaki değişkenleri ekleyerek devam edelim;
Rectangle Arkaplan; Rectangle Karakter; int Kare = 0; int Yon = 0;
GameLoop sınıfının constructor‘ına;
Arkaplan = new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight);
ekleyelim. Böylece, arkaplan görselinin çizileceği alanı tanımlamış olduk.
Oyun kodlarımızın en önemli iki methodundan biri, Update() method’udur;
ks = Keyboard.GetState(); if (ks.IsKeyDown(Keys.Escape)) { this.Exit(); } if (ks.IsKeyDown(Keys.Down)) { Yon = 0; Kare++; KarakterKonum.Y += 3; } else if (ks.IsKeyDown(Keys.Up)) { Yon = 1; Kare++; KarakterKonum.Y -= 3; } else if (ks.IsKeyDown(Keys.Left)) { Yon = 2; Kare++; KarakterKonum.X -= 3; } else if (ks.IsKeyDown(Keys.Right)) { Yon = 3; Kare++; KarakterKonum.X += 3; } if (Kare > 5) { Kare = 0; }
Her bir yön tuşuna basıldığında Yon değişkenini farklı bir değere atadık. Ayrıca Kare değişkeninin değerini de bir artırdık.
KarakterSprite görselinde karakter’in yürüme efekti için yana doğru 6 görsel kullanıldığını görüyoruz. Kare değişkeni 5 değerinden büyük bir değere ulaştığında 0 değerine eşitleyip değişkeni sıfırlamış oluyoruz.
Her yön tuşuna basıldığında Yon değişkenine verdiğimiz değer, KarakterSprite görselinde ilgili tuşa ait yönün yukarıdan aşağıya sıra numarası aynı zamanda.
Son adımda, Draw() method’unu yazıyoruz;
GraphicsDevice.Clear(Color.CornflowerBlue); Karakter = new Rectangle(Kare * 24, Yon * 32, 24, 32); spriteBatch.Begin(); spriteBatch.Draw(ArkaplanCim, Arkaplan, Color.White); spriteBatch.Draw(KarakterSprite, KarakterKonum, Karakter, Color.White); spriteBatch.End(); Öncelikle Rectangle tipinde *Karakter* değişkenine, *KarakterSprite* değişkeninin hangi **parçasını** ekrana çizmek istediğimizi belirteceğimiz değeri atıyoruz. Sonra *arkaplan* ve *karakterimizi* oyun penceresine **çizdiriyoruz**. ![XNA ile Oyun Programlama - Karakter Hareket Oyun Ekranı](/assets/uploads/2011/07/XNAKarakterHareket.png "XNA ile Oyun Programlama - Karakter Hareket Oyun Ekranı") Oyunun kodlarını indirmek için tıklayınız.
Senior Software Engineer, @Microsoft
Ada ve Ege'nin babası ;)
Makale Adedi: 484