Yandex.Metrica
XNA'de Arkaplan Resmi

Merhabalar,bu yazımızda arka plana bir resim koyarak oyunumuzun görsel açıdan daha iyi görünüme sahip olmasını amaçlıyoruz. Bu işlem çok basit olup daha önceden bahsettiğimiz XNA de resim ekleme konusuyla birebir ilişkilidir. O incelememizde eklediğimiz sprite örneği için çizdirme metotunu kullanırken kullanılan parametreler texture,position ve color idi. Bu sefer ki işlemde Draw fonksiyonun değişik bir overload edilmiş örneğini kullanacağız.  

Oyunumuzda kullanacağımız boyut olarak küçük ve orta ölçekli bütün sprite ların çiziminde konum bildirme amaçlı Vector2 sınıfı örneği kullanabiliriz. Fakat arkaplan olarak düşündüğümüz resmin bütün ekranı kaplamasını istiyoruz. Bu durumu normal olarak resim ekleme yöntemiyle aşabilmemiz için resmimiz oyun penceresi büyüklüğünde olacak ayrıca pencerede ki konumu (x:0,y:0) noktasında olmalıdır. Eğer resmimiz oyun penceresinin ölçülerinden daha küçükse karşımıza çıkabilecek görüntü şu şekilde olacaktır.


Bu görünüm için Game1 sınıfı içerisinde Draw metotunda spriteBatch.Draw(arkaplan, new Vector2(0, 0), Color.White) diye fonksiyon kullandık.Resmimiz pencereye sığmadığından bu işlemi Draw metotunun kullandığımız overload edilmiş biçimini değiştirerek istediğimiz hale getirebiliriz.Bunun için Draw metotunda kullandığımız Vector2 sınıfı parametresi yerine Rectangle isimli dikdörtgen ifade etmemizi sağlayan XNA Framework sınıfını kullanabiliriz.
spriteBatch.Draw(arkaplan, new Rectangle(0,0,this.graphics.PreferredBackBufferWidth,this.graphics.PreferredBackBufferHeight), Color.White);

Burada graphics isimli nesnemizin ekran genişliği ve uzunluğu bilgilerini veren alanlarına başvurduk.graphics isimli nesnemizin Game1 sınıfıyla hazır geldiğini ve GraphicsDeviceManager sınıfından geldiğini hatırlayalım.

Son olarak kısa bir şeye değinmek istiyorum ve hemen sonra programımızın son halibe birlikte göz atalım.spriteBatch ile çizim yaparken Begin ve End metotları arasında yazdığımızı hatırlayalım(1).Biz bu örneğimizde ekranda iki adet resim dosyası görüntülemek istiyoruz.Burada söylemem gereken şey çizilecek olan imajların hangisinin diğerinin üstünde kalacağını bilmeliyiz ona göre en altta görüntülenmesi gerekeni ilk sırada çizdirmeliyiz.Yani eğer ilk olarak diğer sprite ımızı çizdirirsek onun arkasından çizdireceğimiz arkaplan resmi onu kapsayarak görüntülenmesi engeller.
 spriteBatch.Begin();
          spriteBatch.Draw(arkaplan, new Rectangle(0,0,graphics.PreferredBackBufferWidth,graphics.PreferredBackBufferHeight), Color.White);
 spriteBatch.Draw(doku,position,Color.White);
          spriteBatch.End();

Eğer dokuyu çizdirdiğimiz satır arkaplanın çizdirildiği satırdan önce yazılsaydı dokumuzu ekranda göremiyecektik.Şimdi birlikte kodumuzun son haline 
bir göz atalım.
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
namespace WindowsGame3
{
   public class Game1 : Microsoft.Xna.Framework.Game
   {
       GraphicsDeviceManager graphics;
       SpriteBatch spriteBatch;
       Vector2 position;
//Burada arkaplan için 2D doku nesnesi tanımlıyoruz
       Texture2D arkaplan;
       Texture2D doku;
       
       public Game1()
       {
           graphics = new GraphicsDeviceManager(this);
           Content.RootDirectory = "Content";
       }
       protected override void Initialize()
       {
           base.Initialize();
       }
        protected override void LoadContent()
       {
           spriteBatch = new SpriteBatch(GraphicsDevice);
           doku = Content.Load("denizanasi");
//Burada arkaplan dokumuza Content klasöründen imaj yüklüyoruz
           arkaplan = Content.Load("arkaplan");
           position = new Vector2(0,0);
       }
       protected override void UnloadContent()
       {
          
       }
       protected override void Update(GameTime gameTime)
       {
           if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
               this.Exit();
           KeyboardState klavye = Keyboard.GetState();
           if (klavye.IsKeyDown(Keys.Up)) 
           {
               this.position.Y -= 2;
           }
           if (klavye.IsKeyDown(Keys.Down))
           {
               this.position.Y += 2;
           }
           if (klavye.IsKeyDown(Keys.Right))
           {
               this.position.X += 2;
           }
           if (klavye.IsKeyDown(Keys.Left))
           {
               this.position.X -= 2;
           }
           base.Update(gameTime);
       }
      
       protected override void Draw(GameTime gameTime)
       {
           GraphicsDevice.Clear(Color.CornflowerBlue);
           
           spriteBatch.Begin();
//arkaplan ı çizdiriyoruz
           spriteBatch.Draw(arkaplan, new Rectangle(0,0,graphics.PreferredBackBufferWidth,graphics.PreferredBackBufferHeight), Color.White);
           spriteBatch.Draw(doku,position,Color.White);
           spriteBatch.End();
           
           base.Draw(gameTime);
       }
   }
}

(1) XNA 'de Resim Ekleme
Not: Denizanası resmi daha önceden kullandığımız biçimiden farklı bir şekilde ayarlandı.Bu örneğimizde arka planı kesildi ve png olarak kaydedildi.(denizanası)

Comments(0):
Bu yazı için henüz bir yorum yapılmamış
Yorum yapabilmeniz için üye olmanız gerekmektedir,(Giriş Yap|| Üye Ol)